painapple-code 1.0.0__py3-none-any.whl

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 (436) hide show
  1. painapple_code/__init__.py +30 -0
  2. painapple_code/__main__.py +18 -0
  3. painapple_code/_version.py +24 -0
  4. painapple_code/auth_middleware.py +930 -0
  5. painapple_code/cli/__init__.py +204 -0
  6. painapple_code/cli/deploy/__init__.py +15 -0
  7. painapple_code/cli/deploy/claude_seed.py +41 -0
  8. painapple_code/cli/deploy/config.py +260 -0
  9. painapple_code/cli/deploy/container.py +715 -0
  10. painapple_code/cli/deploy/launch.py +163 -0
  11. painapple_code/cli/deploy/runtime.py +223 -0
  12. painapple_code/cli/lifecycle_cmd.py +443 -0
  13. painapple_code/cli/list_cmd.py +572 -0
  14. painapple_code/cli/manage_cmd.py +670 -0
  15. painapple_code/cli/netinfo.py +125 -0
  16. painapple_code/cli/profiles.py +390 -0
  17. painapple_code/cli/serve_args.py +163 -0
  18. painapple_code/cli/serve_config.py +256 -0
  19. painapple_code/cli/setup_cmd.py +664 -0
  20. painapple_code/cli/ui.py +438 -0
  21. painapple_code/cost_analytics.py +879 -0
  22. painapple_code/data/models.defaults.yaml +18 -0
  23. painapple_code/data/models.yaml +18 -0
  24. painapple_code/data/presets.defaults.json +32 -0
  25. painapple_code/data/strings.yaml +2269 -0
  26. painapple_code/helpers.py +406 -0
  27. painapple_code/paths.py +1514 -0
  28. painapple_code/prompt_explorer.py +984 -0
  29. painapple_code/providers/__init__.py +224 -0
  30. painapple_code/providers/base.py +710 -0
  31. painapple_code/providers/claude/__init__.py +74 -0
  32. painapple_code/providers/claude/capabilities.py +218 -0
  33. painapple_code/providers/claude/errors.py +79 -0
  34. painapple_code/providers/claude/launch.py +50 -0
  35. painapple_code/providers/claude/summary.py +89 -0
  36. painapple_code/providers/claude/translate.py +74 -0
  37. painapple_code/providers/claude_sdk/__init__.py +139 -0
  38. painapple_code/providers/claude_sdk/driver.py +412 -0
  39. painapple_code/providers/codex/__init__.py +87 -0
  40. painapple_code/providers/codex/capabilities.py +321 -0
  41. painapple_code/providers/codex/errors.py +70 -0
  42. painapple_code/providers/codex/launch.py +142 -0
  43. painapple_code/providers/codex/summary.py +196 -0
  44. painapple_code/providers/codex/translate.py +204 -0
  45. painapple_code/providers/codex_app_server/__init__.py +100 -0
  46. painapple_code/providers/codex_app_server/capabilities.py +41 -0
  47. painapple_code/providers/codex_app_server/launch.py +202 -0
  48. painapple_code/providers/codex_app_server/summary.py +291 -0
  49. painapple_code/providers/codex_app_server/translate.py +263 -0
  50. painapple_code/providers/codex_app_server/transport.py +238 -0
  51. painapple_code/routes/__init__.py +0 -0
  52. painapple_code/routes/api_agents.py +441 -0
  53. painapple_code/routes/api_app.py +368 -0
  54. painapple_code/routes/api_app_commit_sections.py +127 -0
  55. painapple_code/routes/api_app_config.py +997 -0
  56. painapple_code/routes/api_app_session_prefs.py +217 -0
  57. painapple_code/routes/api_browser.py +690 -0
  58. painapple_code/routes/api_commands.py +374 -0
  59. painapple_code/routes/api_costs.py +128 -0
  60. painapple_code/routes/api_drafts.py +139 -0
  61. painapple_code/routes/api_exec.py +149 -0
  62. painapple_code/routes/api_files.py +542 -0
  63. painapple_code/routes/api_git.py +657 -0
  64. painapple_code/routes/api_logs.py +649 -0
  65. painapple_code/routes/api_plugins.py +275 -0
  66. painapple_code/routes/api_project_config.py +418 -0
  67. painapple_code/routes/api_prompts.py +231 -0
  68. painapple_code/routes/api_providers.py +53 -0
  69. painapple_code/routes/api_search.py +411 -0
  70. painapple_code/routes/api_session_stash.py +234 -0
  71. painapple_code/routes/api_session_welcome.py +151 -0
  72. painapple_code/routes/api_sessions.py +742 -0
  73. painapple_code/routes/api_shadow.py +323 -0
  74. painapple_code/routes/api_shadow_db.py +512 -0
  75. painapple_code/routes/api_shadow_files.py +332 -0
  76. painapple_code/routes/api_shadow_search.py +476 -0
  77. painapple_code/routes/api_skills.py +610 -0
  78. painapple_code/routes/api_tasks.py +147 -0
  79. painapple_code/routes/api_terminal.py +540 -0
  80. painapple_code/routes/api_upload.py +293 -0
  81. painapple_code/routes/api_viewer.py +229 -0
  82. painapple_code/routes/dependencies.py +109 -0
  83. painapple_code/routes/ws_chat.py +837 -0
  84. painapple_code/server.py +2208 -0
  85. painapple_code/server_logging.py +263 -0
  86. painapple_code/services/__init__.py +0 -0
  87. painapple_code/services/agent_session.py +2738 -0
  88. painapple_code/session_store.py +253 -0
  89. painapple_code/session_store_core.py +879 -0
  90. painapple_code/shadow_db.py +830 -0
  91. painapple_code/shadow_db_plans.py +369 -0
  92. painapple_code/shadow_db_queries.py +595 -0
  93. painapple_code/shadow_db_schema.py +676 -0
  94. painapple_code/shadow_git.py +1296 -0
  95. painapple_code/shadow_git_frontmatter.py +314 -0
  96. painapple_code/shadow_git_sections.py +520 -0
  97. painapple_code/shadow_git_summary.py +462 -0
  98. painapple_code/shadow_parser.py +560 -0
  99. painapple_code/static/css/00-variables.css +276 -0
  100. painapple_code/static/css/01-base.css +245 -0
  101. painapple_code/static/css/02-tooltips.css +36 -0
  102. painapple_code/static/css/09-left-rail.css +448 -0
  103. painapple_code/static/css/10-header.css +777 -0
  104. painapple_code/static/css/11-connection-bar.css +120 -0
  105. painapple_code/static/css/20-messages.css +750 -0
  106. painapple_code/static/css/21-tool-blocks.css +2340 -0
  107. painapple_code/static/css/22-edit-diff.css +619 -0
  108. painapple_code/static/css/23-thinking.css +1584 -0
  109. painapple_code/static/css/24-background-tasks.css +359 -0
  110. painapple_code/static/css/25-context-block.css +252 -0
  111. painapple_code/static/css/26-session-setup.css +144 -0
  112. painapple_code/static/css/30-markdown.css +854 -0
  113. painapple_code/static/css/40-input.css +2418 -0
  114. painapple_code/static/css/41-autocomplete.css +127 -0
  115. painapple_code/static/css/42-activity-strip.css +97 -0
  116. painapple_code/static/css/43-file-autocomplete.css +121 -0
  117. painapple_code/static/css/44-snippets-autocomplete.css +224 -0
  118. painapple_code/static/css/45-selection-bar.css +433 -0
  119. painapple_code/static/css/46-keyboard-bar.css +119 -0
  120. painapple_code/static/css/47-keyboard-longpress.css +116 -0
  121. painapple_code/static/css/47-token-profile.css +106 -0
  122. painapple_code/static/css/50-welcome.css +3095 -0
  123. painapple_code/static/css/51-modals.css +301 -0
  124. painapple_code/static/css/52-utilities.css +77 -0
  125. painapple_code/static/css/53-image-upload.css +456 -0
  126. painapple_code/static/css/54-todo-list.css +102 -0
  127. painapple_code/static/css/55-file-upload.css +113 -0
  128. painapple_code/static/css/56-chat-navigator.css +218 -0
  129. painapple_code/static/css/56-permission-card.css +332 -0
  130. painapple_code/static/css/56-plan-approval.css +204 -0
  131. painapple_code/static/css/56-question-form.css +602 -0
  132. painapple_code/static/css/57-swipe-indicator.css +95 -0
  133. painapple_code/static/css/58-session-families.css +627 -0
  134. painapple_code/static/css/59-about.css +196 -0
  135. painapple_code/static/css/61-log-explorer.css +723 -0
  136. painapple_code/static/css/62-json-tree.css +489 -0
  137. painapple_code/static/css/62-skills-widget.css +650 -0
  138. painapple_code/static/css/63-commands-widget.css +30 -0
  139. painapple_code/static/css/63-plugins-widget.css +174 -0
  140. painapple_code/static/css/63-terminal.css +516 -0
  141. painapple_code/static/css/64-search-files-widget.css +448 -0
  142. painapple_code/static/css/65-snippets-widget.css +426 -0
  143. painapple_code/static/css/66-active-sessions.css +979 -0
  144. painapple_code/static/css/66-agents-widget.css +265 -0
  145. painapple_code/static/css/66-file-explorer-widget.css +855 -0
  146. painapple_code/static/css/66-git-panel.css +791 -0
  147. painapple_code/static/css/66-history-explorer.css +1496 -0
  148. painapple_code/static/css/67-diff-viewer.css +602 -0
  149. painapple_code/static/css/67-editor-view.css +748 -0
  150. painapple_code/static/css/67-file-preview-widget.css +1873 -0
  151. painapple_code/static/css/68-browser-widget.css +337 -0
  152. painapple_code/static/css/68-compare-wizard.css +355 -0
  153. painapple_code/static/css/68-csv-preview.css +106 -0
  154. painapple_code/static/css/68-diff-preview.css +103 -0
  155. painapple_code/static/css/68-helpers-install-widget.css +491 -0
  156. painapple_code/static/css/68-image-annotate.css +346 -0
  157. painapple_code/static/css/68-terminal-view.css +98 -0
  158. painapple_code/static/css/68-uploads-widget.css +229 -0
  159. painapple_code/static/css/69-cost-analytics.css +537 -0
  160. painapple_code/static/css/70-config-panel.css +3736 -0
  161. painapple_code/static/css/70-excalidraw.css +136 -0
  162. painapple_code/static/css/70-prompt-explorer.css +890 -0
  163. painapple_code/static/css/71-chart.css +111 -0
  164. painapple_code/static/css/72-discussion-sidebar.css +678 -0
  165. painapple_code/static/css/74-debug-logs.css +656 -0
  166. painapple_code/static/css/80-open-dialog.css +146 -0
  167. painapple_code/static/css/80-quick-switcher.css +383 -0
  168. painapple_code/static/css/80-widget-system.css +1763 -0
  169. painapple_code/static/css/81-quick-actions.css +1020 -0
  170. painapple_code/static/css/82-context-popover.css +1233 -0
  171. painapple_code/static/css/83-context-menu.css +339 -0
  172. painapple_code/static/css/85-lazy-loading.css +102 -0
  173. painapple_code/static/css/86-zen-mode.css +708 -0
  174. painapple_code/static/css/87-grid-switcher.css +346 -0
  175. painapple_code/static/css/login.css +198 -0
  176. painapple_code/static/dist/app.bundle.js +7177 -0
  177. painapple_code/static/feature-triage.html +446 -0
  178. painapple_code/static/icons/apple-touch-icon.png +0 -0
  179. painapple_code/static/icons/favicon-32.png +0 -0
  180. painapple_code/static/icons/favicon.ico +0 -0
  181. painapple_code/static/icons/icon-128.png +0 -0
  182. painapple_code/static/icons/icon-144.png +0 -0
  183. painapple_code/static/icons/icon-152.png +0 -0
  184. painapple_code/static/icons/icon-180.png +0 -0
  185. painapple_code/static/icons/icon-192.png +0 -0
  186. painapple_code/static/icons/icon-384.png +0 -0
  187. painapple_code/static/icons/icon-512.png +0 -0
  188. painapple_code/static/icons/icon-72.png +0 -0
  189. painapple_code/static/icons/icon-96.png +0 -0
  190. painapple_code/static/js/action-delegate.js +187 -0
  191. painapple_code/static/js/activity-strip.js +193 -0
  192. painapple_code/static/js/app/context-menus.js +619 -0
  193. painapple_code/static/js/app/file-preview.js +163 -0
  194. painapple_code/static/js/app/init-ui.js +574 -0
  195. painapple_code/static/js/app/input-events.js +561 -0
  196. painapple_code/static/js/app/input-resize.js +313 -0
  197. painapple_code/static/js/app/message-actions.js +419 -0
  198. painapple_code/static/js/app/panels.js +210 -0
  199. painapple_code/static/js/app/rendering-delegators.js +246 -0
  200. painapple_code/static/js/app/server-loading.js +365 -0
  201. painapple_code/static/js/app/session-ops.js +287 -0
  202. painapple_code/static/js/app/session-switch.js +443 -0
  203. painapple_code/static/js/app/settings-helpers.js +280 -0
  204. painapple_code/static/js/app/startup-welcome.js +290 -0
  205. painapple_code/static/js/app-context.js +157 -0
  206. painapple_code/static/js/app.js +2134 -0
  207. painapple_code/static/js/auth-fetch.js +46 -0
  208. painapple_code/static/js/background-tasks.js +274 -0
  209. painapple_code/static/js/boot.js +73 -0
  210. painapple_code/static/js/caret-position.js +171 -0
  211. painapple_code/static/js/chat-navigator.js +710 -0
  212. painapple_code/static/js/chat-search.js +323 -0
  213. painapple_code/static/js/command-executor.js +176 -0
  214. painapple_code/static/js/command-store.js +497 -0
  215. painapple_code/static/js/components.js +1414 -0
  216. painapple_code/static/js/config.js +218 -0
  217. painapple_code/static/js/context-menu.js +740 -0
  218. painapple_code/static/js/controllers/chat-controller.js +4252 -0
  219. painapple_code/static/js/controllers/dialog-controller.js +217 -0
  220. painapple_code/static/js/controllers/tab-controller.js +1828 -0
  221. painapple_code/static/js/controllers/thinking-controller.js +915 -0
  222. painapple_code/static/js/diff-utils.js +486 -0
  223. painapple_code/static/js/drafts-pill.js +95 -0
  224. painapple_code/static/js/editor-view.js +815 -0
  225. painapple_code/static/js/effort-settings.js +430 -0
  226. painapple_code/static/js/feature-triage.js +811 -0
  227. painapple_code/static/js/file-autocomplete.js +516 -0
  228. painapple_code/static/js/file-tabs.js +123 -0
  229. painapple_code/static/js/gestures.js +448 -0
  230. painapple_code/static/js/grid-switcher.js +334 -0
  231. painapple_code/static/js/input-handler.js +1472 -0
  232. painapple_code/static/js/keyboard-bar.js +495 -0
  233. painapple_code/static/js/layout-switcher.js +109 -0
  234. painapple_code/static/js/linkify-utils.js +200 -0
  235. painapple_code/static/js/login.js +141 -0
  236. painapple_code/static/js/open-dialog.js +879 -0
  237. painapple_code/static/js/orphan-terminals.js +373 -0
  238. painapple_code/static/js/path-utils.js +179 -0
  239. painapple_code/static/js/perf-marks.js +102 -0
  240. painapple_code/static/js/permission-settings.js +475 -0
  241. painapple_code/static/js/pointer-input.js +59 -0
  242. painapple_code/static/js/preview/json-tree-menu.js +226 -0
  243. painapple_code/static/js/preview/json-tree-toolbar.js +291 -0
  244. painapple_code/static/js/preview/json-tree.js +457 -0
  245. painapple_code/static/js/preview/preview-breadcrumb.js +387 -0
  246. painapple_code/static/js/preview/preview-edit.js +367 -0
  247. painapple_code/static/js/preview/preview-events.js +361 -0
  248. painapple_code/static/js/preview/preview-history.js +567 -0
  249. painapple_code/static/js/preview/preview-inline-edit.js +869 -0
  250. painapple_code/static/js/preview/preview-poll.js +108 -0
  251. painapple_code/static/js/preview/preview-render.js +572 -0
  252. painapple_code/static/js/preview/preview-search.js +421 -0
  253. painapple_code/static/js/preview/preview-state.js +256 -0
  254. painapple_code/static/js/preview/preview-utils.js +251 -0
  255. painapple_code/static/js/preview-plugins/chart-plugin.js +22 -0
  256. painapple_code/static/js/preview-plugins/csv-plugin.js +188 -0
  257. painapple_code/static/js/preview-plugins/diff-plugin.js +258 -0
  258. painapple_code/static/js/preview-plugins/excalidraw-plugin.js +25 -0
  259. painapple_code/static/js/preview-plugins/html-plugin.js +104 -0
  260. painapple_code/static/js/preview-plugins/image-plugin.js +20 -0
  261. painapple_code/static/js/preview-plugins/index.js +34 -0
  262. painapple_code/static/js/preview-plugins/json-plugin.js +99 -0
  263. painapple_code/static/js/preview-plugins/jsonl-plugin.js +152 -0
  264. painapple_code/static/js/preview-plugins/markdown-plugin.js +266 -0
  265. painapple_code/static/js/preview-plugins/panzoom-plugin.js +63 -0
  266. painapple_code/static/js/preview-plugins/plugin-helpers.js +282 -0
  267. painapple_code/static/js/project-color-picker.js +110 -0
  268. painapple_code/static/js/project-colors.js +163 -0
  269. painapple_code/static/js/prompt-favorites.js +187 -0
  270. painapple_code/static/js/quick-actions-menu.js +1736 -0
  271. painapple_code/static/js/quick-actions-registry.js +1239 -0
  272. painapple_code/static/js/quick-switcher/controller.js +294 -0
  273. painapple_code/static/js/quick-switcher/fuzzy-scorer.js +123 -0
  274. painapple_code/static/js/quick-switcher/index.js +30 -0
  275. painapple_code/static/js/quick-switcher/providers/base-provider.js +51 -0
  276. painapple_code/static/js/quick-switcher/providers/command-provider.js +56 -0
  277. painapple_code/static/js/quick-switcher/providers/file-provider.js +291 -0
  278. painapple_code/static/js/quick-switcher/providers/panel-provider.js +132 -0
  279. painapple_code/static/js/quick-switcher/providers/project-provider.js +361 -0
  280. painapple_code/static/js/quick-switcher/providers/read-files-provider.js +104 -0
  281. painapple_code/static/js/quick-switcher/providers/skills-provider.js +129 -0
  282. painapple_code/static/js/quick-switcher/registry.js +69 -0
  283. painapple_code/static/js/quick-switcher/ui/item.js +54 -0
  284. painapple_code/static/js/quick-switcher/ui/picker.js +464 -0
  285. painapple_code/static/js/recent-opens.js +40 -0
  286. painapple_code/static/js/scroll-manager.js +530 -0
  287. painapple_code/static/js/scroll-state-machine.js +359 -0
  288. painapple_code/static/js/selection/action-bar.js +793 -0
  289. painapple_code/static/js/selection/index.js +15 -0
  290. painapple_code/static/js/selection/selection-handler.js +877 -0
  291. painapple_code/static/js/selection/state.js +181 -0
  292. painapple_code/static/js/session/agent-progress.js +202 -0
  293. painapple_code/static/js/session/handle-agent-message.js +481 -0
  294. painapple_code/static/js/session/handle-message.js +550 -0
  295. painapple_code/static/js/session/interactive.js +587 -0
  296. painapple_code/static/js/session/message-store.js +271 -0
  297. painapple_code/static/js/session/messages.js +253 -0
  298. painapple_code/static/js/session/persistence.js +179 -0
  299. painapple_code/static/js/session/restore.js +136 -0
  300. painapple_code/static/js/session/sync.js +333 -0
  301. painapple_code/static/js/session-container-pool.js +371 -0
  302. painapple_code/static/js/session-setup-panel.js +274 -0
  303. painapple_code/static/js/session.js +1047 -0
  304. painapple_code/static/js/shortcut-hints.js +272 -0
  305. painapple_code/static/js/shortcuts.js +1146 -0
  306. painapple_code/static/js/skills-autocomplete.js +262 -0
  307. painapple_code/static/js/snippets-autocomplete.js +738 -0
  308. painapple_code/static/js/stash-refs-view.js +83 -0
  309. painapple_code/static/js/stash-ui.js +768 -0
  310. painapple_code/static/js/stash.js +785 -0
  311. painapple_code/static/js/status-bar.js +1184 -0
  312. painapple_code/static/js/token-profile.js +274 -0
  313. painapple_code/static/js/tool-renderer-blocks.js +1626 -0
  314. painapple_code/static/js/tool-renderer-thinking.js +813 -0
  315. painapple_code/static/js/tool-renderer.js +1500 -0
  316. painapple_code/static/js/tooltips.js +197 -0
  317. painapple_code/static/js/upload-manager.js +1019 -0
  318. painapple_code/static/js/utils.js +521 -0
  319. painapple_code/static/js/welcome/api.js +363 -0
  320. painapple_code/static/js/welcome/cards.js +626 -0
  321. painapple_code/static/js/welcome/context-menu.js +585 -0
  322. painapple_code/static/js/welcome/families.js +801 -0
  323. painapple_code/static/js/welcome/preview.js +234 -0
  324. painapple_code/static/js/welcome/state.js +129 -0
  325. painapple_code/static/js/welcome.js +1874 -0
  326. painapple_code/static/js/widget-system/base-widget.js +717 -0
  327. painapple_code/static/js/widget-system/device-manager.js +178 -0
  328. painapple_code/static/js/widget-system/event-bus.js +152 -0
  329. painapple_code/static/js/widget-system/icons.js +120 -0
  330. painapple_code/static/js/widget-system/index.js +49 -0
  331. painapple_code/static/js/widget-system/init.js +54 -0
  332. painapple_code/static/js/widget-system/types/bottom-sheet.js +307 -0
  333. painapple_code/static/js/widget-system/types/floating.js +915 -0
  334. painapple_code/static/js/widget-system/types/index.js +40 -0
  335. painapple_code/static/js/widget-system/types/modal.js +147 -0
  336. painapple_code/static/js/widget-system/types/sidebar.js +158 -0
  337. painapple_code/static/js/widget-system/types/tab.js +146 -0
  338. painapple_code/static/js/widget-system/types/top-sheet.js +203 -0
  339. painapple_code/static/js/widget-system/widget-manager.js +1187 -0
  340. painapple_code/static/js/widgets/about-widget.js +260 -0
  341. painapple_code/static/js/widgets/active-sessions-widget.js +760 -0
  342. painapple_code/static/js/widgets/agents-widget.js +897 -0
  343. painapple_code/static/js/widgets/browser-widget.js +579 -0
  344. painapple_code/static/js/widgets/commands-widget.js +694 -0
  345. painapple_code/static/js/widgets/config/commit-sections.js +449 -0
  346. painapple_code/static/js/widgets/config/dir-autocomplete.js +224 -0
  347. painapple_code/static/js/widgets/config/gestures.js +161 -0
  348. painapple_code/static/js/widgets/config/models-tab.js +988 -0
  349. painapple_code/static/js/widgets/config/quick-actions-tab.js +882 -0
  350. painapple_code/static/js/widgets/config/shortcut-editor.js +587 -0
  351. painapple_code/static/js/widgets/config/state.js +517 -0
  352. painapple_code/static/js/widgets/config/system-controls.js +90 -0
  353. painapple_code/static/js/widgets/config-widget.js +1535 -0
  354. painapple_code/static/js/widgets/cost-analytics-widget.js +621 -0
  355. painapple_code/static/js/widgets/debug-widget.js +693 -0
  356. painapple_code/static/js/widgets/diff-viewer-widget.js +1420 -0
  357. painapple_code/static/js/widgets/discussion-widget.js +1107 -0
  358. painapple_code/static/js/widgets/file-explorer-widget.js +2166 -0
  359. painapple_code/static/js/widgets/file-preview-widget.js +861 -0
  360. painapple_code/static/js/widgets/git-widget.js +794 -0
  361. painapple_code/static/js/widgets/helpers-install-widget.js +720 -0
  362. painapple_code/static/js/widgets/history-explorer-widget.js +1804 -0
  363. painapple_code/static/js/widgets/image-annotate-widget.js +951 -0
  364. painapple_code/static/js/widgets/image-preview-widget.js +692 -0
  365. painapple_code/static/js/widgets/index.js +176 -0
  366. painapple_code/static/js/widgets/log-explorer-widget.js +1057 -0
  367. painapple_code/static/js/widgets/plugins-widget.js +305 -0
  368. painapple_code/static/js/widgets/prompt-explorer-widget.js +1119 -0
  369. painapple_code/static/js/widgets/search-files-widget.js +529 -0
  370. painapple_code/static/js/widgets/skills-widget.js +843 -0
  371. painapple_code/static/js/widgets/snippets-widget.js +479 -0
  372. painapple_code/static/js/widgets/sub-agents-widget.js +333 -0
  373. painapple_code/static/js/widgets/tasks-widget.js +379 -0
  374. painapple_code/static/js/widgets/terminal/connection.js +283 -0
  375. painapple_code/static/js/widgets/terminal/gestures.js +357 -0
  376. painapple_code/static/js/widgets/terminal/init.js +642 -0
  377. painapple_code/static/js/widgets/terminal/link-providers.js +532 -0
  378. painapple_code/static/js/widgets/terminal/osc52.js +213 -0
  379. painapple_code/static/js/widgets/terminal/render.js +159 -0
  380. painapple_code/static/js/widgets/terminal/size.js +54 -0
  381. painapple_code/static/js/widgets/terminal/state.js +211 -0
  382. painapple_code/static/js/widgets/terminal/wrap-utils.js +101 -0
  383. painapple_code/static/js/widgets/terminal-widget.js +793 -0
  384. painapple_code/static/js/widgets/uploads-widget.js +461 -0
  385. painapple_code/static/js/widgets/zen-widget.js +1001 -0
  386. painapple_code/static/login.html +51 -0
  387. painapple_code/static/manifest.json +73 -0
  388. painapple_code/static/sw.js +293 -0
  389. painapple_code/static/vendor/LICENSES.txt +769 -0
  390. painapple_code/static/vendor/README.md +103 -0
  391. painapple_code/static/vendor/codemirror.js +35 -0
  392. painapple_code/static/vendor/codemirror.js.LEGAL.txt +304 -0
  393. painapple_code/static/vendor/github-markdown-dark.min.css +1124 -0
  394. painapple_code/static/vendor/highlight-github-dark.min.css +10 -0
  395. painapple_code/static/vendor/highlight-lang-dockerfile.min.js +8 -0
  396. painapple_code/static/vendor/highlight-lang-nginx.min.js +21 -0
  397. painapple_code/static/vendor/highlight-lang-properties.min.js +10 -0
  398. painapple_code/static/vendor/highlight-lang-scala.min.js +28 -0
  399. painapple_code/static/vendor/highlight.min.js +1213 -0
  400. painapple_code/static/vendor/marked.min.js +6 -0
  401. painapple_code/static/vendor/purify.min.js +3 -0
  402. painapple_code/static/vendor/xterm-addon-fit.js +2 -0
  403. painapple_code/static/vendor/xterm.css +209 -0
  404. painapple_code/static/vendor/xterm.js +2 -0
  405. painapple_code/static/web-client.html +635 -0
  406. painapple_code/subprocess_registry.py +535 -0
  407. painapple_code/tls_cert.py +79 -0
  408. painapple_code/tools/agents/shadow-git-helper.md +400 -0
  409. painapple_code/tools/excalidraw-to-svg.js +143 -0
  410. painapple_code/tools/install-helpers.sh +148 -0
  411. painapple_code/tools/shadow-git +320 -0
  412. painapple_code/tools/shadow-query +120 -0
  413. painapple_code/tools/vegalite-to-svg.js +79 -0
  414. painapple_code/turn_query.py +766 -0
  415. painapple_code/turn_tracker.py +221 -0
  416. painapple_code/utils/__init__.py +0 -0
  417. painapple_code/utils/agent_cli.py +306 -0
  418. painapple_code/utils/chart.py +103 -0
  419. painapple_code/utils/excalidraw.py +107 -0
  420. painapple_code/utils/file_lock.py +162 -0
  421. painapple_code/utils/file_paths.py +648 -0
  422. painapple_code/utils/generate_icons.py +251 -0
  423. painapple_code/utils/proc.py +205 -0
  424. painapple_code/utils/pty_backend.py +59 -0
  425. painapple_code/utils/pty_posix.py +160 -0
  426. painapple_code/utils/pty_windows.py +245 -0
  427. painapple_code/utils/token_profiles.py +91 -0
  428. painapple_code/viewer_templates.py +657 -0
  429. painapple_code/welcome_search.py +879 -0
  430. painapple_code-1.0.0.dist-info/METADATA +292 -0
  431. painapple_code-1.0.0.dist-info/RECORD +436 -0
  432. painapple_code-1.0.0.dist-info/WHEEL +5 -0
  433. painapple_code-1.0.0.dist-info/entry_points.txt +2 -0
  434. painapple_code-1.0.0.dist-info/licenses/LICENSE +661 -0
  435. painapple_code-1.0.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +261 -0
  436. painapple_code-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,3736 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════════
