palmier 0.9.5 → 0.9.7

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 (258) hide show
  1. package/README.md +30 -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 +3 -4
  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 +0 -1
  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/apple-touch-icon.png +0 -0
  91. package/dist/pwa/assets/index-D1bIhEbd.css +1 -0
  92. package/dist/pwa/assets/{index-Cvffaohh.js → index-DWvRAUiy.js} +31 -31
  93. package/dist/pwa/assets/{web-qdLcAD7T.js → web-C4iZbqTC.js} +1 -1
  94. package/dist/pwa/assets/{web-ChtbM4nv.js → web-CBFqJGX6.js} +1 -1
  95. package/dist/pwa/assets/{web-hExASsqW.js → web-DL4uXOpS.js} +1 -1
  96. package/dist/pwa/favicon.ico +0 -0
  97. package/dist/pwa/index.html +3 -3
  98. package/dist/pwa/manifest.webmanifest +1 -1
  99. package/dist/pwa/pwa-192x192.png +0 -0
  100. package/dist/pwa/pwa-512x512.png +0 -0
  101. package/dist/pwa/service-worker.js +1 -1
  102. package/dist/rpc-handler.d.ts +0 -1
  103. package/dist/rpc-handler.js +3 -10
  104. package/dist/sms-store.d.ts +0 -1
  105. package/dist/sms-store.js +0 -1
  106. package/dist/spawn-command.d.ts +0 -1
  107. package/dist/spawn-command.js +0 -1
  108. package/dist/task.d.ts +1 -1
  109. package/dist/task.js +14 -1
  110. package/dist/transports/http-transport.d.ts +0 -1
  111. package/dist/transports/http-transport.js +0 -1
  112. package/dist/transports/nats-transport.d.ts +0 -1
  113. package/dist/transports/nats-transport.js +0 -1
  114. package/dist/types.d.ts +0 -1
  115. package/dist/types.js +0 -1
  116. package/dist/update-checker.d.ts +0 -1
  117. package/dist/update-checker.js +0 -1
  118. package/package.json +5 -1
  119. package/.github/workflows/ci.yml +0 -16
  120. package/.github/workflows/publish.yml +0 -37
  121. package/CLAUDE.md +0 -22
  122. package/dist/pwa/assets/index-DBgOYBrB.css +0 -1
  123. package/palmier-server/.github/workflows/ci.yml +0 -21
  124. package/palmier-server/.github/workflows/deploy.yml +0 -38
  125. package/palmier-server/CLAUDE.md +0 -17
  126. package/palmier-server/PRODUCTION.md +0 -358
  127. package/palmier-server/README.md +0 -231
  128. package/palmier-server/nats.conf +0 -19
  129. package/palmier-server/package.json +0 -15
  130. package/palmier-server/pnpm-lock.yaml +0 -7639
  131. package/palmier-server/pnpm-workspace.yaml +0 -3
  132. package/palmier-server/pwa/index.html +0 -16
  133. package/palmier-server/pwa/logo/logo-prompt.md +0 -28
  134. package/palmier-server/pwa/logo/logo_20260330.png +0 -0
  135. package/palmier-server/pwa/package.json +0 -34
  136. package/palmier-server/pwa/public/apple-touch-icon.png +0 -0
  137. package/palmier-server/pwa/public/favicon.ico +0 -0
  138. package/palmier-server/pwa/public/pwa-192x192.png +0 -0
  139. package/palmier-server/pwa/public/pwa-512x512.png +0 -0
  140. package/palmier-server/pwa/src/App.css +0 -3004
  141. package/palmier-server/pwa/src/App.tsx +0 -59
  142. package/palmier-server/pwa/src/agentLabels.ts +0 -11
  143. package/palmier-server/pwa/src/api.ts +0 -67
  144. package/palmier-server/pwa/src/components/CapabilityToggles.tsx +0 -170
  145. package/palmier-server/pwa/src/components/ConnectionStatusIcon.tsx +0 -114
  146. package/palmier-server/pwa/src/components/HostMenu.tsx +0 -429
  147. package/palmier-server/pwa/src/components/PermissionsDialog.tsx +0 -34
  148. package/palmier-server/pwa/src/components/PullToRefreshIndicator.tsx +0 -46
  149. package/palmier-server/pwa/src/components/RunDetailView.tsx +0 -343
  150. package/palmier-server/pwa/src/components/SessionComposer.tsx +0 -157
  151. package/palmier-server/pwa/src/components/SessionsView.tsx +0 -326
  152. package/palmier-server/pwa/src/components/SwipeToDeleteRow.tsx +0 -170
  153. package/palmier-server/pwa/src/components/TabBar.tsx +0 -40
  154. package/palmier-server/pwa/src/components/TaskCard.tsx +0 -255
  155. package/palmier-server/pwa/src/components/TaskForm.tsx +0 -764
  156. package/palmier-server/pwa/src/components/TasksView.tsx +0 -179
  157. package/palmier-server/pwa/src/constants.ts +0 -2
  158. package/palmier-server/pwa/src/contexts/HostConnectionContext.tsx +0 -432
  159. package/palmier-server/pwa/src/contexts/HostStoreContext.tsx +0 -124
  160. package/palmier-server/pwa/src/draftGuard.ts +0 -24
  161. package/palmier-server/pwa/src/formatTime.ts +0 -44
  162. package/palmier-server/pwa/src/hooks/useBackClose.ts +0 -75
  163. package/palmier-server/pwa/src/hooks/useMediaQuery.ts +0 -17
  164. package/palmier-server/pwa/src/hooks/usePullToRefresh.ts +0 -102
  165. package/palmier-server/pwa/src/hooks/usePushSubscription.ts +0 -77
  166. package/palmier-server/pwa/src/main.tsx +0 -14
  167. package/palmier-server/pwa/src/native/Device.ts +0 -49
  168. package/palmier-server/pwa/src/pages/Dashboard.tsx +0 -542
  169. package/palmier-server/pwa/src/pages/PairHost.tsx +0 -232
  170. package/palmier-server/pwa/src/pages/PairSetup.tsx +0 -134
  171. package/palmier-server/pwa/src/service-worker.ts +0 -142
  172. package/palmier-server/pwa/src/types.ts +0 -75
  173. package/palmier-server/pwa/src/vite-env.d.ts +0 -11
  174. package/palmier-server/pwa/tsconfig.json +0 -21
  175. package/palmier-server/pwa/tsconfig.node.json +0 -19
  176. package/palmier-server/pwa/vite.config.ts +0 -47
  177. package/palmier-server/server/.env.example +0 -20
  178. package/palmier-server/server/package.json +0 -36
  179. package/palmier-server/server/src/db.ts +0 -44
  180. package/palmier-server/server/src/fcm.ts +0 -74
  181. package/palmier-server/server/src/index.ts +0 -688
  182. package/palmier-server/server/src/nats-jwt.ts +0 -299
  183. package/palmier-server/server/src/nats-setup.ts +0 -48
  184. package/palmier-server/server/src/nats.ts +0 -33
  185. package/palmier-server/server/src/notify.ts +0 -34
  186. package/palmier-server/server/src/push.ts +0 -68
  187. package/palmier-server/server/src/routes/device.ts +0 -224
  188. package/palmier-server/server/src/routes/fcm.ts +0 -64
  189. package/palmier-server/server/src/routes/hosts.ts +0 -56
  190. package/palmier-server/server/src/routes/push.ts +0 -101
  191. package/palmier-server/server/tsconfig.json +0 -20
  192. package/palmier-server/spec.md +0 -533
  193. package/src/agents/agent-instructions.md +0 -28
  194. package/src/agents/agent.ts +0 -114
  195. package/src/agents/aider.ts +0 -35
  196. package/src/agents/claude.ts +0 -39
  197. package/src/agents/cline.ts +0 -35
  198. package/src/agents/codex.ts +0 -40
  199. package/src/agents/copilot.ts +0 -37
  200. package/src/agents/cursor.ts +0 -36
  201. package/src/agents/deepagents.ts +0 -36
  202. package/src/agents/droid.ts +0 -35
  203. package/src/agents/gemini.ts +0 -43
  204. package/src/agents/goose.ts +0 -33
  205. package/src/agents/hermes.ts +0 -36
  206. package/src/agents/kimi.ts +0 -35
  207. package/src/agents/kiro.ts +0 -36
  208. package/src/agents/openclaw.ts +0 -29
  209. package/src/agents/opencode.ts +0 -36
  210. package/src/agents/qoder.ts +0 -36
  211. package/src/agents/qwen.ts +0 -32
  212. package/src/agents/shared-prompt.ts +0 -30
  213. package/src/client-store.ts +0 -68
  214. package/src/commands/clients.ts +0 -29
  215. package/src/commands/info.ts +0 -29
  216. package/src/commands/init.ts +0 -165
  217. package/src/commands/pair.ts +0 -137
  218. package/src/commands/restart.ts +0 -6
  219. package/src/commands/run.ts +0 -608
  220. package/src/commands/serve.ts +0 -211
  221. package/src/commands/uninstall.ts +0 -9
  222. package/src/config.ts +0 -36
  223. package/src/cross-spawn.d.ts +0 -5
  224. package/src/event-queues.ts +0 -41
  225. package/src/events.ts +0 -29
  226. package/src/index.ts +0 -111
  227. package/src/linked-device.ts +0 -52
  228. package/src/mcp-handler.ts +0 -200
  229. package/src/mcp-tools.ts +0 -839
  230. package/src/nats-client.ts +0 -19
  231. package/src/network.ts +0 -96
  232. package/src/notification-store.ts +0 -30
  233. package/src/pending-requests.ts +0 -73
  234. package/src/platform/index.ts +0 -20
  235. package/src/platform/linux.ts +0 -296
  236. package/src/platform/macos.ts +0 -329
  237. package/src/platform/platform.ts +0 -31
  238. package/src/platform/windows.ts +0 -299
  239. package/src/rpc-handler.ts +0 -694
  240. package/src/sms-store.ts +0 -28
  241. package/src/spawn-command.ts +0 -123
  242. package/src/task.ts +0 -330
  243. package/src/transports/http-transport.ts +0 -478
  244. package/src/transports/nats-transport.ts +0 -76
  245. package/src/types.ts +0 -89
  246. package/src/update-checker.ts +0 -40
  247. package/test/agent-instructions.test.ts +0 -209
  248. package/test/agent-output-parsing.test.ts +0 -74
  249. package/test/linux-cron.test.ts +0 -41
  250. package/test/macos-plist.test.ts +0 -112
  251. package/test/notification-store.test.ts +0 -57
  252. package/test/pairing.test.ts +0 -35
  253. package/test/result-state.test.ts +0 -110
  254. package/test/task-parsing.test.ts +0 -82
  255. package/test/taskrun-messages.test.ts +0 -224
  256. package/test/tsconfig.json +0 -9
  257. package/test/windows-xml.test.ts +0 -89
  258. package/tsconfig.json +0 -19
