palmier 0.9.6 → 0.9.8

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 (255) hide show
  1. package/README.md +28 -13
  2. package/dist/agents/agent.d.ts +0 -1
  3. package/dist/agents/agent.js +0 -1
  4. package/dist/agents/aider.d.ts +0 -1
  5. package/dist/agents/aider.js +0 -1
  6. package/dist/agents/claude.d.ts +0 -1
  7. package/dist/agents/claude.js +0 -1
  8. package/dist/agents/cline.d.ts +0 -1
  9. package/dist/agents/cline.js +0 -1
  10. package/dist/agents/codex.d.ts +0 -1
  11. package/dist/agents/codex.js +0 -1
  12. package/dist/agents/copilot.d.ts +0 -1
  13. package/dist/agents/copilot.js +0 -1
  14. package/dist/agents/cursor.d.ts +0 -1
  15. package/dist/agents/cursor.js +0 -1
  16. package/dist/agents/deepagents.d.ts +0 -1
  17. package/dist/agents/deepagents.js +0 -1
  18. package/dist/agents/droid.d.ts +0 -1
  19. package/dist/agents/droid.js +0 -1
  20. package/dist/agents/gemini.d.ts +0 -1
  21. package/dist/agents/gemini.js +0 -1
  22. package/dist/agents/goose.d.ts +0 -1
  23. package/dist/agents/goose.js +0 -1
  24. package/dist/agents/hermes.d.ts +0 -1
  25. package/dist/agents/hermes.js +0 -1
  26. package/dist/agents/kimi.d.ts +0 -1
  27. package/dist/agents/kimi.js +0 -1
  28. package/dist/agents/kiro.d.ts +0 -1
  29. package/dist/agents/kiro.js +0 -1
  30. package/dist/agents/openclaw.d.ts +0 -1
  31. package/dist/agents/openclaw.js +0 -1
  32. package/dist/agents/opencode.d.ts +0 -1
  33. package/dist/agents/opencode.js +0 -1
  34. package/dist/agents/qoder.d.ts +0 -1
  35. package/dist/agents/qoder.js +0 -1
  36. package/dist/agents/qwen.d.ts +0 -1
  37. package/dist/agents/qwen.js +0 -1
  38. package/dist/agents/shared-prompt.d.ts +0 -1
  39. package/dist/agents/shared-prompt.js +0 -1
  40. package/dist/client-store.d.ts +0 -1
  41. package/dist/client-store.js +0 -1
  42. package/dist/commands/clients.d.ts +0 -1
  43. package/dist/commands/clients.js +0 -1
  44. package/dist/commands/info.d.ts +0 -1
  45. package/dist/commands/info.js +0 -1
  46. package/dist/commands/init.d.ts +0 -1
  47. package/dist/commands/init.js +1 -2
  48. package/dist/commands/pair.d.ts +0 -1
  49. package/dist/commands/pair.js +0 -1
  50. package/dist/commands/restart.d.ts +0 -1
  51. package/dist/commands/restart.js +0 -1
  52. package/dist/commands/run.d.ts +0 -1
  53. package/dist/commands/run.js +19 -3
  54. package/dist/commands/serve.d.ts +0 -1
  55. package/dist/commands/serve.js +0 -1
  56. package/dist/commands/uninstall.d.ts +0 -1
  57. package/dist/commands/uninstall.js +0 -1
  58. package/dist/config.d.ts +0 -1
  59. package/dist/config.js +0 -1
  60. package/dist/event-queues.d.ts +0 -1
  61. package/dist/event-queues.js +0 -1
  62. package/dist/events.d.ts +0 -1
  63. package/dist/events.js +0 -1
  64. package/dist/index.d.ts +0 -1
  65. package/dist/index.js +0 -1
  66. package/dist/linked-device.d.ts +0 -1
  67. package/dist/linked-device.js +0 -1
  68. package/dist/mcp-handler.d.ts +0 -1
  69. package/dist/mcp-handler.js +0 -1
  70. package/dist/mcp-tools.d.ts +0 -1
  71. package/dist/mcp-tools.js +0 -1
  72. package/dist/nats-client.d.ts +0 -1
  73. package/dist/nats-client.js +0 -1
  74. package/dist/network.d.ts +0 -1
  75. package/dist/network.js +0 -1
  76. package/dist/notification-store.d.ts +0 -1
  77. package/dist/notification-store.js +0 -1
  78. package/dist/pending-requests.d.ts +0 -1
  79. package/dist/pending-requests.js +0 -1
  80. package/dist/platform/index.d.ts +0 -1
  81. package/dist/platform/index.js +0 -1
  82. package/dist/platform/linux.d.ts +0 -1
  83. package/dist/platform/linux.js +0 -1
  84. package/dist/platform/macos.d.ts +0 -1
  85. package/dist/platform/macos.js +0 -1
  86. package/dist/platform/platform.d.ts +0 -1
  87. package/dist/platform/platform.js +0 -1
  88. package/dist/platform/windows.d.ts +0 -1
  89. package/dist/platform/windows.js +0 -1
  90. package/dist/pwa/assets/{index-MLEFUP3r.js → index-DWvRAUiy.js} +31 -31
  91. package/dist/pwa/assets/{web-B1sKCc7e.js → web-C4iZbqTC.js} +1 -1
  92. package/dist/pwa/assets/{web-ETD-8ZHd.js → web-CBFqJGX6.js} +1 -1
  93. package/dist/pwa/assets/{web-B4xEa6WO.js → web-DL4uXOpS.js} +1 -1
  94. package/dist/pwa/index.html +2 -2
  95. package/dist/rpc-handler.d.ts +0 -1
  96. package/dist/rpc-handler.js +0 -1
  97. package/dist/sms-store.d.ts +0 -1
  98. package/dist/sms-store.js +0 -1
  99. package/dist/spawn-command.d.ts +0 -1
  100. package/dist/spawn-command.js +0 -1
  101. package/dist/task.d.ts +0 -1
  102. package/dist/task.js +0 -1
  103. package/dist/transports/http-transport.d.ts +0 -1
  104. package/dist/transports/http-transport.js +0 -1
  105. package/dist/transports/nats-transport.d.ts +0 -1
  106. package/dist/transports/nats-transport.js +0 -1
  107. package/dist/types.d.ts +0 -1
  108. package/dist/types.js +0 -1
  109. package/dist/update-checker.d.ts +0 -1
  110. package/dist/update-checker.js +0 -1
  111. package/package.json +11 -1
  112. package/.github/workflows/ci.yml +0 -16
  113. package/.github/workflows/publish.yml +0 -37
  114. package/CLAUDE.md +0 -22
  115. package/dist/pwa/apple-touch-icon.png +0 -0
  116. package/dist/pwa/manifest.webmanifest +0 -1
  117. package/dist/pwa/pwa-192x192.png +0 -0
  118. package/dist/pwa/pwa-512x512.png +0 -0
  119. package/dist/pwa/registerSW.js +0 -1
  120. package/dist/pwa/service-worker.js +0 -2
  121. package/palmier-server/.github/workflows/ci.yml +0 -21
  122. package/palmier-server/.github/workflows/deploy.yml +0 -38
  123. package/palmier-server/CLAUDE.md +0 -17
  124. package/palmier-server/PRODUCTION.md +0 -358
  125. package/palmier-server/README.md +0 -231
  126. package/palmier-server/nats.conf +0 -19
  127. package/palmier-server/package.json +0 -15
  128. package/palmier-server/pnpm-lock.yaml +0 -7639
  129. package/palmier-server/pnpm-workspace.yaml +0 -3
  130. package/palmier-server/pwa/index.html +0 -16
  131. package/palmier-server/pwa/logo/logo_20260421.png +0 -0
  132. package/palmier-server/pwa/package.json +0 -34
  133. package/palmier-server/pwa/public/apple-touch-icon.png +0 -0
  134. package/palmier-server/pwa/public/favicon.ico +0 -0
  135. package/palmier-server/pwa/public/pwa-192x192.png +0 -0
  136. package/palmier-server/pwa/public/pwa-512x512.png +0 -0
  137. package/palmier-server/pwa/src/App.css +0 -3012
  138. package/palmier-server/pwa/src/App.tsx +0 -59
  139. package/palmier-server/pwa/src/agentLabels.ts +0 -11
  140. package/palmier-server/pwa/src/api.ts +0 -67
  141. package/palmier-server/pwa/src/components/CapabilityToggles.tsx +0 -170
  142. package/palmier-server/pwa/src/components/ConnectionStatusIcon.tsx +0 -113
  143. package/palmier-server/pwa/src/components/HostMenu.tsx +0 -429
  144. package/palmier-server/pwa/src/components/PermissionsDialog.tsx +0 -34
  145. package/palmier-server/pwa/src/components/PullToRefreshIndicator.tsx +0 -46
  146. package/palmier-server/pwa/src/components/RunDetailView.tsx +0 -343
  147. package/palmier-server/pwa/src/components/SessionComposer.tsx +0 -157
  148. package/palmier-server/pwa/src/components/SessionsView.tsx +0 -326
  149. package/palmier-server/pwa/src/components/SwipeToDeleteRow.tsx +0 -170
  150. package/palmier-server/pwa/src/components/TabBar.tsx +0 -40
  151. package/palmier-server/pwa/src/components/TaskCard.tsx +0 -255
  152. package/palmier-server/pwa/src/components/TaskForm.tsx +0 -766
  153. package/palmier-server/pwa/src/components/TasksView.tsx +0 -179
  154. package/palmier-server/pwa/src/constants.ts +0 -2
  155. package/palmier-server/pwa/src/contexts/HostConnectionContext.tsx +0 -432
  156. package/palmier-server/pwa/src/contexts/HostStoreContext.tsx +0 -124
  157. package/palmier-server/pwa/src/draftGuard.ts +0 -24
  158. package/palmier-server/pwa/src/formatTime.ts +0 -44
  159. package/palmier-server/pwa/src/hooks/useBackClose.ts +0 -75
  160. package/palmier-server/pwa/src/hooks/useMediaQuery.ts +0 -17
  161. package/palmier-server/pwa/src/hooks/usePullToRefresh.ts +0 -102
  162. package/palmier-server/pwa/src/hooks/usePushSubscription.ts +0 -77
  163. package/palmier-server/pwa/src/main.tsx +0 -14
  164. package/palmier-server/pwa/src/native/Device.ts +0 -49
  165. package/palmier-server/pwa/src/pages/Dashboard.tsx +0 -542
  166. package/palmier-server/pwa/src/pages/PairHost.tsx +0 -232
  167. package/palmier-server/pwa/src/pages/PairSetup.tsx +0 -134
  168. package/palmier-server/pwa/src/service-worker.ts +0 -142
  169. package/palmier-server/pwa/src/types.ts +0 -75
  170. package/palmier-server/pwa/src/vite-env.d.ts +0 -11
  171. package/palmier-server/pwa/tsconfig.json +0 -21
  172. package/palmier-server/pwa/tsconfig.node.json +0 -19
  173. package/palmier-server/pwa/vite.config.ts +0 -47
  174. package/palmier-server/server/.env.example +0 -20
  175. package/palmier-server/server/package.json +0 -36
  176. package/palmier-server/server/src/db.ts +0 -44
  177. package/palmier-server/server/src/fcm.ts +0 -74
  178. package/palmier-server/server/src/index.ts +0 -688
  179. package/palmier-server/server/src/nats-jwt.ts +0 -299
  180. package/palmier-server/server/src/nats-setup.ts +0 -48
  181. package/palmier-server/server/src/nats.ts +0 -33
  182. package/palmier-server/server/src/notify.ts +0 -34
  183. package/palmier-server/server/src/push.ts +0 -68
  184. package/palmier-server/server/src/routes/device.ts +0 -224
  185. package/palmier-server/server/src/routes/fcm.ts +0 -64
  186. package/palmier-server/server/src/routes/hosts.ts +0 -56
  187. package/palmier-server/server/src/routes/push.ts +0 -101
  188. package/palmier-server/server/tsconfig.json +0 -20
  189. package/palmier-server/spec.md +0 -533
  190. package/src/agents/agent-instructions.md +0 -28
  191. package/src/agents/agent.ts +0 -114
  192. package/src/agents/aider.ts +0 -35
  193. package/src/agents/claude.ts +0 -39
  194. package/src/agents/cline.ts +0 -35
  195. package/src/agents/codex.ts +0 -40
  196. package/src/agents/copilot.ts +0 -37
  197. package/src/agents/cursor.ts +0 -36
  198. package/src/agents/deepagents.ts +0 -36
  199. package/src/agents/droid.ts +0 -35
  200. package/src/agents/gemini.ts +0 -43
  201. package/src/agents/goose.ts +0 -33
  202. package/src/agents/hermes.ts +0 -36
  203. package/src/agents/kimi.ts +0 -35
  204. package/src/agents/kiro.ts +0 -36
  205. package/src/agents/openclaw.ts +0 -29
  206. package/src/agents/opencode.ts +0 -36
  207. package/src/agents/qoder.ts +0 -36
  208. package/src/agents/qwen.ts +0 -32
  209. package/src/agents/shared-prompt.ts +0 -30
  210. package/src/client-store.ts +0 -68
  211. package/src/commands/clients.ts +0 -29
  212. package/src/commands/info.ts +0 -29
  213. package/src/commands/init.ts +0 -165
  214. package/src/commands/pair.ts +0 -137
  215. package/src/commands/restart.ts +0 -6
  216. package/src/commands/run.ts +0 -608
  217. package/src/commands/serve.ts +0 -211
  218. package/src/commands/uninstall.ts +0 -9
  219. package/src/config.ts +0 -36
  220. package/src/cross-spawn.d.ts +0 -5
  221. package/src/event-queues.ts +0 -41
  222. package/src/events.ts +0 -29
  223. package/src/index.ts +0 -111
  224. package/src/linked-device.ts +0 -52
  225. package/src/mcp-handler.ts +0 -200
  226. package/src/mcp-tools.ts +0 -839
  227. package/src/nats-client.ts +0 -19
  228. package/src/network.ts +0 -96
  229. package/src/notification-store.ts +0 -30
  230. package/src/pending-requests.ts +0 -73
  231. package/src/platform/index.ts +0 -20
  232. package/src/platform/linux.ts +0 -296
  233. package/src/platform/macos.ts +0 -329
  234. package/src/platform/platform.ts +0 -31
  235. package/src/platform/windows.ts +0 -299
  236. package/src/rpc-handler.ts +0 -691
  237. package/src/sms-store.ts +0 -28
  238. package/src/spawn-command.ts +0 -123
  239. package/src/task.ts +0 -343
  240. package/src/transports/http-transport.ts +0 -478
  241. package/src/transports/nats-transport.ts +0 -76
  242. package/src/types.ts +0 -89
  243. package/src/update-checker.ts +0 -40
  244. package/test/agent-instructions.test.ts +0 -209
  245. package/test/agent-output-parsing.test.ts +0 -74
  246. package/test/linux-cron.test.ts +0 -41
  247. package/test/macos-plist.test.ts +0 -112
  248. package/test/notification-store.test.ts +0 -57
  249. package/test/pairing.test.ts +0 -35
  250. package/test/result-state.test.ts +0 -110
  251. package/test/task-parsing.test.ts +0 -82
  252. package/test/taskrun-messages.test.ts +0 -224
  253. package/test/tsconfig.json +0 -9
  254. package/test/windows-xml.test.ts +0 -89
  255. package/tsconfig.json +0 -19