2
+ Configuration Panel Styles (Widget-based)
3
+ ═══════════════════════════════════════════════════════════════════════════
4
+
5
+ This CSS works with the config widget (modal type).
6
+ The widget system handles: backdrop, positioning, escape, focus trap.
7
+ These styles handle: tabs, sections, shortcuts editor, appearance controls.
8
+
9
+ ═══════════════════════════════════════════════════════════════════════════ */
10
+
11
+ /* Widget-specific overrides for config modal */
12
+ #widget-config {
13
+ width: min(1200px, 95vw);
14
+ height: min(1050px, 90vh);
15
+ max-height: 90vh;
16
+ display: flex;
17
+ flex-direction: column;
18
+ }
19
+
20
+ #widget-config .widget-content-wrapper {
21
+ flex: 1;
22
+ display: flex;
23
+ flex-direction: column;
24
+ overflow: hidden;
25
+ }
26
+
27
+ #widget-config .widget-content {
28
+ flex: 1;
29
+ display: flex;
30
+ flex-direction: column;
31
+ overflow: hidden;
32
+ }
33
+
34
+ /* ═══════════════════════════════════════════════════════════════════════════
35
+ Tabs
36
+ ═══════════════════════════════════════════════════════════════════════════ */
37
+
38
+ .config-tabs {
39
+ display: flex;
40
+ gap: var(--sp-4);
41
+ padding: var(--sp-12) var(--sp-16);
42
+ border-bottom: 1px solid var(--border-color, #2d2d44);
43
+ flex-shrink: 0;
44
+ overflow-x: auto;
45
+ overflow-y: hidden;
46
+ -webkit-overflow-scrolling: touch;
47
+ scrollbar-width: none;
48
+ }
49
+
50
+ .config-tabs::-webkit-scrollbar {
51
+ display: none;
52
+ }
53
+
54
+ .config-tab {
55
+ height: var(--layout-btn-lg);
56
+ display: flex;
57
+ align-items: center;
58
+ gap: var(--sp-8);
59
+ padding: var(--sp-10) var(--sp-16);
60
+ background: none;
61
+ border: none;
62
+ border-radius: var(--radius-md);
63
+ color: var(--text-secondary, #9ca3af);
64
+ font-size: var(--font-size-md);
65
+ cursor: pointer;
66
+ transition: all 0.15s ease;
67
+ flex-shrink: 0;
68
+ white-space: nowrap;
69
+ }
70
+
71
+ .config-tab:hover {
72
+ background: var(--bg-hover, rgba(255, 255, 255, 0.05));
73
+ color: var(--text-primary, #e0e0e0);
74
+ }
75
+
76
+ .config-tab.active {
77
+ background: rgba(var(--accent-rgb), 0.15);
78
+ color: var(--accent);
79
+ }
80
+
81
+ .config-tab svg {
82
+ width: 18px;
83
+ height: 18px;
84
+ flex-shrink: 0;
85
+ }
86
+
87
+ /* ═══════════════════════════════════════════════════════════════════════════
88
+ Body & Sections
89
+ ═══════════════════════════════════════════════════════════════════════════ */
90
+
91
+ .config-body {
92
+ flex: 1;
93
+ overflow: hidden;
94
+ position: relative;
95
+ display: flex;
96
+ flex-direction: column;
97
+ }
98
+
99
+ .config-section {
100
+ position: absolute;
101
+ top: 0;
102
+ left: 0;
103
+ right: 0;
104
+ bottom: 0;
105
+ display: flex;
106
+ flex-direction: column;
107
+ gap: var(--sp-16);
108
+ padding: var(--sp-16);
109
+ overflow-y: auto;
110
+ opacity: 1;
111
+ transition: opacity 0.15s ease;
112
+ }
113
+
114
+ .config-section[hidden] {
115
+ display: none !important;
116
+ }
117
+
118
+ .config-hint {
119
+ color: var(--text-secondary, #9ca3af);
120
+ font-size: var(--font-size-md);
121
+ line-height: 1.5;
122
+ margin: 0 0 var(--sp-12) 0;
123
+ }
124
+
125
+ .config-hint strong {
126
+ color: var(--text-primary, #e0e0e0);
127
+ }
128
+
129
+ .config-hint code {
130
+ background: var(--bg-tertiary, #252540);
131
+ padding: var(--sp-2) var(--sp-6);
132
+ border-radius: var(--radius-sm);
133
+ font-size: 0.9em;
134
+ color: var(--accent);
135
+ }
136
+
137
+ .config-link {
138
+ background: transparent;
139
+ border: none;
140
+ padding: var(--sp-2) 0;
141
+ margin-top: var(--sp-4);
142
+ color: var(--text-secondary, #9ca3af);
143
+ cursor: pointer;
144
+ font: inherit;
145
+ font-size: var(--font-size-base);
146
+ text-decoration: none;
147
+ text-align: left;
148
+ }
149
+ .config-link:hover {
150
+ color: var(--text-primary, #e0e0e0);
151
+ text-decoration: underline;
152
+ }
153
+
154
+ /* Secondary action button — clearer affordance than .config-link
155
+ for "open another panel" CTAs inside system sections. */
156
+ .config-action-btn {
157
+ height: var(--layout-btn-lg);
158
+ margin-top: var(--sp-8);
159
+ padding: var(--sp-8) var(--sp-14);
160
+ background: transparent;
161
+ border: 1px solid var(--border-color, #2d2d44);
162
+ border-radius: var(--radius-md);
163
+ color: var(--text-primary, #e0e0e0);
164
+ font: inherit;
165
+ font-size: var(--font-size-base);
166
+ font-weight: 500;
167
+ cursor: pointer;
168
+ transition: background 0.15s ease, border-color 0.15s ease;
169
+ }
170
+ .config-action-btn:hover {
171
+ background: var(--bg-elevated, rgba(255, 255, 255, 0.04));
172
+ border-color: var(--accent);
173
+ }
174
+ .config-action-btn:active {
175
+ transform: scale(0.98);
176
+ }
177
+
178
+ /* ═══════════════════════════════════════════════════════════════════════════
179
+ Appearance Tab
180
+ ═══════════════════════════════════════════════════════════════════════════ */
181
+
182
+ .appearance-section {
183
+ padding: var(--sp-16) 0;
184
+ border-bottom: 1px solid var(--border-color, #2d2d44);
185
+ }
186
+
187
+ .appearance-section:last-child {
188
+ border-bottom: none;
189
+ }
190
+
191
+ .appearance-section-title {
192
+ margin: 0 0 var(--sp-12) 0;
193
+ font-size: var(--font-size-base);
194
+ font-weight: 600;
195
+ text-transform: uppercase;
196
+ letter-spacing: 0.5px;
197
+ color: var(--text-secondary, #9ca3af);
198
+ }
199
+
200
+ /* Layout Options */
201
+ .layout-options {
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: var(--sp-8);
205
+ }
206
+
207
+ .layout-option {
208
+ display: flex;
209
+ align-items: center;
210
+ gap: var(--sp-12);
211
+ padding: var(--sp-12) var(--sp-14);
212
+ background: var(--bg-secondary, #16162a);
213
+ border: 1px solid transparent;
214
+ border-radius: var(--radius-md);
215
+ cursor: pointer;
216
+ transition: all 0.15s ease;
217
+ }
218
+
219
+ .layout-option:hover {
220
+ background: var(--bg-hover, rgba(255, 255, 255, 0.05));
221
+ }
222
+
223
+ .layout-option:has(input:checked) {
224
+ background: rgba(var(--accent-rgb), 0.15);
225
+ border-color: var(--accent);
226
+ }
227
+
228
+ .layout-option input[type="radio"] {
229
+ width: 18px;
230
+ height: 18px;
231
+ margin: 0;
232
+ accent-color: var(--accent);
233
+ cursor: pointer;
234
+ }
235
+
236
+ .layout-option-content {
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: var(--sp-2);
240
+ }
241
+
242
+ .layout-option-label {
243
+ font-size: var(--font-size-md);
244
+ font-weight: 500;
245
+ color: var(--text-primary, #e0e0e0);
246
+ }
247
+
248
+ .layout-option-desc {
249
+ font-size: var(--font-size-sm);
250
+ color: var(--text-secondary, #9ca3af);
251
+ }
252
+
253
+ /* Font Scale Control */
254
+ .font-scale-control {
255
+ display: flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ gap: var(--sp-8);
259
+ padding: var(--sp-12) var(--sp-16);
260
+ background: var(--bg-secondary, #16162a);
261
+ border-radius: var(--radius-md);
262
+ }
263
+
264
+ .font-scale-btn {
265
+ width: var(--layout-btn-lg);
266
+ height: var(--layout-btn-lg);
267
+ display: flex;
268
+ align-items: center;
269
+ justify-content: center;
270
+ background: var(--bg-tertiary, #252540);
271
+ border: 1px solid var(--border-color, #2d2d44);
272
+ border-radius: var(--radius-md);
273
+ color: var(--text-secondary, #9ca3af);
274
+ cursor: pointer;
275
+ transition: all 0.15s ease;
276
+ }
277
+
278
+ .font-scale-btn:hover {
279
+ background: var(--bg-hover, rgba(255, 255, 255, 0.1));
280
+ border-color: var(--accent);
281
+ color: var(--text-primary, #e0e0e0);
282
+ }
283
+
284
+ .font-scale-btn:active {
285
+ transform: scale(0.95);
286
+ }
287
+
288
+ .font-scale-btn svg {
289
+ width: 16px;
290
+ height: 16px;
291
+ }
292
+
293
+ .font-scale-label {
294
+ min-width: 60px;
295
+ text-align: center;
296
+ font-size: var(--font-size-lg);
297
+ font-weight: 500;
298
+ font-variant-numeric: tabular-nums;
299
+ color: var(--text-primary, #e0e0e0);
300
+ }
301
+
302
+ /* Opacity Slider Control */
303
+ .opacity-slider-control {
304
+ display: flex;
305
+ align-items: center;
306
+ gap: var(--sp-12);
307
+ padding: var(--sp-12) var(--sp-16);
308
+ background: var(--bg-secondary, #16162a);
309
+ border-radius: var(--radius-md);
310
+ }
311
+
312
+ .opacity-slider {
313
+ flex: 1;
314
+ height: 6px;
315
+ -webkit-appearance: none;
316
+ appearance: none;
317
+ background: var(--bg-tertiary, #252540);
318
+ border-radius: var(--radius-sm);
319
+ cursor: pointer;
320
+ }
321
+
322
+ .opacity-slider::-webkit-slider-thumb {
323
+ -webkit-appearance: none;
324
+ appearance: none;
325
+ width: 18px;
326
+ height: 18px;
327
+ background: var(--accent);
328
+ border-radius: 50%;
329
+ cursor: pointer;
330
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
331
+ }
332
+
333
+ .opacity-slider::-webkit-slider-thumb:hover {
334
+ transform: scale(1.1);
335
+ box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.2);
336
+ }
337
+
338
+ .opacity-slider::-moz-range-thumb {
339
+ width: 18px;
340
+ height: 18px;
341
+ background: var(--accent);
342
+ border: none;
343
+ border-radius: 50%;
344
+ cursor: pointer;
345
+ }
346
+
347
+ .opacity-slider-label {
348
+ min-width: 48px;
349
+ text-align: right;
350
+ font-size: var(--font-size-md);
351
+ font-weight: 500;
352
+ font-variant-numeric: tabular-nums;
353
+ color: var(--text-primary, #e0e0e0);
354
+ }
355
+
356
+ /* ═══════════════════════════════════════════════════════════════════════════
357
+ Shortcuts Editor
358
+ ═══════════════════════════════════════════════════════════════════════════ */
359
+
360
+ .shortcuts-header {
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: space-between;
364
+ gap: var(--sp-12);
365
+ padding-bottom: var(--sp-12);
366
+ border-bottom: 1px solid var(--border-color, #2d2d44);
367
+ }
368
+
369
+ .shortcuts-hint {
370
+ margin: 0;
371
+ font-size: var(--font-size-base);
372
+ color: var(--text-secondary, #9ca3af);
373
+ line-height: 1.4;
374
+ }
375
+
376
+ .shortcuts-reset-all {
377
+ flex-shrink: 0;
378
+ padding: var(--sp-6) var(--sp-12);
379
+ background: none;
380
+ border: 1px solid var(--border-color, #2d2d44);
381
+ border-radius: var(--radius-md);
382
+ color: var(--text-secondary, #9ca3af);
383
+ font-size: var(--font-size-sm);
384
+ cursor: pointer;
385
+ transition: all 0.15s ease;
386
+ }
387
+
388
+ .shortcuts-reset-all:hover {
389
+ border-color: #ef4444;
390
+ color: #ef4444;
391
+ }
392
+
393
+ .shortcuts-reset-all.armed {
394
+ background: #ef4444;
395
+ border-color: #ef4444;
396
+ color: #fff;
397
+ }
398
+
399
+ /* ─────────────────────────────────────────────────────────────────────────────
400
+ Shortcuts Search & Filter
401
+ ───────────────────────────────────────────────────────────────────────────── */
402
+
403
+ .shortcuts-search {
404
+ display: flex;
405
+ flex-direction: column;
406
+ gap: var(--sp-12);
407
+ padding-bottom: var(--sp-16);
408
+ border-bottom: 1px solid var(--border-color, #2d2d44);
409
+ margin-bottom: var(--sp-16);
410
+ }
411
+
412
+ .shortcuts-search-input-wrapper {
413
+ position: relative;
414
+ display: flex;
415
+ align-items: center;
416
+ }
417
+
418
+ .shortcuts-search-icon {
419
+ position: absolute;
420
+ left: 12px;
421
+ width: 16px;
422
+ height: 16px;
423
+ color: var(--text-secondary, #9ca3af);
424
+ pointer-events: none;
425
+ }
426
+
427
+ .shortcuts-search-input {
428
+ width: 100%;
429
+ padding: var(--sp-10) 36px var(--sp-10) 38px;
430
+ background: var(--bg-secondary, #16162a);
431
+ border: 1px solid var(--border-color, #2d2d44);
432
+ border-radius: var(--radius-md);
433
+ color: var(--text-primary, #e5e7eb);
434
+ font-size: var(--font-size-md);
435
+ outline: none;
436
+ transition: border-color 0.15s ease;
437
+ }
438
+
439
+ .shortcuts-search-input::placeholder {
440
+ color: var(--text-secondary, #9ca3af);
441
+ }
442
+
443
+ .shortcuts-search-input:focus {
444
+ border-color: var(--accent);
445
+ }
446
+
447
+ .shortcuts-search-clear {
448
+ position: absolute;
449
+ right: 8px;
450
+ width: 24px;
451
+ height: 24px;
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: center;
455
+ background: none;
456
+ border: none;
457
+ color: var(--text-secondary, #9ca3af);
458
+ cursor: pointer;
459
+ border-radius: var(--radius-sm);
460
+ transition: color 0.15s ease;
461
+ }
462
+
463
+ .shortcuts-search-clear:hover {
464
+ color: var(--text-primary, #e5e7eb);
465
+ }
466
+
467
+ .shortcuts-search-clear svg {
468
+ width: 14px;
469
+ height: 14px;
470
+ }
471
+
472
+ .shortcuts-filters {
473
+ display: flex;
474
+ flex-direction: column;
475
+ gap: var(--sp-8);
476
+ }
477
+
478
+ .shortcuts-filter-group {
479
+ display: flex;
480
+ flex-wrap: wrap;
481
+ gap: var(--sp-6);
482
+ }
483
+
484
+ .shortcuts-chip {
485
+ padding: var(--sp-5) var(--sp-10);
486
+ background: var(--bg-secondary, #16162a);
487
+ border: 1px solid var(--border-color, #2d2d44);
488
+ border-radius: var(--radius-sm);
489
+ color: var(--text-secondary, #9ca3af);
490
+ font-size: var(--font-size-sm);
491
+ cursor: pointer;
492
+ transition: all 0.15s ease;
493
+ display: flex;
494
+ align-items: center;
495
+ gap: var(--sp-5);
496
+ }
497
+
498
+ .shortcuts-chip:hover:not(:disabled) {
499
+ border-color: var(--accent);
500
+ color: var(--text-primary, #e5e7eb);
501
+ }
502
+
503
+ .shortcuts-chip.active {
504
+ background: var(--accent);
505
+ border-color: var(--accent);
506
+ color: white;
507
+ }
508
+
509
+ .shortcuts-chip:disabled {
510
+ opacity: 0.4;
511
+ cursor: not-allowed;
512
+ }
513
+
514
+ .shortcuts-chip svg {
515
+ width: 12px;
516
+ height: 12px;
517
+ }
518
+
519
+ .shortcuts-chip-toggle svg {
520
+ flex-shrink: 0;
521
+ }
522
+
523
+ .shortcuts-result-count {
524
+ font-size: var(--font-size-sm);
525
+ color: var(--text-secondary, #9ca3af);
526
+ padding: var(--sp-4) 0;
527
+ }
528
+
529
+ .shortcuts-no-results {
530
+ display: flex;
531
+ flex-direction: column;
532
+ align-items: center;
533
+ justify-content: center;
534
+ gap: var(--sp-12);
535
+ padding: var(--sp-32) var(--sp-20);
536
+ text-align: center;
537
+ color: var(--text-secondary, #9ca3af);
538
+ }
539
+
540
+ .shortcuts-no-results svg {
541
+ width: 40px;
542
+ height: 40px;
543
+ opacity: 0.5;
544
+ }
545
+
546
+ .shortcuts-no-results p {
547
+ margin: 0;
548
+ font-size: var(--font-size-md);
549
+ }
550
+
551
+ .shortcuts-clear-filters {
552
+ padding: var(--sp-8) var(--sp-16);
553
+ background: var(--bg-secondary, #16162a);
554
+ border: 1px solid var(--border-color, #2d2d44);
555
+ border-radius: var(--radius-md);
556
+ color: var(--text-primary, #e5e7eb);
557
+ font-size: var(--font-size-base);
558
+ cursor: pointer;
559
+ transition: all 0.15s ease;
560
+ }
561
+
562
+ .shortcuts-clear-filters:hover {
563
+ border-color: var(--accent);
564
+ background: var(--bg-hover, rgba(255, 255, 255, 0.05));
565
+ }
566
+
567
+ /* Match highlighting */
568
+ .shortcut-match {
569
+ background: rgba(59, 130, 246, 0.3);
570
+ color: var(--text-primary, #e5e7eb);
571
+ padding: 1px var(--sp-2);
572
+ border-radius: var(--radius-xs);
573
+ }
574
+
575
+ .shortcut-key-btn.key-match {
576
+ border-color: var(--accent);
577
+ background: rgba(var(--accent-rgb), 0.15);
578
+ }
579
+
580
+ /* Conflict indicator */
581
+ .shortcut-item.has-conflict {
582
+ border-left: 3px solid var(--accent-orange);
583
+ padding-left: calc(var(--sp-12) - 3px); /* base padding minus the border */
584
+ }
585
+
586
+ .shortcut-conflict-badge {
587
+ font-size: var(--font-size-sm);
588
+ color: #f59e0b;
589
+ margin-left: var(--sp-4);
590
+ }
591
+
592
+ .shortcuts-list {
593
+ display: flex;
594
+ flex-direction: column;
595
+ gap: var(--sp-20);
596
+ }
597
+
598
+ .shortcuts-category {
599
+ display: flex;
600
+ flex-direction: column;
601
+ gap: var(--sp-8);
602
+ }
603
+
604
+ .shortcuts-category-title {
605
+ margin: 0;
606
+ font-size: var(--font-size-sm);
607
+ font-weight: 600;
608
+ text-transform: uppercase;
609
+ letter-spacing: 0.5px;
610
+ color: var(--text-secondary, #9ca3af);
611
+ padding-bottom: var(--sp-4);
612
+ }
613
+
614
+ .shortcuts-category-list {
615
+ display: flex;
616
+ flex-direction: column;
617
+ gap: var(--sp-2);
618
+ }
619
+
620
+ .shortcut-item {
621
+ display: flex;
622
+ align-items: center;
623
+ justify-content: space-between;
624
+ gap: var(--sp-12);
625
+ padding: var(--sp-10) var(--sp-12);
626
+ background: var(--bg-secondary, #16162a);
627
+ border-radius: var(--radius-md);
628
+ transition: background 0.15s ease;
629
+ }
630
+
631
+ .shortcut-item:hover {
632
+ background: var(--bg-hover, rgba(255, 255, 255, 0.05));
633
+ }
634
+
635
+ .shortcut-item.customized {
636
+ border-left: 3px solid var(--accent);
637
+ padding-left: calc(var(--sp-12) - 3px); /* base padding minus the border */
638
+ }
639
+
640
+ .shortcut-info {
641
+ display: flex;
642
+ flex-direction: column;
643
+ gap: var(--sp-2);
644
+ min-width: 0;
645
+ }
646
+
647
+ .shortcut-label {
648
+ font-size: var(--font-size-md);
649
+ color: var(--text-primary, #e0e0e0);
650
+ white-space: nowrap;
651
+ overflow: hidden;
652
+ text-overflow: ellipsis;
653
+ }
654
+
655
+ .shortcut-default {
656
+ font-size: var(--font-size-xs);
657
+ color: var(--accent);
658
+ }
659
+
660
+ .shortcut-keys {
661
+ display: flex;
662
+ align-items: center;
663
+ gap: var(--sp-6);
664
+ flex-shrink: 0;
665
+ }
666
+
667
+ .shortcut-key-btn {
668
+ padding: var(--sp-6) var(--sp-12);
669
+ background: var(--bg-tertiary, #252540);
670
+ border: 1px solid var(--border-color, #2d2d44);
671
+ border-radius: var(--radius-md);
672
+ color: var(--text-primary, #e0e0e0);
673
+ font-size: var(--font-size-sm);
674
+ font-family: 'SF Mono', Menlo, Monaco, monospace;
675
+ cursor: pointer;
676
+ transition: all 0.15s ease;
677
+ min-width: 80px;
678
+ text-align: center;
679
+ }
680
+
681
+ .shortcut-key-btn:hover {
682
+ border-color: var(--accent);
683
+ background: rgba(var(--accent-rgb), 0.1);
684
+ }
685
+
686
+ .shortcut-key-btn:focus {
687
+ outline: none;
688
+ border-color: var(--accent);
689
+ box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.2);
690
+ }
691
+
692
+ .shortcut-key-btn.capturing {
693
+ border-color: #f59e0b;
694
+ background: rgba(245, 158, 11, 0.15);
695
+ color: #f59e0b;
696
+ animation: pulse-capture 1s infinite;
697
+ }
698
+
699
+ .shortcut-key-btn.conflict {
700
+ border-color: #ef4444;
701
+ background: rgba(239, 68, 68, 0.15);
702
+ color: #ef4444;
703
+ }
704
+
705
+ @keyframes pulse-capture {
706
+ 0%, 100% { opacity: 1; }
707
+ 50% { opacity: 0.7; }
708
+ }
709
+
710
+ .shortcut-key-btn.shortcut-key-secondary {
711
+ min-width: 60px;
712
+ background: transparent;
713
+ border-style: dashed;
714
+ }
715
+
716
+ .shortcut-key-btn.shortcut-key-secondary:not(:has(.key-add)) {
717
+ background: var(--bg-tertiary, #252540);
718
+ border-style: solid;
719
+ }
720
+
721
+ .key-empty {
722
+ color: var(--text-secondary, #666);
723
+ font-style: italic;
724
+ }
725
+
726
+ .key-add {
727
+ color: var(--text-secondary, #666);
728
+ font-size: var(--font-size-lg);
729
+ font-weight: 300;
730
+ }
731
+
732
+ .shortcut-key-btn:hover .key-add {
733
+ color: var(--accent);
734
+ }
735
+
736
+ .shortcut-remove-secondary-btn {
737
+ padding: var(--sp-4);
738
+ background: none;
739
+ border: none;
740
+ border-radius: var(--radius-sm);
741
+ color: var(--text-secondary, #9ca3af);
742
+ cursor: pointer;
743
+ transition: all 0.15s ease;
744
+ opacity: 0.6;
745
+ }
746
+
747
+ .shortcut-remove-secondary-btn:hover {
748
+ color: #ef4444;
749
+ opacity: 1;
750
+ }
751
+
752
+ .shortcut-remove-secondary-btn svg {
753
+ width: 12px;
754
+ height: 12px;
755
+ display: block;
756
+ }
757
+
758
+ .shortcut-reset-btn {
759
+ padding: var(--sp-6);
760
+ background: none;
761
+ border: 1px solid transparent;
762
+ border-radius: var(--radius-md);
763
+ color: var(--text-secondary, #9ca3af);
764
+ cursor: pointer;
765
+ transition: all 0.15s ease;
766
+ }
767
+
768
+ .shortcut-reset-btn:hover {
769
+ border-color: var(--border-color, #2d2d44);
770
+ color: var(--text-primary, #e0e0e0);
771
+ }
772
+
773
+ .shortcut-reset-btn svg {
774
+ width: 14px;
775
+ height: 14px;
776
+ display: block;
777
+ }
778
+
779
+ /* ═══════════════════════════════════════════════════════════════════════════
780
+ System Settings
781
+ ═══════════════════════════════════════════════════════════════════════════ */
782
+
783
+ .system-section {
784
+ padding: var(--sp-16) 0;
785
+ border-bottom: 1px solid var(--border-color, #2d2d44);
786
+ }
787
+
788
+ .system-section:last-child {
789
+ border-bottom: none;
790
+ }
791
+
792
+ /* Deep-link landing highlight — a cross-link that names a section (e.g. the
793
+ Auto-journal panel's "Configure defaults for new projects →") scrolls here
794
+ and flashes, so the arrival is visible on a dense tab. Purely additive: the
795
+ class is added for ~1.6s and removed. */
796
+ @keyframes config-section-flash {
797
+ 0% { background: transparent; }
798
+ 25% { background: var(--bg-hover, rgba(255, 255, 255, 0.07)); }
799
+ 100% { background: transparent; }
800
+ }
801
+ .system-section.config-section-flash {
802
+ animation: config-section-flash 1.6s ease-out;
803
+ border-radius: var(--radius-sm);
804
+ }
805
+ /* Respect a reduced-motion preference — the scroll still happens. */
806
+ @media (prefers-reduced-motion: reduce) {
807
+ .system-section.config-section-flash { animation: none; }
808
+ }
809
+
810
+ .system-section-title {
811
+ margin: 0 0 var(--sp-16) 0;
812
+ font-size: var(--font-size-base);
813
+ font-weight: 600;
814
+ text-transform: uppercase;
815
+ letter-spacing: 0.5px;
816
+ color: var(--text-secondary, #9ca3af);
817
+ }
818
+
819
+ .system-setting {
820
+ display: flex;
821
+ align-items: center;
822
+ justify-content: space-between;
823
+ gap: var(--sp-16);
824
+ padding: var(--sp-12) var(--sp-14);
825
+ background: var(--bg-secondary, #16162a);
826
+ border-radius: var(--radius-md);
827
+ margin-bottom: var(--sp-8);
828
+ }
829
+
830
+ .system-setting:last-child {
831
+ margin-bottom: 0;
832
+ }
833
+
834
+ .system-setting-label {
835
+ display: flex;
836
+ flex-direction: column;
837
+ gap: var(--sp-2);
838
+ flex: 1;
839
+ min-width: 0;
840
+ }
841
+
842
+ .system-setting-name {
843
+ font-size: var(--font-size-md);
844
+ font-weight: 500;
845
+ color: var(--text-primary, #e0e0e0);
846
+ }
847
+
848
+ .system-setting-desc {
849
+ font-size: var(--font-size-sm);
850
+ color: var(--text-secondary, #9ca3af);
851
+ }
852
+
853
+ .system-setting-control {
854
+ flex-shrink: 0;
855
+ }
856
+
857
+ .system-number-input {
858
+ width: 70px;
859
+ padding: var(--sp-8) var(--sp-12);
860
+ background: var(--bg-tertiary, #252540);
861
+ border: 1px solid var(--border-color, #2d2d44);
862
+ border-radius: var(--radius-md);
863
+ color: var(--text-primary, #e0e0e0);
864
+ font-size: var(--font-size-md);
865
+ font-family: 'SF Mono', Menlo, Monaco, monospace;
866
+ text-align: center;
867
+ -moz-appearance: textfield;
868
+ }
869
+
870
+ .system-number-input::-webkit-outer-spin-button,
871
+ .system-number-input::-webkit-inner-spin-button {
872
+ -webkit-appearance: none;
873
+ margin: 0;
874
+ }
875
+
876
+ .system-number-input:focus {
877
+ outline: none;
878
+ border-color: var(--accent);
879
+ box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.2);
880
+ }
881
+
882
+ .widget-size-inputs {
883
+ display: flex;
884
+ align-items: center;
885
+ gap: var(--sp-6);
886
+ }
887
+
888
+ .size-input {
889
+ width: 65px;
890
+ padding: var(--sp-6) var(--sp-8);
891
+ background: var(--bg-tertiary, #252540);
892
+ border: 1px solid var(--border-color, #2d2d44);
893
+ border-radius: var(--radius-md);
894
+ color: var(--text-primary, #e0e0e0);
895
+ font-size: var(--font-size-base);
896
+ font-family: 'SF Mono', Menlo, Monaco, monospace;
897
+ text-align: center;
898
+ -moz-appearance: textfield;
899
+ }
900
+
901
+ .size-input::-webkit-outer-spin-button,
902
+ .size-input::-webkit-inner-spin-button {
903
+ -webkit-appearance: none;
904
+ margin: 0;
905
+ }
906
+
907
+ .size-input:focus {
908
+ outline: none;
909
+ border-color: var(--accent);
910
+ box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.2);
911
+ }
912
+
913
+ .size-separator {
914
+ color: var(--text-secondary, #9ca3af);
915
+ font-size: var(--font-size-md);
916
+ }
917
+
918
+ .system-reset-btn,
919
+ .system-btn {
920
+ height: var(--layout-btn-md);
921
+ padding: var(--sp-8) var(--sp-16);
922
+ background: var(--bg-tertiary, #252540);
923
+ border: 1px solid var(--border-primary, #2d2d44);
924
+ border-radius: var(--radius-md);
925
+ color: var(--text-primary, #e0e0e0);
926
+ font-size: var(--font-size-base);
927
+ font-weight: 500;
928
+ cursor: pointer;
929
+ transition: all 0.15s ease;
930
+ }
931
+
932
+ .system-reset-btn:hover:not(:disabled),
933
+ .system-btn:hover:not(:disabled) {
934
+ background: var(--bg-hover, rgba(255, 255, 255, 0.1));
935
+ border-color: var(--accent);
936
+ color: var(--text-primary, #e0e0e0);
937
+ }
938
+
939
+ .system-reset-btn:active:not(:disabled),
940
+ .system-btn:active:not(:disabled) {
941
+ transform: scale(0.97);
942
+ }
943
+
944
+ .system-reset-btn:disabled,
945
+ .system-btn:disabled {
946
+ opacity: 0.4;
947
+ cursor: not-allowed;
948
+ }
949
+
950
+ .system-reset-btn.armed,
951
+ .system-reset-btn.armed:hover,
952
+ .system-btn.armed,
953
+ .system-btn.armed:hover {
954
+ background: #ef4444;
955
+ border-color: #ef4444;
956
+ color: #fff;
957
+ }
958
+
959
+ /* Destructive account actions: tinted at rest so the blast radius reads
960
+ before the click, then the shared .armed rule takes over on confirm. */
961
+ .system-btn.danger {
962
+ border-color: color-mix(in srgb, var(--error) 45%, var(--border-primary, #2d2d44));
963
+ color: var(--error);
964
+ }
965
+
966
+ .system-btn.danger:hover:not(:disabled) {
967
+ border-color: var(--error);
968
+ color: var(--error);
969
+ }
970
+
971
+ /* Armed beats danger. Both selectors have the same specificity and .danger
972
+ is declared later, so without this the confirm state renders as red text
973
+ on the red armed fill — unreadable exactly when the label matters most. */
974
+ .system-btn.danger.armed,
975
+ .system-btn.danger.armed:hover {
976
+ background: #ef4444;
977
+ border-color: #ef4444;
978
+ color: #fff;
979
+ }
980
+
981
+ /* Account section rows carry more explanation than a typical setting, so
982
+ let the description wrap wide and keep the button from being squeezed. */
983
+ #account-section .system-setting-control {
984
+ flex: 0 0 auto;
985
+ }
986
+
987
+ /* Restore-defaults button sits on its own row under the models list */
988
+ #models-reset-btn {
989
+ margin-top: var(--sp-10);
990
+ }
991
+
992
+ /* Select dropdown for system settings */
993
+ .system-select {
994
+ padding: var(--sp-8) var(--sp-12);
995
+ background: var(--bg-tertiary, #252540);
996
+ border: 1px solid var(--border-color, #2d2d44);
997
+ border-radius: var(--radius-md);
998
+ color: var(--text-primary, #e0e0e0);
999
+ font-size: var(--font-size-base);
1000
+ cursor: pointer;
1001
+ min-width: 140px;
1002
+ }
1003
+
1004
+ .system-select:focus {
1005
+ outline: none;
1006
+ border-color: var(--accent);
1007
+ box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.2);
1008
+ }
1009
+
1010
+ .system-select option {
1011
+ background: var(--bg-tertiary, #252540);
1012
+ color: var(--text-primary, #e0e0e0);
1013
+ }
1014
+
1015
+ /* Collapse mode 3×3 grid */
1016
+ .collapse-mode-grid {
1017
+ display: grid;
1018
+ grid-template-columns: auto 1fr 1fr 1fr;
1019
+ gap: var(--sp-6) var(--sp-8);
1020
+ align-items: center;
1021
+ padding: var(--sp-4) 0;
1022
+ }
1023
+
1024
+ .collapse-grid-header {
1025
+ color: var(--text-muted);
1026
+ font-size: 10px;
1027
+ text-align: center;
1028
+ text-transform: uppercase;
1029
+ letter-spacing: 0.5px;
1030
+ }
1031
+
1032
+ .collapse-grid-label {
1033
+ color: var(--text-secondary);
1034
+ font-size: var(--font-size-sm);
1035
+ padding-right: var(--sp-8);
1036
+ }
1037
+
1038
+ .collapse-mode-grid .system-select {
1039
+ width: 100%;
1040
+ font-size: var(--font-size-xs);
1041
+ padding: var(--sp-4) var(--sp-6);
1042
+ min-width: 0;
1043
+ }
1044
+
1045
+ /* Text input for system settings (e.g., Claude path) */
1046
+ .system-text-input {
1047
+ flex: 1;
1048
+ min-width: 0;
1049
+ padding: var(--sp-8) var(--sp-12);
1050
+ background: var(--bg-tertiary, #252540);
1051
+ border: 1px solid var(--border-color, #2d2d44);
1052
+ border-radius: var(--radius-md);
1053
+ color: var(--text-primary, #e0e0e0);
1054
+ font-size: var(--font-size-base);
1055
+ font-family: 'SF Mono', Menlo, Monaco, monospace;
1056
+ }
1057
+
1058
+ .system-text-input::placeholder {
1059
+ color: var(--text-muted, #6b7280);
1060
+ }
1061
+
1062
+ .system-text-input:focus {
1063
+ outline: none;
1064
+ border-color: var(--accent);
1065
+ box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.2);
1066
+ }
1067
+
1068
+ /* Save button for system settings */
1069
+ .system-save-btn {
1070
+ height: var(--layout-btn-md);
1071
+ padding: 0 var(--sp-16);
1072
+ background: var(--accent);
1073
+ border: none;
1074
+ border-radius: var(--radius-md);
1075
+ color: white;
1076
+ font-size: var(--font-size-base);
1077
+ font-weight: 500;
1078
+ cursor: pointer;
1079
+ transition: all 0.15s ease;
1080
+ }
1081
+
1082
+ .system-save-btn:hover:not(:disabled) {
1083
+ background: var(--accent-hover);
1084
+ }
1085
+
1086
+ .system-save-btn:active:not(:disabled) {
1087
+ transform: scale(0.97);
1088
+ }
1089
+
1090
+ .system-save-btn:disabled {
1091
+ opacity: 0.5;
1092
+ cursor: not-allowed;
1093
+ }
1094
+
1095
+ /* ═══════════════════════════════════════════════════════════════════════════
1096
+ Engines tab — engines list (which AI engines the picker offers)
1097
+ ═══════════════════════════════════════════════════════════════════════════ */
1098
+
1099
+ .engines-list {
1100
+ display: flex;
1101
+ flex-direction: column;
1102
+ gap: var(--sp-6);
1103
+ margin-bottom: var(--sp-8);
1104
+ }
1105
+
1106
+ .engine-row {
1107
+ display: flex;
1108
+ align-items: center;
1109
+ gap: var(--sp-12);
1110
+ padding: var(--sp-6) var(--sp-8);
1111
+ background: var(--bg-tertiary);
1112
+ border: 1px solid var(--border-primary);
1113
+ border-radius: var(--radius-sm);
1114
+ }
1115
+
1116
+ .engine-row.unavailable .engine-row-name,
1117
+ .engine-row.unavailable .engine-row-desc {
1118
+ opacity: 0.55;
1119
+ }
1120
+
1121
+ .engine-row-label {
1122
+ flex: 1;
1123
+ display: flex;
1124
+ flex-direction: column;
1125
+ gap: var(--sp-2);
1126
+ min-width: 0;
1127
+ }
1128
+
1129
+ .engine-row-name {
1130
+ display: inline-flex;
1131
+ align-items: center;
1132
+ gap: var(--sp-6);
1133
+ font-size: var(--font-size-base);
1134
+ color: var(--text-primary);
1135
+ }
1136
+
1137
+ .engine-row-tag {
1138
+ font-size: var(--font-size-xs);
1139
+ color: var(--text-muted);
1140
+ border: 1px solid var(--border-primary);
1141
+ border-radius: var(--radius-xs);
1142
+ padding: 0 var(--sp-4);
1143
+ }
1144
+
1145
+ .engine-row-desc {
1146
+ font-size: var(--font-size-xs);
1147
+ color: var(--text-muted);
1148
+ }
1149
+
1150
+ /* Engine trait worth knowing before the toggle (e.g. prompts in argv).
1151
+ Muted-warning, not alarm: these are documented, accepted properties of a
1152
+ working engine, not faults. Left rule instead of an icon so it reads as an
1153
+ aside rather than an error, and stays legible with no color perception. */
1154
+ .engine-row-note {
1155
+ font-size: var(--font-size-xs);
1156
+ color: var(--text-secondary);
1157
+ border-left: 2px solid var(--warning);
1158
+ padding-left: var(--sp-6);
1159
+ margin-top: var(--sp-2);
1160
+ line-height: 1.4;
1161
+ }
1162
+
1163
+ .engine-row-toggle {
1164
+ flex: none;
1165
+ }
1166
+
1167
+ .engine-row-toggle:disabled {
1168
+ opacity: 0.5;
1169
+ }
1170
+
1171
+ /* "Make default" ghost button on non-default rows */
1172
+ .engine-row-make-default {
1173
+ flex: none;
1174
+ padding: var(--sp-3) var(--sp-8);
1175
+ background: transparent;
1176
+ border: 1px solid var(--border-primary);
1177
+ border-radius: var(--radius-sm);
1178
+ color: var(--text-muted);
1179
+ font-size: var(--font-size-xs);
1180
+ white-space: nowrap;
1181
+ cursor: pointer;
1182
+ transition: border-color 0.12s ease, color 0.12s ease;
1183
+ }
1184
+
1185
+ .engine-row-make-default:hover {
1186
+ border-color: var(--accent);
1187
+ color: var(--text-primary);
1188
+ }
1189
+
1190
+ /* ═══════════════════════════════════════════════════════════════════════════
1191
+ Engines tab — engine sub-tabs + unified panel (CLI path + model catalog)
1192
+ ═══════════════════════════════════════════════════════════════════════════ */
1193
+
1194
+ .engine-subtabs {
1195
+ display: flex;
1196
+ flex-wrap: wrap;
1197
+ gap: var(--sp-6);
1198
+ margin-bottom: var(--sp-12);
1199
+ }
1200
+
1201
+ .engine-subtab {
1202
+ display: inline-flex;
1203
+ align-items: center;
1204
+ gap: var(--sp-6);
1205
+ padding: var(--sp-4) var(--sp-10);
1206
+ background: var(--bg-tertiary);
1207
+ border: 1px solid var(--border-primary);
1208
+ border-radius: var(--radius-sm);
1209
+ color: var(--text-muted);
1210
+ font-size: var(--font-size-sm);
1211
+ cursor: pointer;
1212
+ transition: border-color 0.12s ease, color 0.12s ease, background 0.12s ease;
1213
+ }
1214
+
1215
+ .engine-subtab:hover {
1216
+ color: var(--text-primary);
1217
+ border-color: var(--border-secondary, var(--border-primary));
1218
+ }
1219
+
1220
+ .engine-subtab.active {
1221
+ color: var(--text-primary);
1222
+ border-color: var(--accent);
1223
+ background: var(--bg-secondary);
1224
+ }
1225
+
1226
+ /* Version / resolved-path probe line (also carries PUT errors) */
1227
+ .engine-card-status {
1228
+ margin: 0 0 var(--sp-8);
1229
+ font-size: var(--font-size-sm);
1230
+ color: var(--text-muted);
1231
+ font-family: 'SF Mono', Menlo, Monaco, monospace;
1232
+ word-break: break-all;
1233
+ min-height: 1.2em;
1234
+ }
1235
+
1236
+ .engine-card-status.unavailable {
1237
+ color: var(--color-warning, #f59e0b);
1238
+ font-family: inherit;
1239
+ }
1240
+
1241
+ .engine-path-row {
1242
+ display: flex;
1243
+ gap: var(--sp-8);
1244
+ align-items: center;
1245
+ }
1246
+
1247
+ .engine-path-row .system-text-input {
1248
+ flex: 1;
1249
+ min-width: 0;
1250
+ }
1251
+
1252
+ .engine-card-subtitle {
1253
+ margin: var(--sp-16) 0 var(--sp-8);
1254
+ font-size: var(--font-size-sm);
1255
+ font-weight: 600;
1256
+ color: var(--text-secondary);
1257
+ }
1258
+
1259
+ /* CLI login status row — dot + detail + terminal-handoff login button */
1260
+ .engine-auth {
1261
+ display: flex;
1262
+ align-items: center;
1263
+ gap: var(--sp-8);
1264
+ margin-top: var(--sp-10);
1265
+ min-height: 24px;
1266
+ }
1267
+
1268
+ .engine-auth-dot {
1269
+ flex: none;
1270
+ width: 8px;
1271
+ height: 8px;
1272
+ border-radius: 50%; /* true circle — stays round in all density modes */
1273
+ background: var(--text-muted);
1274
+ }
1275
+
1276
+ .engine-auth-dot.ok { background: var(--success); }
1277
+ .engine-auth-dot.err { background: var(--error); }
1278
+
1279
+ .engine-auth-dot.checking {
1280
+ animation: engine-auth-pulse 1.2s ease-in-out infinite;
1281
+ }
1282
+
1283
+ @keyframes engine-auth-pulse {
1284
+ 0%, 100% { opacity: 1; }
1285
+ 50% { opacity: 0.3; }
1286
+ }
1287
+
1288
+ .engine-auth-text {
1289
+ font-size: var(--font-size-sm);
1290
+ color: var(--text-secondary);
1291
+ min-width: 0;
1292
+ overflow: hidden;
1293
+ text-overflow: ellipsis;
1294
+ white-space: nowrap;
1295
+ }
1296
+
1297
+ .engine-login-btn {
1298
+ flex: none;
1299
+ margin-left: var(--sp-4);
1300
+ }
1301
+
1302
+ /* Per-engine new-session defaults (model / effort / account) */
1303
+ .engine-defaults {
1304
+ display: flex;
1305
+ flex-direction: column;
1306
+ gap: var(--sp-6);
1307
+ }
1308
+
1309
+ .engine-defaults-row {
1310
+ display: flex;
1311
+ align-items: center;
1312
+ justify-content: space-between;
1313
+ gap: var(--sp-8);
1314
+ }
1315
+
1316
+ .engine-defaults-label {
1317
+ font-size: var(--font-size-sm);
1318
+ color: var(--text-secondary);
1319
+ }
1320
+
1321
+ .engine-defaults-row .system-select {
1322
+ min-width: 220px;
1323
+ }
1324
+
1325
+ /* Per-engine auto-journal model */
1326
+ .engine-journal-input {
1327
+ max-width: 320px;
1328
+ }
1329
+
1330
+ @media (max-width: 600px) {
1331
+ .engine-defaults-row {
1332
+ flex-direction: column;
1333
+ align-items: stretch;
1334
+ }
1335
+ .engine-defaults-row .system-select {
1336
+ min-width: 0;
1337
+ }
1338
+ }
1339
+
1340
+ /* ═══════════════════════════════════════════════════════════════════════════
1341
+ Engines tab — model list (one row shape for every engine)
1342
+ ═══════════════════════════════════════════════════════════════════════════ */
1343
+
1344
+ .models-list {
1345
+ display: flex;
1346
+ flex-direction: column;
1347
+ gap: var(--sp-6);
1348
+ margin-bottom: var(--sp-12);
1349
+ }
1350
+
1351
+ /* toggle | id | label | description | delete (delete cell empty when the
1352
+ engine's CLI owns the definitions — the columns stay identical) */
1353
+ .models-row {
1354
+ display: grid;
1355
+ grid-template-columns: 16px 200px 130px 1fr 28px;
1356
+ gap: var(--sp-6);
1357
+ align-items: center;
1358
+ }
1359
+
1360
+ .models-row-toggle {
1361
+ width: 16px;
1362
+ height: 16px;
1363
+ margin: 0;
1364
+ cursor: pointer;
1365
+ }
1366
+
1367
+ .models-row .models-row-input {
1368
+ min-width: 0;
1369
+ font-size: var(--font-size-sm);
1370
+ padding: var(--sp-6) var(--sp-8);
1371
+ }
1372
+
1373
+ /* CLI-owned definitions: same row, just not editable */
1374
+ .models-row .models-row-input[readonly] {
1375
+ color: var(--text-secondary, #c9d1d9);
1376
+ cursor: default;
1377
+ }
1378
+
1379
+ /* Hidden-from-pickers rows keep their place, dimmed */
1380
+ .models-row.model-off .models-row-input {
1381
+ opacity: 0.45;
1382
+ }
1383
+
1384
+ .models-row-delete {
1385
+ width: var(--layout-btn-sm);
1386
+ height: var(--layout-btn-sm);
1387
+ padding: 0;
1388
+ background: transparent;
1389
+ border: 1px solid var(--border-color, #2d2d44);
1390
+ border-radius: var(--radius-sm);
1391
+ color: var(--text-muted, #9ca3af);
1392
+ font-size: var(--font-size-lg);
1393
+ line-height: 1;
1394
+ cursor: pointer;
1395
+ transition: all 0.15s;
1396
+ }
1397
+
1398
+ .models-row-delete:hover {
1399
+ background: var(--color-error-bg, rgba(239, 68, 68, 0.1));
1400
+ border-color: var(--color-error, #ef4444);
1401
+ color: var(--color-error, #ef4444);
1402
+ }
1403
+
1404
+ /* Armed state: first click on × turns it solid red; second click commits.
1405
+ Replaces confirm() (no-ops/hangs in the iPad PWA). The fill is the signal
1406
+ on touch devices, where the title tooltip never shows. */
1407
+ .models-row-delete.armed,
1408
+ .models-row-delete.armed:hover {
1409
+ background: var(--color-error, #ef4444);
1410
+ border-color: var(--color-error, #ef4444);
1411
+ color: #fff;
1412
+ }
1413
+
1414
+ .models-add-row {
1415
+ display: grid;
1416
+ grid-template-columns: 16px 200px 130px 1fr auto;
1417
+ gap: var(--sp-6);
1418
+ align-items: center;
1419
+ margin-top: var(--sp-8);
1420
+ padding-top: var(--sp-12);
1421
+ border-top: 1px dashed var(--border-color, #2d2d44);
1422
+ }
1423
+
1424
+ /* Empty cell under the toggle column so add-row inputs align with rows */
1425
+ .models-toggle-spacer {
1426
+ width: 16px;
1427
+ }
1428
+
1429
+ .models-add-row .system-text-input {
1430
+ min-width: 0;
1431
+ font-size: var(--font-size-sm);
1432
+ padding: var(--sp-6) var(--sp-8);
1433
+ }
1434
+
1435
+ .models-empty {
1436
+ padding: var(--sp-16);
1437
+ color: var(--text-muted, #9ca3af);
1438
+ font-style: italic;
1439
+ text-align: center;
1440
+ background: var(--bg-tertiary, #252540);
1441
+ border-radius: var(--radius-md);
1442
+ }
1443
+
1444
+ .models-summary-input {
1445
+ width: 100%;
1446
+ font-family: 'SF Mono', Menlo, Monaco, monospace;
1447
+ font-size: var(--font-size-sm);
1448
+ }
1449
+
1450
+ @media (max-width: 600px) {
1451
+ .models-row,
1452
+ .models-add-row {
1453
+ grid-template-columns: 1fr;
1454
+ }
1455
+ .models-toggle-spacer {
1456
+ display: none;
1457
+ }
1458
+ .models-row-delete {
1459
+ justify-self: end;
1460
+ }
1461
+ }
1462
+
1463
+ /* ═══════════════════════════════════════════════════════════════════════════
1464
+ Mobile Responsive
1465
+ ═══════════════════════════════════════════════════════════════════════════ */
1466
+
1467
+ @media (max-width: 480px) {
1468
+ #widget-config {
1469
+ width: 100vw;
1470
+ max-width: 100vw;
1471
+ height: 100vh;
1472
+ max-height: 100vh;
1473
+ border-radius: 0;
1474
+ }
1475
+
1476
+ .config-tabs {
1477
+ padding: var(--sp-8) var(--sp-12);
1478
+ }
1479
+
1480
+ .config-tab {
1481
+ padding: var(--sp-8) var(--sp-12);
1482
+ font-size: var(--font-size-base);
1483
+ }
1484
+
1485
+ .config-tab svg {
1486
+ width: 16px;
1487
+ height: 16px;
1488
+ }
1489
+
1490
+ .system-setting {
1491
+ flex-direction: column;
1492
+ align-items: flex-start;
1493
+ gap: var(--sp-12);
1494
+ }
1495
+
1496
+ .system-setting-control {
1497
+ width: 100%;
1498
+ }
1499
+
1500
+ .system-number-input {
1501
+ width: 100%;
1502
+ }
1503
+
1504
+ .shortcuts-header {
1505
+ flex-direction: column;
1506
+ align-items: flex-start;
1507
+ }
1508
+
1509
+ .shortcut-item {
1510
+ flex-direction: column;
1511
+ align-items: flex-start;
1512
+ gap: var(--sp-8);
1513
+ }
1514
+
1515
+ .shortcut-keys {
1516
+ width: 100%;
1517
+ }
1518
+
1519
+ .shortcut-key-btn {
1520
+ flex: 1;
1521
+ }
1522
+
1523
+ /* Search responsive */
1524
+ .shortcuts-search {
1525
+ gap: var(--sp-10);
1526
+ }
1527
+
1528
+ .shortcuts-category-chips {
1529
+ overflow-x: auto;
1530
+ flex-wrap: nowrap;
1531
+ padding-bottom: var(--sp-4);
1532
+ -webkit-overflow-scrolling: touch;
1533
+ scrollbar-width: none;
1534
+ }
1535
+
1536
+ .shortcuts-category-chips::-webkit-scrollbar {
1537
+ display: none;
1538
+ }
1539
+
1540
+ .shortcuts-chip {
1541
+ white-space: nowrap;
1542
+ flex-shrink: 0;
1543
+ }
1544
+ }
1545
+
1546
+ /* ═══════════════════════════════════════════════════════════════════════════
1547
+ Agents & Snippets Tabs (shared body styling)
1548
+ ═══════════════════════════════════════════════════════════════════════════ */
1549
+
1550
+ .agents-editor,
1551
+ .snippets-editor {
1552
+ display: flex;
1553
+ flex-direction: column;
1554
+ gap: var(--sp-20);
1555
+ }
1556
+
1557
+ .config-section-title {
1558
+ margin: 0 0 var(--sp-12) 0;
1559
+ font-size: var(--font-size-base);
1560
+ font-weight: 600;
1561
+ text-transform: uppercase;
1562
+ letter-spacing: 0.5px;
1563
+ color: var(--text-secondary, #9ca3af);
1564
+ }
1565
+
1566
+ /* Built-in Agents Section */
1567
+ .agents-list-section {
1568
+ padding-bottom: var(--sp-16);
1569
+ border-bottom: 1px solid var(--border-color, #2d2d44);
1570
+ }
1571
+
1572
+ .agents-list-container {
1573
+ display: flex;
1574
+ flex-direction: column;
1575
+ gap: var(--sp-6);
1576
+ }
1577
+
1578
+ .agents-item {
1579
+ display: flex;
1580
+ align-items: center;
1581
+ gap: var(--sp-12);
1582
+ padding: var(--sp-10) var(--sp-12);
1583
+ background: var(--bg-secondary, #16162a);
1584
+ border-radius: var(--radius-md);
1585
+ transition: opacity 0.15s ease;
1586
+ }
1587
+
1588
+ .agents-item.disabled {
1589
+ opacity: 0.5;
1590
+ }
1591
+
1592
+ .agents-item.disabled .agents-name {
1593
+ text-decoration: line-through;
1594
+ }
1595
+
1596
+ .agents-info {
1597
+ display: flex;
1598
+ flex-direction: column;
1599
+ gap: var(--sp-2);
1600
+ min-width: 0;
1601
+ }
1602
+
1603
+ .agents-name {
1604
+ font-size: var(--font-size-md);
1605
+ font-weight: 500;
1606
+ color: var(--text-primary, #e0e0e0);
1607
+ }
1608
+
1609
+ .agents-desc {
1610
+ font-size: var(--font-size-sm);
1611
+ color: var(--text-secondary, #9ca3af);
1612
+ }
1613
+
1614
+ /* Agent Toggle Switch */
1615
+ .agent-toggle {
1616
+ position: relative;
1617
+ display: inline-block;
1618
+ width: 40px;
1619
+ height: 22px;
1620
+ flex-shrink: 0;
1621
+ cursor: pointer;
1622
+ }
1623
+
1624
+ .agent-toggle input {
1625
+ opacity: 0;
1626
+ width: 0;
1627
+ height: 0;
1628
+ }
1629
+
1630
+ .agent-toggle-slider {
1631
+ position: absolute;
1632
+ inset: 0;
1633
+ background: var(--bg-tertiary, #252540);
1634
+ border-radius: var(--radius-sm); /* toggle tracks stay pill-shaped regardless of radius scale */
1635
+ transition: all 0.2s ease;
1636
+ }
1637
+
1638
+ .agent-toggle-slider::before {
1639
+ content: '';
1640
+ position: absolute;
1641
+ width: 16px;
1642
+ height: 16px;
1643
+ left: 3px;
1644
+ bottom: 3px;
1645
+ background: var(--text-secondary, #9ca3af);
1646
+ border-radius: 50%;
1647
+ transition: all 0.2s ease;
1648
+ }
1649
+
1650
+ .agent-toggle input:checked + .agent-toggle-slider {
1651
+ background: rgba(var(--accent-rgb), 0.3);
1652
+ }
1653
+
1654
+ .agent-toggle input:checked + .agent-toggle-slider::before {
1655
+ transform: translateX(18px);
1656
+ background: var(--accent);
1657
+ }
1658
+
1659
+ .agent-toggle:hover .agent-toggle-slider {
1660
+ background: var(--bg-hover, rgba(255, 255, 255, 0.1));
1661
+ }
1662
+
1663
+ .agent-toggle input:checked:hover + .agent-toggle-slider {
1664
+ background: var(--accent);
1665
+ }
1666
+
1667
+ /* Custom Favorites Section */
1668
+ .snippets-list-section {
1669
+ display: flex;
1670
+ flex-direction: column;
1671
+ }
1672
+
1673
+ .snippets-list-header {
1674
+ display: flex;
1675
+ align-items: center;
1676
+ justify-content: space-between;
1677
+ gap: var(--sp-12);
1678
+ margin-bottom: var(--sp-12);
1679
+ }
1680
+
1681
+ .snippets-list-header .config-section-title {
1682
+ margin: 0;
1683
+ }
1684
+
1685
+ .snippets-add-btn {
1686
+ display: flex;
1687
+ align-items: center;
1688
+ gap: var(--sp-6);
1689
+ padding: var(--sp-6) var(--sp-12);
1690
+ background: rgba(var(--accent-rgb), 0.15);
1691
+ border: 1px solid var(--accent);
1692
+ border-radius: var(--radius-md);
1693
+ color: var(--accent);
1694
+ font-size: var(--font-size-base);
1695
+ font-weight: 500;
1696
+ cursor: pointer;
1697
+ transition: all 0.15s ease;
1698
+ }
1699
+
1700
+ .snippets-add-btn:hover {
1701
+ background: var(--accent);
1702
+ color: white;
1703
+ }
1704
+
1705
+ .snippets-add-btn svg {
1706
+ width: 14px;
1707
+ height: 14px;
1708
+ }
1709
+
1710
+ .snippets-list {
1711
+ display: flex;
1712
+ flex-direction: column;
1713
+ gap: var(--sp-6);
1714
+ }
1715
+
1716
+ .snippets-empty {
1717
+ text-align: center;
1718
+ padding: var(--sp-24);
1719
+ color: var(--text-secondary, #9ca3af);
1720
+ }
1721
+
1722
+ .snippets-empty p {
1723
+ margin: 0 0 var(--sp-8) 0;
1724
+ }
1725
+
1726
+ .snippets-empty-hint {
1727
+ font-size: var(--font-size-base);
1728
+ opacity: 0.7;
1729
+ }
1730
+
1731
+ .snippets-list-item {
1732
+ display: flex;
1733
+ align-items: center;
1734
+ gap: var(--sp-12);
1735
+ padding: var(--sp-10) var(--sp-12);
1736
+ background: var(--bg-secondary, #16162a);
1737
+ border-radius: var(--radius-md);
1738
+ transition: background 0.15s ease, transform 0.15s ease, opacity 0.15s ease, box-shadow 0.15s ease;
1739
+ position: relative;
1740
+ }
1741
+
1742
+ .snippets-list-item:hover {
1743
+ background: var(--bg-hover, rgba(255, 255, 255, 0.05));
1744
+ }
1745
+
1746
+ /* Drag handle */
1747
+ .snippets-drag-handle {
1748
+ display: flex;
1749
+ align-items: center;
1750
+ justify-content: center;
1751
+ width: 24px;
1752
+ height: 24px;
1753
+ padding: 0;
1754
+ background: none;
1755
+ border: none;
1756
+ border-radius: var(--radius-sm);
1757
+ color: var(--text-muted, #6b7280);
1758
+ cursor: grab;
1759
+ touch-action: none;
1760
+ flex-shrink: 0;
1761
+ transition: color 0.15s ease, background 0.15s ease;
1762
+ -webkit-user-select: none;
1763
+ user-select: none;
1764
+ -webkit-touch-callout: none;
1765
+ }
1766
+
1767
+ /* Prevent text selection on items during drag */
1768
+ .snippets-list-item[draggable="true"] {
1769
+ -webkit-user-select: none;
1770
+ user-select: none;
1771
+ }
1772
+
1773
+ .snippets-drag-handle:hover {
1774
+ color: var(--text-secondary, #9ca3af);
1775
+ background: var(--bg-tertiary, #252540);
1776
+ }
1777
+
1778
+ .snippets-drag-handle:active {
1779
+ cursor: grabbing;
1780
+ color: var(--accent);
1781
+ }
1782
+
1783
+ .snippets-drag-handle svg {
1784
+ width: 14px;
1785
+ height: 14px;
1786
+ }
1787
+
1788
+ /* Dragging state */
1789
+ .snippets-list-item.dragging {
1790
+ opacity: 0.5;
1791
+ background: rgba(var(--accent-rgb), 0.15);
1792
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
1793
+ }
1794
+
1795
+ .snippets-list-item.dragging .snippets-drag-handle {
1796
+ cursor: grabbing;
1797
+ color: var(--accent);
1798
+ }
1799
+
1800
+ /* Drop indicator - line above */
1801
+ .snippets-list-item.drag-over-top::before {
1802
+ content: '';
1803
+ position: absolute;
1804
+ top: -3px;
1805
+ left: 0;
1806
+ right: 0;
1807
+ height: 3px;
1808
+ background: var(--accent);
1809
+ border-radius: var(--radius-xs);
1810
+ }
1811
+
1812
+ /* Drop indicator - line below */
1813
+ .snippets-list-item.drag-over-bottom::after {
1814
+ content: '';
1815
+ position: absolute;
1816
+ bottom: -3px;
1817
+ left: 0;
1818
+ right: 0;
1819
+ height: 3px;
1820
+ background: var(--accent);
1821
+ border-radius: var(--radius-xs);
1822
+ }
1823
+
1824
+ .snippets-list-info {
1825
+ display: flex;
1826
+ flex-direction: column;
1827
+ gap: var(--sp-2);
1828
+ flex: 1;
1829
+ min-width: 0;
1830
+ }
1831
+
1832
+ .snippets-list-name {
1833
+ font-size: var(--font-size-md);
1834
+ font-weight: 500;
1835
+ color: var(--text-primary, #e0e0e0);
1836
+ }
1837
+
1838
+ .snippets-list-text {
1839
+ font-size: var(--font-size-sm);
1840
+ color: var(--text-secondary, #9ca3af);
1841
+ white-space: nowrap;
1842
+ overflow: hidden;
1843
+ text-overflow: ellipsis;
1844
+ }
1845
+
1846
+ .snippets-list-actions {
1847
+ display: flex;
1848
+ align-items: center;
1849
+ gap: var(--sp-4);
1850
+ flex-shrink: 0;
1851
+ }
1852
+
1853
+ .snippets-edit-btn,
1854
+ .snippets-delete-btn,
1855
+ .snippets-insert-btn,
1856
+ .snippets-send-btn {
1857
+ padding: var(--sp-6);
1858
+ background: none;
1859
+ border: 1px solid transparent;
1860
+ border-radius: var(--radius-md);
1861
+ color: var(--text-secondary, #9ca3af);
1862
+ cursor: pointer;
1863
+ transition: all 0.15s ease;
1864
+ }
1865
+
1866
+ .snippets-edit-btn:hover {
1867
+ border-color: var(--border-color, #2d2d44);
1868
+ color: var(--accent);
1869
+ }
1870
+
1871
+ .snippets-delete-btn:hover {
1872
+ border-color: #ef4444;
1873
+ color: #ef4444;
1874
+ }
1875
+
1876
+ .snippets-insert-btn:hover {
1877
+ border-color: var(--border-color, #2d2d44);
1878
+ color: #10b981;
1879
+ background: rgba(16, 185, 129, 0.1);
1880
+ }
1881
+
1882
+ .snippets-send-btn:hover {
1883
+ border-color: var(--accent);
1884
+ color: var(--accent);
1885
+ background: rgba(var(--accent-rgb), 0.1);
1886
+ }
1887
+
1888
+ .snippets-edit-btn svg,
1889
+ .snippets-delete-btn svg,
1890
+ .snippets-insert-btn svg,
1891
+ .snippets-send-btn svg {
1892
+ width: 14px;
1893
+ height: 14px;
1894
+ display: block;
1895
+ }
1896
+
1897
+ /* Favorites Editor Modal Overlay */
1898
+ .config-modal-overlay {
1899
+ position: fixed;
1900
+ inset: 0;
1901
+ background: rgba(0, 0, 0, 0.6);
1902
+ display: flex;
1903
+ align-items: center;
1904
+ justify-content: center;
1905
+ z-index: var(--z-modal-backdrop);
1906
+ padding: var(--sp-20);
1907
+ }
1908
+
1909
+ .config-modal {
1910
+ background: var(--bg-primary, #0d0d1a);
1911
+ border: 1px solid var(--border-color, #2d2d44);
1912
+ border-radius: var(--radius-lg);
1913
+ padding: var(--sp-20);
1914
+ width: 100%;
1915
+ max-width: 400px;
1916
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);
1917
+ }
1918
+
1919
+ .config-modal h3 {
1920
+ margin: 0 0 var(--sp-16) 0;
1921
+ font-size: var(--font-size-lg);
1922
+ font-weight: 600;
1923
+ color: var(--text-primary, #e0e0e0);
1924
+ }
1925
+
1926
+ .config-modal-form {
1927
+ display: flex;
1928
+ flex-direction: column;
1929
+ gap: var(--sp-16);
1930
+ margin-bottom: var(--sp-20);
1931
+ }
1932
+
1933
+ .config-modal-field {
1934
+ display: flex;
1935
+ flex-direction: column;
1936
+ gap: var(--sp-6);
1937
+ }
1938
+
1939
+ .config-modal-field label {
1940
+ font-size: var(--font-size-base);
1941
+ color: var(--text-secondary, #9ca3af);
1942
+ }
1943
+
1944
+ .config-modal-field input,
1945
+ .config-modal-field textarea {
1946
+ padding: var(--sp-10) var(--sp-12);
1947
+ background: var(--bg-secondary, #16162a);
1948
+ border: 1px solid var(--border-color, #2d2d44);
1949
+ border-radius: var(--radius-md);
1950
+ color: var(--text-primary, #e0e0e0);
1951
+ font-size: var(--font-size-md);
1952
+ font-family: inherit;
1953
+ resize: none;
1954
+ }
1955
+
1956
+ .config-modal-field input:focus,
1957
+ .config-modal-field textarea:focus {
1958
+ outline: none;
1959
+ border-color: var(--accent);
1960
+ box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.2);
1961
+ }
1962
+
1963
+ .config-modal-buttons {
1964
+ display: flex;
1965
+ justify-content: flex-end;
1966
+ gap: var(--sp-10);
1967
+ }
1968
+
1969
+ .config-modal-cancel,
1970
+ .config-modal-save {
1971
+ padding: var(--sp-10) var(--sp-20);
1972
+ border-radius: var(--radius-md);
1973
+ font-size: var(--font-size-md);
1974
+ font-weight: 500;
1975
+ cursor: pointer;
1976
+ transition: all 0.15s ease;
1977
+ }
1978
+
1979
+ .config-modal-cancel {
1980
+ background: none;
1981
+ border: 1px solid var(--border-color, #2d2d44);
1982
+ color: var(--text-secondary, #9ca3af);
1983
+ }
1984
+
1985
+ .config-modal-cancel:hover {
1986
+ border-color: var(--text-secondary, #9ca3af);
1987
+ color: var(--text-primary, #e0e0e0);
1988
+ }
1989
+
1990
+ .config-modal-save {
1991
+ background: var(--accent);
1992
+ border: 1px solid var(--accent);
1993
+ color: white;
1994
+ }
1995
+
1996
+ .config-modal-save:hover {
1997
+ background: var(--accent-hover);
1998
+ border-color: var(--accent-hover);
1999
+ }
2000
+
2001
+ .config-modal-reset {
2002
+ padding: var(--sp-10) var(--sp-16);
2003
+ border-radius: var(--radius-md);
2004
+ font-size: var(--font-size-md);
2005
+ font-weight: 500;
2006
+ cursor: pointer;
2007
+ transition: all 0.15s ease;
2008
+ background: none;
2009
+ border: 1px solid var(--border-color, #2d2d44);
2010
+ color: var(--text-secondary, #9ca3af);
2011
+ }
2012
+
2013
+ .config-modal-reset:hover {
2014
+ border-color: #f59e0b;
2015
+ color: #f59e0b;
2016
+ }
2017
+
2018
+ /* ═══════════════════════════════════════════════════════════════════════════
2019
+ Agent Pattern Configuration
2020
+ ═══════════════════════════════════════════════════════════════════════════ */
2021
+
2022
+ .agents-pattern-section {
2023
+ padding-bottom: var(--sp-16);
2024
+ border-bottom: 1px solid var(--border-color, #2d2d44);
2025
+ }
2026
+
2027
+ .config-hint-small {
2028
+ margin: 0 0 var(--sp-10) 0;
2029
+ font-size: var(--font-size-sm);
2030
+ color: var(--text-secondary, #9ca3af);
2031
+ }
2032
+
2033
+ .config-hint-small code {
2034
+ background: var(--bg-tertiary, #252540);
2035
+ padding: var(--sp-2) var(--sp-6);
2036
+ border-radius: var(--radius-sm);
2037
+ font-size: var(--font-size-xs);
2038
+ color: var(--accent);
2039
+ }
2040
+
2041
+ .pattern-input-row {
2042
+ display: flex;
2043
+ gap: var(--sp-8);
2044
+ align-items: center;
2045
+ }
2046
+
2047
+ .pattern-input {
2048
+ flex: 1;
2049
+ padding: var(--sp-10) var(--sp-12);
2050
+ background: var(--bg-secondary, #16162a);
2051
+ border: 1px solid var(--border-color, #2d2d44);
2052
+ border-radius: var(--radius-md);
2053
+ color: var(--text-primary, #e0e0e0);
2054
+ font-size: var(--font-size-md);
2055
+ }
2056
+
2057
+ .pattern-input:focus {
2058
+ outline: none;
2059
+ border-color: var(--accent);
2060
+ box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.2);
2061
+ }
2062
+
2063
+ .pattern-input::placeholder {
2064
+ color: var(--text-secondary, #666);
2065
+ opacity: 0.7;
2066
+ }
2067
+
2068
+ .pattern-reset-btn {
2069
+ padding: var(--sp-8);
2070
+ background: none;
2071
+ border: 1px solid var(--border-color, #2d2d44);
2072
+ border-radius: var(--radius-md);
2073
+ color: var(--text-secondary, #9ca3af);
2074
+ cursor: pointer;
2075
+ transition: all 0.15s ease;
2076
+ flex-shrink: 0;
2077
+ }
2078
+
2079
+ .pattern-reset-btn:hover {
2080
+ border-color: var(--text-secondary, #9ca3af);
2081
+ color: var(--text-primary, #e0e0e0);
2082
+ }
2083
+
2084
+ .pattern-reset-btn svg {
2085
+ width: 16px;
2086
+ height: 16px;
2087
+ display: block;
2088
+ }
2089
+
2090
+ /* Agent item with actions */
2091
+ .agents-info {
2092
+ flex: 1;
2093
+ display: flex;
2094
+ flex-direction: column;
2095
+ gap: var(--sp-2);
2096
+ min-width: 0;
2097
+ }
2098
+
2099
+ .agents-badges {
2100
+ display: flex;
2101
+ flex-wrap: wrap;
2102
+ gap: var(--sp-4);
2103
+ margin-top: var(--sp-2);
2104
+ }
2105
+
2106
+ .agents-pattern-badge,
2107
+ .agents-source-badge {
2108
+ display: inline-block;
2109
+ font-size: 10px;
2110
+ font-weight: 500;
2111
+ text-transform: uppercase;
2112
+ letter-spacing: 0.5px;
2113
+ padding: var(--sp-2) var(--sp-6);
2114
+ border-radius: var(--radius-sm);
2115
+ width: fit-content;
2116
+ }
2117
+
2118
+ .agents-pattern-badge {
2119
+ color: #f59e0b;
2120
+ background: rgba(245, 158, 11, 0.15);
2121
+ }
2122
+
2123
+ .agents-source-badge.project {
2124
+ color: #10b981;
2125
+ background: rgba(16, 185, 129, 0.15);
2126
+ }
2127
+
2128
+ .agents-actions {
2129
+ display: flex;
2130
+ align-items: center;
2131
+ gap: var(--sp-8);
2132
+ flex-shrink: 0;
2133
+ }
2134
+
2135
+ .agent-pattern-btn,
2136
+ .agent-insert-btn,
2137
+ .agent-send-btn {
2138
+ padding: var(--sp-6);
2139
+ background: none;
2140
+ border: 1px solid transparent;
2141
+ border-radius: var(--radius-md);
2142
+ color: var(--text-secondary, #9ca3af);
2143
+ cursor: pointer;
2144
+ transition: all 0.15s ease;
2145
+ }
2146
+
2147
+ .agent-pattern-btn:hover {
2148
+ border-color: var(--border-color, #2d2d44);
2149
+ color: var(--accent);
2150
+ }
2151
+
2152
+ .agent-insert-btn:hover {
2153
+ border-color: var(--border-color, #2d2d44);
2154
+ color: #10b981;
2155
+ background: rgba(16, 185, 129, 0.1);
2156
+ }
2157
+
2158
+ .agent-send-btn:hover {
2159
+ border-color: var(--accent);
2160
+ color: var(--accent);
2161
+ background: rgba(var(--accent-rgb), 0.1);
2162
+ }
2163
+
2164
+ /* Hide insert/send buttons for disabled agents */
2165
+ .agents-item.disabled .agent-insert-btn,
2166
+ .agents-item.disabled .agent-send-btn {
2167
+ display: none;
2168
+ }
2169
+
2170
+ .agent-pattern-btn svg,
2171
+ .agent-insert-btn svg,
2172
+ .agent-send-btn svg {
2173
+ width: 14px;
2174
+ height: 14px;
2175
+ display: block;
2176
+ }
2177
+
2178
+ /* Pattern editor modal */
2179
+ .pattern-editor-modal {
2180
+ max-width: 450px;
2181
+ }
2182
+
2183
+ .pattern-preview {
2184
+ display: flex;
2185
+ align-items: center;
2186
+ gap: var(--sp-10);
2187
+ padding: var(--sp-10) var(--sp-12);
2188
+ background: var(--bg-tertiary, #252540);
2189
+ border-radius: var(--radius-md);
2190
+ }
2191
+
2192
+ .pattern-preview-label {
2193
+ font-size: var(--font-size-sm);
2194
+ color: var(--text-secondary, #9ca3af);
2195
+ flex-shrink: 0;
2196
+ }
2197
+
2198
+ .pattern-preview-text {
2199
+ font-size: var(--font-size-base);
2200
+ color: var(--accent);
2201
+ font-family: 'SF Mono', Menlo, Monaco, monospace;
2202
+ word-break: break-all;
2203
+ }
2204
+
2205
+ /* ═══════════════════════════════════════════════════════════════════════════
2206
+ Project Settings Tab
2207
+ ═══════════════════════════════════════════════════════════════════════════ */
2208
+
2209
+ .project-settings {
2210
+ display: flex;
2211
+ flex-direction: column;
2212
+ gap: var(--sp-20);
2213
+ padding: var(--sp-4) 0;
2214
+ }
2215
+
2216
+ .project-info {
2217
+ background: var(--bg-tertiary, #252540);
2218
+ border-radius: var(--radius-md);
2219
+ padding: var(--sp-12) var(--sp-14);
2220
+ display: flex;
2221
+ flex-direction: column;
2222
+ gap: var(--sp-8);
2223
+ }
2224
+
2225
+ .project-info-path,
2226
+ .project-info-hash {
2227
+ display: flex;
2228
+ align-items: baseline;
2229
+ gap: var(--sp-10);
2230
+ }
2231
+
2232
+ .project-info-label {
2233
+ font-size: var(--font-size-xs);
2234
+ font-weight: 500;
2235
+ color: var(--text-muted, #6b7280);
2236
+ text-transform: uppercase;
2237
+ letter-spacing: 0.5px;
2238
+ min-width: 40px;
2239
+ }
2240
+
2241
+ .project-info-value {
2242
+ font-size: var(--font-size-sm);
2243
+ color: var(--text-secondary, #9ca3af);
2244
+ font-family: 'SF Mono', Menlo, Monaco, monospace;
2245
+ word-break: break-all;
2246
+ }
2247
+
2248
+ .project-info-path .project-info-value {
2249
+ color: var(--accent);
2250
+ }
2251
+
2252
+ .project-section {
2253
+ display: flex;
2254
+ flex-direction: column;
2255
+ gap: var(--sp-10);
2256
+ }
2257
+
2258
+ .project-section-title {
2259
+ font-size: var(--font-size-base);
2260
+ font-weight: 600;
2261
+ color: var(--text-primary, #f3f4f6);
2262
+ margin: 0;
2263
+ padding-bottom: var(--sp-6);
2264
+ border-bottom: 1px solid var(--border-color, #2d2d44);
2265
+ }
2266
+
2267
+ .project-toggle {
2268
+ display: flex;
2269
+ flex-wrap: wrap;
2270
+ align-items: center;
2271
+ gap: var(--sp-10);
2272
+ padding: var(--sp-10) var(--sp-12);
2273
+ background: var(--bg-secondary, #1e1e30);
2274
+ border-radius: var(--radius-md);
2275
+ cursor: pointer;
2276
+ transition: background 0.15s ease;
2277
+ }
2278
+
2279
+ .project-toggle:hover {
2280
+ background: var(--bg-tertiary, #252540);
2281
+ }
2282
+
2283
+ .project-toggle input[type="checkbox"] {
2284
+ /* Ensure checkbox is visible on iOS Safari */
2285
+ -webkit-appearance: checkbox;
2286
+ appearance: checkbox;
2287
+ width: 20px;
2288
+ height: 20px;
2289
+ min-width: 20px;
2290
+ min-height: 20px;
2291
+ accent-color: var(--accent);
2292
+ cursor: pointer;
2293
+ flex-shrink: 0;
2294
+ margin: 0;
2295
+ /* Force visibility */
2296
+ opacity: 1 !important;
2297
+ position: relative;
2298
+ }
2299
+
2300
+ .project-toggle-label {
2301
+ font-size: var(--font-size-md);
2302
+ font-weight: 500;
2303
+ color: var(--text-primary, #f3f4f6);
2304
+ flex: 1;
2305
+ }
2306
+
2307
+ .project-toggle-hint {
2308
+ font-size: var(--font-size-sm);
2309
+ color: var(--text-muted, #6b7280);
2310
+ width: 100%;
2311
+ padding-left: 28px; /* fixed: aligns under the checkbox column */
2312
+ margin-top: -4px;
2313
+ }
2314
+
2315
+ /* Radio group (used by download mode, etc.) */
2316
+
2317
+ .system-radio-group {
2318
+ display: flex;
2319
+ flex-direction: column;
2320
+ gap: var(--sp-8);
2321
+ margin-top: var(--sp-8);
2322
+ }
2323
+
2324
+ .system-radio-label {
2325
+ display: flex;
2326
+ align-items: baseline;
2327
+ gap: var(--sp-8);
2328
+ cursor: pointer;
2329
+ font-size: var(--font-size-md);
2330
+ color: var(--text-primary, #e0e0e0);
2331
+ }
2332
+
2333
+ .system-radio-label input[type="radio"] {
2334
+ margin: 0;
2335
+ flex-shrink: 0;
2336
+ position: relative;
2337
+ top: 1px;
2338
+ }
2339
+
2340
+ .system-radio-hint {
2341
+ font-size: var(--font-size-sm);
2342
+ color: var(--text-muted, #6b7280);
2343
+ margin-left: auto;
2344
+ }
2345
+
2346
+ /* Extra Directories */
2347
+
2348
+ .extra-dirs-list {
2349
+ display: flex;
2350
+ flex-direction: column;
2351
+ gap: var(--sp-4);
2352
+ margin-bottom: var(--sp-8);
2353
+ }
2354
+
2355
+ .extra-dir-item {
2356
+ display: flex;
2357
+ align-items: center;
2358
+ gap: var(--sp-8);
2359
+ padding: var(--sp-6) var(--sp-10);
2360
+ background: var(--bg-secondary, #1e1e30);
2361
+ border-radius: var(--radius-md);
2362
+ }
2363
+
2364
+ .extra-dir-path {
2365
+ flex: 1;
2366
+ font-size: var(--font-size-base);
2367
+ font-family: var(--font-mono);
2368
+ color: var(--text-primary, #f3f4f6);
2369
+ overflow: hidden;
2370
+ text-overflow: ellipsis;
2371
+ white-space: nowrap;
2372
+ }
2373
+
2374
+ .extra-dir-remove {
2375
+ background: none;
2376
+ border: none;
2377
+ color: var(--text-muted, #6b7280);
2378
+ cursor: pointer;
2379
+ font-size: var(--font-size-lg);
2380
+ padding: 0 var(--sp-4);
2381
+ line-height: 1;
2382
+ border-radius: var(--radius-sm);
2383
+ }
2384
+
2385
+ .extra-dir-remove:hover {
2386
+ color: var(--error-color, #ef4444);
2387
+ background: var(--bg-tertiary, #252540);
2388
+ }
2389
+
2390
+ .extra-dir-add-row {
2391
+ display: flex;
2392
+ gap: var(--sp-6);
2393
+ }
2394
+
2395
+ .extra-dir-input {
2396
+ flex: 1;
2397
+ background: var(--bg-secondary, #1e1e30);
2398
+ border: 1px solid var(--border-color, #2d2d44);
2399
+ border-radius: var(--radius-md);
2400
+ padding: var(--sp-6) var(--sp-10);
2401
+ font-size: var(--font-size-base);
2402
+ font-family: var(--font-mono);
2403
+ color: var(--text-primary, #f3f4f6);
2404
+ }
2405
+
2406
+ .extra-dir-input:focus {
2407
+ outline: none;
2408
+ border-color: var(--accent);
2409
+ }
2410
+
2411
+ .extra-dir-add-btn {
2412
+ height: var(--layout-btn-sm);
2413
+ background: var(--accent);
2414
+ color: white;
2415
+ border: none;
2416
+ border-radius: var(--radius-md);
2417
+ padding: var(--sp-6) var(--sp-14);
2418
+ font-size: var(--font-size-base);
2419
+ cursor: pointer;
2420
+ }
2421
+
2422
+ .extra-dir-add-btn:hover {
2423
+ filter: brightness(1.1);
2424
+ }
2425
+
2426
+ /* Directory Autocomplete Dropdown */
2427
+ .dir-autocomplete-dropdown {
2428
+ display: none;
2429
+ position: absolute;
2430
+ left: 0;
2431
+ right: 0;
2432
+ top: 100%;
2433
+ margin-top: 2px;
2434
+ background: var(--bg-secondary, #1e1e30);
2435
+ border: 1px solid var(--border-color, #2d2d44);
2436
+ border-radius: var(--radius-md);
2437
+ max-height: 200px;
2438
+ overflow-y: auto;
2439
+ z-index: var(--z-widget-header, 1200);
2440
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
2441
+ }
2442
+ .dir-autocomplete-dropdown.visible {
2443
+ display: block;
2444
+ }
2445
+ .dir-autocomplete-item {
2446
+ display: flex;
2447
+ align-items: center;
2448
+ gap: var(--sp-6);
2449
+ padding: var(--sp-6) var(--sp-10);
2450
+ font-size: var(--font-size-base);
2451
+ font-family: var(--font-mono);
2452
+ color: var(--text-primary, #f3f4f6);
2453
+ cursor: pointer;
2454
+ }
2455
+ .dir-autocomplete-item:hover,
2456
+ .dir-autocomplete-item.highlighted {
2457
+ background: var(--bg-tertiary, #252540);
2458
+ }
2459
+ .dir-autocomplete-icon {
2460
+ opacity: 0.5;
2461
+ flex-shrink: 0;
2462
+ }
2463
+ .dir-autocomplete-name {
2464
+ overflow: hidden;
2465
+ text-overflow: ellipsis;
2466
+ white-space: nowrap;
2467
+ }
2468
+
2469
+ /* ═══════════════════════════════════════════════════════════════════════════
2470
+ Quick Actions Tab
2471
+ ═══════════════════════════════════════════════════════════════════════════ */
2472
+
2473
+ .quick-actions-config {
2474
+ padding: var(--sp-16);
2475
+ overflow-y: auto;
2476
+ max-height: 100%;
2477
+ }
2478
+
2479
+ .qa-section {
2480
+ margin-bottom: var(--sp-24);
2481
+ }
2482
+
2483
+ .qa-section-title {
2484
+ font-size: var(--font-size-md);
2485
+ font-weight: 600;
2486
+ color: var(--text-primary, #f3f4f6);
2487
+ margin: 0 0 var(--sp-8) 0;
2488
+ }
2489
+
2490
+ /* Preset buttons */
2491
+ .qa-preset-grid {
2492
+ display: flex;
2493
+ flex-wrap: wrap;
2494
+ gap: var(--sp-8);
2495
+ }
2496
+
2497
+ .qa-preset-btn {
2498
+ height: var(--layout-btn-md);
2499
+ padding: var(--sp-8) var(--sp-16);
2500
+ border-radius: var(--radius-md);
2501
+ border: 1px solid var(--border-color, #374151);
2502
+ background: var(--bg-secondary, #1f2937);
2503
+ color: var(--text-primary, #f3f4f6);
2504
+ font-size: var(--font-size-base);
2505
+ cursor: pointer;
2506
+ transition: all 0.15s ease;
2507
+ }
2508
+
2509
+ .qa-preset-btn:hover {
2510
+ background: var(--bg-tertiary, #374151);
2511
+ border-color: var(--accent-orange);
2512
+ }
2513
+
2514
+ .qa-preset-btn.active {
2515
+ background: var(--accent-orange);
2516
+ border-color: var(--accent-orange);
2517
+ color: white;
2518
+ }
2519
+
2520
+ /* Visibility selector (segmented buttons) */
2521
+ .qa-visibility-group {
2522
+ display: inline-flex;
2523
+ border: 1px solid var(--border-color, #374151);
2524
+ border-radius: var(--radius-md);
2525
+ overflow: hidden;
2526
+ margin-top: var(--sp-4);
2527
+ }
2528
+
2529
+ .qa-visibility-btn {
2530
+ height: var(--layout-btn-md);
2531
+ padding: 0 var(--sp-16);
2532
+ border: none;
2533
+ border-right: 1px solid var(--border-color, #374151);
2534
+ background: var(--bg-secondary, #1f2937);
2535
+ color: var(--text-primary, #f3f4f6);
2536
+ font-size: var(--font-size-base);
2537
+ cursor: pointer;
2538
+ transition: all 0.15s ease;
2539
+ }
2540
+
2541
+ .qa-visibility-btn:last-child {
2542
+ border-right: none;
2543
+ }
2544
+
2545
+ .qa-visibility-btn:hover {
2546
+ background: var(--bg-tertiary, #374151);
2547
+ }
2548
+
2549
+ .qa-visibility-btn.active {
2550
+ background: var(--accent-orange);
2551
+ color: white;
2552
+ }
2553
+
2554
+ /* Interactive Radial Editor */
2555
+ .qa-radial-editor {
2556
+ position: relative;
2557
+ width: 180px;
2558
+ height: 180px;
2559
+ margin: var(--sp-16) auto;
2560
+ }
2561
+
2562
+ .qa-radial-center {
2563
+ position: absolute;
2564
+ left: 50%;
2565
+ top: 50%;
2566
+ transform: translate(-50%, -50%);
2567
+ width: 44px;
2568
+ height: 44px;
2569
+ border-radius: 50%;
2570
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
2571
+ display: flex;
2572
+ align-items: center;
2573
+ justify-content: center;
2574
+ color: white;
2575
+ box-shadow: 0 2px 8px rgba(245, 158, 11, 0.4);
2576
+ }
2577
+
2578
+ .qa-radial-center svg {
2579
+ width: 22px;
2580
+ height: 22px;
2581
+ }
2582
+
2583
+ .qa-radial-slot {
2584
+ position: absolute;
2585
+ left: 50%;
2586
+ top: 50%;
2587
+ width: 42px;
2588
+ height: 42px;
2589
+ margin: -21px;
2590
+ border-radius: 50%;
2591
+ background: var(--bg-secondary, #1f2937);
2592
+ border: 2px solid var(--border-color, #374151);
2593
+ display: flex;
2594
+ align-items: center;
2595
+ justify-content: center;
2596
+ cursor: pointer;
2597
+ transition: all 0.15s ease;
2598
+ -webkit-user-select: none;
2599
+ user-select: none;
2600
+ }
2601
+
2602
+ .qa-radial-slot:hover {
2603
+ transform: translate(var(--tx, 0), var(--ty, 0)) scale(1.12);
2604
+ border-color: var(--accent-orange);
2605
+ background: var(--bg-tertiary, #374151);
2606
+ }
2607
+
2608
+ .qa-radial-slot.empty {
2609
+ border-style: dashed;
2610
+ opacity: 0.5;
2611
+ }
2612
+
2613
+ .qa-radial-slot.empty:hover {
2614
+ opacity: 1;
2615
+ }
2616
+
2617
+ .qa-radial-slot svg {
2618
+ width: 18px;
2619
+ height: 18px;
2620
+ color: var(--text-secondary, #9ca3af);
2621
+ }
2622
+
2623
+ .qa-radial-slot:hover svg {
2624
+ color: var(--text-primary, #f3f4f6);
2625
+ }
2626
+
2627
+ .qa-radial-key {
2628
+ position: absolute;
2629
+ font-size: 10px;
2630
+ font-weight: 600;
2631
+ color: var(--text-muted, #6b7280);
2632
+ pointer-events: none;
2633
+ }
2634
+
2635
+ /* Position keys outside the circles based on angle */
2636
+ .qa-radial-slot[data-slot="0"] .qa-radial-key,
2637
+ .qa-radial-slot[data-slot="1"] .qa-radial-key { top: -16px; }
2638
+ .qa-radial-slot[data-slot="2"] .qa-radial-key,
2639
+ .qa-radial-slot[data-slot="3"] .qa-radial-key { top: -16px; }
2640
+ .qa-radial-slot[data-slot="4"] .qa-radial-key,
2641
+ .qa-radial-slot[data-slot="5"] .qa-radial-key { bottom: -16px; }
2642
+ .qa-radial-slot[data-slot="6"] .qa-radial-key,
2643
+ .qa-radial-slot[data-slot="7"] .qa-radial-key { bottom: -16px; }
2644
+
2645
+ /* Slots Table */
2646
+ .qa-slots-table-wrap {
2647
+ margin-bottom: var(--sp-12);
2648
+ border-radius: var(--radius-md);
2649
+ overflow: hidden;
2650
+ border: 1px solid var(--border-color, #374151);
2651
+ }
2652
+
2653
+ .qa-slots-table {
2654
+ width: 100%;
2655
+ border-collapse: collapse;
2656
+ font-size: var(--font-size-base);
2657
+ }
2658
+
2659
+ .qa-slots-table thead {
2660
+ background: var(--bg-tertiary, #374151);
2661
+ }
2662
+
2663
+ .qa-slots-table th {
2664
+ text-align: left;
2665
+ padding: var(--sp-8) var(--sp-12);
2666
+ font-size: var(--font-size-xs);
2667
+ font-weight: 600;
2668
+ color: var(--text-muted, #6b7280);
2669
+ text-transform: uppercase;
2670
+ letter-spacing: 0.5px;
2671
+ }
2672
+
2673
+ .qa-slots-table th:last-child {
2674
+ width: 100px;
2675
+ }
2676
+
2677
+ .qa-slot-row {
2678
+ border-bottom: 1px solid var(--border-subtle, rgba(255,255,255,0.05));
2679
+ transition: background 0.1s ease;
2680
+ cursor: pointer;
2681
+ }
2682
+
2683
+ .qa-slot-row:last-child {
2684
+ border-bottom: none;
2685
+ }
2686
+
2687
+ .qa-slot-row:hover {
2688
+ background: var(--bg-secondary, #1f2937);
2689
+ }
2690
+
2691
+ .qa-slot-row:active {
2692
+ background: var(--bg-tertiary, #374151);
2693
+ }
2694
+
2695
+ .qa-slot-cell-key {
2696
+ padding: var(--sp-10) var(--sp-12);
2697
+ width: 50px;
2698
+ }
2699
+
2700
+ .qa-slot-key-badge {
2701
+ display: inline-flex;
2702
+ align-items: center;
2703
+ justify-content: center;
2704
+ min-width: 24px;
2705
+ height: 24px;
2706
+ padding: 0 var(--sp-6);
2707
+ background: var(--bg-tertiary, #374151);
2708
+ border-radius: var(--radius-sm);
2709
+ font-size: var(--font-size-sm);
2710
+ font-weight: 600;
2711
+ color: var(--text-secondary, #9ca3af);
2712
+ }
2713
+
2714
+ .qa-slot-cell-action {
2715
+ padding: var(--sp-10) var(--sp-12);
2716
+ display: flex;
2717
+ align-items: center;
2718
+ gap: var(--sp-10);
2719
+ }
2720
+
2721
+ .qa-slot-icon {
2722
+ width: 20px;
2723
+ height: 20px;
2724
+ flex-shrink: 0;
2725
+ }
2726
+
2727
+ .qa-slot-icon svg {
2728
+ width: 100%;
2729
+ height: 100%;
2730
+ color: var(--text-secondary, #9ca3af);
2731
+ }
2732
+
2733
+ .qa-slot-label {
2734
+ color: var(--text-primary, #f3f4f6);
2735
+ }
2736
+
2737
+ .qa-slot-cell-actions {
2738
+ padding: var(--sp-6) var(--sp-12);
2739
+ text-align: right;
2740
+ }
2741
+
2742
+ .qa-slot-btn {
2743
+ width: var(--layout-btn-sm);
2744
+ height: var(--layout-btn-sm);
2745
+ border: none;
2746
+ background: transparent;
2747
+ border-radius: var(--radius-sm);
2748
+ cursor: pointer;
2749
+ display: inline-flex;
2750
+ align-items: center;
2751
+ justify-content: center;
2752
+ color: var(--text-muted, #6b7280);
2753
+ transition: all 0.1s ease;
2754
+ }
2755
+
2756
+ .qa-slot-btn:hover:not(:disabled) {
2757
+ background: var(--bg-tertiary, #374151);
2758
+ color: var(--text-primary, #f3f4f6);
2759
+ }
2760
+
2761
+ .qa-slot-btn:disabled {
2762
+ opacity: 0.25;
2763
+ cursor: not-allowed;
2764
+ }
2765
+
2766
+ .qa-slot-btn svg {
2767
+ width: 14px;
2768
+ height: 14px;
2769
+ }
2770
+
2771
+ .qa-slot-btn.qa-slot-remove:hover:not(:disabled) {
2772
+ color: #ef4444;
2773
+ }
2774
+
2775
+ /* Add Action Button */
2776
+ .qa-add-btn {
2777
+ height: var(--layout-btn-lg);
2778
+ display: flex;
2779
+ align-items: center;
2780
+ justify-content: center;
2781
+ gap: var(--sp-8);
2782
+ width: 100%;
2783
+ padding: var(--sp-10) var(--sp-16);
2784
+ border-radius: var(--radius-md);
2785
+ border: 1px solid var(--border-color, #374151);
2786
+ background: var(--bg-secondary, #1f2937);
2787
+ color: var(--text-secondary, #9ca3af);
2788
+ font-size: var(--font-size-base);
2789
+ cursor: pointer;
2790
+ transition: all 0.15s ease;
2791
+ }
2792
+
2793
+ .qa-add-btn:hover:not(:disabled) {
2794
+ border-color: var(--accent-orange);
2795
+ color: var(--accent-orange);
2796
+ }
2797
+
2798
+ .qa-add-btn:disabled {
2799
+ opacity: 0.5;
2800
+ cursor: not-allowed;
2801
+ }
2802
+
2803
+ .qa-add-btn svg {
2804
+ width: 16px;
2805
+ height: 16px;
2806
+ }
2807
+
2808
+ .qa-slots-count {
2809
+ font-size: var(--font-size-xs);
2810
+ color: var(--text-muted, #6b7280);
2811
+ margin-left: auto;
2812
+ }
2813
+
2814
+ .qa-reset-btn {
2815
+ height: var(--layout-btn-md);
2816
+ display: flex;
2817
+ align-items: center;
2818
+ gap: var(--sp-6);
2819
+ padding: var(--sp-8) var(--sp-16);
2820
+ border-radius: var(--radius-md);
2821
+ border: 1px solid var(--border-color, #374151);
2822
+ background: var(--bg-secondary, #1f2937);
2823
+ color: var(--text-secondary, #9ca3af);
2824
+ font-size: var(--font-size-base);
2825
+ cursor: pointer;
2826
+ transition: all 0.15s ease;
2827
+ }
2828
+
2829
+ .qa-reset-btn:hover {
2830
+ background: var(--bg-tertiary, #374151);
2831
+ color: var(--text-primary, #f3f4f6);
2832
+ }
2833
+
2834
+ .qa-reset-btn svg {
2835
+ width: 14px;
2836
+ height: 14px;
2837
+ }
2838
+
2839
+ /* Add Action Dialog */
2840
+ /* ─── Custom actions manage list ─── */
2841
+
2842
+ .qa-custom-list {
2843
+ display: flex;
2844
+ flex-direction: column;
2845
+ gap: var(--sp-4);
2846
+ margin-bottom: var(--sp-8);
2847
+ }
2848
+
2849
+ .qa-custom-empty {
2850
+ padding: var(--sp-12);
2851
+ color: var(--text-muted, #6b7280);
2852
+ font-size: var(--font-size-base);
2853
+ text-align: center;
2854
+ }
2855
+
2856
+ .qa-custom-row {
2857
+ display: flex;
2858
+ align-items: center;
2859
+ gap: var(--sp-10);
2860
+ padding: var(--sp-8) var(--sp-10);
2861
+ background: var(--bg-secondary, #1f2937);
2862
+ border: 1px solid var(--border-color, #374151);
2863
+ border-radius: var(--radius-md);
2864
+ }
2865
+
2866
+ .qa-custom-info {
2867
+ flex: 1;
2868
+ min-width: 0;
2869
+ display: flex;
2870
+ flex-direction: column;
2871
+ gap: var(--sp-2);
2872
+ }
2873
+
2874
+ .qa-custom-label-text {
2875
+ font-size: var(--font-size-base);
2876
+ font-weight: 500;
2877
+ color: var(--text-primary, #f3f4f6);
2878
+ }
2879
+
2880
+ .qa-custom-payload-preview {
2881
+ font-size: var(--font-size-xs);
2882
+ color: var(--text-muted, #6b7280);
2883
+ font-family: var(--font-mono, monospace);
2884
+ overflow: hidden;
2885
+ text-overflow: ellipsis;
2886
+ white-space: nowrap;
2887
+ display: flex;
2888
+ align-items: center;
2889
+ gap: var(--sp-6);
2890
+ }
2891
+
2892
+ .qa-custom-type-badge {
2893
+ flex-shrink: 0;
2894
+ padding: 1px var(--sp-6);
2895
+ border-radius: var(--radius-xs);
2896
+ font-size: 10px;
2897
+ font-family: inherit;
2898
+ text-transform: uppercase;
2899
+ letter-spacing: 0.4px;
2900
+ background: var(--bg-tertiary, #374151);
2901
+ color: var(--text-secondary, #9ca3af);
2902
+ }
2903
+
2904
+ .qa-custom-type-badge[data-type="terminal"] { color: #34d399; }
2905
+ .qa-custom-type-badge[data-type="prompt"] { color: var(--accent-blue); }
2906
+ .qa-custom-type-badge[data-type="slash"] { color: #c084fc; }
2907
+
2908
+ .qa-custom-delete.armed {
2909
+ background: rgba(239, 68, 68, 0.12);
2910
+ border-color: #ef4444;
2911
+ color: #ef4444;
2912
+ width: auto;
2913
+ padding: 0 var(--sp-8);
2914
+ gap: var(--sp-4);
2915
+ }
2916
+
2917
+ .qa-custom-delete-label {
2918
+ font-size: var(--font-size-xs);
2919
+ font-weight: 600;
2920
+ }
2921
+
2922
+ /* ─── Custom action editor form ─── */
2923
+
2924
+ .qa-custom-form {
2925
+ display: flex;
2926
+ flex-direction: column;
2927
+ gap: var(--sp-14);
2928
+ padding: var(--sp-16);
2929
+ overflow-y: auto;
2930
+ }
2931
+
2932
+ .qa-custom-field {
2933
+ display: flex;
2934
+ flex-direction: column;
2935
+ gap: var(--sp-6);
2936
+ }
2937
+
2938
+ .qa-custom-field-label {
2939
+ font-size: var(--font-size-sm);
2940
+ font-weight: 600;
2941
+ color: var(--text-secondary, #9ca3af);
2942
+ }
2943
+
2944
+ .qa-custom-field input[type="text"],
2945
+ .qa-custom-field textarea {
2946
+ width: 100%;
2947
+ padding: var(--sp-8) var(--sp-10);
2948
+ border: 1px solid var(--border-color, #374151);
2949
+ border-radius: var(--radius-md);
2950
+ background: var(--bg-secondary, #1f2937);
2951
+ color: var(--text-primary, #f3f4f6);
2952
+ font-size: var(--font-size-base);
2953
+ resize: vertical;
2954
+ }
2955
+
2956
+ .qa-custom-field textarea {
2957
+ font-family: var(--font-mono, monospace);
2958
+ }
2959
+
2960
+ .qa-custom-field input:focus,
2961
+ .qa-custom-field textarea:focus {
2962
+ outline: none;
2963
+ border-color: var(--accent-orange);
2964
+ }
2965
+
2966
+ .qa-custom-type-group {
2967
+ display: flex;
2968
+ gap: var(--sp-6);
2969
+ }
2970
+
2971
+ .qa-custom-type-btn {
2972
+ flex: 1;
2973
+ padding: var(--sp-6) var(--sp-10);
2974
+ border: 1px solid var(--border-color, #374151);
2975
+ border-radius: var(--radius-md);
2976
+ background: var(--bg-secondary, #1f2937);
2977
+ color: var(--text-secondary, #9ca3af);
2978
+ font-size: var(--font-size-sm);
2979
+ cursor: pointer;
2980
+ transition: all 0.15s ease;
2981
+ }
2982
+
2983
+ .qa-custom-type-btn.active {
2984
+ background: var(--accent-muted, rgba(99, 102, 241, 0.15));
2985
+ border-color: var(--accent);
2986
+ color: var(--text-primary, #f3f4f6);
2987
+ }
2988
+
2989
+ .qa-custom-icon-grid {
2990
+ display: flex;
2991
+ flex-wrap: wrap;
2992
+ gap: var(--sp-6);
2993
+ }
2994
+
2995
+ .qa-custom-icon-btn {
2996
+ width: 34px;
2997
+ height: 34px;
2998
+ display: flex;
2999
+ align-items: center;
3000
+ justify-content: center;
3001
+ border: 1px solid var(--border-color, #374151);
3002
+ border-radius: var(--radius-md);
3003
+ background: var(--bg-secondary, #1f2937);
3004
+ color: var(--text-secondary, #9ca3af);
3005
+ cursor: pointer;
3006
+ transition: all 0.15s ease;
3007
+ }
3008
+
3009
+ .qa-custom-icon-btn svg {
3010
+ width: 16px;
3011
+ height: 16px;
3012
+ }
3013
+
3014
+ .qa-custom-icon-btn.active {
3015
+ background: var(--accent-muted, rgba(99, 102, 241, 0.15));
3016
+ border-color: var(--accent);
3017
+ color: var(--text-primary, #f3f4f6);
3018
+ }
3019
+
3020
+ .qa-custom-form-actions {
3021
+ display: flex;
3022
+ justify-content: flex-end;
3023
+ gap: var(--sp-8);
3024
+ }
3025
+
3026
+ .qa-custom-cancel,
3027
+ .qa-custom-save {
3028
+ padding: var(--sp-8) var(--sp-16);
3029
+ border-radius: var(--radius-md);
3030
+ font-size: var(--font-size-base);
3031
+ font-weight: 500;
3032
+ cursor: pointer;
3033
+ transition: all 0.15s ease;
3034
+ }
3035
+
3036
+ .qa-custom-cancel {
3037
+ border: 1px solid var(--border-color, #374151);
3038
+ background: transparent;
3039
+ color: var(--text-secondary, #9ca3af);
3040
+ }
3041
+
3042
+ .qa-custom-cancel:hover {
3043
+ color: var(--text-primary, #f3f4f6);
3044
+ background: var(--bg-secondary, #1f2937);
3045
+ }
3046
+
3047
+ .qa-custom-save {
3048
+ border: 1px solid var(--accent);
3049
+ background: var(--accent);
3050
+ color: #fff;
3051
+ }
3052
+
3053
+ .qa-custom-save:hover {
3054
+ filter: brightness(1.1);
3055
+ }
3056
+
3057
+ .qa-add-dialog {
3058
+ position: fixed;
3059
+ inset: 0;
3060
+ background: rgba(0, 0, 0, 0.6);
3061
+ display: flex;
3062
+ align-items: center;
3063
+ justify-content: center;
3064
+ z-index: var(--z-modal-backdrop);
3065
+ }
3066
+
3067
+ .qa-add-dialog[hidden] {
3068
+ display: none;
3069
+ }
3070
+
3071
+ .qa-add-dialog-content {
3072
+ width: min(500px, 90vw);
3073
+ max-height: 70vh;
3074
+ background: var(--bg-primary, #111827);
3075
+ border: 1px solid var(--border-color, #374151);
3076
+ border-radius: var(--radius-lg);
3077
+ display: flex;
3078
+ flex-direction: column;
3079
+ overflow: hidden;
3080
+ }
3081
+
3082
+ .qa-add-dialog-header {
3083
+ display: flex;
3084
+ align-items: center;
3085
+ justify-content: space-between;
3086
+ padding: var(--sp-16);
3087
+ border-bottom: 1px solid var(--border-color, #374151);
3088
+ }
3089
+
3090
+ .qa-add-dialog-header h3 {
3091
+ margin: 0;
3092
+ font-size: var(--font-size-lg);
3093
+ font-weight: 600;
3094
+ color: var(--text-primary, #f3f4f6);
3095
+ }
3096
+
3097
+ .qa-add-dialog-close {
3098
+ width: var(--layout-btn-sm);
3099
+ height: var(--layout-btn-sm);
3100
+ border: none;
3101
+ background: none;
3102
+ color: var(--text-muted, #6b7280);
3103
+ font-size: var(--font-size-xl);
3104
+ cursor: pointer;
3105
+ display: flex;
3106
+ align-items: center;
3107
+ justify-content: center;
3108
+ }
3109
+
3110
+ .qa-add-dialog-close:hover {
3111
+ color: var(--text-primary, #f3f4f6);
3112
+ }
3113
+
3114
+ .qa-add-dialog-search {
3115
+ padding: var(--sp-12) var(--sp-16);
3116
+ border-bottom: 1px solid var(--border-color, #374151);
3117
+ }
3118
+
3119
+ .qa-add-dialog-search input {
3120
+ width: 100%;
3121
+ padding: var(--sp-10) var(--sp-12);
3122
+ border: 1px solid var(--border-color, #374151);
3123
+ border-radius: var(--radius-md);
3124
+ background: var(--bg-secondary, #1f2937);
3125
+ color: var(--text-primary, #f3f4f6);
3126
+ font-size: var(--font-size-md);
3127
+ }
3128
+
3129
+ .qa-add-dialog-search input:focus {
3130
+ outline: none;
3131
+ border-color: var(--accent-orange);
3132
+ }
3133
+
3134
+ .qa-add-dialog-list {
3135
+ flex: 1;
3136
+ overflow-y: auto;
3137
+ padding: var(--sp-8);
3138
+ }
3139
+
3140
+ .qa-action-category {
3141
+ font-size: var(--font-size-xs);
3142
+ font-weight: 600;
3143
+ text-transform: uppercase;
3144
+ color: var(--text-muted, #6b7280);
3145
+ padding: var(--sp-12) var(--sp-8) var(--sp-4);
3146
+ letter-spacing: 0.5px;
3147
+ }
3148
+
3149
+ .qa-action-option {
3150
+ display: flex;
3151
+ align-items: center;
3152
+ gap: var(--sp-12);
3153
+ padding: var(--sp-10) var(--sp-12);
3154
+ border-radius: var(--radius-md);
3155
+ cursor: pointer;
3156
+ transition: background 0.15s ease;
3157
+ }
3158
+
3159
+ .qa-action-option:hover {
3160
+ background: var(--bg-secondary, #1f2937);
3161
+ }
3162
+
3163
+ .qa-action-icon {
3164
+ width: 24px;
3165
+ height: 24px;
3166
+ flex-shrink: 0;
3167
+ }
3168
+
3169
+ .qa-action-icon svg {
3170
+ width: 100%;
3171
+ height: 100%;
3172
+ color: var(--text-secondary, #9ca3af);
3173
+ }
3174
+
3175
+ .qa-action-info {
3176
+ flex: 1;
3177
+ display: flex;
3178
+ flex-direction: column;
3179
+ gap: var(--sp-2);
3180
+ min-width: 0;
3181
+ }
3182
+
3183
+ .qa-action-label {
3184
+ font-size: var(--font-size-md);
3185
+ color: var(--text-primary, #f3f4f6);
3186
+ }
3187
+
3188
+ .qa-action-desc {
3189
+ font-size: var(--font-size-sm);
3190
+ color: var(--text-muted, #6b7280);
3191
+ white-space: nowrap;
3192
+ overflow: hidden;
3193
+ text-overflow: ellipsis;
3194
+ }
3195
+
3196
+ .qa-action-shortcut {
3197
+ font-size: var(--font-size-xs);
3198
+ color: var(--text-muted, #6b7280);
3199
+ padding: var(--sp-2) var(--sp-6);
3200
+ background: var(--bg-tertiary, #374151);
3201
+ border-radius: var(--radius-sm);
3202
+ flex-shrink: 0;
3203
+ }
3204
+
3205
+ .qa-no-actions {
3206
+ padding: var(--sp-24);
3207
+ text-align: center;
3208
+ color: var(--text-muted, #6b7280);
3209
+ font-size: var(--font-size-md);
3210
+ }
3211
+
3212
+
3213
+ /* ═══════════════════════════════════════════════════════════════════════════
3214
+ Commit Sections Editor
3215
+ ═══════════════════════════════════════════════════════════════════════════ */
3216
+
3217
+ .commit-sections-container {
3218
+ margin-top: var(--sp-16);
3219
+ border-top: 1px solid var(--border-color, #2d2d44);
3220
+ padding-top: var(--sp-12);
3221
+ overflow-x: hidden;
3222
+ }
3223
+
3224
+ .commit-sections-container.disabled {
3225
+ opacity: 0.5;
3226
+ pointer-events: none;
3227
+ }
3228
+
3229
+ .commit-sections-toggle {
3230
+ height: var(--layout-btn-md);
3231
+ display: flex;
3232
+ align-items: center;
3233
+ gap: var(--sp-8);
3234
+ width: 100%;
3235
+ padding: var(--sp-8) var(--sp-12);
3236
+ background: var(--bg-tertiary, #1f1f2e);
3237
+ border: 1px solid var(--border-color, #2d2d44);
3238
+ border-radius: var(--radius-md);
3239
+ color: var(--text-primary, #f3f4f6);
3240
+ font-size: var(--font-size-base);
3241
+ cursor: pointer;
3242
+ transition: background 0.15s;
3243
+ }
3244
+
3245
+ .commit-sections-toggle:hover {
3246
+ background: var(--bg-secondary, #252538);
3247
+ }
3248
+
3249
+ .commit-sections-toggle .chevron-icon {
3250
+ width: 16px;
3251
+ height: 16px;
3252
+ transition: transform 0.2s;
3253
+ flex-shrink: 0;
3254
+ }
3255
+
3256
+ .commit-sections-toggle .chevron-icon.expanded {
3257
+ transform: rotate(90deg);
3258
+ }
3259
+
3260
+ .sections-count {
3261
+ margin-left: auto;
3262
+ font-size: var(--font-size-xs);
3263
+ color: var(--text-muted, #6b7280);
3264
+ padding: var(--sp-2) var(--sp-8);
3265
+ background: var(--bg-primary, #1a1a2e);
3266
+ border-radius: var(--radius-sm);
3267
+ }
3268
+
3269
+ .commit-sections-editor {
3270
+ display: none;
3271
+ margin-top: var(--sp-8);
3272
+ background: var(--bg-primary, #1a1a2e);
3273
+ border: 1px solid var(--border-color, #2d2d44);
3274
+ border-radius: var(--radius-md);
3275
+ overflow: hidden;
3276
+ overflow-x: hidden;
3277
+ }
3278
+
3279
+ .commit-sections-editor.expanded {
3280
+ display: block;
3281
+ }
3282
+
3283
+ .sections-loading {
3284
+ padding: var(--sp-24);
3285
+ text-align: center;
3286
+ color: var(--text-muted, #6b7280);
3287
+ }
3288
+
3289
+ .sections-list {
3290
+ max-height: 500px;
3291
+ overflow-y: auto;
3292
+ overflow-x: hidden;
3293
+ }
3294
+
3295
+ .section-item {
3296
+ display: flex;
3297
+ align-items: center;
3298
+ gap: var(--sp-8);
3299
+ padding: var(--sp-8) var(--sp-12);
3300
+ border-bottom: 1px solid var(--border-color, #2d2d44);
3301
+ transition: background 0.15s;
3302
+ min-width: 0; /* Allow flex children to shrink */
3303
+ }
3304
+
3305
+ .section-item:last-child {
3306
+ border-bottom: none;
3307
+ }
3308
+
3309
+ .section-item:hover {
3310
+ background: var(--bg-secondary, #252538);
3311
+ }
3312
+
3313
+ .section-item.disabled {
3314
+ opacity: 0.6;
3315
+ }
3316
+
3317
+ .section-drag-handle {
3318
+ cursor: grab;
3319
+ color: var(--text-muted, #6b7280);
3320
+ padding: var(--sp-4);
3321
+ flex-shrink: 0;
3322
+ }
3323
+
3324
+ .section-drag-handle svg {
3325
+ width: 14px;
3326
+ height: 14px;
3327
+ }
3328
+
3329
+ .section-drag-handle:active {
3330
+ cursor: grabbing;
3331
+ }
3332
+
3333
+ .section-toggle {
3334
+ display: flex;
3335
+ align-items: center;
3336
+ gap: var(--sp-8);
3337
+ flex: 1;
3338
+ min-width: 0;
3339
+ cursor: pointer;
3340
+ }
3341
+
3342
+ .section-toggle input[type="checkbox"] {
3343
+ /* Restore native checkbox appearance (overrides global appearance:none) */
3344
+ -webkit-appearance: checkbox;
3345
+ appearance: checkbox;
3346
+ width: 18px;
3347
+ height: 18px;
3348
+ min-width: 18px;
3349
+ min-height: 18px;
3350
+ accent-color: var(--accent);
3351
+ flex-shrink: 0;
3352
+ cursor: pointer;
3353
+ margin: 0;
3354
+ }
3355
+
3356
+ .section-toggle input[type="checkbox"]:disabled {
3357
+ opacity: 0.5;
3358
+ }
3359
+
3360
+ .section-info {
3361
+ display: flex;
3362
+ flex-direction: column;
3363
+ gap: var(--sp-2);
3364
+ min-width: 0;
3365
+ flex: 1;
3366
+ }
3367
+
3368
+ .section-name-row {
3369
+ display: flex;
3370
+ align-items: center;
3371
+ gap: var(--sp-8);
3372
+ }
3373
+
3374
+ .section-name {
3375
+ font-size: var(--font-size-base);
3376
+ color: var(--text-primary, #f3f4f6);
3377
+ white-space: nowrap;
3378
+ overflow: hidden;
3379
+ text-overflow: ellipsis;
3380
+ }
3381
+
3382
+ .section-prompt-preview {
3383
+ font-size: var(--font-size-xs);
3384
+ color: var(--text-muted, #6b7280);
3385
+ white-space: nowrap;
3386
+ overflow: hidden;
3387
+ text-overflow: ellipsis;
3388
+ line-height: 1.3;
3389
+ }
3390
+
3391
+ .section-badge {
3392
+ font-size: 10px;
3393
+ padding: var(--sp-2) var(--sp-6);
3394
+ border-radius: var(--radius-sm);
3395
+ flex-shrink: 0;
3396
+ }
3397
+
3398
+ .section-badge.required {
3399
+ background: var(--accent);
3400
+ color: white;
3401
+ }
3402
+
3403
+ .section-badge.custom {
3404
+ background: var(--warning-color, #f59e0b);
3405
+ color: #1a1a2e;
3406
+ }
3407
+
3408
+ .section-actions {
3409
+ display: flex;
3410
+ align-items: center;
3411
+ gap: var(--sp-4);
3412
+ flex-shrink: 0;
3413
+ }
3414
+
3415
+ .section-actions button {
3416
+ display: flex;
3417
+ align-items: center;
3418
+ justify-content: center;
3419
+ width: var(--layout-btn-sm);
3420
+ height: var(--layout-btn-sm);
3421
+ padding: 0;
3422
+ background: transparent;
3423
+ border: 1px solid transparent;
3424
+ border-radius: var(--radius-sm);
3425
+ color: var(--text-muted, #6b7280);
3426
+ cursor: pointer;
3427
+ transition: all 0.15s;
3428
+ }
3429
+
3430
+ .section-actions button:hover:not(:disabled) {
3431
+ background: var(--bg-tertiary, #1f1f2e);
3432
+ border-color: var(--border-color, #2d2d44);
3433
+ color: var(--text-primary, #f3f4f6);
3434
+ }
3435
+
3436
+ .section-actions button:disabled {
3437
+ opacity: 0.3;
3438
+ cursor: not-allowed;
3439
+ }
3440
+
3441
+ .section-actions button svg {
3442
+ width: 14px;
3443
+ height: 14px;
3444
+ }
3445
+
3446
+ .section-delete-btn:hover:not(:disabled) {
3447
+ color: var(--error-color, #ef4444) !important;
3448
+ }
3449
+
3450
+ .sections-footer {
3451
+ display: flex;
3452
+ align-items: center;
3453
+ gap: var(--sp-8);
3454
+ padding: var(--sp-12);
3455
+ background: var(--bg-secondary, #252538);
3456
+ border-top: 1px solid var(--border-color, #2d2d44);
3457
+ }
3458
+
3459
+ .sections-add-btn,
3460
+ .sections-reset-btn {
3461
+ display: flex;
3462
+ align-items: center;
3463
+ gap: var(--sp-6);
3464
+ padding: var(--sp-6) var(--sp-12);
3465
+ font-size: var(--font-size-sm);
3466
+ border-radius: var(--radius-sm);
3467
+ cursor: pointer;
3468
+ transition: all 0.15s;
3469
+ }
3470
+
3471
+ .sections-add-btn {
3472
+ height: var(--layout-btn-sm);
3473
+ background: var(--accent);
3474
+ border: none;
3475
+ color: white;
3476
+ }
3477
+
3478
+ .sections-add-btn:hover {
3479
+ background: var(--accent-hover);
3480
+ }
3481
+
3482
+ .sections-add-btn svg,
3483
+ .sections-reset-btn svg {
3484
+ width: 14px;
3485
+ height: 14px;
3486
+ }
3487
+
3488
+ .sections-reset-btn {
3489
+ margin-left: auto;
3490
+ background: transparent;
3491
+ border: 1px solid var(--border-color, #2d2d44);
3492
+ color: var(--text-muted, #6b7280);
3493
+ }
3494
+
3495
+ .sections-reset-btn:hover {
3496
+ background: var(--bg-tertiary, #1f1f2e);
3497
+ color: var(--text-primary, #f3f4f6);
3498
+ }
3499
+
3500
+ /* Section Edit Modal */
3501
+ .section-edit-modal {
3502
+ position: fixed;
3503
+ inset: 0;
3504
+ background: rgba(0, 0, 0, 0.6);
3505
+ display: flex;
3506
+ align-items: center;
3507
+ justify-content: center;
3508
+ z-index: var(--z-modal);
3509
+ padding: var(--sp-20);
3510
+ }
3511
+
3512
+ .section-edit-content {
3513
+ background: var(--bg-primary, #1a1a2e);
3514
+ border: 1px solid var(--border-color, #2d2d44);
3515
+ border-radius: var(--radius-lg);
3516
+ width: 100%;
3517
+ max-width: 500px;
3518
+ max-height: 90vh;
3519
+ overflow-y: auto;
3520
+ }
3521
+
3522
+ .section-edit-content h3 {
3523
+ padding: var(--sp-16) var(--sp-20);
3524
+ margin: 0;
3525
+ font-size: var(--font-size-lg);
3526
+ font-weight: 600;
3527
+ color: var(--text-primary, #f3f4f6);
3528
+ border-bottom: 1px solid var(--border-color, #2d2d44);
3529
+ }
3530
+
3531
+ .section-edit-form {
3532
+ padding: var(--sp-20);
3533
+ display: flex;
3534
+ flex-direction: column;
3535
+ gap: var(--sp-16);
3536
+ }
3537
+
3538
+ .section-edit-form .form-group {
3539
+ display: flex;
3540
+ flex-direction: column;
3541
+ gap: var(--sp-6);
3542
+ }
3543
+
3544
+ .section-edit-form .form-group > label {
3545
+ font-size: var(--font-size-base);
3546
+ font-weight: 500;
3547
+ color: var(--text-primary, #f3f4f6);
3548
+ }
3549
+
3550
+ .section-edit-form input[type="text"],
3551
+ .section-edit-form textarea {
3552
+ padding: var(--sp-10) var(--sp-12);
3553
+ background: var(--bg-secondary, #252538);
3554
+ border: 1px solid var(--border-color, #2d2d44);
3555
+ border-radius: var(--radius-md);
3556
+ color: var(--text-primary, #f3f4f6);
3557
+ font-size: var(--font-size-base);
3558
+ font-family: inherit;
3559
+ }
3560
+
3561
+ .section-edit-form input[type="text"]:focus,
3562
+ .section-edit-form textarea:focus {
3563
+ outline: none;
3564
+ border-color: var(--accent);
3565
+ }
3566
+
3567
+ .section-edit-form input[type="text"]:disabled {
3568
+ opacity: 0.6;
3569
+ cursor: not-allowed;
3570
+ }
3571
+
3572
+ .section-edit-form textarea {
3573
+ resize: vertical;
3574
+ min-height: 100px;
3575
+ }
3576
+
3577
+ .section-edit-form .form-hint {
3578
+ font-size: var(--font-size-xs);
3579
+ color: var(--text-muted, #6b7280);
3580
+ }
3581
+
3582
+ .applies-to-checkboxes {
3583
+ display: flex;
3584
+ gap: var(--sp-16);
3585
+ }
3586
+
3587
+ .applies-to-checkboxes label {
3588
+ display: flex;
3589
+ align-items: center;
3590
+ gap: var(--sp-6);
3591
+ font-size: var(--font-size-base);
3592
+ color: var(--text-secondary, #9ca3af);
3593
+ cursor: pointer;
3594
+ }
3595
+
3596
+ .applies-to-checkboxes input[type="checkbox"] {
3597
+ -webkit-appearance: checkbox;
3598
+ appearance: checkbox;
3599
+ width: 16px;
3600
+ height: 16px;
3601
+ accent-color: var(--accent);
3602
+ }
3603
+
3604
+ .field-type-selector {
3605
+ display: flex;
3606
+ gap: var(--sp-16);
3607
+ }
3608
+
3609
+ .field-type-selector label {
3610
+ display: flex;
3611
+ align-items: center;
3612
+ gap: var(--sp-6);
3613
+ font-size: var(--font-size-base);
3614
+ color: var(--text-secondary, #9ca3af);
3615
+ cursor: pointer;
3616
+ }
3617
+
3618
+ .field-type-selector input[type="radio"] {
3619
+ -webkit-appearance: radio;
3620
+ appearance: radio;
3621
+ width: 16px;
3622
+ height: 16px;
3623
+ accent-color: var(--accent);
3624
+ }
3625
+
3626
+ .section-edit-actions {
3627
+ display: flex;
3628
+ justify-content: flex-end;
3629
+ gap: var(--sp-8);
3630
+ padding: var(--sp-16) var(--sp-20);
3631
+ background: var(--bg-secondary, #252538);
3632
+ border-top: 1px solid var(--border-color, #2d2d44);
3633
+ }
3634
+
3635
+ .section-edit-actions .btn-cancel,
3636
+ .section-edit-actions .btn-save {
3637
+ padding: var(--sp-8) var(--sp-16);
3638
+ font-size: var(--font-size-base);
3639
+ border-radius: var(--radius-md);
3640
+ cursor: pointer;
3641
+ transition: all 0.15s;
3642
+ }
3643
+
3644
+ .section-edit-actions .btn-cancel {
3645
+ background: transparent;
3646
+ border: 1px solid var(--border-color, #2d2d44);
3647
+ color: var(--text-secondary, #9ca3af);
3648
+ }
3649
+
3650
+ .section-edit-actions .btn-cancel:hover {
3651
+ background: var(--bg-tertiary, #1f1f2e);
3652
+ color: var(--text-primary, #f3f4f6);
3653
+ }
3654
+
3655
+ .section-edit-actions .btn-save {
3656
+ background: var(--accent);
3657
+ border: none;
3658
+ color: white;
3659
+ }
3660
+
3661
+ .section-edit-actions .btn-save:hover {
3662
+ background: var(--accent-hover);
3663
+ }
3664
+
3665
+ /* ═════════════════════════════════════════════════════════════
3666
+ Shortcut Hints Picker (System tab → Input section)
3667
+ ═════════════════════════════════════════════════════════════ */
3668
+ .shortcut-hints-picker {
3669
+ margin-top: var(--sp-8);
3670
+ margin-left: var(--sp-24);
3671
+ padding: var(--sp-10) var(--sp-12);
3672
+ background: var(--bg-primary);
3673
+ border: 1px solid var(--border-primary);
3674
+ border-radius: var(--radius-md);
3675
+ transition: opacity 0.15s ease;
3676
+ }
3677
+
3678
+ .shortcut-hints-picker.disabled {
3679
+ opacity: 0.5;
3680
+ pointer-events: none;
3681
+ }
3682
+
3683
+ .shortcut-hints-picker-header {
3684
+ display: flex;
3685
+ justify-content: space-between;
3686
+ align-items: center;
3687
+ font-size: var(--font-size-sm);
3688
+ color: var(--text-muted);
3689
+ margin-bottom: var(--sp-8);
3690
+ }
3691
+
3692
+ .shortcut-hints-picker-list {
3693
+ display: grid;
3694
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
3695
+ gap: var(--sp-4) var(--sp-12);
3696
+ }
3697
+
3698
+ .shortcut-hints-picker-item {
3699
+ display: flex;
3700
+ align-items: center;
3701
+ gap: var(--sp-8);
3702
+ padding: var(--sp-4) var(--sp-6);
3703
+ font-size: var(--font-size-sm);
3704
+ cursor: pointer;
3705
+ border-radius: var(--radius-sm);
3706
+ transition: background 0.12s ease;
3707
+ }
3708
+
3709
+ .shortcut-hints-picker-item:hover {
3710
+ background: var(--bg-secondary);
3711
+ }
3712
+
3713
+ .shortcut-hints-picker-item input[type="checkbox"] {
3714
+ margin: 0;
3715
+ cursor: pointer;
3716
+ }
3717
+
3718
+ .shortcut-hints-picker-key {
3719
+ font-family: var(--font-mono, monospace);
3720
+ font-size: var(--font-size-xs);
3721
+ background: var(--bg-secondary);
3722
+ border: 1px solid var(--border-primary);
3723
+ border-radius: var(--radius-xs);
3724
+ padding: 1px var(--sp-5);
3725
+ color: var(--text-primary);
3726
+ white-space: nowrap;
3727
+ min-width: 48px;
3728
+ text-align: center;
3729
+ }
3730
+
3731
+ .shortcut-hints-picker-label {
3732
+ color: var(--text-secondary);
3733
+ overflow: hidden;
3734
+ text-overflow: ellipsis;
3735
+ white-space: nowrap;
3736
+ }