@@ -1,3004 +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-reactive {
1178
- display: flex;
1179
- flex-direction: column;
1180
- gap: var(--space-xs);
1181
- }
1182
-
1183
- .yolo-inline {
1184
- display: inline-flex;
1185
- align-items: center;
1186
- gap: 4px;
1187
- font-size: 0.8rem;
1188
- color: var(--color-text-secondary);
1189
- cursor: pointer;
1190
- user-select: none;
1191
- white-space: nowrap;
1192
- }
1193
-
1194
- .yolo-inline input {
1195
- margin: 0;
1196
- cursor: pointer;
1197
- }
1198
-
1199
- .yolo-warning {
1200
- flex-basis: 100%;
1201
- margin: 0;
1202
- font-size: 0.75rem;
1203
- color: var(--color-text-secondary);
1204
- line-height: 1.4;
1205
- }
1206
-
1207
- .trigger-row-card {
1208
- display: flex;
1209
- align-items: center;
1210
- gap: 8px;
1211
- padding: 4px 0;
1212
- }
1213
-
1214
- .trigger-row-content {
1215
- display: flex;
1216
- flex-direction: column;
1217
- gap: 4px;
1218
- flex: 1;
1219
- min-width: 0;
1220
- }
1221
-
1222
- .trigger-row-top {
1223
- display: flex;
1224
- align-items: center;
1225
- gap: 8px;
1226
- }
1227
-
1228
- .trigger-row-top .form-select {
1229
- flex: 0 0 auto;
1230
- width: auto;
1231
- }
1232
-
1233
- .trigger-row-top .form-input {
1234
- flex: 1;
1235
- }
1236
-
1237
- .trigger-details {
1238
- display: flex;
1239
- gap: 6px;
1240
- }
1241
-
1242
- .trigger-details .form-input[type="date"] {
1243
- flex: 1;
1244
- min-width: 0;
1245
- }
1246
-
1247
- .trigger-details .form-input[type="time"] {
1248
- flex: 0 0 auto;
1249
- width: auto;
1250
- }
1251
-
1252
- .schedule-section > .form-select,
1253
- .trigger-row-card .form-select,
1254
- .trigger-row-card .form-input {
1255
- margin-bottom: 0;
1256
- font-size: 0.8125rem;
1257
- padding: 6px 8px;
1258
- height: 32px;
1259
- box-sizing: border-box;
1260
- min-width: 0;
1261
- }
1262
-
1263
- .schedule-section > .form-select {
1264
- width: 100%;
1265
- }
1266
-
1267
- .trigger-row-card .form-select,
1268
- .trigger-row-card .form-input {
1269
- flex: 1;
1270
- }
1271
-
1272
- .trigger-remove-btn {
1273
- display: inline-flex;
1274
- align-items: center;
1275
- justify-content: center;
1276
- width: 26px;
1277
- height: 26px;
1278
- border: none;
1279
- border-radius: var(--radius-full);
1280
- background: transparent;
1281
- color: var(--color-muted);
1282
- font-size: 1.1rem;
1283
- line-height: 1;
1284
- cursor: pointer;
1285
- transition: all var(--transition-fast);
1286
- flex-shrink: 0;
1287
- }
1288
-
1289
- .trigger-remove-btn:hover {
1290
- background: var(--color-error-bg);
1291
- color: var(--color-error);
1292
- }
1293
-
1294
- .trigger-add-btn {
1295
- display: inline-flex;
1296
- align-items: center;
1297
- gap: 4px;
1298
- border: 1px dashed var(--color-border);
1299
- border-radius: var(--radius-sm);
1300
- background: transparent;
1301
- color: var(--color-text-secondary);
1302
- font-family: var(--font-sans);
1303
- font-size: 0.8125rem;
1304
- font-weight: 500;
1305
- padding: 8px 14px;
1306
- cursor: pointer;
1307
- transition: all var(--transition-fast);
1308
- width: 100%;
1309
- justify-content: center;
1310
- }
1311
-
1312
- .trigger-add-btn:hover {
1313
- border-color: var(--color-primary);
1314
- color: var(--color-primary);
1315
- background: var(--color-primary-subtle);
1316
- }
1317
-
1318
- .form-select {
1319
- width: auto;
1320
- min-width: 80px;
1321
- }
1322
-
1323
- .toggles-section {
1324
- display: flex;
1325
- flex-direction: column;
1326
- gap: 10px;
1327
- margin-bottom: var(--space-md);
1328
- }
1329
-
1330
- .toggle-label {
1331
- display: flex;
1332
- align-items: center;
1333
- gap: 10px;
1334
- font-size: 0.875rem;
1335
- font-weight: 500;
1336
- cursor: pointer;
1337
- -webkit-tap-highlight-color: transparent;
1338
- color: var(--color-text);
1339
- }
1340
-
1341
- .toggle-label input[type="checkbox"] {
1342
- width: 16px;
1343
- height: 16px;
1344
- accent-color: var(--color-primary);
1345
- border-radius: 4px;
1346
- }
1347
-
1348
- .toggles-group {
1349
- display: flex;
1350
- flex-direction: column;
1351
- gap: var(--space-xs);
1352
- }
1353
-
1354
- .command-section {
1355
- margin-bottom: 0;
1356
- }
1357
-
1358
- .command-section-active {
1359
- }
1360
-
1361
- .command-section-active .toggle-label {
1362
- margin-bottom: 0;
1363
- }
1364
-
1365
- .command-help-text {
1366
- font-size: 0.75rem;
1367
- color: var(--color-text-secondary);
1368
- line-height: 1.4;
1369
- margin: 6px 0 10px 0;
1370
- }
1371
-
1372
- .command-section-active .form-input {
1373
- font-size: 0.8125rem;
1374
- padding: 6px 8px;
1375
- height: 32px;
1376
- box-sizing: border-box;
1377
- }
1378
-
1379
- .form-actions {
1380
- display: flex;
1381
- gap: var(--space-sm);
1382
- position: sticky;
1383
- bottom: 0;
1384
- background: var(--color-surface);
1385
- padding: var(--space-sm) 0;
1386
- }
1387
-
1388
- /* ===== Confirmation Modal ===== */
1389
- .confirm-modal-overlay {
1390
- position: fixed;
1391
- inset: 0;
1392
- background: var(--color-overlay);
1393
- display: flex;
1394
- align-items: center;
1395
- justify-content: center;
1396
- z-index: 1000;
1397
- padding: var(--space-md);
1398
- backdrop-filter: blur(4px);
1399
- }
1400
-
1401
- .confirm-modal {
1402
- background: var(--color-surface);
1403
- border-radius: var(--radius-lg);
1404
- border: 1px solid var(--color-border);
1405
- padding: var(--space-xl);
1406
- width: 100%;
1407
- max-width: 380px;
1408
- text-align: center;
1409
- box-shadow: var(--shadow-xl);
1410
- animation: slideUp 0.25s cubic-bezier(0.16, 1, 0.3, 1);
1411
- }
1412
-
1413
- .confirm-modal-title {
1414
- font-size: 1.125rem;
1415
- font-weight: 700;
1416
- letter-spacing: -0.02em;
1417
- margin-bottom: var(--space-xs);
1418
- }
1419
-
1420
- .confirm-modal-subtitle {
1421
- font-size: 0.8rem;
1422
- color: var(--color-muted);
1423
- margin-bottom: var(--space-sm);
1424
- }
1425
-
1426
- .confirm-modal-message {
1427
- font-size: 0.9375rem;
1428
- color: var(--color-text-secondary);
1429
- margin-bottom: var(--space-lg);
1430
- line-height: 1.5;
1431
- }
1432
-
1433
- .confirm-modal-actions {
1434
- display: flex;
1435
- gap: var(--space-sm);
1436
- justify-content: center;
1437
- }
1438
-
1439
- .confirm-modal-actions .btn {
1440
- flex: 1;
1441
- padding: 10px var(--space-lg);
1442
- font-size: 0.875rem;
1443
- }
1444
-
1445
- .permission-modal {
1446
- text-align: left;
1447
- max-width: 400px;
1448
- }
1449
-
1450
- .permission-modal .confirm-modal-title {
1451
- text-align: center;
1452
- }
1453
-
1454
- .permission-modal .confirm-modal-message {
1455
- text-align: center;
1456
- word-break: break-word;
1457
- }
1458
-
1459
- .permission-list {
1460
- display: flex;
1461
- flex-direction: column;
1462
- gap: var(--space-xs);
1463
- margin-bottom: var(--space-lg);
1464
- }
1465
-
1466
- .permission-item {
1467
- display: flex;
1468
- flex-direction: column;
1469
- gap: 2px;
1470
- padding: var(--space-sm);
1471
- background: var(--color-hover);
1472
- border-radius: var(--radius-sm);
1473
- }
1474
-
1475
- .permission-name {
1476
- font-size: 0.8125rem;
1477
- font-weight: 600;
1478
- color: var(--color-text);
1479
- }
1480
-
1481
- .permission-desc {
1482
- font-size: 0.75rem;
1483
- color: var(--color-text-secondary);
1484
- line-height: 1.4;
1485
- }
1486
-
1487
- .permission-actions {
1488
- display: flex;
1489
- gap: var(--space-sm);
1490
- }
1491
-
1492
- .permission-actions .btn {
1493
- flex: 1;
1494
- padding: 10px var(--space-md);
1495
- font-size: 0.875rem;
1496
- }
1497
-
1498
- .permission-abort-link {
1499
- display: block;
1500
- width: 100%;
1501
- margin-top: var(--space-sm);
1502
- background: none;
1503
- border: none;
1504
- color: var(--color-error);
1505
- font-size: 0.8125rem;
1506
- cursor: pointer;
1507
- text-align: center;
1508
- padding: var(--space-xs) 0;
1509
- opacity: 0.8;
1510
- }
1511
-
1512
- .permission-abort-link:hover {
1513
- opacity: 1;
1514
- text-decoration: underline;
1515
- }
1516
-
1517
- /* ===== Input Request Modal ===== */
1518
- .input-modal {
1519
- text-align: left;
1520
- max-width: 400px;
1521
- }
1522
-
1523
- .input-modal .confirm-modal-title {
1524
- text-align: center;
1525
- }
1526
-
1527
- .input-modal .confirm-modal-message {
1528
- text-align: center;
1529
- word-break: break-word;
1530
- }
1531
-
1532
- .input-list {
1533
- display: flex;
1534
- flex-direction: column;
1535
- gap: var(--space-md);
1536
- margin-bottom: var(--space-lg);
1537
- }
1538
-
1539
- .input-item {
1540
- display: flex;
1541
- flex-direction: column;
1542
- gap: var(--space-xs);
1543
- }
1544
-
1545
- .input-label {
1546
- font-size: 0.8125rem;
1547
- font-weight: 600;
1548
- color: var(--color-text);
1549
- }
1550
-
1551
- .input-field {
1552
- width: 100%;
1553
- padding: var(--space-sm) var(--space-md);
1554
- font-size: 0.875rem;
1555
- border: 1px solid var(--color-border);
1556
- border-radius: var(--radius-sm);
1557
- background: var(--color-surface);
1558
- color: var(--color-text);
1559
- box-sizing: border-box;
1560
- }
1561
-
1562
- .input-field:focus {
1563
- outline: none;
1564
- border-color: var(--color-primary);
1565
- box-shadow: 0 0 0 2px rgba(var(--color-primary-rgb, 99, 102, 241), 0.2);
1566
- }
1567
-
1568
- .input-actions {
1569
- display: flex;
1570
- gap: var(--space-sm);
1571
- }
1572
-
1573
- .input-actions .btn {
1574
- flex: 1;
1575
- padding: 10px var(--space-md);
1576
- font-size: 0.875rem;
1577
- }
1578
-
1579
- /* ===== Host Picker ===== */
1580
- .host-picker-inline {
1581
- border: 1px solid var(--color-border);
1582
- border-radius: var(--radius-md);
1583
- overflow: hidden;
1584
- }
1585
-
1586
- .host-picker-list {
1587
- max-height: 240px;
1588
- overflow-y: auto;
1589
- padding: var(--space-xs) 0;
1590
- }
1591
-
1592
- .host-picker-item-wrapper {
1593
- position: relative;
1594
- }
1595
-
1596
- .host-picker-item {
1597
- display: flex;
1598
- align-items: center;
1599
- gap: 8px;
1600
- width: 100%;
1601
- padding: 8px 12px;
1602
- border: none;
1603
- background: none;
1604
- cursor: pointer;
1605
- font-family: var(--font-sans);
1606
- font-size: 0.8125rem;
1607
- color: var(--color-text);
1608
- text-align: left;
1609
- transition: background var(--transition-fast);
1610
- -webkit-tap-highlight-color: transparent;
1611
- }
1612
-
1613
- .host-picker-item:hover {
1614
- background: var(--color-border-subtle);
1615
- }
1616
-
1617
- .host-picker-item-active {
1618
- background: var(--color-primary-subtle);
1619
- }
1620
-
1621
- .host-picker-item-active:hover {
1622
- background: var(--color-primary-subtle);
1623
- }
1624
-
1625
- .host-picker-item-name {
1626
- flex: 1;
1627
- min-width: 0;
1628
- overflow: hidden;
1629
- text-overflow: ellipsis;
1630
- white-space: nowrap;
1631
- display: flex;
1632
- align-items: center;
1633
- gap: 6px;
1634
- }
1635
-
1636
- .host-picker-pending {
1637
- font-size: 0.6875rem;
1638
- font-weight: 500;
1639
- color: var(--color-muted);
1640
- background: var(--color-border-subtle);
1641
- padding: 1px 6px;
1642
- border-radius: 4px;
1643
- flex-shrink: 0;
1644
- }
1645
-
1646
- .host-picker-item-actions {
1647
- flex-shrink: 0;
1648
- width: 24px;
1649
- display: flex;
1650
- align-items: center;
1651
- justify-content: center;
1652
- }
1653
-
1654
- .host-picker-edit-btn {
1655
- display: flex;
1656
- align-items: center;
1657
- justify-content: center;
1658
- width: 24px;
1659
- height: 24px;
1660
- border: none;
1661
- background: none;
1662
- cursor: pointer;
1663
- color: var(--color-muted);
1664
- border-radius: 4px;
1665
- flex-shrink: 0;
1666
- transition: all var(--transition-fast);
1667
- }
1668
-
1669
- .host-picker-edit-btn:hover {
1670
- color: var(--color-primary);
1671
- background: var(--color-primary-subtle);
1672
- }
1673
-
1674
- .host-picker-rename-input {
1675
- font-size: 0.8125rem !important;
1676
- padding: 3px 6px !important;
1677
- flex: 1;
1678
- min-width: 0;
1679
- }
1680
-
1681
- .host-picker-delete-btn {
1682
- display: flex;
1683
- align-items: center;
1684
- justify-content: center;
1685
- width: 24px;
1686
- height: 24px;
1687
- border: none;
1688
- background: none;
1689
- cursor: pointer;
1690
- color: var(--color-muted);
1691
- border-radius: 4px;
1692
- flex-shrink: 0;
1693
- transition: all var(--transition-fast);
1694
- }
1695
-
1696
- .host-picker-delete-btn:hover {
1697
- color: var(--color-error);
1698
- background: var(--color-error-bg);
1699
- }
1700
-
1701
-
1702
- /* ===== Hamburger button ===== */
1703
-
1704
- .hamburger-btn {
1705
- display: flex;
1706
- align-items: center;
1707
- justify-content: center;
1708
- width: 40px;
1709
- height: 40px;
1710
- padding: 0;
1711
- border: none;
1712
- background: none;
1713
- color: var(--color-text);
1714
- cursor: pointer;
1715
- border-radius: var(--radius-sm);
1716
- transition: background var(--transition-fast);
1717
- }
1718
-
1719
- .hamburger-btn:hover {
1720
- background: var(--color-primary-subtle);
1721
- }
1722
-
1723
- /* ===== Drawer ===== */
1724
-
1725
- .drawer-overlay {
1726
- position: fixed;
1727
- inset: 0;
1728
- background: var(--color-overlay);
1729
- z-index: 100;
1730
- animation: drawerFadeIn 0.2s ease;
1731
- }
1732
-
1733
- .drawer-panel {
1734
- position: fixed;
1735
- top: 0;
1736
- left: 0;
1737
- bottom: 0;
1738
- width: 280px;
1739
- max-width: 80vw;
1740
- background: var(--color-surface);
1741
- box-shadow: var(--shadow-xl);
1742
- z-index: 101;
1743
- display: flex;
1744
- flex-direction: column;
1745
- overflow-y: auto;
1746
- overscroll-behavior: contain;
1747
- animation: drawerSlideIn 0.25s ease;
1748
- }
1749
-
1750
- .drawer-close-btn {
1751
- position: absolute;
1752
- top: 8px;
1753
- right: 8px;
1754
- z-index: 1;
1755
- display: flex;
1756
- align-items: center;
1757
- justify-content: center;
1758
- width: 32px;
1759
- height: 32px;
1760
- padding: 0;
1761
- border: none;
1762
- background: none;
1763
- color: var(--color-text-secondary);
1764
- cursor: pointer;
1765
- border-radius: var(--radius-sm);
1766
- transition: background var(--transition-fast);
1767
- }
1768
-
1769
- .drawer-close-btn:hover {
1770
- background: var(--color-border-subtle);
1771
- color: var(--color-text);
1772
- }
1773
-
1774
- .drawer-section {
1775
- padding: var(--space-md);
1776
- display: flex;
1777
- flex-direction: column;
1778
- gap: var(--space-sm);
1779
- }
1780
-
1781
- .drawer-section-label {
1782
- font-size: 0.6875rem;
1783
- font-weight: 600;
1784
- text-transform: uppercase;
1785
- letter-spacing: 0.05em;
1786
- color: var(--color-muted);
1787
- margin-bottom: var(--space-sm);
1788
- }
1789
-
1790
- .drawer-section-hint {
1791
- font-size: 0.8125rem;
1792
- color: var(--color-muted);
1793
- line-height: 1.45;
1794
- margin: 0 0 var(--space-sm) 0;
1795
- }
1796
-
1797
- .pair-checkbox {
1798
- display: flex;
1799
- align-items: flex-start;
1800
- gap: var(--space-sm);
1801
- padding: var(--space-sm) 0;
1802
- cursor: pointer;
1803
- }
1804
-
1805
- .pair-checkbox input[type="checkbox"] {
1806
- margin-top: 0.2rem;
1807
- flex-shrink: 0;
1808
- }
1809
-
1810
- .pair-checkbox-text {
1811
- display: flex;
1812
- flex-direction: column;
1813
- gap: 0.15rem;
1814
- }
1815
-
1816
- .pair-checkbox-title {
1817
- font-size: 0.9375rem;
1818
- font-weight: 500;
1819
- }
1820
-
1821
- .pair-checkbox-hint {
1822
- font-size: 0.8125rem;
1823
- color: var(--color-muted);
1824
- line-height: 1.4;
1825
- }
1826
-
1827
- .drawer-toggle-group {
1828
- display: flex;
1829
- flex-direction: column;
1830
- gap: var(--space-sm);
1831
- }
1832
-
1833
- .drawer-toggle-group-divided {
1834
- border-top: 1px solid var(--color-border);
1835
- padding-top: var(--space-sm);
1836
- margin-top: var(--space-xs);
1837
- }
1838
-
1839
- .drawer-toggle {
1840
- display: flex;
1841
- align-items: center;
1842
- justify-content: space-between;
1843
- gap: var(--space-sm);
1844
- }
1845
-
1846
- .drawer-toggle-label {
1847
- font-size: 0.85rem;
1848
- color: var(--color-text);
1849
- }
1850
-
1851
- .toggle-switch {
1852
- position: relative;
1853
- width: 40px;
1854
- height: 22px;
1855
- border-radius: 11px;
1856
- border: none;
1857
- background: var(--color-border);
1858
- cursor: pointer;
1859
- padding: 0;
1860
- transition: background 0.2s;
1861
- flex-shrink: 0;
1862
- }
1863
-
1864
- .toggle-switch-on {
1865
- background: var(--color-primary);
1866
- }
1867
-
1868
- .toggle-switch-thumb {
1869
- position: absolute;
1870
- top: 2px;
1871
- left: 2px;
1872
- width: 18px;
1873
- height: 18px;
1874
- border-radius: 50%;
1875
- background: white;
1876
- transition: transform 0.2s;
1877
- }
1878
-
1879
- .toggle-switch-on .toggle-switch-thumb {
1880
- transform: translateX(18px);
1881
- }
1882
-
1883
- .toggle-switch:disabled {
1884
- opacity: 0.5;
1885
- cursor: not-allowed;
1886
- }
1887
-
1888
- .drawer-footer {
1889
- margin-top: auto;
1890
- padding: var(--space-md);
1891
- }
1892
-
1893
- .drawer-version {
1894
- font-size: 0.75rem;
1895
- color: var(--color-muted);
1896
- }
1897
-
1898
- .drawer-host-time {
1899
- font-size: 0.75rem;
1900
- color: var(--color-muted);
1901
- margin-bottom: var(--space-xs);
1902
- }
1903
-
1904
- .drawer-legal {
1905
- font-size: 0.75rem;
1906
- color: var(--color-muted);
1907
- margin-top: var(--space-xs);
1908
- }
1909
-
1910
- .drawer-legal a {
1911
- color: var(--color-muted);
1912
- text-decoration: none;
1913
- }
1914
-
1915
- .drawer-legal a:hover {
1916
- text-decoration: underline;
1917
- }
1918
-
1919
- .drawer-legal-sep {
1920
- margin: 0 var(--space-xs);
1921
- }
1922
-
1923
- .drawer-divider {
1924
- height: 1px;
1925
- background: var(--color-border);
1926
- margin: 0 var(--space-md);
1927
- }
1928
-
1929
- @keyframes drawerFadeIn {
1930
- from { opacity: 0; }
1931
- to { opacity: 1; }
1932
- }
1933
-
1934
- @keyframes drawerFadeOut {
1935
- from { opacity: 1; }
1936
- to { opacity: 0; }
1937
- }
1938
-
1939
- @keyframes drawerSlideIn {
1940
- from { transform: translateX(-100%); }
1941
- to { transform: translateX(0); }
1942
- }
1943
-
1944
- @keyframes drawerSlideOut {
1945
- from { transform: translateX(0); }
1946
- to { transform: translateX(-100%); }
1947
- }
1948
-
1949
- .drawer-overlay-closing {
1950
- animation: drawerFadeOut 0.2s ease forwards;
1951
- }
1952
-
1953
- .drawer-panel-closing {
1954
- animation: drawerSlideOut 0.2s ease forwards;
1955
- }
1956
-
1957
- /* ===== Tab bar ===== */
1958
-
1959
- .app-header {
1960
- position: sticky;
1961
- top: 0;
1962
- z-index: 10;
1963
- background: color-mix(in srgb, var(--color-surface) 92%, transparent);
1964
- border-bottom: 1px solid var(--color-border);
1965
- backdrop-filter: blur(8px);
1966
- }
1967
-
1968
- .app-title-bar {
1969
- position: relative;
1970
- display: flex;
1971
- align-items: center;
1972
- justify-content: center;
1973
- padding: 8px 0;
1974
- }
1975
-
1976
- .app-title-bar .hamburger-btn {
1977
- position: absolute;
1978
- left: 4px;
1979
- top: 50%;
1980
- transform: translateY(-50%);
1981
- }
1982
-
1983
- .app-title {
1984
- margin: 0;
1985
- font-size: 1rem;
1986
- font-weight: 700;
1987
- letter-spacing: -0.01em;
1988
- color: #1E3A8A;
1989
- }
1990
-
1991
- .conn-status {
1992
- position: absolute;
1993
- right: 4px;
1994
- top: 50%;
1995
- transform: translateY(-50%);
1996
- display: inline-flex;
1997
- color: #60A5FA;
1998
- }
1999
-
2000
- .conn-status--lan { color: #2563EB; }
2001
- .conn-status--disconnected { color: #DC2626; }
2002
-
2003
- .conn-status-btn {
2004
- background: none;
2005
- border: none;
2006
- padding: 4px 8px;
2007
- cursor: pointer;
2008
- line-height: 1;
2009
- display: inline-flex;
2010
- align-items: center;
2011
- justify-content: center;
2012
- border-radius: 6px;
2013
- color: inherit;
2014
- }
2015
-
2016
- .conn-status-btn:hover,
2017
- .conn-status-btn:focus-visible {
2018
- background: var(--color-bg);
2019
- outline: none;
2020
- }
2021
-
2022
- .conn-status-popover {
2023
- position: absolute;
2024
- top: calc(100% + 6px);
2025
- right: 0;
2026
- background: var(--color-text);
2027
- color: var(--color-surface);
2028
- font-size: 0.75rem;
2029
- font-weight: 500;
2030
- padding: 6px 10px;
2031
- border-radius: 6px;
2032
- white-space: nowrap;
2033
- pointer-events: none;
2034
- opacity: 0;
2035
- transform: translateY(-2px);
2036
- transition: opacity 0.12s, transform 0.12s;
2037
- z-index: 20;
2038
- }
2039
-
2040
- .conn-status:hover .conn-status-popover,
2041
- .conn-status-popover--open {
2042
- opacity: 1;
2043
- transform: translateY(0);
2044
- }
2045
-
2046
- .conn-status--connecting .conn-status-btn > svg {
2047
- animation: conn-status-pulse 1.2s ease-in-out infinite;
2048
- }
2049
-
2050
- @keyframes conn-status-pulse {
2051
- 0%, 100% { opacity: 0.35; }
2052
- 50% { opacity: 1; }
2053
- }
2054
-
2055
- .tab-bar {
2056
- display: flex;
2057
- align-items: center;
2058
- }
2059
-
2060
- .tab-btn {
2061
- flex: 1;
2062
- display: flex;
2063
- align-items: center;
2064
- justify-content: center;
2065
- gap: 6px;
2066
- padding: 12px 0;
2067
- border: none;
2068
- background: none;
2069
- font-family: var(--font-sans);
2070
- font-size: 0.875rem;
2071
- font-weight: 600;
2072
- color: var(--color-text-secondary);
2073
- cursor: pointer;
2074
- border-bottom: 2px solid transparent;
2075
- transition: color var(--transition-fast), border-color var(--transition-fast);
2076
- }
2077
-
2078
- .tab-icon {
2079
- flex-shrink: 0;
2080
- }
2081
-
2082
- .tab-btn:hover {
2083
- color: var(--color-text);
2084
- }
2085
-
2086
- .tab-btn-active {
2087
- color: var(--color-primary);
2088
- border-bottom-color: var(--color-primary);
2089
- }
2090
-
2091
- /* ===== Sessions view ===== */
2092
-
2093
- .sessions-view {
2094
- flex: 1;
2095
- display: flex;
2096
- flex-direction: column;
2097
- align-items: center;
2098
- justify-content: center;
2099
- }
2100
-
2101
- .sessions-card {
2102
- background: var(--color-surface);
2103
- border-radius: var(--radius-md);
2104
- border: 1px solid var(--color-border);
2105
- box-shadow: var(--shadow-sm);
2106
- padding: var(--space-md);
2107
- display: flex;
2108
- align-items: center;
2109
- gap: var(--space-sm);
2110
- cursor: pointer;
2111
- transition: box-shadow var(--transition-base), border-color var(--transition-base);
2112
- -webkit-tap-highlight-color: transparent;
2113
- }
2114
-
2115
- .sessions-card:hover {
2116
- box-shadow: var(--shadow-md);
2117
- border-color: #CBD5E1;
2118
- }
2119
-
2120
- .sessions-card-body {
2121
- flex: 1;
2122
- min-width: 0;
2123
- display: flex;
2124
- flex-direction: column;
2125
- gap: var(--space-xs);
2126
- }
2127
-
2128
- .sessions-card-name {
2129
- font-size: 0.9375rem;
2130
- font-weight: 600;
2131
- letter-spacing: -0.01em;
2132
- color: var(--color-text);
2133
- white-space: nowrap;
2134
- overflow: hidden;
2135
- text-overflow: ellipsis;
2136
- }
2137
-
2138
- .sessions-card-meta {
2139
- display: flex;
2140
- flex-wrap: wrap;
2141
- gap: var(--space-sm);
2142
- font-size: 0.75rem;
2143
- color: var(--color-text-secondary);
2144
- }
2145
-
2146
- .sessions-card-chevron {
2147
- flex-shrink: 0;
2148
- align-self: center;
2149
- color: var(--color-text-secondary);
2150
- font-size: 1.25rem;
2151
- line-height: 1;
2152
- opacity: 0.4;
2153
- transition: opacity var(--transition-base);
2154
- }
2155
-
2156
- .sessions-card:hover .sessions-card-chevron {
2157
- opacity: 0.8;
2158
- }
2159
-
2160
- .sessions-filter-chip {
2161
- display: inline-flex;
2162
- align-items: center;
2163
- gap: var(--space-xs);
2164
- padding: 4px 10px;
2165
- font-size: 0.8125rem;
2166
- color: var(--color-text-secondary);
2167
- background: var(--color-bg);
2168
- border: 1px solid var(--color-border);
2169
- border-radius: 999px;
2170
- }
2171
-
2172
- .sessions-filter-chip button {
2173
- display: inline-flex;
2174
- align-items: center;
2175
- justify-content: center;
2176
- border: none;
2177
- background: none;
2178
- cursor: pointer;
2179
- padding: 0;
2180
- color: var(--color-text-secondary);
2181
- font-size: 1rem;
2182
- line-height: 1;
2183
- }
2184
-
2185
- .sessions-filter-chip button:hover {
2186
- color: var(--color-text);
2187
- }
2188
-
2189
- /* ===== Run Detail (inline drill-down) ===== */
2190
-
2191
- .run-detail {
2192
- display: flex;
2193
- flex-direction: column;
2194
- gap: var(--space-md);
2195
- background: var(--color-surface);
2196
- border-radius: var(--radius-md);
2197
- border: 1px solid var(--color-border);
2198
- box-shadow: var(--shadow-sm);
2199
- padding: var(--space-md);
2200
- }
2201
-
2202
- .run-detail-back {
2203
- display: inline-flex;
2204
- align-items: center;
2205
- gap: var(--space-xs);
2206
- border: none;
2207
- background: none;
2208
- cursor: pointer;
2209
- padding: 0;
2210
- color: var(--color-text-secondary);
2211
- font-size: 0.8125rem;
2212
- }
2213
-
2214
- .run-detail-back:hover {
2215
- color: var(--color-text);
2216
- }
2217
-
2218
- /* ===== Chat Thread ===== */
2219
- .chat-thread {
2220
- display: flex;
2221
- flex-direction: column;
2222
- gap: var(--space-sm);
2223
- overflow-y: auto;
2224
- flex: 1;
2225
- min-height: 0;
2226
- }
2227
-
2228
- .chat-message {
2229
- display: flex;
2230
- flex-direction: column;
2231
- gap: var(--space-xs);
2232
- max-width: 85%;
2233
- min-width: 0;
2234
- padding: var(--space-sm) var(--space-md);
2235
- border-radius: var(--radius-md);
2236
- font-size: 0.8125rem;
2237
- line-height: 1.6;
2238
- }
2239
-
2240
- .chat-message--assistant {
2241
- align-self: flex-start;
2242
- background: var(--color-surface);
2243
- border: 1px solid var(--color-border);
2244
- }
2245
-
2246
- .chat-message--user {
2247
- align-self: flex-end;
2248
- background: var(--color-primary-subtle);
2249
- border: 1px solid var(--color-border-subtle);
2250
- }
2251
-
2252
- .chat-message-agent {
2253
- font-size: 0.6875rem;
2254
- font-weight: 500;
2255
- color: var(--color-text-tertiary);
2256
- margin-bottom: var(--space-xs);
2257
- }
2258
-
2259
- .chat-message-content {
2260
- color: var(--color-text);
2261
- overflow-wrap: break-word;
2262
- }
2263
-
2264
- .chat-message-content h1,
2265
- .chat-message-content h2,
2266
- .chat-message-content h3,
2267
- .chat-message-content h4 {
2268
- margin: 0.75em 0 0.25em;
2269
- font-weight: 600;
2270
- }
2271
- .chat-message-content h1 { font-size: 1.1rem; }
2272
- .chat-message-content h2 { font-size: 1rem; }
2273
- .chat-message-content h3 { font-size: 0.9375rem; }
2274
-
2275
- .chat-message-content p {
2276
- margin: 0.5em 0;
2277
- }
2278
-
2279
- .chat-message-content ul,
2280
- .chat-message-content ol {
2281
- margin: 0.5em 0;
2282
- padding-left: 1.5em;
2283
- }
2284
-
2285
- .chat-message-content code {
2286
- font-size: 0.8em;
2287
- background: var(--color-hover);
2288
- padding: 0.15em 0.35em;
2289
- border-radius: 4px;
2290
- }
2291
-
2292
- .chat-message-content pre {
2293
- background: var(--color-bg);
2294
- border-radius: var(--radius-sm);
2295
- padding: var(--space-sm);
2296
- overflow-x: auto;
2297
- margin: 0.5em 0;
2298
- }
2299
-
2300
- .chat-message-content pre code {
2301
- background: none;
2302
- padding: 0;
2303
- }
2304
-
2305
- .chat-message-content table {
2306
- border-collapse: collapse;
2307
- width: 100%;
2308
- margin: 0.5em 0;
2309
- }
2310
-
2311
- .chat-message-content th,
2312
- .chat-message-content td {
2313
- border: 1px solid var(--color-border);
2314
- padding: 0.35em 0.6em;
2315
- text-align: left;
2316
- }
2317
-
2318
- .chat-message-content th {
2319
- background: var(--color-bg);
2320
- font-weight: 600;
2321
- }
2322
-
2323
- .chat-message-meta {
2324
- display: flex;
2325
- align-items: center;
2326
- gap: var(--space-xs);
2327
- font-size: 0.6875rem;
2328
- color: var(--color-muted);
2329
- }
2330
-
2331
- .chat-message-type {
2332
- font-weight: 600;
2333
- text-transform: uppercase;
2334
- letter-spacing: 0.04em;
2335
- font-size: 0.625rem;
2336
- }
2337
-
2338
- .chat-message-attachments {
2339
- display: flex;
2340
- flex-wrap: wrap;
2341
- gap: var(--space-xs);
2342
- }
2343
-
2344
- .chat-attachment-chip {
2345
- display: inline-flex;
2346
- align-items: center;
2347
- padding: 0.2em 0.6em;
2348
- font-size: 0.75rem;
2349
- background: var(--color-bg);
2350
- border: 1px solid var(--color-border);
2351
- border-radius: var(--radius-sm);
2352
- cursor: pointer;
2353
- color: var(--color-primary);
2354
- font-weight: 500;
2355
- }
2356
-
2357
- .chat-attachment-chip:hover {
2358
- background: var(--color-primary-subtle);
2359
- }
2360
-
2361
- .chat-message-report {
2362
- margin-top: var(--space-xs);
2363
- padding: var(--space-sm);
2364
- background: var(--color-bg);
2365
- border-radius: var(--radius-sm);
2366
- border: 1px solid var(--color-border);
2367
- font-size: 0.8125rem;
2368
- line-height: 1.6;
2369
- color: var(--color-text-secondary);
2370
- }
2371
-
2372
- .chat-status {
2373
- display: flex;
2374
- flex-direction: column;
2375
- align-items: center;
2376
- gap: var(--space-xs);
2377
- font-size: 0.6875rem;
2378
- color: var(--color-muted);
2379
- padding: var(--space-xs) 0;
2380
- }
2381
-
2382
- .chat-status > div {
2383
- display: flex;
2384
- align-items: center;
2385
- gap: var(--space-xs);
2386
- }
2387
-
2388
- .chat-status--error {
2389
- color: var(--color-error);
2390
- }
2391
-
2392
- .chat-status-detail {
2393
- margin-top: var(--space-xs);
2394
- padding: var(--space-sm);
2395
- background: var(--color-bg);
2396
- border: 1px solid var(--color-border);
2397
- border-radius: var(--radius-sm);
2398
- font-size: 0.75rem;
2399
- font-family: "SF Mono", "Fira Code", monospace;
2400
- white-space: pre-wrap;
2401
- word-break: break-word;
2402
- max-width: 100%;
2403
- max-height: 200px;
2404
- overflow-y: auto;
2405
- color: var(--color-text-secondary);
2406
- }
2407
-
2408
- .chat-status-time {
2409
- color: var(--color-muted);
2410
- }
2411
-
2412
- .chat-monitoring-indicator {
2413
- display: flex;
2414
- align-items: center;
2415
- justify-content: center;
2416
- gap: var(--space-xs);
2417
- font-size: 0.6875rem;
2418
- color: var(--color-muted);
2419
- padding: var(--space-md) 0;
2420
- }
2421
-
2422
- .chat-monitoring-dot {
2423
- width: 6px;
2424
- height: 6px;
2425
- border-radius: 50%;
2426
- background: var(--color-muted);
2427
- animation: monitoring-pulse 1.5s ease-in-out infinite;
2428
- }
2429
-
2430
- @keyframes monitoring-pulse {
2431
- 0%, 100% { opacity: 0.3; }
2432
- 50% { opacity: 1; }
2433
- }
2434
-
2435
- .chat-abort-bar {
2436
- display: flex;
2437
- justify-content: center;
2438
- padding: var(--space-sm) 0;
2439
- flex-shrink: 0;
2440
- }
2441
-
2442
- .chat-abort-btn {
2443
- color: var(--color-error);
2444
- border-color: var(--color-error);
2445
- }
2446
-
2447
- .chat-abort-btn:hover:not(:disabled) {
2448
- background: var(--color-error-bg);
2449
- }
2450
-
2451
- .chat-stop-btn {
2452
- display: flex;
2453
- align-items: center;
2454
- justify-content: center;
2455
- width: 36px;
2456
- height: 36px;
2457
- padding: 0;
2458
- border-radius: 50%;
2459
- flex-shrink: 0;
2460
- margin-left: auto;
2461
- background: var(--color-error);
2462
- color: white;
2463
- border-color: var(--color-error);
2464
- }
2465
-
2466
- .chat-stop-btn:hover:not(:disabled) {
2467
- background: #dc2626;
2468
- border-color: #dc2626;
2469
- }
2470
-
2471
- .chat-input-bar {
2472
- display: flex;
2473
- gap: var(--space-xs);
2474
- padding: var(--space-sm) 0;
2475
- flex-shrink: 0;
2476
- }
2477
-
2478
- .chat-input {
2479
- flex: 1;
2480
- min-width: 0;
2481
- padding: var(--space-sm) var(--space-md);
2482
- border: 1px solid var(--color-border);
2483
- border-radius: var(--radius-md);
2484
- font-size: 0.8125rem;
2485
- outline: none;
2486
- background: var(--color-surface);
2487
- color: var(--color-text);
2488
- }
2489
-
2490
- .chat-input:focus {
2491
- border-color: var(--color-primary);
2492
- box-shadow: 0 0 0 2px var(--color-primary-subtle);
2493
- }
2494
-
2495
- .chat-input:disabled {
2496
- opacity: 0.6;
2497
- }
2498
-
2499
- .chat-send-btn {
2500
- display: flex;
2501
- align-items: center;
2502
- justify-content: center;
2503
- width: 36px;
2504
- height: 36px;
2505
- padding: 0;
2506
- border-radius: 50%;
2507
- flex-shrink: 0;
2508
- }
2509
-
2510
- /* ===== Report Fullscreen Dialog ===== */
2511
- .report-dialog-overlay {
2512
- position: fixed;
2513
- inset: 0;
2514
- z-index: 1000;
2515
- background: var(--color-overlay);
2516
- display: flex;
2517
- align-items: stretch;
2518
- justify-content: center;
2519
- }
2520
-
2521
- .report-dialog {
2522
- display: flex;
2523
- flex-direction: column;
2524
- width: 100%;
2525
- max-width: 800px;
2526
- background: var(--color-surface);
2527
- overflow: hidden;
2528
- }
2529
-
2530
- .report-dialog-header {
2531
- display: flex;
2532
- align-items: center;
2533
- justify-content: space-between;
2534
- padding: var(--space-sm) var(--space-md);
2535
- border-bottom: 1px solid var(--color-border);
2536
- flex-shrink: 0;
2537
- }
2538
-
2539
- .report-dialog-title {
2540
- font-size: 0.875rem;
2541
- font-weight: 600;
2542
- color: var(--color-text);
2543
- }
2544
-
2545
- .report-dialog-close {
2546
- display: flex;
2547
- align-items: center;
2548
- justify-content: center;
2549
- border: none;
2550
- background: none;
2551
- cursor: pointer;
2552
- color: var(--color-text-secondary);
2553
- padding: 4px;
2554
- border-radius: var(--radius-sm);
2555
- }
2556
-
2557
- .report-dialog-close:hover {
2558
- background: var(--color-hover);
2559
- color: var(--color-text);
2560
- }
2561
-
2562
- .report-dialog-body {
2563
- flex: 1;
2564
- overflow-y: auto;
2565
- padding: var(--space-md);
2566
- font-size: 0.8125rem;
2567
- line-height: 1.6;
2568
- color: var(--color-text);
2569
- }
2570
-
2571
- .report-dialog-body h1,
2572
- .report-dialog-body h2,
2573
- .report-dialog-body h3,
2574
- .report-dialog-body h4 {
2575
- margin: 0.75em 0 0.25em;
2576
- font-weight: 600;
2577
- }
2578
- .report-dialog-body h1 { font-size: 1.1rem; }
2579
- .report-dialog-body h2 { font-size: 1rem; }
2580
- .report-dialog-body h3 { font-size: 0.9375rem; }
2581
-
2582
- .report-dialog-body p { margin: 0.5em 0; }
2583
-
2584
- .report-dialog-body img {
2585
- max-width: 100%;
2586
- height: auto;
2587
- }
2588
-
2589
- .report-dialog-body ul,
2590
- .report-dialog-body ol {
2591
- margin: 0.5em 0;
2592
- padding-left: 1.5em;
2593
- }
2594
-
2595
- .report-dialog-body code {
2596
- font-size: 0.8em;
2597
- background: var(--color-hover);
2598
- padding: 0.15em 0.35em;
2599
- border-radius: 4px;
2600
- }
2601
-
2602
- .report-dialog-body pre {
2603
- background: var(--color-bg);
2604
- border-radius: var(--radius-sm);
2605
- padding: var(--space-sm);
2606
- overflow-x: auto;
2607
- margin: 0.5em 0;
2608
- }
2609
-
2610
- .report-dialog-body pre code {
2611
- background: none;
2612
- padding: 0;
2613
- }
2614
-
2615
- .report-dialog-body table {
2616
- border-collapse: collapse;
2617
- width: 100%;
2618
- margin: 0.5em 0;
2619
- }
2620
-
2621
- .report-dialog-body th,
2622
- .report-dialog-body td {
2623
- border: 1px solid var(--color-border);
2624
- padding: 0.35em 0.6em;
2625
- text-align: left;
2626
- }
2627
-
2628
- .report-dialog-body th {
2629
- background: var(--color-bg);
2630
- font-weight: 600;
2631
- }
2632
-
2633
- .chat-typing-indicator {
2634
- display: flex;
2635
- align-items: center;
2636
- gap: 4px;
2637
- padding: 4px 0;
2638
- }
2639
-
2640
- .chat-typing-indicator span {
2641
- width: 6px;
2642
- height: 6px;
2643
- border-radius: 50%;
2644
- background: var(--color-muted);
2645
- animation: chat-typing 1.4s infinite;
2646
- }
2647
-
2648
- .chat-typing-indicator span:nth-child(2) {
2649
- animation-delay: 0.2s;
2650
- }
2651
-
2652
- .chat-typing-indicator span:nth-child(3) {
2653
- animation-delay: 0.4s;
2654
- }
2655
-
2656
- @keyframes chat-typing {
2657
- 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
2658
- 30% { opacity: 1; transform: scale(1); }
2659
- }
2660
-
2661
- /* ===== Pair consent ===== */
2662
- .pair-consent {
2663
- font-size: 0.75rem;
2664
- color: var(--color-muted);
2665
- text-align: center;
2666
- line-height: 1.5;
2667
- }
2668
-
2669
- .pair-consent a {
2670
- color: var(--color-muted);
2671
- text-decoration: underline;
2672
- }
2673
-
2674
- .pair-consent a:hover {
2675
- color: var(--color-text-secondary);
2676
- }
2677
-
2678
- /* ===== Dashboard content wrapper ===== */
2679
- .dashboard-content {
2680
- display: flex;
2681
- flex-direction: column;
2682
- flex: 1;
2683
- min-height: 100dvh;
2684
- max-width: 800px;
2685
- margin: 0 auto;
2686
- width: 100%;
2687
- }
2688
-
2689
- /* ===== Desktop persistent sidebar ===== */
2690
- .drawer-panel-desktop {
2691
- position: sticky;
2692
- top: 0;
2693
- height: 100dvh;
2694
- width: 320px;
2695
- min-width: 320px;
2696
- background: var(--color-surface);
2697
- border-right: 1px solid var(--color-border);
2698
- display: flex;
2699
- flex-direction: column;
2700
- overflow-y: auto;
2701
- overscroll-behavior: contain;
2702
- animation: none;
2703
- }
2704
-
2705
- /* ===== Desktop adjustments ===== */
2706
- @media (min-width: 768px) {
2707
- .dashboard {
2708
- flex-direction: row;
2709
- }
2710
-
2711
- .dashboard-main {
2712
- padding: var(--space-lg);
2713
- }
2714
-
2715
- .fab {
2716
- right: max(var(--space-lg), calc((100vw - 1080px) / 2));
2717
- }
2718
- }
2719
-
2720
- /* ===== Swipe-to-delete row ===== */
2721
-
2722
- .swipe-row {
2723
- position: relative;
2724
- overflow: hidden;
2725
- touch-action: pan-y; /* let vertical scroll through; capture horizontal ourselves */
2726
- }
2727
-
2728
- .swipe-row-action {
2729
- position: absolute;
2730
- top: 0;
2731
- right: 0;
2732
- bottom: 0;
2733
- display: flex;
2734
- flex-direction: column;
2735
- align-items: center;
2736
- justify-content: center;
2737
- gap: 4px;
2738
- background: var(--color-error, #dc2626);
2739
- color: #fff;
2740
- border: none;
2741
- font-size: 0.75rem;
2742
- font-weight: 600;
2743
- cursor: pointer;
2744
- padding: 0;
2745
- }
2746
-
2747
- .swipe-row-action-label {
2748
- font-size: 0.75rem;
2749
- line-height: 1;
2750
- }
2751
-
2752
- .swipe-row-action:focus-visible {
2753
- outline: 2px solid var(--color-accent, #2E5CE5);
2754
- outline-offset: -4px;
2755
- }
2756
-
2757
- .swipe-row-content {
2758
- position: relative;
2759
- background: var(--color-surface);
2760
- transition: transform 0.2s cubic-bezier(0.22, 1, 0.36, 1);
2761
- will-change: transform;
2762
- }
2763
-
2764
- /* During an active drag, skip the transition so the row tracks the finger 1:1.
2765
- On release the class is removed and the snap animates. */
2766
- .swipe-row-content-dragging {
2767
- transition: none;
2768
- }
2769
-
2770
- .app-filter-help {
2771
- margin-top: var(--space-xs);
2772
- }
2773
-
2774
- .app-filter-trigger {
2775
- display: inline-block;
2776
- padding: 0;
2777
- font-size: 0.875rem;
2778
- font-weight: 500;
2779
- text-align: left;
2780
- }
2781
-
2782
- .app-filter-selected {
2783
- display: inline-flex;
2784
- align-items: center;
2785
- gap: var(--space-sm);
2786
- padding: 6px 10px;
2787
- border: 1px solid var(--color-border);
2788
- border-radius: var(--radius-md);
2789
- background: var(--color-surface);
2790
- max-width: 100%;
2791
- }
2792
-
2793
- .app-filter-selected-name {
2794
- font-size: 0.9375rem;
2795
- font-weight: 500;
2796
- white-space: nowrap;
2797
- overflow: hidden;
2798
- text-overflow: ellipsis;
2799
- }
2800
-
2801
- .app-filter-selected-pkg {
2802
- font-size: 0.75rem;
2803
- color: var(--color-muted);
2804
- white-space: nowrap;
2805
- overflow: hidden;
2806
- text-overflow: ellipsis;
2807
- }
2808
-
2809
- .app-filter-selected-clear {
2810
- display: flex;
2811
- align-items: center;
2812
- justify-content: center;
2813
- width: 22px;
2814
- height: 22px;
2815
- padding: 0;
2816
- margin-left: auto;
2817
- border: none;
2818
- background: none;
2819
- color: var(--color-muted);
2820
- font-size: 0.875rem;
2821
- cursor: pointer;
2822
- border-radius: var(--radius-sm);
2823
- }
2824
-
2825
- .app-filter-selected-clear:hover {
2826
- background: var(--color-border-subtle);
2827
- color: var(--color-text);
2828
- }
2829
-
2830
- .app-filter-overlay {
2831
- position: fixed;
2832
- inset: 0;
2833
- background: var(--color-overlay);
2834
- display: flex;
2835
- align-items: center;
2836
- justify-content: center;
2837
- z-index: 1100;
2838
- backdrop-filter: blur(4px);
2839
- padding: var(--space-md);
2840
- }
2841
-
2842
- .app-filter-dialog {
2843
- background: var(--color-surface);
2844
- width: 100%;
2845
- max-width: 480px;
2846
- max-height: 80dvh;
2847
- border-radius: var(--radius-lg);
2848
- box-shadow: var(--shadow-xl);
2849
- display: flex;
2850
- flex-direction: column;
2851
- overflow: hidden;
2852
- }
2853
-
2854
- .app-filter-header {
2855
- display: flex;
2856
- align-items: center;
2857
- justify-content: space-between;
2858
- padding: var(--space-md) var(--space-lg);
2859
- border-bottom: 1px solid var(--color-border);
2860
- }
2861
-
2862
- .app-filter-header h2 {
2863
- margin: 0;
2864
- font-size: 1rem;
2865
- font-weight: 600;
2866
- }
2867
-
2868
- .app-filter-close {
2869
- display: flex;
2870
- align-items: center;
2871
- justify-content: center;
2872
- width: 32px;
2873
- height: 32px;
2874
- padding: 0;
2875
- border: none;
2876
- background: none;
2877
- color: var(--color-muted);
2878
- cursor: pointer;
2879
- border-radius: var(--radius-sm);
2880
- }
2881
-
2882
- .app-filter-close:hover {
2883
- background: var(--color-border-subtle);
2884
- color: var(--color-text);
2885
- }
2886
-
2887
- .app-filter-search {
2888
- margin: var(--space-md) var(--space-lg) 0;
2889
- width: calc(100% - 2 * var(--space-lg));
2890
- }
2891
-
2892
- .app-filter-list {
2893
- flex: 1;
2894
- overflow-y: auto;
2895
- list-style: none;
2896
- margin: 0;
2897
- padding: var(--space-xs) 0 var(--space-md);
2898
- }
2899
-
2900
- .app-filter-row {
2901
- display: flex;
2902
- align-items: center;
2903
- gap: var(--space-md);
2904
- padding: 10px var(--space-lg);
2905
- cursor: pointer;
2906
- user-select: none;
2907
- }
2908
-
2909
- .app-filter-row:hover {
2910
- background: var(--color-hover, rgba(0, 0, 0, 0.04));
2911
- }
2912
-
2913
- .app-filter-row-labels {
2914
- display: flex;
2915
- flex-direction: column;
2916
- min-width: 0;
2917
- flex: 1;
2918
- }
2919
-
2920
- .app-filter-row-name {
2921
- font-size: 0.9375rem;
2922
- font-weight: 500;
2923
- white-space: nowrap;
2924
- overflow: hidden;
2925
- text-overflow: ellipsis;
2926
- }
2927
-
2928
- .app-filter-row-pkg {
2929
- font-size: 0.75rem;
2930
- color: var(--color-muted);
2931
- white-space: nowrap;
2932
- overflow: hidden;
2933
- text-overflow: ellipsis;
2934
- }
2935
-
2936
- .app-filter-empty {
2937
- padding: var(--space-lg);
2938
- text-align: center;
2939
- color: var(--color-muted);
2940
- font-size: 0.875rem;
2941
- }
2942
-
2943
- .app-filter-skeleton {
2944
- cursor: default;
2945
- }
2946
-
2947
- .app-filter-skeleton-bar {
2948
- flex: 1;
2949
- height: 14px;
2950
- border-radius: 4px;
2951
- background: linear-gradient(90deg, var(--color-border-subtle) 25%, var(--color-border) 50%, var(--color-border-subtle) 75%);
2952
- background-size: 200% 100%;
2953
- animation: appFilterShimmer 1.2s ease-in-out infinite;
2954
- }
2955
-
2956
- @keyframes appFilterShimmer {
2957
- 0% { background-position: 200% 0; }
2958
- 100% { background-position: -200% 0; }
2959
- }
2960
-
2961
- .pair-setup {
2962
- min-height: 100dvh;
2963
- display: flex;
2964
- justify-content: center;
2965
- padding: var(--space-lg);
2966
- background: var(--color-bg);
2967
- }
2968
-
2969
- .pair-setup-inner {
2970
- width: 100%;
2971
- max-width: 480px;
2972
- display: flex;
2973
- flex-direction: column;
2974
- gap: var(--space-lg);
2975
- }
2976
-
2977
- .pair-setup-title {
2978
- margin: 0;
2979
- font-size: 1.25rem;
2980
- font-weight: 600;
2981
- line-height: 1.35;
2982
- }
2983
-
2984
- .pair-setup-description {
2985
- margin: 0;
2986
- color: var(--color-muted);
2987
- font-size: 0.875rem;
2988
- }
2989
-
2990
- .pair-setup-loading {
2991
- padding: var(--space-xl, 32px) var(--space-lg);
2992
- min-height: 200px;
2993
- display: flex;
2994
- flex-direction: column;
2995
- align-items: center;
2996
- justify-content: center;
2997
- gap: var(--space-md);
2998
- color: var(--color-muted);
2999
- font-size: 0.95rem;
3000
- }
3001
-
3002
- .pair-setup-actions {
3003
- margin-top: var(--space-md);
3004
- }