@@ -1,3012 +0,0 @@
1
- /* ===== CSS Variables / Theming ===== */
2
- :root {
3
- --color-bg: #F7F8FC;
4
- --color-surface: #ffffff;
5
- --color-primary: #2E5CE5;
6
- --color-primary-hover: #1D4ED8;
7
- --color-primary-subtle: #EEF2FF;
8
- --color-secondary: #64748B;
9
- --color-secondary-hover: #475569;
10
- --color-text: #1A1F36;
11
- --color-text-secondary: #697386;
12
- --color-muted: #94A3B8;
13
- --color-success: #22C55E;
14
- --color-error: #EF4444;
15
- --color-error-bg: #FEF2F2;
16
- --color-warning: #F59E0B;
17
- --color-border: #E2E8F0;
18
- --color-border-subtle: #F1F5F9;
19
- --color-hover: rgba(15, 23, 42, 0.06);
20
- --color-overlay: rgba(15, 23, 42, 0.5);
21
- --color-input-focus: rgba(46, 92, 229, 0.15);
22
-
23
- --shadow-xs: 0 1px 2px rgba(15, 23, 42, 0.05);
24
- --shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.06), 0 1px 2px rgba(15, 23, 42, 0.04);
25
- --shadow-md: 0 4px 6px -1px rgba(15, 23, 42, 0.07), 0 2px 4px -2px rgba(15, 23, 42, 0.05);
26
- --shadow-lg: 0 10px 15px -3px rgba(15, 23, 42, 0.08), 0 4px 6px -4px rgba(15, 23, 42, 0.04);
27
- --shadow-xl: 0 20px 25px -5px rgba(15, 23, 42, 0.1), 0 8px 10px -6px rgba(15, 23, 42, 0.06);
28
-
29
- --radius-sm: 8px;
30
- --radius-md: 12px;
31
- --radius-lg: 16px;
32
- --radius-full: 50%;
33
-
34
- --font-sans: "Plus Jakarta Sans Variable", "Plus Jakarta Sans", -apple-system,
35
- BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
36
-
37
- --space-xs: 4px;
38
- --space-sm: 8px;
39
- --space-md: 16px;
40
- --space-lg: 24px;
41
- --space-xl: 32px;
42
- --space-2xl: 48px;
43
-
44
- --transition-fast: 0.12s ease;
45
- --transition-base: 0.2s ease;
46
- }
47
-
48
- /* ===== Reset ===== */
49
- *,
50
- *::before,
51
- *::after {
52
- box-sizing: border-box;
53
- margin: 0;
54
- padding: 0;
55
- }
56
-
57
- html {
58
- font-size: 16px;
59
- -webkit-text-size-adjust: 100%;
60
- }
61
-
62
- body {
63
- font-family: var(--font-sans);
64
- background: var(--color-bg);
65
- color: var(--color-text);
66
- line-height: 1.6;
67
- min-height: 100dvh;
68
- -webkit-font-smoothing: antialiased;
69
- -moz-osx-font-smoothing: grayscale;
70
- overscroll-behavior-y: contain;
71
- }
72
-
73
- .pull-to-refresh {
74
- position: fixed;
75
- top: -48px;
76
- left: 0;
77
- right: 0;
78
- height: 48px;
79
- display: flex;
80
- align-items: center;
81
- justify-content: center;
82
- pointer-events: none;
83
- z-index: 40;
84
- transition: opacity 0.15s;
85
- }
86
-
87
- .pull-to-refresh-badge {
88
- width: 40px;
89
- height: 40px;
90
- border-radius: 50%;
91
- background: var(--color-surface);
92
- border: 1px solid var(--color-border);
93
- box-shadow: var(--shadow-md);
94
- display: flex;
95
- align-items: center;
96
- justify-content: center;
97
- color: var(--color-text-secondary);
98
- }
99
-
100
- #root {
101
- min-height: 100dvh;
102
- }
103
-
104
- /* ===== Buttons ===== */
105
- .btn {
106
- display: inline-flex;
107
- align-items: center;
108
- justify-content: center;
109
- gap: 6px;
110
- border: 1px solid transparent;
111
- border-radius: var(--radius-sm);
112
- font-family: var(--font-sans);
113
- font-size: 0.875rem;
114
- font-weight: 600;
115
- padding: 10px 18px;
116
- cursor: pointer;
117
- transition: all var(--transition-base);
118
- -webkit-tap-highlight-color: transparent;
119
- letter-spacing: -0.01em;
120
- line-height: 1.25;
121
- }
122
-
123
- .btn:disabled {
124
- opacity: 0.45;
125
- cursor: not-allowed;
126
- }
127
-
128
- .btn:focus-visible {
129
- outline: 2px solid var(--color-primary);
130
- outline-offset: 2px;
131
- }
132
-
133
- .btn-primary {
134
- background: var(--color-primary);
135
- color: #fff;
136
- box-shadow: 0 1px 2px rgba(46, 92, 229, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1);
137
- }
138
- .btn-primary:hover:not(:disabled) {
139
- background: var(--color-primary-hover);
140
- box-shadow: 0 2px 4px rgba(46, 92, 229, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.1);
141
- transform: translateY(-0.5px);
142
- }
143
- .btn-primary:active:not(:disabled) {
144
- transform: translateY(0);
145
- box-shadow: 0 1px 2px rgba(46, 92, 229, 0.3);
146
- }
147
-
148
- .btn-secondary {
149
- background: var(--color-surface);
150
- color: var(--color-text);
151
- border-color: var(--color-border);
152
- box-shadow: var(--shadow-xs);
153
- }
154
- .btn-secondary:hover:not(:disabled) {
155
- background: var(--color-border-subtle);
156
- border-color: #CBD5E1;
157
- }
158
-
159
- .btn-danger {
160
- background: var(--color-error);
161
- color: #fff;
162
- box-shadow: 0 1px 2px rgba(239, 68, 68, 0.3);
163
- }
164
- .btn-danger:hover:not(:disabled) {
165
- background: #DC2626;
166
- box-shadow: 0 2px 4px rgba(239, 68, 68, 0.35);
167
- }
168
-
169
- .btn-link {
170
- background: none;
171
- border: none;
172
- color: var(--color-primary);
173
- padding: 0;
174
- font-weight: 500;
175
- box-shadow: none;
176
- }
177
- .btn-link:hover:not(:disabled) {
178
- text-decoration: underline;
179
- background: none;
180
- box-shadow: none;
181
- }
182
-
183
- .btn-spinner {
184
- display: inline-block;
185
- width: 14px;
186
- height: 14px;
187
- border: 2px solid rgba(255, 255, 255, 0.3);
188
- border-top-color: #fff;
189
- border-radius: 50%;
190
- animation: spin 0.6s linear infinite;
191
- vertical-align: middle;
192
- margin-right: 6px;
193
- }
194
-
195
- .btn-sm {
196
- font-size: 0.8125rem;
197
- padding: 6px 12px;
198
- border-radius: 6px;
199
- }
200
-
201
-
202
- .btn-full {
203
- width: 100%;
204
- }
205
-
206
- /* ===== Forms ===== */
207
- .form-label {
208
- display: flex;
209
- flex-direction: column;
210
- gap: 6px;
211
- font-size: 0.8125rem;
212
- font-weight: 600;
213
- color: var(--color-text);
214
- margin-bottom: var(--space-md);
215
- letter-spacing: -0.01em;
216
- }
217
-
218
- .form-input,
219
- .form-textarea,
220
- .form-select {
221
- font-family: var(--font-sans);
222
- font-size: 0.9375rem;
223
- padding: 10px 12px;
224
- border: 1.5px solid var(--color-border);
225
- border-radius: var(--radius-sm);
226
- background: var(--color-surface);
227
- color: var(--color-text);
228
- transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
229
- width: 100%;
230
- }
231
-
232
- .form-input:focus,
233
- .form-textarea:focus,
234
- .form-select:focus {
235
- outline: none;
236
- border-color: var(--color-primary);
237
- box-shadow: 0 0 0 3px var(--color-input-focus);
238
- }
239
-
240
- .form-input-mono {
241
- font-family: "SF Mono", "Fira Code", "Cascadia Code", monospace;
242
- font-size: 0.8125rem;
243
- }
244
-
245
- .agent-picker-label {
246
- font-size: 0.8125rem;
247
- color: var(--color-text-secondary);
248
- white-space: nowrap;
249
- }
250
-
251
- .form-input::placeholder,
252
- .form-textarea::placeholder {
253
- color: var(--color-muted);
254
- }
255
-
256
- .form-textarea {
257
- resize: vertical;
258
- min-height: 80px;
259
- line-height: 1.5;
260
- }
261
-
262
- .form-error {
263
- background: var(--color-error-bg);
264
- color: var(--color-error);
265
- border: 1px solid #FECACA;
266
- border-radius: var(--radius-sm);
267
- padding: var(--space-sm) var(--space-md);
268
- font-size: 0.8125rem;
269
- font-weight: 500;
270
- margin-bottom: var(--space-md);
271
- }
272
-
273
- .form-warning {
274
- background: #FEF3C7;
275
- color: #92400E;
276
- border: 1px solid #FDE68A;
277
- border-radius: var(--radius-sm);
278
- padding: var(--space-sm) var(--space-md);
279
- font-size: 0.8125rem;
280
- font-weight: 500;
281
- margin-bottom: var(--space-md);
282
- }
283
-
284
- /* ===== Auth Pages ===== */
285
- /* ===== Dashboard ===== */
286
- .dashboard {
287
- min-height: 100dvh;
288
- display: flex;
289
- flex-direction: column;
290
- padding-bottom: 0;
291
- }
292
-
293
-
294
- .dashboard-main {
295
- flex: 1;
296
- padding: var(--space-md);
297
- width: 100%;
298
- }
299
-
300
- /* ===== Status Dot ===== */
301
- .status-dot {
302
- display: inline-block;
303
- width: 8px;
304
- height: 8px;
305
- border-radius: var(--radius-full);
306
- flex-shrink: 0;
307
- box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.8);
308
- }
309
-
310
- .status-spinner {
311
- display: inline-flex;
312
- align-items: center;
313
- gap: 2px;
314
- flex-shrink: 0;
315
- height: 8px;
316
- }
317
-
318
- .status-spinner::before,
319
- .status-spinner > span,
320
- .status-spinner::after {
321
- content: "";
322
- display: block;
323
- width: 3px;
324
- height: 3px;
325
- border-radius: var(--radius-full);
326
- background-color: var(--color-success);
327
- animation: marching-dot 1.2s ease-in-out infinite;
328
- }
329
-
330
- .status-spinner::before {
331
- animation-delay: 0s;
332
- }
333
-
334
- .status-spinner > span {
335
- animation-delay: 0.2s;
336
- }
337
-
338
- .status-spinner::after {
339
- animation-delay: 0.4s;
340
- }
341
-
342
- @keyframes marching-dot {
343
- 0%, 60%, 100% { opacity: 0.25; transform: scale(0.8); }
344
- 30% { opacity: 1; transform: scale(1); }
345
- }
346
-
347
- /* ===== Pair Host Page ===== */
348
- .pair-page {
349
- display: flex;
350
- align-items: flex-start;
351
- justify-content: center;
352
- min-height: 100dvh;
353
- padding: var(--space-xl) var(--space-md);
354
- background: var(--color-bg);
355
- }
356
-
357
- .pair-card {
358
- width: 100%;
359
- max-width: 420px;
360
- display: flex;
361
- flex-direction: column;
362
- gap: var(--space-lg);
363
- }
364
-
365
- .pair-header {
366
- text-align: center;
367
- }
368
-
369
- .pair-title {
370
- font-size: 1.5rem;
371
- font-weight: 700;
372
- color: var(--color-text);
373
- letter-spacing: -0.02em;
374
- }
375
-
376
- .pair-subtitle {
377
- margin-top: var(--space-xs);
378
- font-size: 0.875rem;
379
- color: var(--color-text-secondary);
380
- }
381
-
382
- .pair-instructions {
383
- background: var(--color-surface);
384
- border: 1px solid var(--color-border);
385
- border-radius: var(--radius-md);
386
- padding: var(--space-md);
387
- display: flex;
388
- flex-direction: column;
389
- gap: var(--space-md);
390
- }
391
-
392
- .pair-instruction-block {
393
- display: flex;
394
- flex-direction: column;
395
- gap: var(--space-sm);
396
- }
397
-
398
- .pair-instruction-heading {
399
- font-size: 0.8125rem;
400
- font-weight: 600;
401
- color: var(--color-text);
402
- letter-spacing: -0.01em;
403
- }
404
-
405
- .pair-steps {
406
- list-style: none;
407
- counter-reset: pair-step;
408
- display: flex;
409
- flex-direction: column;
410
- gap: 6px;
411
- padding: 0;
412
- }
413
-
414
- .pair-steps li {
415
- counter-increment: pair-step;
416
- font-size: 0.8125rem;
417
- color: var(--color-text-secondary);
418
- line-height: 1.5;
419
- display: flex;
420
- flex-wrap: wrap;
421
- gap: 0 var(--space-sm);
422
- }
423
-
424
- .pair-steps li::before {
425
- content: counter(pair-step) ".";
426
- font-weight: 600;
427
- color: var(--color-muted);
428
- min-width: 16px;
429
- flex-shrink: 0;
430
- }
431
-
432
- .pair-steps li .pair-command {
433
- flex-basis: 100%;
434
- }
435
-
436
- .pair-steps code {
437
- font-family: "SF Mono", "Fira Code", "Cascadia Code", monospace;
438
- font-size: 0.75rem;
439
- background: var(--color-bg);
440
- border: 1px solid var(--color-border);
441
- border-radius: 4px;
442
- padding: 1px 5px;
443
- color: var(--color-text);
444
- white-space: nowrap;
445
- }
446
-
447
- .pair-command {
448
- display: block;
449
- margin-top: 4px;
450
- padding: 6px 10px !important;
451
- border-radius: var(--radius-sm) !important;
452
- overflow-x: auto;
453
- -webkit-overflow-scrolling: touch;
454
- }
455
-
456
- .pair-platform-label {
457
- display: block;
458
- margin-top: 8px;
459
- font-size: 0.75rem;
460
- font-weight: 600;
461
- color: var(--color-muted);
462
- }
463
-
464
- .pair-instruction-divider {
465
- height: 1px;
466
- background: var(--color-border);
467
- }
468
-
469
- .pair-form {
470
- background: var(--color-surface);
471
- border: 1px solid var(--color-border);
472
- border-radius: var(--radius-md);
473
- padding: var(--space-lg);
474
- display: flex;
475
- flex-direction: column;
476
- gap: var(--space-md);
477
- box-shadow: var(--shadow-sm);
478
- }
479
-
480
- .pair-code-input {
481
- font-size: 1.5rem !important;
482
- letter-spacing: 0.25em;
483
- text-align: center;
484
- padding: 14px 12px !important;
485
- text-transform: uppercase;
486
- }
487
-
488
- .pair-code-input::placeholder {
489
- letter-spacing: 0.25em;
490
- opacity: 0.35;
491
- }
492
-
493
- .pair-label-hint {
494
- font-weight: 400;
495
- color: var(--color-muted);
496
- font-size: 0.75rem;
497
- }
498
-
499
- .pair-error {
500
- font-size: 0.8125rem;
501
- color: var(--color-error);
502
- background: var(--color-error-bg);
503
- padding: var(--space-sm) var(--space-md);
504
- border-radius: var(--radius-sm);
505
- line-height: 1.4;
506
- }
507
-
508
- /* ===== Loading / Empty States ===== */
509
- .loading-state,
510
- .empty-state {
511
- display: flex;
512
- flex-direction: column;
513
- align-items: center;
514
- justify-content: center;
515
- padding: var(--space-2xl) 0;
516
- gap: var(--space-sm);
517
- }
518
-
519
- .empty-state-text {
520
- font-size: 1rem;
521
- font-weight: 600;
522
- color: var(--color-text-secondary);
523
- }
524
-
525
- .empty-state-hint {
526
- font-size: 0.8125rem;
527
- color: var(--color-muted);
528
- }
529
-
530
- /* ===== Client Revoked State ===== */
531
- .revoked-state {
532
- display: flex;
533
- flex-direction: column;
534
- align-items: center;
535
- text-align: center;
536
- padding: var(--space-2xl) var(--space-lg);
537
- margin: var(--space-md) 0;
538
- background: var(--color-surface);
539
- border: 1px solid var(--color-border);
540
- border-radius: var(--radius-md);
541
- animation: revokedFadeIn 0.35s ease;
542
- }
543
-
544
- @keyframes revokedFadeIn {
545
- from { opacity: 0; transform: translateY(8px); }
546
- to { opacity: 1; transform: translateY(0); }
547
- }
548
-
549
- .revoked-icon {
550
- width: 56px;
551
- height: 56px;
552
- display: flex;
553
- align-items: center;
554
- justify-content: center;
555
- border-radius: var(--radius-full);
556
- background: var(--color-error-bg);
557
- color: var(--color-error);
558
- margin-bottom: var(--space-md);
559
- }
560
-
561
- .revoked-title {
562
- font-size: 1.125rem;
563
- font-weight: 700;
564
- color: var(--color-text);
565
- margin-bottom: var(--space-xs);
566
- }
567
-
568
- .revoked-description {
569
- font-size: 0.875rem;
570
- line-height: 1.6;
571
- color: var(--color-text-secondary);
572
- max-width: 320px;
573
- margin-bottom: var(--space-lg);
574
- }
575
-
576
- .revoked-command {
577
- padding: 8px 16px;
578
- background: var(--color-bg);
579
- border: 1px solid var(--color-border);
580
- border-radius: var(--radius-sm);
581
- margin-bottom: var(--space-lg);
582
- }
583
-
584
- .revoked-command code {
585
- font-family: "SF Mono", "Fira Code", "Cascadia Code", monospace;
586
- font-size: 0.8125rem;
587
- color: var(--color-text);
588
- letter-spacing: -0.01em;
589
- }
590
-
591
- .revoked-actions {
592
- display: flex;
593
- gap: var(--space-sm);
594
- width: 100%;
595
- max-width: 280px;
596
- }
597
-
598
- .revoked-actions .btn {
599
- flex: 1;
600
- }
601
-
602
- .spinner {
603
- width: 24px;
604
- height: 24px;
605
- border: 2.5px solid var(--color-border);
606
- border-top-color: var(--color-primary);
607
- border-radius: var(--radius-full);
608
- animation: spin 0.7s linear infinite;
609
- }
610
-
611
- .spinner-lg {
612
- width: 40px;
613
- height: 40px;
614
- border-width: 3px;
615
- }
616
-
617
- .capability-toggles-loading {
618
- display: flex;
619
- justify-content: center;
620
- padding: var(--space-lg);
621
- }
622
-
623
- @keyframes spin {
624
- to {
625
- transform: rotate(360deg);
626
- }
627
- }
628
-
629
- /* ===== Session Composer ===== */
630
- .session-composer {
631
- background: var(--color-surface);
632
- border-radius: var(--radius-md);
633
- border: 1px solid var(--color-border);
634
- box-shadow: var(--shadow-sm);
635
- padding: var(--space-sm);
636
- margin-bottom: var(--space-md);
637
- display: flex;
638
- flex-direction: column;
639
- gap: var(--space-sm);
640
- }
641
-
642
- .session-composer:focus-within {
643
- border-color: var(--color-primary);
644
- box-shadow: 0 0 0 2px var(--color-input-focus);
645
- }
646
-
647
- .session-composer-textarea {
648
- width: 100%;
649
- border: none;
650
- resize: vertical;
651
- outline: none;
652
- background: transparent;
653
- color: var(--color-text);
654
- font-family: var(--font-sans);
655
- font-size: 0.9375rem;
656
- line-height: 1.5;
657
- padding: var(--space-xs) var(--space-sm);
658
- min-height: 3.5em;
659
- }
660
-
661
- .session-composer-textarea::placeholder {
662
- color: var(--color-muted);
663
- }
664
-
665
- .session-composer-controls {
666
- display: flex;
667
- align-items: center;
668
- gap: var(--space-sm);
669
- padding-left: var(--space-xs);
670
- }
671
-
672
- .session-composer-yolo {
673
- display: inline-flex;
674
- align-items: center;
675
- gap: 4px;
676
- font-size: 0.8rem;
677
- color: var(--color-text-secondary);
678
- cursor: pointer;
679
- user-select: none;
680
- }
681
-
682
- .session-composer-yolo input {
683
- margin: 0;
684
- cursor: pointer;
685
- }
686
-
687
- .session-composer-controls .chat-send-btn {
688
- margin-left: auto;
689
- }
690
-
691
- /* ===== Task List ===== */
692
- .fab {
693
- position: fixed;
694
- right: var(--space-lg);
695
- bottom: calc(var(--space-lg) + env(safe-area-inset-bottom, 0px));
696
- width: 56px;
697
- height: 56px;
698
- border-radius: 50%;
699
- border: none;
700
- background: var(--color-primary);
701
- color: #fff;
702
- display: inline-flex;
703
- align-items: center;
704
- justify-content: center;
705
- cursor: pointer;
706
- box-shadow: var(--shadow-lg);
707
- transition: background var(--transition-base), transform var(--transition-fast), box-shadow var(--transition-base);
708
- z-index: 50;
709
- -webkit-tap-highlight-color: transparent;
710
- }
711
-
712
- .fab:hover {
713
- background: var(--color-primary-hover);
714
- box-shadow: var(--shadow-xl);
715
- transform: translateY(-1px);
716
- }
717
-
718
- .fab:active {
719
- transform: translateY(0);
720
- }
721
-
722
- .fab:focus-visible {
723
- outline: 2px solid var(--color-primary);
724
- outline-offset: 3px;
725
- }
726
-
727
- .section-label {
728
- font-size: 0.6875rem;
729
- font-weight: 600;
730
- text-transform: uppercase;
731
- letter-spacing: 0.05em;
732
- color: var(--color-muted);
733
- margin: var(--space-md) 0 var(--space-xs);
734
- }
735
-
736
- .agent-picker-section-inline {
737
- display: flex;
738
- align-items: center;
739
- gap: var(--space-xs);
740
- }
741
-
742
- .agent-picker-section-inline .agent-picker-label {
743
- font-size: 0.8rem;
744
- color: var(--color-text-secondary);
745
- white-space: nowrap;
746
- }
747
-
748
- .agent-picker-section-inline .form-select {
749
- width: auto;
750
- min-width: 0;
751
- font-size: 0.8rem;
752
- padding: 4px 8px;
753
- }
754
-
755
- .task-list {
756
- display: flex;
757
- flex-direction: column;
758
- gap: 10px;
759
- padding-bottom: calc(56px + var(--space-lg) * 2 + env(safe-area-inset-bottom, 0px));
760
- }
761
-
762
- /* ===== Task Card ===== */
763
- .task-card {
764
- background: var(--color-surface);
765
- border-radius: var(--radius-md);
766
- border: 1px solid var(--color-border);
767
- box-shadow: var(--shadow-sm);
768
- padding: var(--space-md);
769
- display: flex;
770
- flex-direction: column;
771
- gap: var(--space-sm);
772
- cursor: pointer;
773
- transition: box-shadow var(--transition-base), border-color var(--transition-base);
774
- -webkit-tap-highlight-color: transparent;
775
- }
776
-
777
- .task-card:hover {
778
- box-shadow: var(--shadow-md);
779
- border-color: #CBD5E1;
780
- }
781
-
782
- .task-card-header {
783
- display: flex;
784
- align-items: center;
785
- justify-content: space-between;
786
- gap: var(--space-sm);
787
- }
788
-
789
- .task-card-title-row {
790
- display: flex;
791
- align-items: center;
792
- gap: 10px;
793
- min-width: 0;
794
- flex: 1;
795
- }
796
-
797
- .task-card-name {
798
- font-size: 0.9375rem;
799
- font-weight: 600;
800
- letter-spacing: -0.01em;
801
- color: var(--color-text);
802
- display: -webkit-box;
803
- -webkit-line-clamp: 2;
804
- -webkit-box-orient: vertical;
805
- overflow: hidden;
806
- }
807
-
808
- .task-card-meta {
809
- display: flex;
810
- flex-wrap: wrap;
811
- gap: var(--space-sm);
812
- font-size: 0.75rem;
813
- color: var(--color-text-secondary);
814
- }
815
-
816
- .task-card-agent {
817
- color: var(--color-text-tertiary);
818
- }
819
-
820
- .task-card-last-event-link {
821
- color: var(--color-primary);
822
- cursor: pointer;
823
- text-decoration: underline;
824
- }
825
-
826
- /* ===== Task Card Menu (Desktop Dropdown) ===== */
827
- .task-card-actions {
828
- display: flex;
829
- gap: var(--space-xs);
830
- flex-shrink: 0;
831
- }
832
-
833
- .task-card-menu {
834
- position: relative;
835
- }
836
-
837
- .task-card-menu-btn {
838
- background: none;
839
- border: none;
840
- color: var(--color-text-secondary);
841
- font-size: 1.5rem;
842
- min-width: 44px;
843
- min-height: 44px;
844
- display: flex;
845
- align-items: center;
846
- justify-content: center;
847
- border-radius: var(--radius-sm);
848
- cursor: pointer;
849
- line-height: 1;
850
- }
851
-
852
- .task-card-menu-btn:hover {
853
- background: var(--color-hover);
854
- color: var(--color-text);
855
- }
856
-
857
- .task-card-menu-dropdown {
858
- position: absolute;
859
- right: 0;
860
- top: 100%;
861
- margin-top: 4px;
862
- background: var(--color-surface);
863
- border: 1px solid var(--color-border);
864
- border-radius: var(--radius-md);
865
- box-shadow: var(--shadow-md);
866
- min-width: 150px;
867
- z-index: 10;
868
- overflow: hidden;
869
- }
870
-
871
- .task-card-menu-dropdown button {
872
- display: flex;
873
- align-items: center;
874
- gap: var(--space-sm);
875
- width: 100%;
876
- text-align: left;
877
- padding: var(--space-sm) var(--space-md);
878
- background: none;
879
- border: none;
880
- font-size: 0.9375rem;
881
- color: var(--color-text);
882
- cursor: pointer;
883
- white-space: nowrap;
884
- }
885
-
886
- .task-card-menu-dropdown button:hover {
887
- background: var(--color-hover);
888
- }
889
-
890
- .task-card-menu-dropdown .menu-item-danger {
891
- color: var(--color-error);
892
- }
893
-
894
- .menu-icon {
895
- display: inline-flex;
896
- align-items: center;
897
- justify-content: center;
898
- width: 20px;
899
- height: 20px;
900
- font-size: 0.875rem;
901
- flex-shrink: 0;
902
- line-height: 1;
903
- }
904
-
905
- /* ===== Bottom Sheet (Mobile) ===== */
906
- .bottom-sheet-overlay {
907
- position: fixed;
908
- inset: 0;
909
- background: var(--color-overlay);
910
- z-index: 1000;
911
- display: flex;
912
- align-items: flex-end;
913
- justify-content: center;
914
- backdrop-filter: blur(4px);
915
- animation: fadeIn var(--transition-fast);
916
- }
917
-
918
- @keyframes fadeIn {
919
- from { opacity: 0; }
920
- to { opacity: 1; }
921
- }
922
-
923
- .bottom-sheet {
924
- background: var(--color-surface);
925
- border-radius: var(--radius-lg) var(--radius-lg) 0 0;
926
- width: 100%;
927
- max-width: 480px;
928
- padding: var(--space-sm) var(--space-md) var(--space-xl);
929
- box-shadow: var(--shadow-xl);
930
- animation: sheetSlideUp 0.25s cubic-bezier(0.16, 1, 0.3, 1);
931
- }
932
-
933
- @keyframes sheetSlideUp {
934
- from { transform: translateY(100%); }
935
- to { transform: translateY(0); }
936
- }
937
-
938
- .bottom-sheet-handle {
939
- width: 36px;
940
- height: 4px;
941
- background: var(--color-border);
942
- border-radius: 2px;
943
- margin: 0 auto var(--space-md);
944
- }
945
-
946
- .bottom-sheet-title {
947
- font-size: 0.9375rem;
948
- font-weight: 600;
949
- color: var(--color-text);
950
- padding: 0 var(--space-xs) var(--space-md);
951
- white-space: nowrap;
952
- overflow: hidden;
953
- text-overflow: ellipsis;
954
- }
955
-
956
- .bottom-sheet-actions {
957
- display: flex;
958
- flex-direction: column;
959
- }
960
-
961
- .bottom-sheet-actions button {
962
- display: flex;
963
- align-items: center;
964
- gap: var(--space-md);
965
- width: 100%;
966
- text-align: left;
967
- padding: var(--space-md);
968
- background: none;
969
- border: none;
970
- border-radius: var(--radius-sm);
971
- font-size: 0.9375rem;
972
- font-family: var(--font-sans);
973
- color: var(--color-text);
974
- cursor: pointer;
975
- transition: background var(--transition-fast);
976
- }
977
-
978
- .bottom-sheet-actions button:active {
979
- background: var(--color-hover);
980
- }
981
-
982
- .bottom-sheet-actions .menu-item-danger {
983
- color: var(--color-error);
984
- }
985
-
986
- /* ===== Task Form Overlay ===== */
987
- .task-form-overlay {
988
- position: fixed;
989
- inset: 0;
990
- background: transparent;
991
- display: flex;
992
- align-items: stretch;
993
- justify-content: center;
994
- z-index: 100;
995
- padding: 0;
996
- overflow: hidden;
997
- overscroll-behavior: contain;
998
- }
999
-
1000
- .task-form {
1001
- background: var(--color-surface);
1002
- border-radius: 0;
1003
- padding: var(--space-lg) var(--space-md);
1004
- width: 100%;
1005
- max-width: none;
1006
- max-height: none;
1007
- overflow-y: auto;
1008
- animation: slideUp 0.25s cubic-bezier(0.16, 1, 0.3, 1);
1009
- display: flex;
1010
- flex-direction: column;
1011
- gap: var(--space-md);
1012
- }
1013
-
1014
- @media (min-width: 600px) {
1015
- .task-form-overlay {
1016
- background: var(--color-overlay);
1017
- backdrop-filter: blur(4px);
1018
- align-items: center;
1019
- padding: var(--space-md);
1020
- }
1021
-
1022
- .task-form {
1023
- border-radius: var(--radius-lg);
1024
- box-shadow: var(--shadow-xl);
1025
- max-width: 540px;
1026
- max-height: 90dvh;
1027
- padding: var(--space-lg);
1028
- }
1029
- }
1030
-
1031
- @keyframes slideUp {
1032
- from {
1033
- transform: translateY(20px);
1034
- opacity: 0;
1035
- }
1036
- to {
1037
- transform: translateY(0);
1038
- opacity: 1;
1039
- }
1040
- }
1041
-
1042
- .task-form-header {
1043
- display: flex;
1044
- align-items: center;
1045
- justify-content: space-between;
1046
- }
1047
-
1048
- .task-form h2 {
1049
- font-size: 1.0625rem;
1050
- font-weight: 700;
1051
- letter-spacing: -0.02em;
1052
- margin-bottom: 0;
1053
- }
1054
-
1055
- .plan-actions {
1056
- display: flex;
1057
- gap: var(--space-sm);
1058
- flex-wrap: wrap;
1059
- }
1060
-
1061
- .permissions-dialog {
1062
- display: flex;
1063
- flex-direction: column;
1064
- gap: var(--space-md);
1065
- overflow: hidden;
1066
- flex: 1;
1067
- min-height: 0;
1068
- }
1069
-
1070
- .permissions-dialog h2 {
1071
- margin: 0;
1072
- font-size: 1.125rem;
1073
- }
1074
-
1075
- .permissions-dialog-scroll {
1076
- flex: 1;
1077
- min-height: 0;
1078
- overflow-y: auto;
1079
- }
1080
-
1081
- .permissions-empty {
1082
- color: var(--color-text-secondary);
1083
- font-size: 0.875rem;
1084
- font-style: italic;
1085
- margin: var(--space-md) 0;
1086
- }
1087
-
1088
- .permissions-section {
1089
- border-top: 1px solid var(--color-border);
1090
- padding-top: var(--space-md);
1091
- margin-top: var(--space-md);
1092
- }
1093
-
1094
- .permissions-section h3 {
1095
- margin: 0 0 var(--space-xs) 0;
1096
- font-size: 0.95rem;
1097
- }
1098
-
1099
- .permissions-list {
1100
- margin: 0;
1101
- padding-left: 1.25em;
1102
- }
1103
-
1104
- .permission-item {
1105
- margin-bottom: var(--space-sm);
1106
- display: flex;
1107
- flex-direction: column;
1108
- }
1109
-
1110
- .permission-tool {
1111
- font-weight: 600;
1112
- font-family: var(--font-mono, monospace);
1113
- }
1114
-
1115
- .permission-desc {
1116
- color: var(--color-text-secondary);
1117
- font-size: 0.9em;
1118
- }
1119
-
1120
- .permissions-dialog-actions {
1121
- display: flex;
1122
- gap: var(--space-sm);
1123
- align-items: center;
1124
- justify-content: flex-end;
1125
- }
1126
-
1127
- @media (min-width: 600px) {
1128
- .permissions-dialog {
1129
- max-width: none;
1130
- }
1131
- }
1132
-
1133
- .result-times {
1134
- display: flex;
1135
- flex-direction: column;
1136
- gap: var(--space-xs);
1137
- font-size: 0.8125rem;
1138
- color: var(--color-text-secondary);
1139
- margin-bottom: var(--space-sm);
1140
- }
1141
-
1142
- .skeleton-line {
1143
- height: 0.875rem;
1144
- border-radius: var(--radius-sm);
1145
- background: var(--color-border);
1146
- animation: skeleton-pulse 1.2s ease-in-out infinite;
1147
- }
1148
-
1149
- @keyframes skeleton-pulse {
1150
- 0%, 100% { opacity: 0.4; }
1151
- 50% { opacity: 1; }
1152
- }
1153
-
1154
- .granted-permissions-row {
1155
- flex-basis: 100%;
1156
- }
1157
-
1158
- .granted-permissions-row .btn-link {
1159
- padding: 0;
1160
- }
1161
-
1162
- .schedule-section {
1163
- display: flex;
1164
- flex-direction: column;
1165
- gap: var(--space-sm);
1166
- }
1167
-
1168
- .schedule-section-title {
1169
- font-size: 0.75rem;
1170
- font-weight: 600;
1171
- text-transform: uppercase;
1172
- letter-spacing: 0.05em;
1173
- color: var(--color-muted);
1174
- margin: 0;
1175
- }
1176
-
1177
- .schedule-section-hint {
1178
- font-weight: 400;
1179
- text-transform: none;
1180
- letter-spacing: 0;
1181
- color: var(--color-text-secondary);
1182
- margin-left: 6px;
1183
- }
1184
-
1185
- .schedule-reactive {
1186
- display: flex;
1187
- flex-direction: column;
1188
- gap: var(--space-xs);
1189
- }
1190
-
1191
- .yolo-inline {
1192
- display: inline-flex;
1193
- align-items: center;
1194
- gap: 4px;
1195
- font-size: 0.8rem;
1196
- color: var(--color-text-secondary);
1197
- cursor: pointer;
1198
- user-select: none;
1199
- white-space: nowrap;
1200
- }
1201
-
1202
- .yolo-inline input {
1203
- margin: 0;
1204
- cursor: pointer;
1205
- }
1206
-
1207
- .yolo-warning {
1208
- flex-basis: 100%;
1209
- margin: 0;
1210
- font-size: 0.75rem;
1211
- color: var(--color-text-secondary);
1212
- line-height: 1.4;
1213
- }
1214
-
1215
- .trigger-row-card {
1216
- display: flex;
1217
- align-items: center;
1218
- gap: 8px;
1219
- padding: 4px 0;
1220
- }
1221
-
1222
- .trigger-row-content {
1223
- display: flex;
1224
- flex-direction: column;
1225
- gap: 4px;
1226
- flex: 1;
1227
- min-width: 0;
1228
- }
1229
-
1230
- .trigger-row-top {
1231
- display: flex;
1232
- align-items: center;
1233
- gap: 8px;
1234
- }
1235
-
1236
- .trigger-row-top .form-select {
1237
- flex: 0 0 auto;
1238
- width: auto;
1239
- }
1240
-
1241
- .trigger-row-top .form-input {
1242
- flex: 1;
1243
- }
1244
-
1245
- .trigger-details {
1246
- display: flex;
1247
- gap: 6px;
1248
- }
1249
-
1250
- .trigger-details .form-input[type="date"] {
1251
- flex: 1;
1252
- min-width: 0;
1253
- }
1254
-
1255
- .trigger-details .form-input[type="time"] {
1256
- flex: 0 0 auto;
1257
- width: auto;
1258
- }
1259
-
1260
- .schedule-section > .form-select,
1261
- .trigger-row-card .form-select,
1262
- .trigger-row-card .form-input {
1263
- margin-bottom: 0;
1264
- font-size: 0.8125rem;
1265
- padding: 6px 8px;
1266
- height: 32px;
1267
- box-sizing: border-box;
1268
- min-width: 0;
1269
- }
1270
-
1271
- .schedule-section > .form-select {
1272
- width: 100%;
1273
- }
1274
-
1275
- .trigger-row-card .form-select,
1276
- .trigger-row-card .form-input {
1277
- flex: 1;
1278
- }
1279
-
1280
- .trigger-remove-btn {
1281
- display: inline-flex;
1282
- align-items: center;
1283
- justify-content: center;
1284
- width: 26px;
1285
- height: 26px;
1286
- border: none;
1287
- border-radius: var(--radius-full);
1288
- background: transparent;
1289
- color: var(--color-muted);
1290
- font-size: 1.1rem;
1291
- line-height: 1;
1292
- cursor: pointer;
1293
- transition: all var(--transition-fast);
1294
- flex-shrink: 0;
1295
- }
1296
-
1297
- .trigger-remove-btn:hover {
1298
- background: var(--color-error-bg);
1299
- color: var(--color-error);
1300
- }
1301
-
1302
- .trigger-add-btn {
1303
- display: inline-flex;
1304
- align-items: center;
1305
- gap: 4px;
1306
- border: 1px dashed var(--color-border);
1307
- border-radius: var(--radius-sm);
1308
- background: transparent;
1309
- color: var(--color-text-secondary);
1310
- font-family: var(--font-sans);
1311
- font-size: 0.8125rem;
1312
- font-weight: 500;
1313
- padding: 8px 14px;
1314
- cursor: pointer;
1315
- transition: all var(--transition-fast);
1316
- width: 100%;
1317
- justify-content: center;
1318
- }
1319
-
1320
- .trigger-add-btn:hover {
1321
- border-color: var(--color-primary);
1322
- color: var(--color-primary);
1323
- background: var(--color-primary-subtle);
1324
- }
1325
-
1326
- .form-select {
1327
- width: auto;
1328
- min-width: 80px;
1329
- }
1330
-
1331
- .toggles-section {
1332
- display: flex;
1333
- flex-direction: column;
1334
- gap: 10px;
1335
- margin-bottom: var(--space-md);
1336
- }
1337
-
1338
- .toggle-label {
1339
- display: flex;
1340
- align-items: center;
1341
- gap: 10px;
1342
- font-size: 0.875rem;
1343
- font-weight: 500;
1344
- cursor: pointer;
1345
- -webkit-tap-highlight-color: transparent;
1346
- color: var(--color-text);
1347
- }
1348
-
1349
- .toggle-label input[type="checkbox"] {
1350
- width: 16px;
1351
- height: 16px;
1352
- accent-color: var(--color-primary);
1353
- border-radius: 4px;
1354
- }
1355
-
1356
- .toggles-group {
1357
- display: flex;
1358
- flex-direction: column;
1359
- gap: var(--space-xs);
1360
- }
1361
-
1362
- .command-section {
1363
- margin-bottom: 0;
1364
- }
1365
-
1366
- .command-section-active {
1367
- }
1368
-
1369
- .command-section-active .toggle-label {
1370
- margin-bottom: 0;
1371
- }
1372
-
1373
- .command-help-text {
1374
- font-size: 0.75rem;
1375
- color: var(--color-text-secondary);
1376
- line-height: 1.4;
1377
- margin: 6px 0 10px 0;
1378
- }
1379
-
1380
- .command-section-active .form-input {
1381
- font-size: 0.8125rem;
1382
- padding: 6px 8px;
1383
- height: 32px;
1384
- box-sizing: border-box;
1385
- }
1386
-
1387
- .form-actions {
1388
- display: flex;
1389
- gap: var(--space-sm);
1390
- position: sticky;
1391
- bottom: 0;
1392
- background: var(--color-surface);
1393
- padding: var(--space-sm) 0;
1394
- }
1395
-
1396
- /* ===== Confirmation Modal ===== */
1397
- .confirm-modal-overlay {
1398
- position: fixed;
1399
- inset: 0;
1400
- background: var(--color-overlay);
1401
- display: flex;
1402
- align-items: center;
1403
- justify-content: center;
1404
- z-index: 1000;
1405
- padding: var(--space-md);
1406
- backdrop-filter: blur(4px);
1407
- }
1408
-
1409
- .confirm-modal {
1410
- background: var(--color-surface);
1411
- border-radius: var(--radius-lg);
1412
- border: 1px solid var(--color-border);
1413
- padding: var(--space-xl);
1414
- width: 100%;
1415
- max-width: 380px;
1416
- text-align: center;
1417
- box-shadow: var(--shadow-xl);
1418
- animation: slideUp 0.25s cubic-bezier(0.16, 1, 0.3, 1);
1419
- }
1420
-
1421
- .confirm-modal-title {
1422
- font-size: 1.125rem;
1423
- font-weight: 700;
1424
- letter-spacing: -0.02em;
1425
- margin-bottom: var(--space-xs);
1426
- }
1427
-
1428
- .confirm-modal-subtitle {
1429
- font-size: 0.8rem;
1430
- color: var(--color-muted);
1431
- margin-bottom: var(--space-sm);
1432
- }
1433
-
1434
- .confirm-modal-message {
1435
- font-size: 0.9375rem;
1436
- color: var(--color-text-secondary);
1437
- margin-bottom: var(--space-lg);
1438
- line-height: 1.5;
1439
- }
1440
-
1441
- .confirm-modal-actions {
1442
- display: flex;
1443
- gap: var(--space-sm);
1444
- justify-content: center;
1445
- }
1446
-
1447
- .confirm-modal-actions .btn {
1448
- flex: 1;
1449
- padding: 10px var(--space-lg);
1450
- font-size: 0.875rem;
1451
- }
1452
-
1453
- .permission-modal {
1454
- text-align: left;
1455
- max-width: 400px;
1456
- }
1457
-
1458
- .permission-modal .confirm-modal-title {
1459
- text-align: center;
1460
- }
1461
-
1462
- .permission-modal .confirm-modal-message {
1463
- text-align: center;
1464
- word-break: break-word;
1465
- }
1466
-
1467
- .permission-list {
1468
- display: flex;
1469
- flex-direction: column;
1470
- gap: var(--space-xs);
1471
- margin-bottom: var(--space-lg);
1472
- }
1473
-
1474
- .permission-item {
1475
- display: flex;
1476
- flex-direction: column;
1477
- gap: 2px;
1478
- padding: var(--space-sm);
1479
- background: var(--color-hover);
1480
- border-radius: var(--radius-sm);
1481
- }
1482
-
1483
- .permission-name {
1484
- font-size: 0.8125rem;
1485
- font-weight: 600;
1486
- color: var(--color-text);
1487
- }
1488
-
1489
- .permission-desc {
1490
- font-size: 0.75rem;
1491
- color: var(--color-text-secondary);
1492
- line-height: 1.4;
1493
- }
1494
-
1495
- .permission-actions {
1496
- display: flex;
1497
- gap: var(--space-sm);
1498
- }
1499
-
1500
- .permission-actions .btn {
1501
- flex: 1;
1502
- padding: 10px var(--space-md);
1503
- font-size: 0.875rem;
1504
- }
1505
-
1506
- .permission-abort-link {
1507
- display: block;
1508
- width: 100%;
1509
- margin-top: var(--space-sm);
1510
- background: none;
1511
- border: none;
1512
- color: var(--color-error);
1513
- font-size: 0.8125rem;
1514
- cursor: pointer;
1515
- text-align: center;
1516
- padding: var(--space-xs) 0;
1517
- opacity: 0.8;
1518
- }
1519
-
1520
- .permission-abort-link:hover {
1521
- opacity: 1;
1522
- text-decoration: underline;
1523
- }
1524
-
1525
- /* ===== Input Request Modal ===== */
1526
- .input-modal {
1527
- text-align: left;
1528
- max-width: 400px;
1529
- }
1530
-
1531
- .input-modal .confirm-modal-title {
1532
- text-align: center;
1533
- }
1534
-
1535
- .input-modal .confirm-modal-message {
1536
- text-align: center;
1537
- word-break: break-word;
1538
- }
1539
-
1540
- .input-list {
1541
- display: flex;
1542
- flex-direction: column;
1543
- gap: var(--space-md);
1544
- margin-bottom: var(--space-lg);
1545
- }
1546
-
1547
- .input-item {
1548
- display: flex;
1549
- flex-direction: column;
1550
- gap: var(--space-xs);
1551
- }
1552
-
1553
- .input-label {
1554
- font-size: 0.8125rem;
1555
- font-weight: 600;
1556
- color: var(--color-text);
1557
- }
1558
-
1559
- .input-field {
1560
- width: 100%;
1561
- padding: var(--space-sm) var(--space-md);
1562
- font-size: 0.875rem;
1563
- border: 1px solid var(--color-border);
1564
- border-radius: var(--radius-sm);
1565
- background: var(--color-surface);
1566
- color: var(--color-text);
1567
- box-sizing: border-box;
1568
- }
1569
-
1570
- .input-field:focus {
1571
- outline: none;
1572
- border-color: var(--color-primary);
1573
- box-shadow: 0 0 0 2px rgba(var(--color-primary-rgb, 99, 102, 241), 0.2);
1574
- }
1575
-
1576
- .input-actions {
1577
- display: flex;
1578
- gap: var(--space-sm);
1579
- }
1580
-
1581
- .input-actions .btn {
1582
- flex: 1;
1583
- padding: 10px var(--space-md);
1584
- font-size: 0.875rem;
1585
- }
1586
-
1587
- /* ===== Host Picker ===== */
1588
- .host-picker-inline {
1589
- border: 1px solid var(--color-border);
1590
- border-radius: var(--radius-md);
1591
- overflow: hidden;
1592
- }
1593
-
1594
- .host-picker-list {
1595
- max-height: 240px;
1596
- overflow-y: auto;
1597
- padding: var(--space-xs) 0;
1598
- }
1599
-
1600
- .host-picker-item-wrapper {
1601
- position: relative;
1602
- }
1603
-
1604
- .host-picker-item {
1605
- display: flex;
1606
- align-items: center;
1607
- gap: 8px;
1608
- width: 100%;
1609
- padding: 8px 12px;
1610
- border: none;
1611
- background: none;
1612
- cursor: pointer;
1613
- font-family: var(--font-sans);
1614
- font-size: 0.8125rem;
1615
- color: var(--color-text);
1616
- text-align: left;
1617
- transition: background var(--transition-fast);
1618
- -webkit-tap-highlight-color: transparent;
1619
- }
1620
-
1621
- .host-picker-item:hover {
1622
- background: var(--color-border-subtle);
1623
- }
1624
-
1625
- .host-picker-item-active {
1626
- background: var(--color-primary-subtle);
1627
- }
1628
-
1629
- .host-picker-item-active:hover {
1630
- background: var(--color-primary-subtle);
1631
- }
1632
-
1633
- .host-picker-item-name {
1634
- flex: 1;
1635
- min-width: 0;
1636
- overflow: hidden;
1637
- text-overflow: ellipsis;
1638
- white-space: nowrap;
1639
- display: flex;
1640
- align-items: center;
1641
- gap: 6px;
1642
- }
1643
-
1644
- .host-picker-pending {
1645
- font-size: 0.6875rem;
1646
- font-weight: 500;
1647
- color: var(--color-muted);
1648
- background: var(--color-border-subtle);
1649
- padding: 1px 6px;
1650
- border-radius: 4px;
1651
- flex-shrink: 0;
1652
- }
1653
-
1654
- .host-picker-item-actions {
1655
- flex-shrink: 0;
1656
- width: 24px;
1657
- display: flex;
1658
- align-items: center;
1659
- justify-content: center;
1660
- }
1661
-
1662
- .host-picker-edit-btn {
1663
- display: flex;
1664
- align-items: center;
1665
- justify-content: center;
1666
- width: 24px;
1667
- height: 24px;
1668
- border: none;
1669
- background: none;
1670
- cursor: pointer;
1671
- color: var(--color-muted);
1672
- border-radius: 4px;
1673
- flex-shrink: 0;
1674
- transition: all var(--transition-fast);
1675
- }
1676
-
1677
- .host-picker-edit-btn:hover {
1678
- color: var(--color-primary);
1679
- background: var(--color-primary-subtle);
1680
- }
1681
-
1682
- .host-picker-rename-input {
1683
- font-size: 0.8125rem !important;
1684
- padding: 3px 6px !important;
1685
- flex: 1;
1686
- min-width: 0;
1687
- }
1688
-
1689
- .host-picker-delete-btn {
1690
- display: flex;
1691
- align-items: center;
1692
- justify-content: center;
1693
- width: 24px;
1694
- height: 24px;
1695
- border: none;
1696
- background: none;
1697
- cursor: pointer;
1698
- color: var(--color-muted);
1699
- border-radius: 4px;
1700
- flex-shrink: 0;
1701
- transition: all var(--transition-fast);
1702
- }
1703
-
1704
- .host-picker-delete-btn:hover {
1705
- color: var(--color-error);
1706
- background: var(--color-error-bg);
1707
- }
1708
-
1709
-
1710
- /* ===== Hamburger button ===== */
1711
-
1712
- .hamburger-btn {
1713
- display: flex;
1714
- align-items: center;
1715
- justify-content: center;
1716
- width: 40px;
1717
- height: 40px;
1718
- padding: 0;
1719
- border: none;
1720
- background: none;
1721
- color: var(--color-text);
1722
- cursor: pointer;
1723
- border-radius: var(--radius-sm);
1724
- transition: background var(--transition-fast);
1725
- }
1726
-
1727
- .hamburger-btn:hover {
1728
- background: var(--color-primary-subtle);
1729
- }
1730
-
1731
- /* ===== Drawer ===== */
1732
-
1733
- .drawer-overlay {
1734
- position: fixed;
1735
- inset: 0;
1736
- background: var(--color-overlay);
1737
- z-index: 100;
1738
- animation: drawerFadeIn 0.2s ease;
1739
- }
1740
-
1741
- .drawer-panel {
1742
- position: fixed;
1743
- top: 0;
1744
- left: 0;
1745
- bottom: 0;
1746
- width: 280px;
1747
- max-width: 80vw;
1748
- background: var(--color-surface);
1749
- box-shadow: var(--shadow-xl);
1750
- z-index: 101;
1751
- display: flex;
1752
- flex-direction: column;
1753
- overflow-y: auto;
1754
- overscroll-behavior: contain;
1755
- animation: drawerSlideIn 0.25s ease;
1756
- }
1757
-
1758
- .drawer-close-btn {
1759
- position: absolute;
1760
- top: 8px;
1761
- right: 8px;
1762
- z-index: 1;
1763
- display: flex;
1764
- align-items: center;
1765
- justify-content: center;
1766
- width: 32px;
1767
- height: 32px;
1768
- padding: 0;
1769
- border: none;
1770
- background: none;
1771
- color: var(--color-text-secondary);
1772
- cursor: pointer;
1773
- border-radius: var(--radius-sm);
1774
- transition: background var(--transition-fast);
1775
- }
1776
-
1777
- .drawer-close-btn:hover {
1778
- background: var(--color-border-subtle);
1779
- color: var(--color-text);
1780
- }
1781
-
1782
- .drawer-section {
1783
- padding: var(--space-md);
1784
- display: flex;
1785
- flex-direction: column;
1786
- gap: var(--space-sm);
1787
- }
1788
-
1789
- .drawer-section-label {
1790
- font-size: 0.6875rem;
1791
- font-weight: 600;
1792
- text-transform: uppercase;
1793
- letter-spacing: 0.05em;
1794
- color: var(--color-muted);
1795
- margin-bottom: var(--space-sm);
1796
- }
1797
-
1798
- .drawer-section-hint {
1799
- font-size: 0.8125rem;
1800
- color: var(--color-muted);
1801
- line-height: 1.45;
1802
- margin: 0 0 var(--space-sm) 0;
1803
- }
1804
-
1805
- .pair-checkbox {
1806
- display: flex;
1807
- align-items: flex-start;
1808
- gap: var(--space-sm);
1809
- padding: var(--space-sm) 0;
1810
- cursor: pointer;
1811
- }
1812
-
1813
- .pair-checkbox input[type="checkbox"] {
1814
- margin-top: 0.2rem;
1815
- flex-shrink: 0;
1816
- }
1817
-
1818
- .pair-checkbox-text {
1819
- display: flex;
1820
- flex-direction: column;
1821
- gap: 0.15rem;
1822
- }
1823
-
1824
- .pair-checkbox-title {
1825
- font-size: 0.9375rem;
1826
- font-weight: 500;
1827
- }
1828
-
1829
- .pair-checkbox-hint {
1830
- font-size: 0.8125rem;
1831
- color: var(--color-muted);
1832
- line-height: 1.4;
1833
- }
1834
-
1835
- .drawer-toggle-group {
1836
- display: flex;
1837
- flex-direction: column;
1838
- gap: var(--space-sm);
1839
- }
1840
-
1841
- .drawer-toggle-group-divided {
1842
- border-top: 1px solid var(--color-border);
1843
- padding-top: var(--space-sm);
1844
- margin-top: var(--space-xs);
1845
- }
1846
-
1847
- .drawer-toggle {
1848
- display: flex;
1849
- align-items: center;
1850
- justify-content: space-between;
1851
- gap: var(--space-sm);
1852
- }
1853
-
1854
- .drawer-toggle-label {
1855
- font-size: 0.85rem;
1856
- color: var(--color-text);
1857
- }
1858
-
1859
- .toggle-switch {
1860
- position: relative;
1861
- width: 40px;
1862
- height: 22px;
1863
- border-radius: 11px;
1864
- border: none;
1865
- background: var(--color-border);
1866
- cursor: pointer;
1867
- padding: 0;
1868
- transition: background 0.2s;
1869
- flex-shrink: 0;
1870
- }
1871
-
1872
- .toggle-switch-on {
1873
- background: var(--color-primary);
1874
- }
1875
-
1876
- .toggle-switch-thumb {
1877
- position: absolute;
1878
- top: 2px;
1879
- left: 2px;
1880
- width: 18px;
1881
- height: 18px;
1882
- border-radius: 50%;
1883
- background: white;
1884
- transition: transform 0.2s;
1885
- }
1886
-
1887
- .toggle-switch-on .toggle-switch-thumb {
1888
- transform: translateX(18px);
1889
- }
1890
-
1891
- .toggle-switch:disabled {
1892
- opacity: 0.5;
1893
- cursor: not-allowed;
1894
- }
1895
-
1896
- .drawer-footer {
1897
- margin-top: auto;
1898
- padding: var(--space-md);
1899
- }
1900
-
1901
- .drawer-version {
1902
- font-size: 0.75rem;
1903
- color: var(--color-muted);
1904
- }
1905
-
1906
- .drawer-host-time {
1907
- font-size: 0.75rem;
1908
- color: var(--color-muted);
1909
- margin-bottom: var(--space-xs);
1910
- }
1911
-
1912
- .drawer-legal {
1913
- font-size: 0.75rem;
1914
- color: var(--color-muted);
1915
- margin-top: var(--space-xs);
1916
- }
1917
-
1918
- .drawer-legal a {
1919
- color: var(--color-muted);
1920
- text-decoration: none;
1921
- }
1922
-
1923
- .drawer-legal a:hover {
1924
- text-decoration: underline;
1925
- }
1926
-
1927
- .drawer-legal-sep {
1928
- margin: 0 var(--space-xs);
1929
- }
1930
-
1931
- .drawer-divider {
1932
- height: 1px;
1933
- background: var(--color-border);
1934
- margin: 0 var(--space-md);
1935
- }
1936
-
1937
- @keyframes drawerFadeIn {
1938
- from { opacity: 0; }
1939
- to { opacity: 1; }
1940
- }
1941
-
1942
- @keyframes drawerFadeOut {
1943
- from { opacity: 1; }
1944
- to { opacity: 0; }
1945
- }
1946
-
1947
- @keyframes drawerSlideIn {
1948
- from { transform: translateX(-100%); }
1949
- to { transform: translateX(0); }
1950
- }
1951
-
1952
- @keyframes drawerSlideOut {
1953
- from { transform: translateX(0); }
1954
- to { transform: translateX(-100%); }
1955
- }
1956
-
1957
- .drawer-overlay-closing {
1958
- animation: drawerFadeOut 0.2s ease forwards;
1959
- }
1960
-
1961
- .drawer-panel-closing {
1962
- animation: drawerSlideOut 0.2s ease forwards;
1963
- }
1964
-
1965
- /* ===== Tab bar ===== */
1966
-
1967
- .app-header {
1968
- position: sticky;
1969
- top: 0;
1970
- z-index: 10;
1971
- background: color-mix(in srgb, var(--color-surface) 92%, transparent);
1972
- border-bottom: 1px solid var(--color-border);
1973
- backdrop-filter: blur(8px);
1974
- }
1975
-
1976
- .app-title-bar {
1977
- position: relative;
1978
- display: flex;
1979
- align-items: center;
1980
- justify-content: center;
1981
- padding: 8px 0;
1982
- }
1983
-
1984
- .app-title-bar .hamburger-btn {
1985
- position: absolute;
1986
- left: 4px;
1987
- top: 50%;
1988
- transform: translateY(-50%);
1989
- }
1990
-
1991
- .app-title {
1992
- margin: 0;
1993
- font-size: 1rem;
1994
- font-weight: 700;
1995
- letter-spacing: -0.01em;
1996
- color: #1E3A8A;
1997
- }
1998
-
1999
- .conn-status {
2000
- position: absolute;
2001
- right: 4px;
2002
- top: 50%;
2003
- transform: translateY(-50%);
2004
- display: inline-flex;
2005
- color: #60A5FA;
2006
- }
2007
-
2008
- .conn-status--lan { color: #2563EB; }
2009
- .conn-status--disconnected { color: #DC2626; }
2010
-
2011
- .conn-status-btn {
2012
- background: none;
2013
- border: none;
2014
- padding: 4px 8px;
2015
- cursor: pointer;
2016
- line-height: 1;
2017
- display: inline-flex;
2018
- align-items: center;
2019
- justify-content: center;
2020
- border-radius: 6px;
2021
- color: inherit;
2022
- }
2023
-
2024
- .conn-status-btn:hover,
2025
- .conn-status-btn:focus-visible {
2026
- background: var(--color-bg);
2027
- outline: none;
2028
- }
2029
-
2030
- .conn-status-popover {
2031
- position: absolute;
2032
- top: calc(100% + 6px);
2033
- right: 0;
2034
- background: var(--color-text);
2035
- color: var(--color-surface);
2036
- font-size: 0.75rem;
2037
- font-weight: 500;
2038
- padding: 6px 10px;
2039
- border-radius: 6px;
2040
- white-space: nowrap;
2041
- pointer-events: none;
2042
- opacity: 0;
2043
- transform: translateY(-2px);
2044
- transition: opacity 0.12s, transform 0.12s;
2045
- z-index: 20;
2046
- }
2047
-
2048
- .conn-status:hover .conn-status-popover,
2049
- .conn-status-popover--open {
2050
- opacity: 1;
2051
- transform: translateY(0);
2052
- }
2053
-
2054
- .conn-status--connecting .conn-status-btn > svg {
2055
- animation: conn-status-pulse 1.2s ease-in-out infinite;
2056
- }
2057
-
2058
- @keyframes conn-status-pulse {
2059
- 0%, 100% { opacity: 0.35; }
2060
- 50% { opacity: 1; }
2061
- }
2062
-
2063
- .tab-bar {
2064
- display: flex;
2065
- align-items: center;
2066
- }
2067
-
2068
- .tab-btn {
2069
- flex: 1;
2070
- display: flex;
2071
- align-items: center;
2072
- justify-content: center;
2073
- gap: 6px;
2074
- padding: 12px 0;
2075
- border: none;
2076
- background: none;
2077
- font-family: var(--font-sans);
2078
- font-size: 0.875rem;
2079
- font-weight: 600;
2080
- color: var(--color-text-secondary);
2081
- cursor: pointer;
2082
- border-bottom: 2px solid transparent;
2083
- transition: color var(--transition-fast), border-color var(--transition-fast);
2084
- }
2085
-
2086
- .tab-icon {
2087
- flex-shrink: 0;
2088
- }
2089
-
2090
- .tab-btn:hover {
2091
- color: var(--color-text);
2092
- }
2093
-
2094
- .tab-btn-active {
2095
- color: var(--color-primary);
2096
- border-bottom-color: var(--color-primary);
2097
- }
2098
-
2099
- /* ===== Sessions view ===== */
2100
-
2101
- .sessions-view {
2102
- flex: 1;
2103
- display: flex;
2104
- flex-direction: column;
2105
- align-items: center;
2106
- justify-content: center;
2107
- }
2108
-
2109
- .sessions-card {
2110
- background: var(--color-surface);
2111
- border-radius: var(--radius-md);
2112
- border: 1px solid var(--color-border);
2113
- box-shadow: var(--shadow-sm);
2114
- padding: var(--space-md);
2115
- display: flex;
2116
- align-items: center;
2117
- gap: var(--space-sm);
2118
- cursor: pointer;
2119
- transition: box-shadow var(--transition-base), border-color var(--transition-base);
2120
- -webkit-tap-highlight-color: transparent;
2121
- }
2122
-
2123
- .sessions-card:hover {
2124
- box-shadow: var(--shadow-md);
2125
- border-color: #CBD5E1;
2126
- }
2127
-
2128
- .sessions-card-body {
2129
- flex: 1;
2130
- min-width: 0;
2131
- display: flex;
2132
- flex-direction: column;
2133
- gap: var(--space-xs);
2134
- }
2135
-
2136
- .sessions-card-name {
2137
- font-size: 0.9375rem;
2138
- font-weight: 600;
2139
- letter-spacing: -0.01em;
2140
- color: var(--color-text);
2141
- white-space: nowrap;
2142
- overflow: hidden;
2143
- text-overflow: ellipsis;
2144
- }
2145
-
2146
- .sessions-card-meta {
2147
- display: flex;
2148
- flex-wrap: wrap;
2149
- gap: var(--space-sm);
2150
- font-size: 0.75rem;
2151
- color: var(--color-text-secondary);
2152
- }
2153
-
2154
- .sessions-card-chevron {
2155
- flex-shrink: 0;
2156
- align-self: center;
2157
- color: var(--color-text-secondary);
2158
- font-size: 1.25rem;
2159
- line-height: 1;
2160
- opacity: 0.4;
2161
- transition: opacity var(--transition-base);
2162
- }
2163
-
2164
- .sessions-card:hover .sessions-card-chevron {
2165
- opacity: 0.8;
2166
- }
2167
-
2168
- .sessions-filter-chip {
2169
- display: inline-flex;
2170
- align-items: center;
2171
- gap: var(--space-xs);
2172
- padding: 4px 10px;
2173
- font-size: 0.8125rem;
2174
- color: var(--color-text-secondary);
2175
- background: var(--color-bg);
2176
- border: 1px solid var(--color-border);
2177
- border-radius: 999px;
2178
- }
2179
-
2180
- .sessions-filter-chip button {
2181
- display: inline-flex;
2182
- align-items: center;
2183
- justify-content: center;
2184
- border: none;
2185
- background: none;
2186
- cursor: pointer;
2187
- padding: 0;
2188
- color: var(--color-text-secondary);
2189
- font-size: 1rem;
2190
- line-height: 1;
2191
- }
2192
-
2193
- .sessions-filter-chip button:hover {
2194
- color: var(--color-text);
2195
- }
2196
-
2197
- /* ===== Run Detail (inline drill-down) ===== */
2198
-
2199
- .run-detail {
2200
- display: flex;
2201
- flex-direction: column;
2202
- gap: var(--space-md);
2203
- background: var(--color-surface);
2204
- border-radius: var(--radius-md);
2205
- border: 1px solid var(--color-border);
2206
- box-shadow: var(--shadow-sm);
2207
- padding: var(--space-md);
2208
- }
2209
-
2210
- .run-detail-back {
2211
- display: inline-flex;
2212
- align-items: center;
2213
- gap: var(--space-xs);
2214
- border: none;
2215
- background: none;
2216
- cursor: pointer;
2217
- padding: 0;
2218
- color: var(--color-text-secondary);
2219
- font-size: 0.8125rem;
2220
- }
2221
-
2222
- .run-detail-back:hover {
2223
- color: var(--color-text);
2224
- }
2225
-
2226
- /* ===== Chat Thread ===== */
2227
- .chat-thread {
2228
- display: flex;
2229
- flex-direction: column;
2230
- gap: var(--space-sm);
2231
- overflow-y: auto;
2232
- flex: 1;
2233
- min-height: 0;
2234
- }
2235
-
2236
- .chat-message {
2237
- display: flex;
2238
- flex-direction: column;
2239
- gap: var(--space-xs);
2240
- max-width: 85%;
2241
- min-width: 0;
2242
- padding: var(--space-sm) var(--space-md);
2243
- border-radius: var(--radius-md);
2244
- font-size: 0.8125rem;
2245
- line-height: 1.6;
2246
- }
2247
-
2248
- .chat-message--assistant {
2249
- align-self: flex-start;
2250
- background: var(--color-surface);
2251
- border: 1px solid var(--color-border);
2252
- }
2253
-
2254
- .chat-message--user {
2255
- align-self: flex-end;
2256
- background: var(--color-primary-subtle);
2257
- border: 1px solid var(--color-border-subtle);
2258
- }
2259
-
2260
- .chat-message-agent {
2261
- font-size: 0.6875rem;
2262
- font-weight: 500;
2263
- color: var(--color-text-tertiary);
2264
- margin-bottom: var(--space-xs);
2265
- }
2266
-
2267
- .chat-message-content {
2268
- color: var(--color-text);
2269
- overflow-wrap: break-word;
2270
- }
2271
-
2272
- .chat-message-content h1,
2273
- .chat-message-content h2,
2274
- .chat-message-content h3,
2275
- .chat-message-content h4 {
2276
- margin: 0.75em 0 0.25em;
2277
- font-weight: 600;
2278
- }
2279
- .chat-message-content h1 { font-size: 1.1rem; }
2280
- .chat-message-content h2 { font-size: 1rem; }
2281
- .chat-message-content h3 { font-size: 0.9375rem; }
2282
-
2283
- .chat-message-content p {
2284
- margin: 0.5em 0;
2285
- }
2286
-
2287
- .chat-message-content ul,
2288
- .chat-message-content ol {
2289
- margin: 0.5em 0;
2290
- padding-left: 1.5em;
2291
- }
2292
-
2293
- .chat-message-content code {
2294
- font-size: 0.8em;
2295
- background: var(--color-hover);
2296
- padding: 0.15em 0.35em;
2297
- border-radius: 4px;
2298
- }
2299
-
2300
- .chat-message-content pre {
2301
- background: var(--color-bg);
2302
- border-radius: var(--radius-sm);
2303
- padding: var(--space-sm);
2304
- overflow-x: auto;
2305
- margin: 0.5em 0;
2306
- }
2307
-
2308
- .chat-message-content pre code {
2309
- background: none;
2310
- padding: 0;
2311
- }
2312
-
2313
- .chat-message-content table {
2314
- border-collapse: collapse;
2315
- width: 100%;
2316
- margin: 0.5em 0;
2317
- }
2318
-
2319
- .chat-message-content th,
2320
- .chat-message-content td {
2321
- border: 1px solid var(--color-border);
2322
- padding: 0.35em 0.6em;
2323
- text-align: left;
2324
- }
2325
-
2326
- .chat-message-content th {
2327
- background: var(--color-bg);
2328
- font-weight: 600;
2329
- }
2330
-
2331
- .chat-message-meta {
2332
- display: flex;
2333
- align-items: center;
2334
- gap: var(--space-xs);
2335
- font-size: 0.6875rem;
2336
- color: var(--color-muted);
2337
- }
2338
-
2339
- .chat-message-type {
2340
- font-weight: 600;
2341
- text-transform: uppercase;
2342
- letter-spacing: 0.04em;
2343
- font-size: 0.625rem;
2344
- }
2345
-
2346
- .chat-message-attachments {
2347
- display: flex;
2348
- flex-wrap: wrap;
2349
- gap: var(--space-xs);
2350
- }
2351
-
2352
- .chat-attachment-chip {
2353
- display: inline-flex;
2354
- align-items: center;
2355
- padding: 0.2em 0.6em;
2356
- font-size: 0.75rem;
2357
- background: var(--color-bg);
2358
- border: 1px solid var(--color-border);
2359
- border-radius: var(--radius-sm);
2360
- cursor: pointer;
2361
- color: var(--color-primary);
2362
- font-weight: 500;
2363
- }
2364
-
2365
- .chat-attachment-chip:hover {
2366
- background: var(--color-primary-subtle);
2367
- }
2368
-
2369
- .chat-message-report {
2370
- margin-top: var(--space-xs);
2371
- padding: var(--space-sm);
2372
- background: var(--color-bg);
2373
- border-radius: var(--radius-sm);
2374
- border: 1px solid var(--color-border);
2375
- font-size: 0.8125rem;
2376
- line-height: 1.6;
2377
- color: var(--color-text-secondary);
2378
- }
2379
-
2380
- .chat-status {
2381
- display: flex;
2382
- flex-direction: column;
2383
- align-items: center;
2384
- gap: var(--space-xs);
2385
- font-size: 0.6875rem;
2386
- color: var(--color-muted);
2387
- padding: var(--space-xs) 0;
2388
- }
2389
-
2390
- .chat-status > div {
2391
- display: flex;
2392
- align-items: center;
2393
- gap: var(--space-xs);
2394
- }
2395
-
2396
- .chat-status--error {
2397
- color: var(--color-error);
2398
- }
2399
-
2400
- .chat-status-detail {
2401
- margin-top: var(--space-xs);
2402
- padding: var(--space-sm);
2403
- background: var(--color-bg);
2404
- border: 1px solid var(--color-border);
2405
- border-radius: var(--radius-sm);
2406
- font-size: 0.75rem;
2407
- font-family: "SF Mono", "Fira Code", monospace;
2408
- white-space: pre-wrap;
2409
- word-break: break-word;
2410
- max-width: 100%;
2411
- max-height: 200px;
2412
- overflow-y: auto;
2413
- color: var(--color-text-secondary);
2414
- }
2415
-
2416
- .chat-status-time {
2417
- color: var(--color-muted);
2418
- }
2419
-
2420
- .chat-monitoring-indicator {
2421
- display: flex;
2422
- align-items: center;
2423
- justify-content: center;
2424
- gap: var(--space-xs);
2425
- font-size: 0.6875rem;
2426
- color: var(--color-muted);
2427
- padding: var(--space-md) 0;
2428
- }
2429
-
2430
- .chat-monitoring-dot {
2431
- width: 6px;
2432
- height: 6px;
2433
- border-radius: 50%;
2434
- background: var(--color-muted);
2435
- animation: monitoring-pulse 1.5s ease-in-out infinite;
2436
- }
2437
-
2438
- @keyframes monitoring-pulse {
2439
- 0%, 100% { opacity: 0.3; }
2440
- 50% { opacity: 1; }
2441
- }
2442
-
2443
- .chat-abort-bar {
2444
- display: flex;
2445
- justify-content: center;
2446
- padding: var(--space-sm) 0;
2447
- flex-shrink: 0;
2448
- }
2449
-
2450
- .chat-abort-btn {
2451
- color: var(--color-error);
2452
- border-color: var(--color-error);
2453
- }
2454
-
2455
- .chat-abort-btn:hover:not(:disabled) {
2456
- background: var(--color-error-bg);
2457
- }
2458
-
2459
- .chat-stop-btn {
2460
- display: flex;
2461
- align-items: center;
2462
- justify-content: center;
2463
- width: 36px;
2464
- height: 36px;
2465
- padding: 0;
2466
- border-radius: 50%;
2467
- flex-shrink: 0;
2468
- margin-left: auto;
2469
- background: var(--color-error);
2470
- color: white;
2471
- border-color: var(--color-error);
2472
- }
2473
-
2474
- .chat-stop-btn:hover:not(:disabled) {
2475
- background: #dc2626;
2476
- border-color: #dc2626;
2477
- }
2478
-
2479
- .chat-input-bar {
2480
- display: flex;
2481
- gap: var(--space-xs);
2482
- padding: var(--space-sm) 0;
2483
- flex-shrink: 0;
2484
- }
2485
-
2486
- .chat-input {
2487
- flex: 1;
2488
- min-width: 0;
2489
- padding: var(--space-sm) var(--space-md);
2490
- border: 1px solid var(--color-border);
2491
- border-radius: var(--radius-md);
2492
- font-size: 0.8125rem;
2493
- outline: none;
2494
- background: var(--color-surface);
2495
- color: var(--color-text);
2496
- }
2497
-
2498
- .chat-input:focus {
2499
- border-color: var(--color-primary);
2500
- box-shadow: 0 0 0 2px var(--color-primary-subtle);
2501
- }
2502
-
2503
- .chat-input:disabled {
2504
- opacity: 0.6;
2505
- }
2506
-
2507
- .chat-send-btn {
2508
- display: flex;
2509
- align-items: center;
2510
- justify-content: center;
2511
- width: 36px;
2512
- height: 36px;
2513
- padding: 0;
2514
- border-radius: 50%;
2515
- flex-shrink: 0;
2516
- }
2517
-
2518
- /* ===== Report Fullscreen Dialog ===== */
2519
- .report-dialog-overlay {
2520
- position: fixed;
2521
- inset: 0;
2522
- z-index: 1000;
2523
- background: var(--color-overlay);
2524
- display: flex;
2525
- align-items: stretch;
2526
- justify-content: center;
2527
- }
2528
-
2529
- .report-dialog {
2530
- display: flex;
2531
- flex-direction: column;
2532
- width: 100%;
2533
- max-width: 800px;
2534
- background: var(--color-surface);
2535
- overflow: hidden;
2536
- }
2537
-
2538
- .report-dialog-header {
2539
- display: flex;
2540
- align-items: center;
2541
- justify-content: space-between;
2542
- padding: var(--space-sm) var(--space-md);
2543
- border-bottom: 1px solid var(--color-border);
2544
- flex-shrink: 0;
2545
- }
2546
-
2547
- .report-dialog-title {
2548
- font-size: 0.875rem;
2549
- font-weight: 600;
2550
- color: var(--color-text);
2551
- }
2552
-
2553
- .report-dialog-close {
2554
- display: flex;
2555
- align-items: center;
2556
- justify-content: center;
2557
- border: none;
2558
- background: none;
2559
- cursor: pointer;
2560
- color: var(--color-text-secondary);
2561
- padding: 4px;
2562
- border-radius: var(--radius-sm);
2563
- }
2564
-
2565
- .report-dialog-close:hover {
2566
- background: var(--color-hover);
2567
- color: var(--color-text);
2568
- }
2569
-
2570
- .report-dialog-body {
2571
- flex: 1;
2572
- overflow-y: auto;
2573
- padding: var(--space-md);
2574
- font-size: 0.8125rem;
2575
- line-height: 1.6;
2576
- color: var(--color-text);
2577
- }
2578
-
2579
- .report-dialog-body h1,
2580
- .report-dialog-body h2,
2581
- .report-dialog-body h3,
2582
- .report-dialog-body h4 {
2583
- margin: 0.75em 0 0.25em;
2584
- font-weight: 600;
2585
- }
2586
- .report-dialog-body h1 { font-size: 1.1rem; }
2587
- .report-dialog-body h2 { font-size: 1rem; }
2588
- .report-dialog-body h3 { font-size: 0.9375rem; }
2589
-
2590
- .report-dialog-body p { margin: 0.5em 0; }
2591
-
2592
- .report-dialog-body img {
2593
- max-width: 100%;
2594
- height: auto;
2595
- }
2596
-
2597
- .report-dialog-body ul,
2598
- .report-dialog-body ol {
2599
- margin: 0.5em 0;
2600
- padding-left: 1.5em;
2601
- }
2602
-
2603
- .report-dialog-body code {
2604
- font-size: 0.8em;
2605
- background: var(--color-hover);
2606
- padding: 0.15em 0.35em;
2607
- border-radius: 4px;
2608
- }
2609
-
2610
- .report-dialog-body pre {
2611
- background: var(--color-bg);
2612
- border-radius: var(--radius-sm);
2613
- padding: var(--space-sm);
2614
- overflow-x: auto;
2615
- margin: 0.5em 0;
2616
- }
2617
-
2618
- .report-dialog-body pre code {
2619
- background: none;
2620
- padding: 0;
2621
- }
2622
-
2623
- .report-dialog-body table {
2624
- border-collapse: collapse;
2625
- width: 100%;
2626
- margin: 0.5em 0;
2627
- }
2628
-
2629
- .report-dialog-body th,
2630
- .report-dialog-body td {
2631
- border: 1px solid var(--color-border);
2632
- padding: 0.35em 0.6em;
2633
- text-align: left;
2634
- }
2635
-
2636
- .report-dialog-body th {
2637
- background: var(--color-bg);
2638
- font-weight: 600;
2639
- }
2640
-
2641
- .chat-typing-indicator {
2642
- display: flex;
2643
- align-items: center;
2644
- gap: 4px;
2645
- padding: 4px 0;
2646
- }
2647
-
2648
- .chat-typing-indicator span {
2649
- width: 6px;
2650
- height: 6px;
2651
- border-radius: 50%;
2652
- background: var(--color-muted);
2653
- animation: chat-typing 1.4s infinite;
2654
- }
2655
-
2656
- .chat-typing-indicator span:nth-child(2) {
2657
- animation-delay: 0.2s;
2658
- }
2659
-
2660
- .chat-typing-indicator span:nth-child(3) {
2661
- animation-delay: 0.4s;
2662
- }
2663
-
2664
- @keyframes chat-typing {
2665
- 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
2666
- 30% { opacity: 1; transform: scale(1); }
2667
- }
2668
-
2669
- /* ===== Pair consent ===== */
2670
- .pair-consent {
2671
- font-size: 0.75rem;
2672
- color: var(--color-muted);
2673
- text-align: center;
2674
- line-height: 1.5;
2675
- }
2676
-
2677
- .pair-consent a {
2678
- color: var(--color-muted);
2679
- text-decoration: underline;
2680
- }
2681
-
2682
- .pair-consent a:hover {
2683
- color: var(--color-text-secondary);
2684
- }
2685
-
2686
- /* ===== Dashboard content wrapper ===== */
2687
- .dashboard-content {
2688
- display: flex;
2689
- flex-direction: column;
2690
- flex: 1;
2691
- min-height: 100dvh;
2692
- max-width: 800px;
2693
- margin: 0 auto;
2694
- width: 100%;
2695
- }
2696
-
2697
- /* ===== Desktop persistent sidebar ===== */
2698
- .drawer-panel-desktop {
2699
- position: sticky;
2700
- top: 0;
2701
- height: 100dvh;
2702
- width: 320px;
2703
- min-width: 320px;
2704
- background: var(--color-surface);
2705
- border-right: 1px solid var(--color-border);
2706
- display: flex;
2707
- flex-direction: column;
2708
- overflow-y: auto;
2709
- overscroll-behavior: contain;
2710
- animation: none;
2711
- }
2712
-
2713
- /* ===== Desktop adjustments ===== */
2714
- @media (min-width: 768px) {
2715
- .dashboard {
2716
- flex-direction: row;
2717
- }
2718
-
2719
- .dashboard-main {
2720
- padding: var(--space-lg);
2721
- }
2722
-
2723
- .fab {
2724
- right: max(var(--space-lg), calc((100vw - 1080px) / 2));
2725
- }
2726
- }
2727
-
2728
- /* ===== Swipe-to-delete row ===== */
2729
-
2730
- .swipe-row {
2731
- position: relative;
2732
- overflow: hidden;
2733
- touch-action: pan-y; /* let vertical scroll through; capture horizontal ourselves */
2734
- }
2735
-
2736
- .swipe-row-action {
2737
- position: absolute;
2738
- top: 0;
2739
- right: 0;
2740
- bottom: 0;
2741
- display: flex;
2742
- flex-direction: column;
2743
- align-items: center;
2744
- justify-content: center;
2745
- gap: 4px;
2746
- background: var(--color-error, #dc2626);
2747
- color: #fff;
2748
- border: none;
2749
- font-size: 0.75rem;
2750
- font-weight: 600;
2751
- cursor: pointer;
2752
- padding: 0;
2753
- }
2754
-
2755
- .swipe-row-action-label {
2756
- font-size: 0.75rem;
2757
- line-height: 1;
2758
- }
2759
-
2760
- .swipe-row-action:focus-visible {
2761
- outline: 2px solid var(--color-accent, #2E5CE5);
2762
- outline-offset: -4px;
2763
- }
2764
-
2765
- .swipe-row-content {
2766
- position: relative;
2767
- background: var(--color-surface);
2768
- transition: transform 0.2s cubic-bezier(0.22, 1, 0.36, 1);
2769
- will-change: transform;
2770
- }
2771
-
2772
- /* During an active drag, skip the transition so the row tracks the finger 1:1.
2773
- On release the class is removed and the snap animates. */
2774
- .swipe-row-content-dragging {
2775
- transition: none;
2776
- }
2777
-
2778
- .app-filter-help {
2779
- margin-top: var(--space-xs);
2780
- }
2781
-
2782
- .app-filter-trigger {
2783
- display: inline-block;
2784
- padding: 0;
2785
- font-size: 0.875rem;
2786
- font-weight: 500;
2787
- text-align: left;
2788
- }
2789
-
2790
- .app-filter-selected {
2791
- display: inline-flex;
2792
- align-items: center;
2793
- gap: var(--space-sm);
2794
- padding: 6px 10px;
2795
- border: 1px solid var(--color-border);
2796
- border-radius: var(--radius-md);
2797
- background: var(--color-surface);
2798
- max-width: 100%;
2799
- }
2800
-
2801
- .app-filter-selected-name {
2802
- font-size: 0.9375rem;
2803
- font-weight: 500;
2804
- white-space: nowrap;
2805
- overflow: hidden;
2806
- text-overflow: ellipsis;
2807
- }
2808
-
2809
- .app-filter-selected-pkg {
2810
- font-size: 0.75rem;
2811
- color: var(--color-muted);
2812
- white-space: nowrap;
2813
- overflow: hidden;
2814
- text-overflow: ellipsis;
2815
- }
2816
-
2817
- .app-filter-selected-clear {
2818
- display: flex;
2819
- align-items: center;
2820
- justify-content: center;
2821
- width: 22px;
2822
- height: 22px;
2823
- padding: 0;
2824
- margin-left: auto;
2825
- border: none;
2826
- background: none;
2827
- color: var(--color-muted);
2828
- font-size: 0.875rem;
2829
- cursor: pointer;
2830
- border-radius: var(--radius-sm);
2831
- }
2832
-
2833
- .app-filter-selected-clear:hover {
2834
- background: var(--color-border-subtle);
2835
- color: var(--color-text);
2836
- }
2837
-
2838
- .app-filter-overlay {
2839
- position: fixed;
2840
- inset: 0;
2841
- background: var(--color-overlay);
2842
- display: flex;
2843
- align-items: center;
2844
- justify-content: center;
2845
- z-index: 1100;
2846
- backdrop-filter: blur(4px);
2847
- padding: var(--space-md);
2848
- }
2849
-
2850
- .app-filter-dialog {
2851
- background: var(--color-surface);
2852
- width: 100%;
2853
- max-width: 480px;
2854
- max-height: 80dvh;
2855
- border-radius: var(--radius-lg);
2856
- box-shadow: var(--shadow-xl);
2857
- display: flex;
2858
- flex-direction: column;
2859
- overflow: hidden;
2860
- }
2861
-
2862
- .app-filter-header {
2863
- display: flex;
2864
- align-items: center;
2865
- justify-content: space-between;
2866
- padding: var(--space-md) var(--space-lg);
2867
- border-bottom: 1px solid var(--color-border);
2868
- }
2869
-
2870
- .app-filter-header h2 {
2871
- margin: 0;
2872
- font-size: 1rem;
2873
- font-weight: 600;
2874
- }
2875
-
2876
- .app-filter-close {
2877
- display: flex;
2878
- align-items: center;
2879
- justify-content: center;
2880
- width: 32px;
2881
- height: 32px;
2882
- padding: 0;
2883
- border: none;
2884
- background: none;
2885
- color: var(--color-muted);
2886
- cursor: pointer;
2887
- border-radius: var(--radius-sm);
2888
- }
2889
-
2890
- .app-filter-close:hover {
2891
- background: var(--color-border-subtle);
2892
- color: var(--color-text);
2893
- }
2894
-
2895
- .app-filter-search {
2896
- margin: var(--space-md) var(--space-lg) 0;
2897
- width: calc(100% - 2 * var(--space-lg));
2898
- }
2899
-
2900
- .app-filter-list {
2901
- flex: 1;
2902
- overflow-y: auto;
2903
- list-style: none;
2904
- margin: 0;
2905
- padding: var(--space-xs) 0 var(--space-md);
2906
- }
2907
-
2908
- .app-filter-row {
2909
- display: flex;
2910
- align-items: center;
2911
- gap: var(--space-md);
2912
- padding: 10px var(--space-lg);
2913
- cursor: pointer;
2914
- user-select: none;
2915
- }
2916
-
2917
- .app-filter-row:hover {
2918
- background: var(--color-hover, rgba(0, 0, 0, 0.04));
2919
- }
2920
-
2921
- .app-filter-row-labels {
2922
- display: flex;
2923
- flex-direction: column;
2924
- min-width: 0;
2925
- flex: 1;
2926
- }
2927
-
2928
- .app-filter-row-name {
2929
- font-size: 0.9375rem;
2930
- font-weight: 500;
2931
- white-space: nowrap;
2932
- overflow: hidden;
2933
- text-overflow: ellipsis;
2934
- }
2935
-
2936
- .app-filter-row-pkg {
2937
- font-size: 0.75rem;
2938
- color: var(--color-muted);
2939
- white-space: nowrap;
2940
- overflow: hidden;
2941
- text-overflow: ellipsis;
2942
- }
2943
-
2944
- .app-filter-empty {
2945
- padding: var(--space-lg);
2946
- text-align: center;
2947
- color: var(--color-muted);
2948
- font-size: 0.875rem;
2949
- }
2950
-
2951
- .app-filter-skeleton {
2952
- cursor: default;
2953
- }
2954
-
2955
- .app-filter-skeleton-bar {
2956
- flex: 1;
2957
- height: 14px;
2958
- border-radius: 4px;
2959
- background: linear-gradient(90deg, var(--color-border-subtle) 25%, var(--color-border) 50%, var(--color-border-subtle) 75%);
2960
- background-size: 200% 100%;
2961
- animation: appFilterShimmer 1.2s ease-in-out infinite;
2962
- }
2963
-
2964
- @keyframes appFilterShimmer {
2965
- 0% { background-position: 200% 0; }
2966
- 100% { background-position: -200% 0; }
2967
- }
2968
-
2969
- .pair-setup {
2970
- min-height: 100dvh;
2971
- display: flex;
2972
- justify-content: center;
2973
- padding: var(--space-lg);
2974
- background: var(--color-bg);
2975
- }
2976
-
2977
- .pair-setup-inner {
2978
- width: 100%;
2979
- max-width: 480px;
2980
- display: flex;
2981
- flex-direction: column;
2982
- gap: var(--space-lg);
2983
- }
2984
-
2985
- .pair-setup-title {
2986
- margin: 0;
2987
- font-size: 1.25rem;
2988
- font-weight: 600;
2989
- line-height: 1.35;
2990
- }
2991
-
2992
- .pair-setup-description {
2993
- margin: 0;
2994
- color: var(--color-muted);
2995
- font-size: 0.875rem;
2996
- }
2997
-
2998
- .pair-setup-loading {
2999
- padding: var(--space-xl, 32px) var(--space-lg);
3000
- min-height: 200px;
3001
- display: flex;
3002
- flex-direction: column;
3003
- align-items: center;
3004
- justify-content: center;
3005
- gap: var(--space-md);
3006
- color: var(--color-muted);
3007
- font-size: 0.95rem;
3008
- }
3009
-
3010
- .pair-setup-actions {
3011
- margin-top: var(--space-md);
3012
- }