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,3095 @@
1
+ /* ═══════════════════════════════════════════════════════════════════
2
+ WELCOME SCREEN - Conversational Session Discovery
3
+ ═══════════════════════════════════════════════════════════════════ */
4
+
5
+ /* Base Welcome Screen */
6
+ .welcome-screen {
7
+ display: flex;
8
+ flex-direction: column;
9
+ padding: 0;
10
+ width: 100%;
11
+ }
12
+
13
+ /* Welcome container — own scroll, same as .session-messages */
14
+ #welcome-container {
15
+ flex: 1;
16
+ overflow-y: auto;
17
+ padding: var(--layout-content-padding);
18
+ -webkit-overflow-scrolling: touch;
19
+ touch-action: pan-y;
20
+ overscroll-behavior-y: contain;
21
+ margin: 0;
22
+ }
23
+
24
+ /* Constrain content width, not the scroll area */
25
+ #welcome-container > .welcome-screen {
26
+ max-width: 900px;
27
+ }
28
+
29
+ .welcome-screen--conversation {
30
+ padding: 0;
31
+ }
32
+
33
+ /* Structural wrappers that let the search bar survive re-renders.
34
+ Both are layout-neutral: the body keeps the same flex-column context the
35
+ sections used to get from .welcome-screen, and the loading host disappears
36
+ from the box tree so the spinner stays a direct flex item. */
37
+ .welcome-body {
38
+ display: flex;
39
+ flex-direction: column;
40
+ }
41
+
42
+ .welcome-loading-host {
43
+ display: contents;
44
+ }
45
+
46
+ /* Welcome view (top-level sibling of #session-view / #widget-views) */
47
+ #welcome-view {
48
+ background: var(--bg-primary);
49
+ }
50
+
51
+ /* ═══════════════════════════════════════════════════════════════════
52
+ UNIFIED SEARCH BAR - Spotlight-style prominent search
53
+ ═══════════════════════════════════════════════════════════════════ */
54
+
55
+ .welcome-search-bar {
56
+ margin-bottom: var(--sp-8);
57
+ }
58
+
59
+ .welcome-search-input-wrapper {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: var(--sp-8);
63
+ padding: var(--sp-12) var(--sp-16);
64
+ background: var(--bg-secondary);
65
+ border: 1px solid var(--border-secondary);
66
+ border-radius: var(--radius-lg);
67
+ transition: all 0.15s ease;
68
+ }
69
+
70
+ .welcome-search-input-wrapper:focus-within {
71
+ border-color: var(--accent);
72
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);
73
+ }
74
+
75
+ .welcome-search-icon {
76
+ width: 20px;
77
+ height: 20px;
78
+ color: var(--text-muted);
79
+ flex-shrink: 0;
80
+ }
81
+
82
+ .welcome-search-input-wrapper:focus-within .welcome-search-icon {
83
+ color: var(--accent);
84
+ }
85
+
86
+ .welcome-search-input {
87
+ flex: 1;
88
+ border: none;
89
+ background: transparent;
90
+ font-size: var(--font-size-lg);
91
+ color: var(--text-primary);
92
+ outline: none;
93
+ min-width: 0;
94
+ }
95
+
96
+ .welcome-search-input::placeholder {
97
+ color: var(--text-tertiary);
98
+ }
99
+
100
+ .welcome-search-clear {
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: center;
104
+ width: 28px;
105
+ height: 28px;
106
+ padding: 0;
107
+ border: none;
108
+ border-radius: var(--radius-sm);
109
+ background: var(--bg-tertiary);
110
+ color: var(--text-secondary);
111
+ cursor: pointer;
112
+ transition: all 0.15s ease;
113
+ flex-shrink: 0;
114
+ }
115
+
116
+ .welcome-search-clear:hover {
117
+ background: var(--error, #ef4444);
118
+ color: white;
119
+ }
120
+
121
+ .welcome-search-clear:active {
122
+ transform: scale(0.95);
123
+ }
124
+
125
+ .welcome-search-new {
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ width: 36px;
130
+ height: 36px;
131
+ padding: 0;
132
+ border: none;
133
+ border-radius: var(--radius-md);
134
+ background: var(--accent);
135
+ color: white;
136
+ cursor: pointer;
137
+ transition: all 0.15s ease;
138
+ flex-shrink: 0;
139
+ margin-left: var(--sp-4);
140
+ }
141
+
142
+ .welcome-search-new:hover {
143
+ background: var(--accent-hover);
144
+ transform: scale(1.05);
145
+ }
146
+
147
+ .welcome-search-new:active {
148
+ transform: scale(0.95);
149
+ }
150
+
151
+ /* Search status (shown when filtering) */
152
+ .welcome-search-status {
153
+ font-size: var(--font-size-sm);
154
+ color: var(--accent);
155
+ font-weight: 500;
156
+ padding: var(--sp-4) var(--sp-10);
157
+ margin-top: var(--sp-8);
158
+ background: rgba(99, 102, 241, 0.1);
159
+ border-radius: var(--radius-lg);
160
+ }
161
+
162
+ .welcome-search-status kbd {
163
+ display: inline-block;
164
+ background: rgba(99, 102, 241, 0.2);
165
+ padding: 1px var(--sp-5);
166
+ border-radius: var(--radius-sm);
167
+ font-family: inherit;
168
+ font-size: var(--font-size-xs);
169
+ margin: 0 var(--sp-2);
170
+ }
171
+
172
+ /* Session list limit quick-selector */
173
+ .welcome-limit-selector {
174
+ display: inline-block;
175
+ position: relative;
176
+ font-size: var(--font-size-xs);
177
+ color: var(--text-muted);
178
+ padding: var(--sp-3) var(--sp-8);
179
+ margin-top: var(--sp-4);
180
+ cursor: pointer;
181
+ border-radius: var(--radius-md);
182
+ transition: background 0.15s, color 0.15s;
183
+ user-select: none;
184
+ }
185
+ .welcome-limit-selector:hover {
186
+ background: rgba(255, 255, 255, 0.06);
187
+ color: var(--text-secondary);
188
+ }
189
+ .welcome-limit-value {
190
+ opacity: 0.6;
191
+ }
192
+
193
+ .limit-popup {
194
+ position: absolute;
195
+ bottom: calc(100% + 4px);
196
+ left: 0;
197
+ display: flex;
198
+ gap: var(--sp-4);
199
+ background: var(--bg-secondary);
200
+ border: 1px solid var(--border-color);
201
+ border-radius: var(--radius-md);
202
+ padding: var(--sp-4);
203
+ z-index: var(--z-overlay);
204
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
205
+ }
206
+ .limit-option {
207
+ background: none;
208
+ border: 1px solid transparent;
209
+ color: var(--text-secondary);
210
+ padding: var(--sp-4) var(--sp-10);
211
+ border-radius: var(--radius-md);
212
+ cursor: pointer;
213
+ font-size: var(--font-size-sm);
214
+ font-family: inherit;
215
+ transition: all 0.15s;
216
+ }
217
+ .limit-option:hover {
218
+ background: rgba(255, 255, 255, 0.08);
219
+ color: var(--text-primary);
220
+ }
221
+ .limit-option.active {
222
+ background: var(--accent);
223
+ color: white;
224
+ border-color: var(--accent);
225
+ }
226
+
227
+
228
+ /* ═══════════════════════════════════════════════════════════════════
229
+ SEARCH FILTER CHIPS
230
+ ═══════════════════════════════════════════════════════════════════ */
231
+
232
+ .search-filter-chip {
233
+ display: inline-flex;
234
+ align-items: center;
235
+ gap: var(--sp-4);
236
+ padding: var(--sp-4) var(--sp-8);
237
+ background: var(--accent);
238
+ color: white;
239
+ font-size: var(--font-size-sm);
240
+ font-weight: 500;
241
+ border-radius: var(--radius-lg);
242
+ cursor: pointer;
243
+ transition: all 0.15s ease;
244
+ flex-shrink: 0;
245
+ max-width: 180px;
246
+ overflow: hidden;
247
+ text-overflow: ellipsis;
248
+ white-space: nowrap;
249
+ }
250
+
251
+ .search-filter-chip:hover {
252
+ background: var(--accent-hover);
253
+ }
254
+
255
+ .search-filter-chip svg:first-child {
256
+ flex-shrink: 0;
257
+ opacity: 0.8;
258
+ }
259
+
260
+ .search-filter-chip .chip-remove {
261
+ flex-shrink: 0;
262
+ opacity: 0.7;
263
+ transition: opacity 0.15s;
264
+ }
265
+
266
+ .search-filter-chip:hover .chip-remove {
267
+ opacity: 1;
268
+ }
269
+
270
+ .welcome-search-input.has-filter {
271
+ /* Reduce input flex when filter chip is present */
272
+ flex: 1;
273
+ }
274
+
275
+
276
+ /* ═══════════════════════════════════════════════════════════════════
277
+ PROJECT CONTEXT MENU
278
+ ═══════════════════════════════════════════════════════════════════ */
279
+
280
+ .project-context-menu {
281
+ min-width: 180px;
282
+ background: var(--bg-secondary);
283
+ border: 1px solid var(--border-secondary);
284
+ border-radius: var(--radius-lg);
285
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
286
+ padding: var(--sp-6) 0;
287
+ overflow: hidden;
288
+ }
289
+
290
+ .context-menu-item {
291
+ display: flex;
292
+ align-items: center;
293
+ gap: var(--sp-10);
294
+ padding: var(--sp-6) var(--sp-10);
295
+ line-height: var(--layout-menu-line-height);
296
+ font-size: var(--font-size-base);
297
+ color: var(--text-primary);
298
+ cursor: pointer;
299
+ transition: background 0.1s;
300
+ }
301
+
302
+ .context-menu-item:hover {
303
+ background: var(--bg-hover);
304
+ }
305
+
306
+ .context-menu-item:active {
307
+ background: var(--bg-tertiary);
308
+ }
309
+
310
+ .context-menu-item svg {
311
+ color: var(--text-muted);
312
+ flex-shrink: 0;
313
+ }
314
+
315
+ .context-menu-item:hover svg {
316
+ color: var(--accent);
317
+ }
318
+
319
+ .context-menu-separator {
320
+ height: 1px;
321
+ background: var(--border-secondary);
322
+ margin: var(--sp-6) 0;
323
+ }
324
+
325
+
326
+ /* ═══════════════════════════════════════════════════════════════════
327
+ PROJECT COLOR PICKER (swatch popup)
328
+ ═══════════════════════════════════════════════════════════════════ */
329
+
330
+ .project-color-picker {
331
+ background: var(--bg-secondary);
332
+ border: 1px solid var(--border-secondary);
333
+ border-radius: var(--radius-lg);
334
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
335
+ padding: var(--sp-10);
336
+ display: flex;
337
+ flex-direction: column;
338
+ gap: var(--sp-8);
339
+ }
340
+
341
+ .project-color-picker-swatches {
342
+ display: grid;
343
+ grid-template-columns: repeat(7, 1fr);
344
+ gap: var(--sp-6);
345
+ }
346
+
347
+ .project-swatch {
348
+ width: 22px;
349
+ height: 22px;
350
+ padding: 0;
351
+ border: 2px solid transparent;
352
+ border-radius: var(--radius-sm);
353
+ background: var(--swatch);
354
+ cursor: pointer;
355
+ transition: transform 0.1s, border-color 0.1s;
356
+ }
357
+
358
+ .project-swatch:hover {
359
+ transform: scale(1.12);
360
+ }
361
+
362
+ .project-swatch.is-active {
363
+ border-color: var(--text-primary);
364
+ box-shadow: 0 0 0 1px var(--bg-secondary) inset;
365
+ }
366
+
367
+ .project-swatch-auto {
368
+ width: 100%;
369
+ padding: var(--sp-6) var(--sp-10);
370
+ border: 1px solid var(--border-secondary);
371
+ border-radius: var(--radius-sm);
372
+ background: var(--bg-tertiary);
373
+ color: var(--text-secondary);
374
+ font-size: var(--font-size-sm);
375
+ cursor: pointer;
376
+ transition: background 0.1s, color 0.1s;
377
+ }
378
+
379
+ .project-swatch-auto:hover {
380
+ background: var(--bg-hover);
381
+ color: var(--text-primary);
382
+ }
383
+
384
+ .project-swatch-auto.is-active {
385
+ border-color: var(--accent);
386
+ color: var(--text-primary);
387
+ }
388
+
389
+
390
+ /* ═══════════════════════════════════════════════════════════════════
391
+ PROJECTS QUICK-START SECTION
392
+ ═══════════════════════════════════════════════════════════════════ */
393
+
394
+ .welcome-section--projects {
395
+ margin-top: var(--sp-8);
396
+ }
397
+
398
+ .welcome-projects-chips {
399
+ display: flex;
400
+ flex-wrap: wrap;
401
+ gap: var(--sp-8);
402
+ }
403
+
404
+ .welcome-project-chip {
405
+ height: var(--layout-btn-md);
406
+ display: inline-flex;
407
+ align-items: center;
408
+ gap: var(--sp-6);
409
+ padding: var(--sp-8) var(--sp-12);
410
+ background: var(--bg-secondary);
411
+ border: 1px solid var(--border-secondary);
412
+ border-radius: var(--radius-md);
413
+ color: var(--text-primary);
414
+ font-size: var(--font-size-base);
415
+ cursor: pointer;
416
+ transition: all 0.15s ease;
417
+ user-select: none;
418
+ -webkit-user-select: none;
419
+ }
420
+
421
+ .welcome-project-chip:hover {
422
+ background: var(--bg-tertiary);
423
+ border-color: var(--accent);
424
+ transform: translateY(-1px);
425
+ }
426
+
427
+ .welcome-project-chip:active {
428
+ transform: translateY(0);
429
+ }
430
+
431
+ .welcome-project-chip svg {
432
+ color: var(--project-color, var(--text-muted));
433
+ flex-shrink: 0;
434
+ }
435
+
436
+ .welcome-project-chip:hover svg {
437
+ color: var(--project-color, var(--accent));
438
+ }
439
+
440
+ /* Keyboard selection state for project chips */
441
+ .welcome-project-chip.selected {
442
+ background: var(--accent-muted, rgba(99, 102, 241, 0.15));
443
+ border-color: var(--accent);
444
+ transform: translateY(-1px);
445
+ box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2);
446
+ }
447
+
448
+ .welcome-project-chip.selected svg {
449
+ color: var(--project-color, var(--accent));
450
+ }
451
+
452
+ /* The project the welcome screen is currently filtered to. Pinned into the
453
+ row regardless of rank, so it needs to read as "this is the one" rather
454
+ than as just another chip. */
455
+ .welcome-project-chip--active {
456
+ border-color: var(--project-color, var(--accent));
457
+ background: var(--bg-tertiary);
458
+ }
459
+
460
+ .welcome-project-chip--active svg {
461
+ color: var(--project-color, var(--accent));
462
+ }
463
+
464
+ /* Overflow toggle for the visited-projects row. Shares the italic muted
465
+ treatment of the unvisited toggle, but keeps a solid border — it sits
466
+ among solid chips, not dashed ones. */
467
+ .welcome-project-chip--more-toggle {
468
+ color: var(--text-muted);
469
+ font-style: italic;
470
+ opacity: 0.85;
471
+ }
472
+
473
+ .welcome-project-chip--more-toggle:hover {
474
+ background: var(--bg-tertiary);
475
+ color: var(--text-primary);
476
+ opacity: 1;
477
+ }
478
+
479
+ /* Small per-project color dot (project pickers, group headers).
480
+ True circle — allowed to stay round per design guidelines. */
481
+ .project-color-dot {
482
+ width: 8px;
483
+ height: 8px;
484
+ border-radius: 50%;
485
+ background: var(--project-color, var(--text-muted));
486
+ flex-shrink: 0;
487
+ }
488
+
489
+ .project-chip-count {
490
+ font-size: var(--font-size-xs);
491
+ color: var(--text-muted);
492
+ background: var(--bg-tertiary);
493
+ padding: 1px var(--sp-6);
494
+ border-radius: var(--radius-sm);
495
+ margin-left: var(--sp-2);
496
+ }
497
+
498
+ /* Unvisited workspace siblings — siblings of an existing project on disk
499
+ that have no session yet. Muted to read as "not your project, but maybe?"
500
+ without competing visually with the real projects above. */
501
+ .welcome-projects-separator {
502
+ display: flex;
503
+ align-items: center;
504
+ gap: var(--sp-8);
505
+ margin: var(--sp-12) 0 var(--sp-6);
506
+ font-size: 10px;
507
+ text-transform: uppercase;
508
+ letter-spacing: 0.08em;
509
+ color: var(--text-muted);
510
+ }
511
+
512
+ .welcome-projects-separator::before,
513
+ .welcome-projects-separator::after {
514
+ content: "";
515
+ flex: 1;
516
+ height: 1px;
517
+ background: var(--border-secondary);
518
+ opacity: 0.5;
519
+ }
520
+
521
+ .welcome-projects-separator-label {
522
+ flex: 0 0 auto;
523
+ }
524
+
525
+ .welcome-projects-chips--unvisited {
526
+ display: flex;
527
+ flex-wrap: wrap;
528
+ gap: var(--sp-8);
529
+ }
530
+
531
+ .welcome-project-chip--unvisited {
532
+ background: transparent;
533
+ border-style: dashed;
534
+ color: var(--text-muted);
535
+ }
536
+
537
+ .welcome-project-chip--unvisited:hover {
538
+ background: var(--bg-secondary);
539
+ border-style: solid;
540
+ color: var(--text-primary);
541
+ }
542
+
543
+ .welcome-project-chip--unvisited svg {
544
+ opacity: 0.7;
545
+ }
546
+
547
+ .welcome-project-chip--unvisited-toggle {
548
+ border-style: dashed;
549
+ color: var(--text-muted);
550
+ font-style: italic;
551
+ opacity: 0.85;
552
+ }
553
+
554
+ .welcome-project-chip--unvisited-toggle:hover {
555
+ background: var(--bg-secondary);
556
+ color: var(--text-primary);
557
+ opacity: 1;
558
+ }
559
+
560
+ @media (max-width: 640px) {
561
+ .welcome-section--projects {
562
+ margin-top: var(--sp-16);
563
+ padding-top: var(--sp-12);
564
+ }
565
+
566
+ .welcome-projects-chips {
567
+ gap: var(--sp-6);
568
+ }
569
+
570
+ .welcome-project-chip {
571
+ padding: var(--sp-6) var(--sp-10);
572
+ font-size: var(--font-size-sm);
573
+ }
574
+
575
+ .welcome-project-chip svg {
576
+ width: 12px;
577
+ height: 12px;
578
+ }
579
+ }
580
+
581
+ /* Mobile: full-width search */
582
+ @media (max-width: 640px) {
583
+ .welcome-search-bar {
584
+ margin-bottom: var(--sp-16);
585
+ }
586
+
587
+ .welcome-search-input-wrapper {
588
+ padding: var(--sp-10) var(--sp-12);
589
+ }
590
+
591
+ .welcome-search-input {
592
+ font-size: var(--font-size-lg); /* Prevent iOS zoom */
593
+ }
594
+
595
+ .welcome-search-icon {
596
+ width: 18px;
597
+ height: 18px;
598
+ }
599
+
600
+ .welcome-search-new {
601
+ width: 32px;
602
+ height: 32px;
603
+ }
604
+
605
+ }
606
+
607
+
608
+ /* ═══════════════════════════════════════════════════════════════════
609
+ SEARCH MODE TOGGLE - Type-anywhere activation (legacy)
610
+ ═══════════════════════════════════════════════════════════════════ */
611
+
612
+ .welcome-search-mode-btn {
613
+ display: flex;
614
+ align-items: center;
615
+ justify-content: center;
616
+ width: var(--layout-btn-sm);
617
+ height: var(--layout-btn-sm);
618
+ padding: 0;
619
+ margin-left: var(--sp-8);
620
+ background: var(--bg-tertiary);
621
+ border: 1px solid var(--border-secondary);
622
+ border-radius: var(--radius-sm);
623
+ color: var(--text-secondary);
624
+ cursor: pointer;
625
+ transition: all 0.15s ease;
626
+ }
627
+
628
+ .welcome-search-mode-btn:hover {
629
+ background: var(--accent);
630
+ border-color: var(--accent);
631
+ color: white;
632
+ }
633
+
634
+ .welcome-search-mode-btn.active {
635
+ background: var(--accent);
636
+ border-color: var(--accent);
637
+ color: white;
638
+ animation: pulse-glow 1.5s ease-in-out infinite;
639
+ }
640
+
641
+ @keyframes pulse-glow {
642
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.4); }
643
+ 50% { box-shadow: 0 0 0 6px rgba(99, 102, 241, 0); }
644
+ }
645
+
646
+ .welcome-search-mode-btn svg {
647
+ width: 14px;
648
+ height: 14px;
649
+ }
650
+
651
+ /* Quick inline search input */
652
+ .welcome-quick-search {
653
+ display: flex;
654
+ align-items: center;
655
+ gap: var(--sp-4);
656
+ margin-left: var(--sp-8);
657
+ flex: 1;
658
+ max-width: 250px;
659
+ }
660
+
661
+ .welcome-quick-search-input {
662
+ flex: 1;
663
+ height: 28px;
664
+ padding: 0 var(--sp-10);
665
+ background: var(--bg-primary);
666
+ border: 1px solid var(--accent);
667
+ border-radius: var(--radius-sm);
668
+ color: var(--text-primary);
669
+ font-size: var(--font-size-base);
670
+ outline: none;
671
+ transition: all 0.15s ease;
672
+ }
673
+
674
+ .welcome-quick-search-input:focus {
675
+ box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2);
676
+ }
677
+
678
+ .welcome-quick-search-input::placeholder {
679
+ color: var(--text-tertiary);
680
+ }
681
+
682
+ .welcome-quick-search-clear {
683
+ display: flex;
684
+ align-items: center;
685
+ justify-content: center;
686
+ width: 26px;
687
+ height: 26px;
688
+ padding: 0;
689
+ background: var(--bg-tertiary);
690
+ border: 1px solid var(--border-color);
691
+ color: var(--text-secondary);
692
+ cursor: pointer;
693
+ border-radius: var(--radius-sm);
694
+ transition: all 0.15s ease;
695
+ flex-shrink: 0;
696
+ }
697
+
698
+ .welcome-quick-search-clear:hover {
699
+ background: var(--accent);
700
+ border-color: var(--accent);
701
+ color: white;
702
+ }
703
+
704
+ .welcome-quick-search-clear:active {
705
+ transform: scale(0.95);
706
+ }
707
+
708
+ /* ═══════════════════════════════════════════════════════════════════
709
+ RECENT SESSIONS - Compact Cards
710
+ ═══════════════════════════════════════════════════════════════════ */
711
+
712
+ .welcome-section--recent {
713
+ margin-bottom: var(--sp-16);
714
+ }
715
+
716
+ .welcome-recent-grid {
717
+ display: flex;
718
+ flex-direction: column;
719
+ gap: var(--sp-8);
720
+ }
721
+
722
+ .welcome-recent-card {
723
+ background: var(--bg-secondary);
724
+ border: 1px solid var(--border-secondary);
725
+ border-left: 3px solid var(--project-color, var(--border-secondary));
726
+ border-radius: var(--radius-md);
727
+ padding: var(--sp-12) var(--sp-14);
728
+ cursor: pointer;
729
+ transition: all 0.15s ease;
730
+ /* Prevent iOS native text selection during long press */
731
+ -webkit-user-select: none;
732
+ user-select: none;
733
+ -webkit-touch-callout: none;
734
+ }
735
+
736
+ .welcome-recent-card:hover {
737
+ background: var(--bg-tertiary);
738
+ border-color: var(--accent);
739
+ border-left-color: var(--project-color, var(--accent));
740
+ }
741
+
742
+ .recent-card-header {
743
+ display: flex;
744
+ align-items: center;
745
+ justify-content: space-between;
746
+ gap: var(--sp-12);
747
+ margin-bottom: var(--sp-2);
748
+ }
749
+
750
+ .recent-card-name {
751
+ font-size: var(--font-size-md);
752
+ font-weight: 600;
753
+ color: var(--text-primary);
754
+ white-space: nowrap;
755
+ overflow: hidden;
756
+ text-overflow: ellipsis;
757
+ flex: 1;
758
+ min-width: 0;
759
+ }
760
+
761
+ .recent-card-time {
762
+ font-size: var(--font-size-xs);
763
+ color: var(--text-muted);
764
+ flex-shrink: 0;
765
+ }
766
+
767
+ .recent-card-project {
768
+ font-size: var(--font-size-xs);
769
+ color: var(--text-tertiary);
770
+ font-family: var(--font-mono);
771
+ margin-bottom: var(--sp-4);
772
+ }
773
+
774
+ .recent-card-summary {
775
+ font-size: var(--font-size-sm);
776
+ color: var(--text-secondary);
777
+ line-height: 1.35;
778
+ margin-bottom: var(--sp-6);
779
+ display: -webkit-box;
780
+ -webkit-line-clamp: 1;
781
+ -webkit-box-orient: vertical;
782
+ overflow: hidden;
783
+ }
784
+
785
+ .recent-card-summary.first-prompt,
786
+ .welcome-session-summary.first-prompt,
787
+ .family-root-summary.first-prompt {
788
+ font-style: italic;
789
+ opacity: 0.7;
790
+ }
791
+
792
+ .recent-card-footer {
793
+ display: flex;
794
+ align-items: center;
795
+ justify-content: space-between;
796
+ gap: var(--sp-8);
797
+ }
798
+
799
+ .recent-card-tags {
800
+ display: flex;
801
+ gap: var(--sp-4);
802
+ flex-wrap: wrap;
803
+ flex: 1;
804
+ min-width: 0;
805
+ }
806
+
807
+ .recent-card-tags .welcome-tag {
808
+ font-size: 10px;
809
+ padding: 1px var(--sp-6);
810
+ }
811
+
812
+ .recent-card-meta {
813
+ display: flex;
814
+ gap: var(--sp-8);
815
+ font-size: var(--font-size-xs);
816
+ color: var(--text-muted);
817
+ flex-shrink: 0;
818
+ }
819
+
820
+ .recent-card-meta .meta-item {
821
+ white-space: nowrap;
822
+ }
823
+
824
+ .recent-card-meta .meta-cost {
825
+ color: var(--success);
826
+ }
827
+
828
+ /* Preview button on recent cards */
829
+ .recent-card-preview {
830
+ display: flex;
831
+ align-items: center;
832
+ justify-content: center;
833
+ width: var(--layout-btn-sm);
834
+ height: var(--layout-btn-sm);
835
+ padding: 0;
836
+ border: none;
837
+ border-radius: var(--radius-sm);
838
+ background: transparent;
839
+ color: var(--text-muted);
840
+ cursor: pointer;
841
+ transition: all 0.15s ease;
842
+ flex-shrink: 0;
843
+ }
844
+
845
+ .recent-card-preview:hover {
846
+ background: var(--bg-tertiary);
847
+ color: var(--accent);
848
+ }
849
+
850
+ .recent-card-preview:active {
851
+ transform: scale(0.95);
852
+ }
853
+
854
+ .recent-card-preview svg {
855
+ width: 16px;
856
+ height: 16px;
857
+ }
858
+
859
+ /* Hide hero on all screens now - using compact layout */
860
+ .welcome-hero {
861
+ display: none;
862
+ }
863
+
864
+ /* Load More button for recent sessions */
865
+ .welcome-load-more {
866
+ height: var(--layout-btn-lg);
867
+ display: flex;
868
+ align-items: center;
869
+ justify-content: center;
870
+ gap: var(--sp-8);
871
+ width: 100%;
872
+ padding: var(--sp-12) var(--sp-16);
873
+ margin-top: var(--sp-8);
874
+ background: var(--bg-tertiary);
875
+ border: 1px dashed var(--border-secondary);
876
+ border-radius: var(--radius-md);
877
+ color: var(--text-secondary);
878
+ font-size: var(--font-size-base);
879
+ cursor: pointer;
880
+ transition: all 0.15s ease;
881
+ }
882
+
883
+ .welcome-load-more:hover {
884
+ background: var(--bg-secondary);
885
+ border-color: var(--accent);
886
+ color: var(--accent);
887
+ }
888
+
889
+ .welcome-load-more:active {
890
+ transform: scale(0.98);
891
+ }
892
+
893
+ .welcome-load-more svg {
894
+ width: 16px;
895
+ height: 16px;
896
+ flex-shrink: 0;
897
+ }
898
+
899
+ .welcome-load-more-hint {
900
+ font-size: var(--font-size-xs);
901
+ color: var(--text-muted);
902
+ margin-left: var(--sp-4);
903
+ }
904
+
905
+ .welcome-load-more:hover .welcome-load-more-hint {
906
+ color: var(--text-tertiary);
907
+ }
908
+
909
+
910
+ /* ═══════════════════════════════════════════════════════════════════
911
+ FAVORITES SECTION
912
+ ═══════════════════════════════════════════════════════════════════ */
913
+
914
+ .welcome-section--favorites {
915
+ margin-bottom: var(--sp-12);
916
+ }
917
+
918
+ /* Favorites List (compact rows) */
919
+ .favorites-list {
920
+ display: flex;
921
+ flex-direction: column;
922
+ gap: var(--sp-2);
923
+ }
924
+
925
+ .section-nav-hints {
926
+ display: inline-flex;
927
+ align-items: center;
928
+ gap: var(--sp-12);
929
+ }
930
+
931
+ .section-nav-hint {
932
+ display: none;
933
+ font-size: var(--font-size-xs);
934
+ color: var(--text-muted);
935
+ opacity: 0.7;
936
+ }
937
+
938
+ .section-nav-hint kbd {
939
+ display: inline-flex;
940
+ align-items: center;
941
+ justify-content: center;
942
+ width: 18px;
943
+ height: 18px;
944
+ font-size: 10px;
945
+ font-family: inherit;
946
+ color: var(--text-secondary);
947
+ background: var(--bg-tertiary);
948
+ border: 1px solid var(--border-color);
949
+ border-radius: var(--radius-sm);
950
+ }
951
+
952
+ .welcome-section--projects:has(.welcome-project-chip.selected) .section-nav-hint,
953
+ .welcome-section--favorites:has(.favorites-row.selected) .section-nav-hint {
954
+ display: inline;
955
+ }
956
+
957
+ .favorites-row {
958
+ display: flex;
959
+ align-items: center;
960
+ gap: var(--sp-8);
961
+ padding: var(--sp-8) var(--sp-12);
962
+ background: var(--bg-secondary);
963
+ border-radius: var(--radius-sm);
964
+ box-shadow: inset 3px 0 0 0 var(--project-color, transparent);
965
+ cursor: pointer;
966
+ transition: background 0.1s ease;
967
+ -webkit-user-select: none;
968
+ user-select: none;
969
+ }
970
+
971
+ .favorites-row:hover {
972
+ background: var(--bg-tertiary);
973
+ }
974
+
975
+ .favorites-row.selected {
976
+ background: var(--accent-muted, rgba(99, 102, 241, 0.08));
977
+ box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2),
978
+ inset 3px 0 0 0 var(--project-color, transparent);
979
+ }
980
+
981
+ .favorites-row.is-deleted {
982
+ opacity: 0.5;
983
+ }
984
+
985
+ .favorites-row-star {
986
+ color: #fbbf24;
987
+ font-size: var(--font-size-sm);
988
+ flex-shrink: 0;
989
+ cursor: pointer;
990
+ padding: var(--sp-2);
991
+ border-radius: var(--radius-xs);
992
+ transition: background 0.1s;
993
+ }
994
+
995
+ .favorites-row-star:hover {
996
+ background: rgba(251, 191, 36, 0.2);
997
+ }
998
+
999
+ .favorites-row-content {
1000
+ flex: 1;
1001
+ min-width: 0;
1002
+ display: flex;
1003
+ flex-direction: column;
1004
+ gap: 1px;
1005
+ }
1006
+
1007
+ .favorites-row-name {
1008
+ font-size: var(--font-size-base);
1009
+ font-weight: 500;
1010
+ color: var(--text-primary);
1011
+ white-space: nowrap;
1012
+ overflow: hidden;
1013
+ text-overflow: ellipsis;
1014
+ }
1015
+
1016
+ .favorites-row-desc {
1017
+ font-size: var(--font-size-xs);
1018
+ color: var(--text-muted);
1019
+ white-space: nowrap;
1020
+ overflow: hidden;
1021
+ text-overflow: ellipsis;
1022
+ }
1023
+
1024
+ .favorites-row-project {
1025
+ font-size: var(--font-size-xs);
1026
+ color: var(--text-tertiary);
1027
+ font-family: var(--font-mono);
1028
+ flex-shrink: 0;
1029
+ white-space: nowrap;
1030
+ }
1031
+
1032
+ .favorites-row-time {
1033
+ font-size: var(--font-size-xs);
1034
+ color: var(--text-tertiary);
1035
+ flex-shrink: 0;
1036
+ white-space: nowrap;
1037
+ }
1038
+
1039
+ /* Responsive: hide project on narrow screens */
1040
+ @media (max-width: 600px) {
1041
+ .favorites-row-project {
1042
+ display: none;
1043
+ }
1044
+
1045
+ .favorites-row-desc {
1046
+ max-width: 200px;
1047
+ }
1048
+ }
1049
+
1050
+ /* Show all favorites button */
1051
+ .welcome-btn--text {
1052
+ background: transparent;
1053
+ border: none;
1054
+ color: var(--accent);
1055
+ cursor: pointer;
1056
+ font-size: var(--font-size-base);
1057
+ padding: var(--sp-8);
1058
+ margin-top: var(--sp-8);
1059
+ width: 100%;
1060
+ text-align: center;
1061
+ }
1062
+
1063
+ .welcome-btn--text:hover {
1064
+ text-decoration: underline;
1065
+ }
1066
+
1067
+ /* Favorite Star Button (used in session cards) */
1068
+ .favorite-star {
1069
+ display: flex;
1070
+ align-items: center;
1071
+ justify-content: center;
1072
+ width: var(--layout-btn-sm);
1073
+ height: var(--layout-btn-sm);
1074
+ padding: 0;
1075
+ border: none;
1076
+ border-radius: var(--radius-sm);
1077
+ background: transparent;
1078
+ color: var(--text-muted);
1079
+ cursor: pointer;
1080
+ transition: all 0.15s ease;
1081
+ flex-shrink: 0;
1082
+ }
1083
+
1084
+ .favorite-star:hover {
1085
+ background: rgba(251, 191, 36, 0.15);
1086
+ color: #fbbf24;
1087
+ }
1088
+
1089
+ .favorite-star:active {
1090
+ transform: scale(0.9);
1091
+ }
1092
+
1093
+ .favorite-star.is-favorite {
1094
+ color: #fbbf24;
1095
+ }
1096
+
1097
+ .favorite-star.is-favorite:hover {
1098
+ background: rgba(251, 191, 36, 0.15);
1099
+ }
1100
+
1101
+ .favorite-star svg {
1102
+ width: 16px;
1103
+ height: 16px;
1104
+ }
1105
+
1106
+ /* Recent card with favorite indicator */
1107
+ .welcome-recent-card.is-favorite {
1108
+ border-color: rgba(251, 191, 36, 0.3);
1109
+ }
1110
+
1111
+ .welcome-recent-card.is-favorite:hover {
1112
+ border-color: #fbbf24;
1113
+ }
1114
+
1115
+ /* Session status indicators (open in tab, Claude running) */
1116
+ .session-status-badge {
1117
+ display: inline-flex;
1118
+ align-items: center;
1119
+ justify-content: center;
1120
+ font-size: 10px;
1121
+ line-height: 1;
1122
+ flex-shrink: 0;
1123
+ margin-right: var(--sp-4);
1124
+ }
1125
+
1126
+ .session-status-badge.open {
1127
+ color: var(--accent);
1128
+ }
1129
+
1130
+ .session-status-badge.running {
1131
+ color: #22c55e;
1132
+ animation: pulse-badge 1.5s ease-in-out infinite;
1133
+ }
1134
+
1135
+ @keyframes pulse-badge {
1136
+ 0%, 100% { opacity: 1; }
1137
+ 50% { opacity: 0.5; }
1138
+ }
1139
+
1140
+ /* Cards with open/running state - subtle left border accent */
1141
+ .welcome-recent-card.is-open,
1142
+ .session-family-root.is-open {
1143
+ border-left: 2px solid var(--accent);
1144
+ }
1145
+
1146
+ .welcome-recent-card.is-running,
1147
+ .session-family-root.is-running {
1148
+ border-left: 2px solid #22c55e;
1149
+ }
1150
+
1151
+
1152
+ /* ═══════════════════════════════════════════════════════════════════
1153
+ BACK TO SESSIONS FLOATING PILL
1154
+ Always visible at bottom-left, above input area
1155
+ iOS-style unified blue pill with subtle separator
1156
+ ═══════════════════════════════════════════════════════════════════ */
1157
+
1158
+ .back-to-sessions-pill {
1159
+ position: fixed;
1160
+ bottom: calc(var(--input-area-height, 80px) + 16px);
1161
+ left: max(16px, env(safe-area-inset-left, 0px));
1162
+ z-index: 100;
1163
+ display: flex;
1164
+ align-items: stretch;
1165
+ background: var(--accent);
1166
+ border-radius: var(--radius-lg);
1167
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.15);
1168
+ opacity: 0;
1169
+ transform: translateX(-20px);
1170
+ transition: opacity 0.2s ease, transform 0.2s ease;
1171
+ overflow: hidden;
1172
+ }
1173
+
1174
+ .back-to-sessions-pill.visible {
1175
+ opacity: 1;
1176
+ transform: translateX(0);
1177
+ }
1178
+
1179
+ .back-pill-btn {
1180
+ display: flex;
1181
+ align-items: center;
1182
+ gap: var(--sp-6);
1183
+ padding: var(--sp-10) var(--sp-14) var(--sp-10) var(--sp-14);
1184
+ border: none;
1185
+ background: transparent;
1186
+ color: white;
1187
+ font-size: var(--font-size-base);
1188
+ font-weight: 500;
1189
+ cursor: pointer;
1190
+ transition: background 0.15s ease;
1191
+ white-space: nowrap;
1192
+ }
1193
+
1194
+ .back-pill-btn:hover {
1195
+ background: rgba(255, 255, 255, 0.12);
1196
+ }
1197
+
1198
+ .back-pill-btn:active {
1199
+ background: rgba(255, 255, 255, 0.2);
1200
+ }
1201
+
1202
+ .back-pill-btn svg {
1203
+ width: 16px;
1204
+ height: 16px;
1205
+ flex-shrink: 0;
1206
+ }
1207
+
1208
+ /* Keyboard hint badge */
1209
+ .back-pill-key {
1210
+ display: inline-flex;
1211
+ align-items: center;
1212
+ justify-content: center;
1213
+ min-width: 22px;
1214
+ height: 20px;
1215
+ padding: 0 var(--sp-5);
1216
+ background: rgba(255, 255, 255, 0.2);
1217
+ border-radius: var(--radius-sm);
1218
+ font-size: var(--font-size-base);
1219
+ font-weight: 600;
1220
+ letter-spacing: 0;
1221
+ }
1222
+
1223
+ /* iOS-style separator line */
1224
+ .back-pill-dismiss {
1225
+ display: flex;
1226
+ align-items: center;
1227
+ justify-content: center;
1228
+ padding: var(--sp-10) var(--sp-14) var(--sp-10) var(--sp-12);
1229
+ border: none;
1230
+ border-left: 1px solid rgba(255, 255, 255, 0.3);
1231
+ background: transparent;
1232
+ color: rgba(255, 255, 255, 0.9);
1233
+ cursor: pointer;
1234
+ transition: background 0.15s ease;
1235
+ flex-shrink: 0;
1236
+ }
1237
+
1238
+ .back-pill-dismiss:hover {
1239
+ background: rgba(255, 255, 255, 0.12);
1240
+ color: white;
1241
+ }
1242
+
1243
+ .back-pill-dismiss:active {
1244
+ background: rgba(255, 255, 255, 0.2);
1245
+ }
1246
+
1247
+ .back-pill-dismiss svg {
1248
+ width: 12px;
1249
+ height: 12px;
1250
+ }
1251
+
1252
+ /* Swipe hint indicator (subtle left-edge glow when pill is visible) */
1253
+ .back-to-sessions-pill.visible::before {
1254
+ content: '';
1255
+ position: fixed;
1256
+ left: 0;
1257
+ top: 50%;
1258
+ transform: translateY(-50%);
1259
+ width: 3px;
1260
+ height: 60px;
1261
+ background: linear-gradient(
1262
+ to bottom,
1263
+ transparent,
1264
+ rgba(var(--accent-rgb), 0.3),
1265
+ transparent
1266
+ );
1267
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
1268
+ opacity: 0;
1269
+ animation: swipeHint 3s ease-in-out 2s;
1270
+ }
1271
+
1272
+ @keyframes swipeHint {
1273
+ 0%, 100% { opacity: 0; }
1274
+ 50% { opacity: 1; }
1275
+ }
1276
+
1277
+ /* Mobile: slightly larger touch targets */
1278
+ @media (max-width: 768px) {
1279
+ .back-to-sessions-pill {
1280
+ bottom: calc(var(--input-area-height, 100px) + 12px);
1281
+ }
1282
+
1283
+ .back-pill-btn {
1284
+ padding: var(--sp-12) var(--sp-16) var(--sp-12) var(--sp-16);
1285
+ font-size: var(--font-size-md);
1286
+ }
1287
+
1288
+ .back-pill-btn svg {
1289
+ width: 18px;
1290
+ height: 18px;
1291
+ }
1292
+
1293
+ .back-pill-dismiss {
1294
+ padding: var(--sp-12) var(--sp-16) var(--sp-12) var(--sp-14);
1295
+ }
1296
+
1297
+ .back-pill-dismiss svg {
1298
+ width: 14px;
1299
+ height: 14px;
1300
+ }
1301
+ }
1302
+
1303
+
1304
+ /* ═══════════════════════════════════════════════════════════════════
1305
+ SECTION HEADERS
1306
+ ═══════════════════════════════════════════════════════════════════ */
1307
+
1308
+ .welcome-section {
1309
+ margin-bottom: var(--sp-16);
1310
+ }
1311
+
1312
+ .welcome-section-header {
1313
+ display: flex;
1314
+ align-items: center;
1315
+ justify-content: space-between;
1316
+ margin-bottom: var(--sp-8);
1317
+ }
1318
+
1319
+ .welcome-section-header h3 {
1320
+ font-size: var(--font-size-base);
1321
+ font-weight: 600;
1322
+ color: var(--text-muted);
1323
+ text-transform: uppercase;
1324
+ letter-spacing: 0.5px;
1325
+ margin: 0;
1326
+ }
1327
+
1328
+ .welcome-btn-link {
1329
+ font-size: var(--font-size-base);
1330
+ color: var(--accent);
1331
+ background: none;
1332
+ border: none;
1333
+ cursor: pointer;
1334
+ padding: 0;
1335
+ }
1336
+
1337
+ .welcome-btn-link:hover {
1338
+ text-decoration: underline;
1339
+ }
1340
+
1341
+
1342
+ /* ═══════════════════════════════════════════════════════════════════
1343
+ SESSION CARDS GRID
1344
+ ═══════════════════════════════════════════════════════════════════ */
1345
+
1346
+ .welcome-sessions-grid {
1347
+ display: flex;
1348
+ flex-direction: column;
1349
+ gap: var(--sp-12);
1350
+ }
1351
+
1352
+ .welcome-sessions-grid--compact {
1353
+ gap: var(--sp-8);
1354
+ }
1355
+
1356
+
1357
+ /* ═══════════════════════════════════════════════════════════════════
1358
+ SESSION CARD
1359
+ ═══════════════════════════════════════════════════════════════════ */
1360
+
1361
+ .welcome-session-card {
1362
+ background: var(--bg-secondary);
1363
+ border: 1px solid var(--border-secondary);
1364
+ border-left: 3px solid var(--project-color, var(--border-secondary));
1365
+ border-radius: var(--radius-lg);
1366
+ padding: var(--sp-16);
1367
+ cursor: pointer;
1368
+ transition: all 0.15s ease;
1369
+ /* Prevent iOS native text selection during long press */
1370
+ -webkit-user-select: none;
1371
+ user-select: none;
1372
+ -webkit-touch-callout: none;
1373
+ }
1374
+
1375
+ .welcome-session-card:hover {
1376
+ background: var(--bg-tertiary);
1377
+ border-color: var(--accent);
1378
+ border-left-color: var(--project-color, var(--accent));
1379
+ transform: translateY(-1px);
1380
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
1381
+ }
1382
+
1383
+ /* Compact card variant */
1384
+ .welcome-session-card--compact {
1385
+ padding: var(--sp-12);
1386
+ }
1387
+
1388
+ .welcome-session-card--compact .welcome-session-header {
1389
+ margin-bottom: var(--sp-4);
1390
+ }
1391
+
1392
+ .welcome-session-card--compact .welcome-session-name {
1393
+ font-size: var(--font-size-md);
1394
+ margin-bottom: var(--sp-4);
1395
+ }
1396
+
1397
+ .welcome-session-card--compact .welcome-session-summary {
1398
+ font-size: var(--font-size-base);
1399
+ margin-bottom: var(--sp-8);
1400
+ -webkit-line-clamp: 1;
1401
+ }
1402
+
1403
+ .welcome-session-card--compact .welcome-session-tags {
1404
+ margin-bottom: 0;
1405
+ }
1406
+
1407
+
1408
+ /* Card Header */
1409
+ .welcome-session-header {
1410
+ display: flex;
1411
+ align-items: flex-start;
1412
+ gap: var(--sp-12);
1413
+ margin-bottom: var(--sp-8);
1414
+ }
1415
+
1416
+ .welcome-session-icon {
1417
+ flex-shrink: 0;
1418
+ width: 32px;
1419
+ height: 32px;
1420
+ display: flex;
1421
+ align-items: center;
1422
+ justify-content: center;
1423
+ background: var(--accent-muted);
1424
+ border-radius: var(--radius-md);
1425
+ }
1426
+
1427
+ .welcome-session-icon svg {
1428
+ width: 18px;
1429
+ height: 18px;
1430
+ color: var(--accent);
1431
+ }
1432
+
1433
+ .welcome-session-title-row {
1434
+ flex: 1;
1435
+ min-width: 0;
1436
+ }
1437
+
1438
+ .welcome-session-name {
1439
+ font-size: var(--font-size-content);
1440
+ font-weight: 600;
1441
+ color: var(--text-primary);
1442
+ display: block;
1443
+ white-space: nowrap;
1444
+ overflow: hidden;
1445
+ text-overflow: ellipsis;
1446
+ }
1447
+
1448
+ .welcome-session-project {
1449
+ font-size: var(--font-size-sm);
1450
+ color: var(--text-muted);
1451
+ font-family: var(--font-mono);
1452
+ }
1453
+
1454
+ .welcome-session-time {
1455
+ font-size: var(--font-size-sm);
1456
+ color: var(--text-muted);
1457
+ white-space: nowrap;
1458
+ }
1459
+
1460
+
1461
+ /* Summary */
1462
+ .welcome-session-summary {
1463
+ font-size: var(--font-size-md);
1464
+ color: var(--text-secondary);
1465
+ line-height: 1.4;
1466
+ margin-bottom: var(--sp-10);
1467
+ display: -webkit-box;
1468
+ -webkit-line-clamp: 2;
1469
+ -webkit-box-orient: vertical;
1470
+ overflow: hidden;
1471
+ }
1472
+
1473
+
1474
+ /* Tags */
1475
+ .welcome-session-tags {
1476
+ display: flex;
1477
+ flex-wrap: wrap;
1478
+ gap: var(--sp-6);
1479
+ margin-bottom: var(--sp-10);
1480
+ }
1481
+
1482
+ .welcome-tag {
1483
+ font-size: var(--font-size-xs);
1484
+ font-weight: 500;
1485
+ padding: var(--sp-2) var(--sp-8);
1486
+ border-radius: var(--radius-lg);
1487
+ background: var(--accent-muted);
1488
+ color: var(--accent);
1489
+ }
1490
+
1491
+ /* Tag colors by type */
1492
+ .welcome-tag:nth-child(6n+1) { background: rgba(139, 92, 246, 0.15); color: #a78bfa; }
1493
+ .welcome-tag:nth-child(6n+2) { background: rgba(16, 185, 129, 0.15); color: #34d399; }
1494
+ .welcome-tag:nth-child(6n+3) { background: rgba(245, 158, 11, 0.15); color: #fbbf24; }
1495
+ .welcome-tag:nth-child(6n+4) { background: rgba(239, 68, 68, 0.15); color: #f87171; }
1496
+ .welcome-tag:nth-child(6n+5) { background: rgba(59, 130, 246, 0.15); color: #60a5fa; }
1497
+ .welcome-tag:nth-child(6n+6) { background: rgba(236, 72, 153, 0.15); color: #f472b6; }
1498
+
1499
+
1500
+ /* Meta info row */
1501
+ .welcome-session-meta {
1502
+ display: flex;
1503
+ gap: var(--sp-16);
1504
+ font-size: var(--font-size-sm);
1505
+ color: var(--text-muted);
1506
+ margin-bottom: var(--sp-8);
1507
+ }
1508
+
1509
+ .welcome-session-meta .meta-item {
1510
+ display: flex;
1511
+ align-items: center;
1512
+ gap: var(--sp-4);
1513
+ }
1514
+
1515
+ .welcome-session-meta .meta-item svg {
1516
+ width: 14px;
1517
+ height: 14px;
1518
+ }
1519
+
1520
+ .welcome-session-meta .meta-cost {
1521
+ color: var(--success);
1522
+ }
1523
+
1524
+
1525
+ /* Tools & Journey */
1526
+ .welcome-session-tools,
1527
+ .welcome-session-journey {
1528
+ font-size: var(--font-size-sm);
1529
+ color: var(--text-muted);
1530
+ margin-bottom: var(--sp-6);
1531
+ white-space: nowrap;
1532
+ overflow: hidden;
1533
+ text-overflow: ellipsis;
1534
+ }
1535
+
1536
+ .welcome-session-tools .tools-label,
1537
+ .welcome-session-journey .journey-label {
1538
+ color: var(--text-secondary);
1539
+ font-weight: 500;
1540
+ }
1541
+
1542
+
1543
+ /* Match reasons (in search results) */
1544
+ .welcome-session-match-reasons {
1545
+ display: flex;
1546
+ flex-wrap: wrap;
1547
+ gap: var(--sp-4);
1548
+ margin-top: var(--sp-8);
1549
+ padding-top: var(--sp-8);
1550
+ border-top: 1px solid var(--border-secondary);
1551
+ }
1552
+
1553
+ .match-reason {
1554
+ font-size: var(--font-size-xs);
1555
+ color: var(--success);
1556
+ background: rgba(16, 185, 129, 0.1);
1557
+ padding: var(--sp-2) var(--sp-6);
1558
+ border-radius: var(--radius-sm);
1559
+ }
1560
+
1561
+
1562
+ /* Card Actions */
1563
+ .welcome-session-actions {
1564
+ display: flex;
1565
+ gap: var(--sp-8);
1566
+ margin-top: var(--sp-12);
1567
+ padding-top: var(--sp-12);
1568
+ border-top: 1px solid var(--border-secondary);
1569
+ }
1570
+
1571
+
1572
+ /* ═══════════════════════════════════════════════════════════════════
1573
+ BUTTONS
1574
+ ═══════════════════════════════════════════════════════════════════ */
1575
+
1576
+ .welcome-btn {
1577
+ padding: var(--sp-8) var(--sp-16);
1578
+ font-size: var(--font-size-base);
1579
+ font-weight: 500;
1580
+ border-radius: var(--radius-md);
1581
+ border: none;
1582
+ cursor: pointer;
1583
+ transition: all 0.15s ease;
1584
+ }
1585
+
1586
+ .welcome-btn--primary {
1587
+ background: var(--accent);
1588
+ color: var(--bg-primary);
1589
+ }
1590
+
1591
+ .welcome-btn--primary:hover {
1592
+ opacity: 0.9;
1593
+ }
1594
+
1595
+ .welcome-btn--secondary {
1596
+ background: var(--bg-tertiary);
1597
+ color: var(--text-secondary);
1598
+ }
1599
+
1600
+ .welcome-btn--secondary:hover {
1601
+ background: var(--bg-hover);
1602
+ color: var(--text-primary);
1603
+ }
1604
+
1605
+ .welcome-btn-icon {
1606
+ width: var(--layout-btn-sm);
1607
+ height: var(--layout-btn-sm);
1608
+ padding: 0;
1609
+ display: flex;
1610
+ align-items: center;
1611
+ justify-content: center;
1612
+ background: transparent;
1613
+ border: none;
1614
+ border-radius: var(--radius-sm);
1615
+ cursor: pointer;
1616
+ color: var(--text-muted);
1617
+ }
1618
+
1619
+ .welcome-btn-icon:hover {
1620
+ background: var(--bg-tertiary);
1621
+ color: var(--text-primary);
1622
+ }
1623
+
1624
+ .welcome-btn-icon svg {
1625
+ width: 16px;
1626
+ height: 16px;
1627
+ }
1628
+
1629
+
1630
+ /* ═══════════════════════════════════════════════════════════════════
1631
+ SEARCH RESULTS
1632
+ ═══════════════════════════════════════════════════════════════════ */
1633
+
1634
+ .welcome-search-results {
1635
+ margin-bottom: var(--sp-24);
1636
+ }
1637
+
1638
+ .welcome-search-header {
1639
+ display: flex;
1640
+ align-items: center;
1641
+ gap: var(--sp-12);
1642
+ margin-bottom: var(--sp-16);
1643
+ padding-bottom: var(--sp-12);
1644
+ border-bottom: 1px solid var(--border-secondary);
1645
+ }
1646
+
1647
+ .welcome-search-header .search-label {
1648
+ font-size: var(--font-size-base);
1649
+ font-weight: 600;
1650
+ color: var(--text-primary);
1651
+ }
1652
+
1653
+ .welcome-search-header .search-query {
1654
+ font-size: var(--font-size-base);
1655
+ color: var(--accent);
1656
+ font-style: italic;
1657
+ }
1658
+
1659
+ .welcome-search-header .search-count {
1660
+ font-size: var(--font-size-sm);
1661
+ color: var(--text-muted);
1662
+ margin-left: auto;
1663
+ }
1664
+
1665
+ .welcome-search-filters {
1666
+ display: flex;
1667
+ flex-wrap: wrap;
1668
+ gap: var(--sp-6);
1669
+ margin-bottom: var(--sp-12);
1670
+ }
1671
+
1672
+ .filter-chip {
1673
+ font-size: var(--font-size-xs);
1674
+ padding: var(--sp-3) var(--sp-8);
1675
+ border-radius: var(--radius-lg);
1676
+ background: var(--bg-tertiary);
1677
+ color: var(--text-secondary);
1678
+ }
1679
+
1680
+ .filter-chip.filter-tag {
1681
+ background: rgba(139, 92, 246, 0.15);
1682
+ color: #a78bfa;
1683
+ }
1684
+
1685
+ .filter-chip.filter-time {
1686
+ background: rgba(59, 130, 246, 0.15);
1687
+ color: var(--accent-blue);
1688
+ }
1689
+
1690
+ .filter-chip.filter-file {
1691
+ background: rgba(16, 185, 129, 0.15);
1692
+ color: #34d399;
1693
+ font-family: var(--font-mono);
1694
+ }
1695
+
1696
+
1697
+ /* No results */
1698
+ .welcome-no-results {
1699
+ text-align: center;
1700
+ padding: var(--sp-24) var(--sp-16);
1701
+ color: var(--text-secondary);
1702
+ }
1703
+
1704
+ .welcome-no-results ul {
1705
+ list-style: none;
1706
+ padding: 0;
1707
+ margin: var(--sp-16) 0;
1708
+ }
1709
+
1710
+ .welcome-no-results li {
1711
+ margin: var(--sp-8) 0;
1712
+ }
1713
+
1714
+ .welcome-no-results code {
1715
+ background: var(--bg-tertiary);
1716
+ padding: var(--sp-2) var(--sp-6);
1717
+ border-radius: var(--radius-sm);
1718
+ font-family: var(--font-mono);
1719
+ font-size: var(--font-size-sm);
1720
+ }
1721
+
1722
+ /* Search results actions (no results state) */
1723
+ .welcome-search-actions {
1724
+ display: flex;
1725
+ flex-direction: column;
1726
+ gap: var(--sp-8);
1727
+ align-items: center;
1728
+ margin-top: var(--sp-16);
1729
+ }
1730
+
1731
+ .welcome-search-actions .welcome-btn {
1732
+ display: flex;
1733
+ align-items: center;
1734
+ justify-content: center;
1735
+ gap: var(--sp-6);
1736
+ min-width: 180px;
1737
+ }
1738
+
1739
+ .welcome-search-actions .welcome-btn svg {
1740
+ width: 16px;
1741
+ height: 16px;
1742
+ }
1743
+
1744
+ /* New session button in search header */
1745
+ .welcome-btn-new-session {
1746
+ color: var(--accent);
1747
+ }
1748
+
1749
+ .welcome-btn-new-session:hover {
1750
+ background: var(--accent);
1751
+ color: white;
1752
+ }
1753
+
1754
+
1755
+ /* Task prompt */
1756
+ .welcome-task-prompt {
1757
+ text-align: center;
1758
+ margin-top: var(--sp-20);
1759
+ padding: var(--sp-16);
1760
+ background: var(--bg-tertiary);
1761
+ border-radius: var(--radius-lg);
1762
+ }
1763
+
1764
+ .welcome-task-prompt p {
1765
+ margin: 0 0 var(--sp-12) 0;
1766
+ color: var(--text-secondary);
1767
+ }
1768
+
1769
+
1770
+ /* ═══════════════════════════════════════════════════════════════════
1771
+ PROJECT PICKER
1772
+ ═══════════════════════════════════════════════════════════════════ */
1773
+
1774
+ .welcome-project-picker {
1775
+ margin-bottom: var(--sp-24);
1776
+ position: relative;
1777
+ }
1778
+
1779
+ .welcome-project-picker-toggle {
1780
+ display: flex;
1781
+ align-items: center;
1782
+ gap: var(--sp-10);
1783
+ width: 100%;
1784
+ padding: var(--sp-12) var(--sp-16);
1785
+ background: var(--bg-secondary);
1786
+ border: 1px solid var(--border-secondary);
1787
+ border-radius: var(--radius-md);
1788
+ cursor: pointer;
1789
+ color: var(--text-secondary);
1790
+ font-size: var(--font-size-md);
1791
+ transition: all 0.15s ease;
1792
+ /* Prevent iOS native text selection */
1793
+ -webkit-user-select: none;
1794
+ user-select: none;
1795
+ -webkit-touch-callout: none;
1796
+ }
1797
+
1798
+ .welcome-project-picker-toggle:hover {
1799
+ background: var(--bg-tertiary);
1800
+ border-color: var(--accent);
1801
+ }
1802
+
1803
+ .welcome-project-picker-toggle svg {
1804
+ width: 18px;
1805
+ height: 18px;
1806
+ color: var(--text-muted);
1807
+ }
1808
+
1809
+ .welcome-project-picker-toggle .chevron {
1810
+ margin-left: auto;
1811
+ transition: transform 0.2s ease;
1812
+ }
1813
+
1814
+ .welcome-project-picker.is-open .chevron {
1815
+ transform: rotate(180deg);
1816
+ }
1817
+
1818
+ .welcome-project-list {
1819
+ display: none;
1820
+ position: absolute;
1821
+ top: 100%;
1822
+ left: 0;
1823
+ right: 0;
1824
+ z-index: 10;
1825
+ margin-top: 4px;
1826
+ background: var(--bg-secondary);
1827
+ border: 1px solid var(--border-secondary);
1828
+ border-radius: var(--radius-md);
1829
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1830
+ max-height: 240px;
1831
+ overflow-y: auto;
1832
+ }
1833
+
1834
+ .welcome-project-picker.is-open .welcome-project-list {
1835
+ display: block;
1836
+ }
1837
+
1838
+ .welcome-project-item {
1839
+ display: flex;
1840
+ align-items: center;
1841
+ justify-content: space-between;
1842
+ gap: var(--sp-8);
1843
+ padding: var(--sp-10) var(--sp-16);
1844
+ cursor: pointer;
1845
+ transition: background 0.1s ease;
1846
+ /* Prevent iOS native text selection */
1847
+ -webkit-user-select: none;
1848
+ user-select: none;
1849
+ -webkit-touch-callout: none;
1850
+ }
1851
+
1852
+ .welcome-project-item:hover {
1853
+ background: var(--bg-tertiary);
1854
+ }
1855
+
1856
+ .welcome-project-item .project-name {
1857
+ flex: 1;
1858
+ font-size: var(--font-size-md);
1859
+ color: var(--text-primary);
1860
+ }
1861
+
1862
+ .welcome-project-item .project-sessions {
1863
+ font-size: var(--font-size-sm);
1864
+ color: var(--text-muted);
1865
+ }
1866
+
1867
+ .welcome-project-browse {
1868
+ border-top: 1px solid var(--border-secondary);
1869
+ color: var(--accent);
1870
+ gap: var(--sp-8);
1871
+ }
1872
+
1873
+ .welcome-project-browse svg {
1874
+ width: 16px;
1875
+ height: 16px;
1876
+ }
1877
+
1878
+
1879
+ /* ═══════════════════════════════════════════════════════════════════
1880
+ SUGGESTIONS
1881
+ ═══════════════════════════════════════════════════════════════════ */
1882
+
1883
+ .welcome-suggestions {
1884
+ display: flex;
1885
+ align-items: center;
1886
+ flex-wrap: wrap;
1887
+ gap: var(--sp-8);
1888
+ margin-top: var(--sp-16);
1889
+ padding-top: var(--sp-16);
1890
+ border-top: 1px solid var(--border-secondary);
1891
+ }
1892
+
1893
+ .suggestions-label {
1894
+ font-size: var(--font-size-sm);
1895
+ color: var(--text-muted);
1896
+ }
1897
+
1898
+ .suggestion-chip {
1899
+ font-size: var(--font-size-sm);
1900
+ padding: var(--sp-4) var(--sp-10);
1901
+ background: var(--bg-tertiary);
1902
+ border: 1px solid var(--border-secondary);
1903
+ border-radius: var(--radius-lg);
1904
+ color: var(--text-secondary);
1905
+ cursor: pointer;
1906
+ transition: all 0.15s ease;
1907
+ }
1908
+
1909
+ .suggestion-chip:hover {
1910
+ background: var(--bg-hover);
1911
+ border-color: var(--accent);
1912
+ color: var(--accent);
1913
+ }
1914
+
1915
+
1916
+ /* ═══════════════════════════════════════════════════════════════════
1917
+ HINTS
1918
+ ═══════════════════════════════════════════════════════════════════ */
1919
+
1920
+ .welcome-hints {
1921
+ display: flex;
1922
+ justify-content: center;
1923
+ gap: var(--sp-16);
1924
+ margin-top: var(--sp-12);
1925
+ padding-top: var(--sp-12);
1926
+ border-top: 1px solid var(--border-secondary);
1927
+ }
1928
+
1929
+ .welcome-hint {
1930
+ display: flex;
1931
+ align-items: center;
1932
+ gap: var(--sp-4);
1933
+ font-size: var(--font-size-xs);
1934
+ color: var(--text-tertiary);
1935
+ }
1936
+
1937
+ .welcome-hint kbd {
1938
+ background: var(--bg-tertiary);
1939
+ padding: var(--sp-2) var(--sp-6);
1940
+ border-radius: var(--radius-sm);
1941
+ font-family: var(--font-mono);
1942
+ font-size: 10px;
1943
+ color: var(--text-secondary);
1944
+ }
1945
+
1946
+
1947
+ /* ═══════════════════════════════════════════════════════════════════
1948
+ LOADING & EMPTY STATES
1949
+ ═══════════════════════════════════════════════════════════════════ */
1950
+
1951
+ .welcome-loading {
1952
+ display: flex;
1953
+ align-items: center;
1954
+ justify-content: center;
1955
+ gap: var(--sp-12);
1956
+ padding: var(--sp-32);
1957
+ color: var(--text-muted);
1958
+ }
1959
+
1960
+ .loading-spinner {
1961
+ width: 20px;
1962
+ height: 20px;
1963
+ border: 2px solid var(--border-secondary);
1964
+ border-top-color: var(--accent);
1965
+ border-radius: 50%;
1966
+ animation: spin 0.8s linear infinite;
1967
+ }
1968
+
1969
+ @keyframes spin {
1970
+ to { transform: rotate(360deg); }
1971
+ }
1972
+
1973
+ .welcome-empty {
1974
+ text-align: center;
1975
+ padding: var(--sp-32);
1976
+ color: var(--text-muted);
1977
+ }
1978
+
1979
+ .welcome-no-results {
1980
+ text-align: center;
1981
+ padding: 30px var(--sp-20);
1982
+ color: var(--text-muted);
1983
+ }
1984
+
1985
+ .welcome-no-results p {
1986
+ margin: 0;
1987
+ }
1988
+
1989
+ .welcome-no-results strong {
1990
+ color: var(--text-secondary);
1991
+ font-weight: 500;
1992
+ }
1993
+
1994
+
1995
+ /* ═══════════════════════════════════════════════════════════════════
1996
+ TASK MODE (Smart Session Routing)
1997
+ ═══════════════════════════════════════════════════════════════════ */
1998
+
1999
+ .welcome-task-mode {
2000
+ max-width: 600px;
2001
+ margin: 0 auto;
2002
+ }
2003
+
2004
+ .welcome-task-header {
2005
+ display: flex;
2006
+ align-items: flex-start;
2007
+ gap: var(--sp-12);
2008
+ padding: var(--sp-16);
2009
+ background: var(--bg-secondary);
2010
+ border-radius: var(--radius-lg);
2011
+ margin-bottom: var(--sp-16);
2012
+ }
2013
+
2014
+ .task-icon {
2015
+ flex-shrink: 0;
2016
+ width: 40px;
2017
+ height: 40px;
2018
+ background: var(--accent);
2019
+ border-radius: var(--radius-lg);
2020
+ display: flex;
2021
+ align-items: center;
2022
+ justify-content: center;
2023
+ }
2024
+
2025
+ .task-icon svg {
2026
+ width: 22px;
2027
+ height: 22px;
2028
+ stroke: white;
2029
+ }
2030
+
2031
+ .task-info {
2032
+ flex: 1;
2033
+ min-width: 0;
2034
+ }
2035
+
2036
+ .task-label {
2037
+ font-size: var(--font-size-md);
2038
+ font-weight: 600;
2039
+ color: var(--text-primary);
2040
+ margin-bottom: var(--sp-4);
2041
+ }
2042
+
2043
+ .task-preview {
2044
+ font-size: var(--font-size-base);
2045
+ color: var(--text-secondary);
2046
+ font-style: italic;
2047
+ word-break: break-word;
2048
+ }
2049
+
2050
+ .welcome-task-hint {
2051
+ font-size: var(--font-size-base);
2052
+ color: var(--text-muted);
2053
+ margin-bottom: var(--sp-12);
2054
+ padding-left: var(--sp-4);
2055
+ }
2056
+
2057
+ .welcome-task-no-matches {
2058
+ padding: var(--sp-24);
2059
+ text-align: center;
2060
+ background: var(--bg-secondary);
2061
+ border-radius: var(--radius-md);
2062
+ margin-bottom: var(--sp-16);
2063
+ }
2064
+
2065
+ .welcome-task-no-matches p {
2066
+ margin: 0;
2067
+ color: var(--text-muted);
2068
+ font-size: var(--font-size-md);
2069
+ }
2070
+
2071
+ .welcome-task-actions {
2072
+ display: flex;
2073
+ gap: var(--sp-12);
2074
+ margin-top: var(--sp-16);
2075
+ padding-top: var(--sp-16);
2076
+ border-top: 1px solid var(--border);
2077
+ }
2078
+
2079
+ .welcome-btn--start-fresh {
2080
+ flex: 1;
2081
+ display: flex;
2082
+ align-items: center;
2083
+ justify-content: center;
2084
+ gap: var(--sp-8);
2085
+ }
2086
+
2087
+ .welcome-btn--start-fresh svg {
2088
+ width: 18px;
2089
+ height: 18px;
2090
+ }
2091
+
2092
+ /* Task mode session cards - more compact */
2093
+ .welcome-session-card--task {
2094
+ padding: var(--sp-12);
2095
+ }
2096
+
2097
+ .welcome-session-card--task .welcome-session-summary {
2098
+ -webkit-line-clamp: 2;
2099
+ }
2100
+
2101
+ /* Task card action buttons row */
2102
+ .welcome-task-card-actions {
2103
+ display: flex;
2104
+ gap: var(--sp-8);
2105
+ margin-top: var(--sp-10);
2106
+ padding-top: var(--sp-10);
2107
+ border-top: 1px solid var(--border-secondary);
2108
+ }
2109
+
2110
+ .welcome-task-card-actions .welcome-btn {
2111
+ flex: 1;
2112
+ padding: var(--sp-6) var(--sp-12);
2113
+ font-size: var(--font-size-sm);
2114
+ }
2115
+
2116
+ /* Continue button in task mode */
2117
+ .welcome-btn--continue {
2118
+ background: var(--accent);
2119
+ color: var(--bg-primary);
2120
+ }
2121
+
2122
+ .welcome-btn--continue:hover {
2123
+ opacity: 0.9;
2124
+ }
2125
+
2126
+ /* Fork button in task mode */
2127
+ .welcome-btn--fork {
2128
+ background: rgba(139, 92, 246, 0.15);
2129
+ color: #a78bfa;
2130
+ border: 1px solid rgba(139, 92, 246, 0.3);
2131
+ }
2132
+
2133
+ .welcome-btn--fork:hover {
2134
+ background: rgba(139, 92, 246, 0.25);
2135
+ border-color: rgba(139, 92, 246, 0.5);
2136
+ }
2137
+
2138
+ /* Match reasons in task mode */
2139
+ .welcome-session-match-reasons {
2140
+ display: flex;
2141
+ flex-wrap: wrap;
2142
+ gap: var(--sp-6);
2143
+ margin-top: var(--sp-8);
2144
+ }
2145
+
2146
+ .match-reason {
2147
+ font-size: var(--font-size-xs);
2148
+ color: var(--green);
2149
+ background: rgba(76, 175, 80, 0.1);
2150
+ padding: var(--sp-2) var(--sp-8);
2151
+ border-radius: var(--radius-sm);
2152
+ }
2153
+
2154
+
2155
+ /* ═══════════════════════════════════════════════════════════════════
2156
+ TASK MODE - GROUPED VIEW
2157
+ ═══════════════════════════════════════════════════════════════════ */
2158
+
2159
+ /* Summary stats */
2160
+ .task-summary {
2161
+ display: flex;
2162
+ gap: var(--sp-16);
2163
+ padding: var(--sp-8) 0;
2164
+ margin-bottom: var(--sp-16);
2165
+ border-bottom: 1px solid var(--border-secondary);
2166
+ }
2167
+
2168
+ .task-summary-stat {
2169
+ display: flex;
2170
+ align-items: center;
2171
+ gap: var(--sp-6);
2172
+ font-size: var(--font-size-sm);
2173
+ color: var(--text-secondary);
2174
+ }
2175
+
2176
+ .task-summary-stat svg {
2177
+ width: 14px;
2178
+ height: 14px;
2179
+ opacity: 0.6;
2180
+ }
2181
+
2182
+ /* Section headers */
2183
+ .task-section {
2184
+ margin-bottom: var(--sp-20);
2185
+ }
2186
+
2187
+ .task-section-header {
2188
+ display: flex;
2189
+ align-items: center;
2190
+ justify-content: space-between;
2191
+ margin-bottom: var(--sp-10);
2192
+ padding-bottom: var(--sp-6);
2193
+ border-bottom: 1px solid var(--border-secondary);
2194
+ }
2195
+
2196
+ .task-section-title {
2197
+ font-size: var(--font-size-sm);
2198
+ font-weight: 600;
2199
+ color: var(--text-secondary);
2200
+ text-transform: uppercase;
2201
+ letter-spacing: 0.5px;
2202
+ }
2203
+
2204
+ .task-section-count {
2205
+ font-size: var(--font-size-xs);
2206
+ color: var(--text-tertiary);
2207
+ }
2208
+
2209
+ /* Project groups */
2210
+ .task-project-groups {
2211
+ display: flex;
2212
+ flex-direction: column;
2213
+ gap: var(--sp-8);
2214
+ }
2215
+
2216
+ .task-project-group {
2217
+ background: var(--bg-secondary);
2218
+ border-radius: var(--radius-md);
2219
+ overflow: hidden;
2220
+ }
2221
+
2222
+ .task-project-header {
2223
+ display: flex;
2224
+ align-items: center;
2225
+ gap: var(--sp-8);
2226
+ padding: var(--sp-10) var(--sp-12);
2227
+ cursor: pointer;
2228
+ transition: background 0.15s;
2229
+ /* Prevent iOS native text selection during long press */
2230
+ -webkit-user-select: none;
2231
+ user-select: none;
2232
+ -webkit-touch-callout: none;
2233
+ }
2234
+
2235
+ .task-project-header:hover {
2236
+ background: var(--bg-tertiary);
2237
+ }
2238
+
2239
+ /* Start/play button for new session */
2240
+ .task-project-start {
2241
+ display: flex;
2242
+ align-items: center;
2243
+ justify-content: center;
2244
+ width: var(--layout-btn-md);
2245
+ height: var(--layout-btn-md);
2246
+ margin-left: auto;
2247
+ padding: 0;
2248
+ border: none;
2249
+ border-radius: var(--radius-sm);
2250
+ background: transparent;
2251
+ color: var(--text-muted);
2252
+ cursor: pointer;
2253
+ transition: all 0.15s ease;
2254
+ flex-shrink: 0;
2255
+ opacity: 0.5;
2256
+ }
2257
+
2258
+ .task-project-start:hover {
2259
+ background: var(--accent);
2260
+ color: white;
2261
+ opacity: 1;
2262
+ }
2263
+
2264
+ .task-project-start:active {
2265
+ transform: scale(0.9);
2266
+ }
2267
+
2268
+ .task-project-start svg {
2269
+ width: 14px;
2270
+ height: 14px;
2271
+ }
2272
+
2273
+ .task-project-chevron {
2274
+ width: 16px;
2275
+ height: 16px;
2276
+ color: var(--text-tertiary);
2277
+ transition: transform 0.2s;
2278
+ flex-shrink: 0;
2279
+ }
2280
+
2281
+ .task-project-group.is-expanded .task-project-chevron {
2282
+ transform: rotate(90deg);
2283
+ }
2284
+
2285
+ .task-project-name {
2286
+ font-size: var(--font-size-base);
2287
+ font-weight: 500;
2288
+ color: var(--text-primary);
2289
+ white-space: nowrap;
2290
+ overflow: hidden;
2291
+ text-overflow: ellipsis;
2292
+ transition: color 0.15s ease;
2293
+ }
2294
+
2295
+ .task-project-count {
2296
+ font-size: var(--font-size-sm);
2297
+ color: var(--text-tertiary);
2298
+ flex-shrink: 0;
2299
+ }
2300
+
2301
+ .task-project-sessions {
2302
+ display: none;
2303
+ padding: 0 var(--sp-12) var(--sp-12);
2304
+ }
2305
+
2306
+ .task-project-group.is-expanded .task-project-sessions {
2307
+ display: block;
2308
+ }
2309
+
2310
+ /* Time period labels */
2311
+ .task-period-section {
2312
+ margin-bottom: var(--sp-8);
2313
+ }
2314
+
2315
+ .task-period-section:last-child {
2316
+ margin-bottom: 0;
2317
+ }
2318
+
2319
+ .task-period-label {
2320
+ font-size: 10px;
2321
+ font-weight: 600;
2322
+ color: var(--text-tertiary);
2323
+ text-transform: uppercase;
2324
+ letter-spacing: 0.5px;
2325
+ padding: var(--sp-4) 0 var(--sp-6);
2326
+ margin-top: var(--sp-4);
2327
+ }
2328
+
2329
+ .task-period-section:first-child .task-period-label {
2330
+ margin-top: 0;
2331
+ }
2332
+
2333
+ /* Compact session rows */
2334
+ .task-session-row {
2335
+ display: flex;
2336
+ flex-direction: column;
2337
+ gap: var(--sp-4);
2338
+ padding: var(--sp-8) var(--sp-10);
2339
+ background: var(--bg-primary);
2340
+ border-radius: var(--radius-md);
2341
+ margin-bottom: var(--sp-4);
2342
+ cursor: pointer;
2343
+ transition: background 0.15s;
2344
+ /* Prevent iOS native text selection during long press */
2345
+ -webkit-user-select: none;
2346
+ user-select: none;
2347
+ -webkit-touch-callout: none;
2348
+ }
2349
+
2350
+ .task-session-row:hover {
2351
+ background: var(--bg-tertiary);
2352
+ }
2353
+
2354
+ .task-session-row:last-child {
2355
+ margin-bottom: 0;
2356
+ }
2357
+
2358
+ .task-session-info {
2359
+ display: flex;
2360
+ align-items: center;
2361
+ justify-content: space-between;
2362
+ gap: var(--sp-8);
2363
+ }
2364
+
2365
+ .task-session-name {
2366
+ font-size: var(--font-size-base);
2367
+ color: var(--text-primary);
2368
+ white-space: nowrap;
2369
+ overflow: hidden;
2370
+ text-overflow: ellipsis;
2371
+ flex: 1;
2372
+ }
2373
+
2374
+ .task-session-time {
2375
+ font-size: var(--font-size-xs);
2376
+ color: var(--text-tertiary);
2377
+ flex-shrink: 0;
2378
+ }
2379
+
2380
+ .task-session-tags {
2381
+ display: flex;
2382
+ gap: var(--sp-4);
2383
+ flex-wrap: wrap;
2384
+ }
2385
+
2386
+ .welcome-tag--small {
2387
+ font-size: 9px;
2388
+ padding: 1px var(--sp-5);
2389
+ }
2390
+
2391
+ .task-session-actions {
2392
+ display: flex;
2393
+ gap: var(--sp-4);
2394
+ margin-left: auto;
2395
+ flex-shrink: 0;
2396
+ }
2397
+
2398
+ .task-action-btn {
2399
+ width: var(--layout-btn-sm);
2400
+ height: var(--layout-btn-sm);
2401
+ border-radius: var(--radius-md);
2402
+ border: none;
2403
+ background: transparent;
2404
+ cursor: pointer;
2405
+ display: flex;
2406
+ align-items: center;
2407
+ justify-content: center;
2408
+ transition: all 0.15s;
2409
+ }
2410
+
2411
+ .task-action-btn svg {
2412
+ width: 14px;
2413
+ height: 14px;
2414
+ }
2415
+
2416
+ .task-action-continue {
2417
+ color: var(--accent);
2418
+ }
2419
+
2420
+ .task-action-continue:hover {
2421
+ background: rgba(var(--accent-rgb), 0.15);
2422
+ }
2423
+
2424
+ .task-action-fork {
2425
+ color: #a78bfa;
2426
+ }
2427
+
2428
+ .task-action-fork:hover {
2429
+ background: rgba(139, 92, 246, 0.15);
2430
+ }
2431
+
2432
+ /* Show more link */
2433
+ .task-show-more {
2434
+ font-size: var(--font-size-sm);
2435
+ color: var(--accent);
2436
+ padding: var(--sp-8) var(--sp-10);
2437
+ cursor: pointer;
2438
+ text-align: center;
2439
+ }
2440
+
2441
+ .task-show-more:hover {
2442
+ text-decoration: underline;
2443
+ }
2444
+
2445
+
2446
+ /* ═══════════════════════════════════════════════════════════════════
2447
+ WELCOME SCREEN - GROUPED VIEW
2448
+ ═══════════════════════════════════════════════════════════════════ */
2449
+
2450
+ /* All sessions section (by project) */
2451
+ .welcome-section--all {
2452
+ margin-bottom: var(--sp-12);
2453
+ }
2454
+
2455
+ .welcome-section--all .welcome-section-header {
2456
+ margin-bottom: var(--sp-8);
2457
+ }
2458
+
2459
+ /* Section count */
2460
+ .welcome-section-count {
2461
+ font-size: var(--font-size-xs);
2462
+ color: var(--text-tertiary);
2463
+ margin-left: auto; /* Push to right, allowing h3+button to stay left */
2464
+ }
2465
+
2466
+ /* Welcome session rows (compact, clickable) */
2467
+ .welcome-session-row {
2468
+ display: flex;
2469
+ flex-direction: column;
2470
+ gap: var(--sp-4);
2471
+ padding: var(--sp-10) var(--sp-12);
2472
+ background: var(--bg-primary);
2473
+ border-radius: var(--radius-md);
2474
+ margin-bottom: var(--sp-4);
2475
+ cursor: pointer;
2476
+ transition: all 0.15s;
2477
+ /* Prevent iOS native text selection during long press */
2478
+ -webkit-user-select: none;
2479
+ user-select: none;
2480
+ -webkit-touch-callout: none;
2481
+ }
2482
+
2483
+ .welcome-session-row:hover {
2484
+ background: var(--bg-tertiary);
2485
+ transform: translateX(2px);
2486
+ }
2487
+
2488
+ .welcome-session-row:last-child {
2489
+ margin-bottom: 0;
2490
+ }
2491
+
2492
+ .welcome-row-info {
2493
+ display: flex;
2494
+ align-items: center;
2495
+ justify-content: space-between;
2496
+ gap: var(--sp-12);
2497
+ }
2498
+
2499
+ .welcome-row-name {
2500
+ font-size: var(--font-size-base);
2501
+ color: var(--text-primary);
2502
+ white-space: nowrap;
2503
+ overflow: hidden;
2504
+ text-overflow: ellipsis;
2505
+ flex: 1;
2506
+ }
2507
+
2508
+ .welcome-row-time {
2509
+ font-size: var(--font-size-xs);
2510
+ color: var(--text-tertiary);
2511
+ flex-shrink: 0;
2512
+ }
2513
+
2514
+ .welcome-row-tags {
2515
+ display: flex;
2516
+ gap: var(--sp-4);
2517
+ flex-wrap: wrap;
2518
+ }
2519
+
2520
+
2521
+ /* ═══════════════════════════════════════════════════════════════════
2522
+ SESSION PREVIEW SHEET
2523
+ ═══════════════════════════════════════════════════════════════════ */
2524
+
2525
+ .session-preview-overlay {
2526
+ position: fixed;
2527
+ inset: 0;
2528
+ background: rgba(0, 0, 0, 0.5);
2529
+ z-index: 999;
2530
+ animation: fadeIn 0.15s ease;
2531
+ }
2532
+
2533
+ @keyframes fadeIn {
2534
+ from { opacity: 0; }
2535
+ to { opacity: 1; }
2536
+ }
2537
+
2538
+ .session-preview-sheet {
2539
+ position: fixed;
2540
+ /* Position above the input area - account for input bar height */
2541
+ bottom: calc(var(--input-area-height, 120px) + env(safe-area-inset-bottom, 0px));
2542
+ left: 0;
2543
+ right: 0;
2544
+ max-height: 60vh;
2545
+ background: var(--bg-secondary);
2546
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
2547
+ z-index: 1000;
2548
+ display: flex;
2549
+ flex-direction: column;
2550
+ animation: slideUp 0.2s ease;
2551
+ overflow: hidden;
2552
+ box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.3);
2553
+ }
2554
+
2555
+ @keyframes slideUp {
2556
+ from { transform: translateY(100%); }
2557
+ to { transform: translateY(0); }
2558
+ }
2559
+
2560
+ .preview-header {
2561
+ display: flex;
2562
+ align-items: flex-start;
2563
+ justify-content: space-between;
2564
+ padding: var(--sp-16);
2565
+ border-bottom: 1px solid var(--border-primary);
2566
+ flex-shrink: 0; /* Never shrink header */
2567
+ }
2568
+
2569
+ .preview-title {
2570
+ display: flex;
2571
+ flex-direction: column;
2572
+ gap: var(--sp-2);
2573
+ }
2574
+
2575
+ .preview-name {
2576
+ font-size: var(--font-size-lg);
2577
+ font-weight: 600;
2578
+ color: var(--text-primary);
2579
+ }
2580
+
2581
+ .preview-project {
2582
+ font-size: var(--font-size-sm);
2583
+ color: var(--text-secondary);
2584
+ }
2585
+
2586
+ .preview-close {
2587
+ width: var(--layout-btn-md);
2588
+ height: var(--layout-btn-md);
2589
+ border-radius: 50%;
2590
+ border: none;
2591
+ background: var(--bg-tertiary);
2592
+ color: var(--text-secondary);
2593
+ cursor: pointer;
2594
+ display: flex;
2595
+ align-items: center;
2596
+ justify-content: center;
2597
+ flex-shrink: 0;
2598
+ }
2599
+
2600
+ .preview-close:hover {
2601
+ background: var(--bg-primary);
2602
+ color: var(--text-primary);
2603
+ }
2604
+
2605
+ .preview-close svg {
2606
+ width: 16px;
2607
+ height: 16px;
2608
+ }
2609
+
2610
+ .preview-meta {
2611
+ display: flex;
2612
+ align-items: center;
2613
+ gap: var(--sp-12);
2614
+ padding: var(--sp-12) var(--sp-16);
2615
+ flex-wrap: wrap;
2616
+ }
2617
+
2618
+ .preview-time {
2619
+ font-size: var(--font-size-sm);
2620
+ color: var(--text-muted);
2621
+ }
2622
+
2623
+ .preview-tags {
2624
+ display: flex;
2625
+ gap: var(--sp-4);
2626
+ flex-wrap: wrap;
2627
+ }
2628
+
2629
+ .preview-meta {
2630
+ flex-shrink: 0; /* Never shrink */
2631
+ }
2632
+
2633
+ .preview-summary {
2634
+ padding: 0 var(--sp-16) var(--sp-12);
2635
+ font-size: var(--font-size-base);
2636
+ color: var(--text-secondary);
2637
+ line-height: 1.4;
2638
+ flex-shrink: 0; /* Never shrink */
2639
+ }
2640
+
2641
+ .preview-messages {
2642
+ flex: 1;
2643
+ overflow-y: auto;
2644
+ padding: 0 var(--sp-16);
2645
+ min-height: 0; /* Allow flex shrinking */
2646
+ }
2647
+
2648
+ .preview-messages-header {
2649
+ font-size: var(--font-size-xs);
2650
+ font-weight: 600;
2651
+ color: var(--text-muted);
2652
+ text-transform: uppercase;
2653
+ letter-spacing: 0.5px;
2654
+ margin-bottom: var(--sp-8);
2655
+ }
2656
+
2657
+ .preview-loading {
2658
+ display: flex;
2659
+ align-items: center;
2660
+ justify-content: center;
2661
+ gap: var(--sp-8);
2662
+ padding: var(--sp-24);
2663
+ color: var(--text-muted);
2664
+ font-size: var(--font-size-base);
2665
+ }
2666
+
2667
+ .preview-empty {
2668
+ padding: var(--sp-24);
2669
+ text-align: center;
2670
+ color: var(--text-muted);
2671
+ font-size: var(--font-size-base);
2672
+ }
2673
+
2674
+ .preview-messages-list {
2675
+ display: flex;
2676
+ flex-direction: column;
2677
+ gap: var(--sp-8);
2678
+ padding-bottom: var(--sp-12);
2679
+ }
2680
+
2681
+ .preview-message {
2682
+ padding: var(--sp-8) var(--sp-10);
2683
+ background: var(--bg-primary);
2684
+ border-radius: var(--radius-md);
2685
+ border-left: 2px solid var(--border-primary);
2686
+ }
2687
+
2688
+ .preview-message--user {
2689
+ border-left-color: var(--accent);
2690
+ }
2691
+
2692
+ .preview-message--assistant {
2693
+ border-left-color: var(--success);
2694
+ }
2695
+
2696
+ .preview-msg-role {
2697
+ display: block;
2698
+ font-size: 10px;
2699
+ font-weight: 600;
2700
+ text-transform: uppercase;
2701
+ color: var(--text-muted);
2702
+ margin-bottom: var(--sp-2);
2703
+ }
2704
+
2705
+ .preview-message--user .preview-msg-role {
2706
+ color: var(--accent);
2707
+ }
2708
+
2709
+ .preview-message--assistant .preview-msg-role {
2710
+ color: var(--success);
2711
+ }
2712
+
2713
+ .preview-msg-text {
2714
+ font-size: var(--font-size-sm);
2715
+ color: var(--text-secondary);
2716
+ line-height: 1.4;
2717
+ }
2718
+
2719
+ .preview-actions {
2720
+ display: flex;
2721
+ gap: var(--sp-8);
2722
+ padding: var(--sp-16);
2723
+ border-top: 1px solid var(--border-primary);
2724
+ background: var(--bg-secondary);
2725
+ flex-shrink: 0; /* Never shrink - always show buttons */
2726
+ }
2727
+
2728
+ .preview-actions .welcome-btn {
2729
+ flex: 1;
2730
+ }
2731
+
2732
+
2733
+ /* ═══════════════════════════════════════════════════════════════════
2734
+ CONTEXT MENU
2735
+ ═══════════════════════════════════════════════════════════════════ */
2736
+
2737
+ .session-context-overlay {
2738
+ position: fixed;
2739
+ inset: 0;
2740
+ z-index: 998;
2741
+ /* Prevent iOS native text selection */
2742
+ -webkit-user-select: none;
2743
+ user-select: none;
2744
+ -webkit-touch-callout: none;
2745
+ }
2746
+
2747
+ .session-context-menu {
2748
+ position: fixed;
2749
+ min-width: 180px;
2750
+ background: var(--bg-secondary);
2751
+ border: 1px solid var(--border-primary);
2752
+ border-radius: var(--radius-md);
2753
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
2754
+ z-index: 999;
2755
+ padding: var(--sp-4);
2756
+ animation: contextFadeIn 0.1s ease;
2757
+ /* Prevent iOS native text selection */
2758
+ -webkit-user-select: none;
2759
+ user-select: none;
2760
+ -webkit-touch-callout: none;
2761
+ }
2762
+
2763
+ @keyframes contextFadeIn {
2764
+ from { opacity: 0; transform: scale(0.95); }
2765
+ to { opacity: 1; transform: scale(1); }
2766
+ }
2767
+
2768
+ .context-menu-item {
2769
+ display: flex;
2770
+ align-items: center;
2771
+ gap: var(--sp-10);
2772
+ width: 100%;
2773
+ padding: var(--sp-6) var(--sp-10);
2774
+ line-height: var(--layout-menu-line-height);
2775
+ border: none;
2776
+ background: transparent;
2777
+ color: var(--text-primary);
2778
+ font-size: var(--font-size-base);
2779
+ text-align: left;
2780
+ cursor: pointer;
2781
+ border-radius: var(--radius-sm);
2782
+ transition: background 0.1s;
2783
+ /* Prevent iOS native text selection */
2784
+ -webkit-user-select: none;
2785
+ user-select: none;
2786
+ -webkit-touch-callout: none;
2787
+ }
2788
+
2789
+ .context-menu-item:hover {
2790
+ background: var(--bg-tertiary);
2791
+ }
2792
+
2793
+ .context-menu-item svg {
2794
+ width: 16px;
2795
+ height: 16px;
2796
+ color: var(--text-secondary);
2797
+ flex-shrink: 0;
2798
+ }
2799
+
2800
+ .context-menu-divider {
2801
+ height: 1px;
2802
+ background: var(--border-primary);
2803
+ margin: var(--sp-4) var(--sp-8);
2804
+ }
2805
+
2806
+ /* Accent style for primary action (e.g., "New Session") */
2807
+ .context-menu-item--accent {
2808
+ color: var(--success-color, #10b981);
2809
+ font-weight: 500;
2810
+ }
2811
+
2812
+ .context-menu-item--accent svg {
2813
+ color: var(--success-color, #10b981);
2814
+ }
2815
+
2816
+ .context-menu-item--accent:hover {
2817
+ background: rgba(16, 185, 129, 0.1);
2818
+ }
2819
+
2820
+
2821
+ /* ═══════════════════════════════════════════════════════════════════
2822
+ RESPONSIVE
2823
+ ═══════════════════════════════════════════════════════════════════ */
2824
+
2825
+ @media (max-width: 640px) {
2826
+ /* Tighter section spacing */
2827
+ .welcome-section {
2828
+ margin-bottom: var(--sp-10);
2829
+ }
2830
+
2831
+ .welcome-section-header {
2832
+ margin-bottom: var(--sp-6);
2833
+ }
2834
+
2835
+ .welcome-section-header h3 {
2836
+ font-size: var(--font-size-xs);
2837
+ }
2838
+
2839
+ /* Compact recent cards on mobile */
2840
+ .welcome-recent-card {
2841
+ padding: var(--sp-10) var(--sp-12);
2842
+ }
2843
+
2844
+ .recent-card-name {
2845
+ font-size: var(--font-size-base);
2846
+ }
2847
+
2848
+ .recent-card-project {
2849
+ font-size: 10px;
2850
+ }
2851
+
2852
+ .recent-card-summary {
2853
+ font-size: var(--font-size-xs);
2854
+ }
2855
+
2856
+ .recent-card-tags .welcome-tag {
2857
+ font-size: 9px;
2858
+ padding: 1px var(--sp-5);
2859
+ }
2860
+
2861
+ .recent-card-meta {
2862
+ font-size: 10px;
2863
+ }
2864
+
2865
+ /* Load more button on mobile */
2866
+ .welcome-load-more {
2867
+ padding: var(--sp-10) var(--sp-14);
2868
+ font-size: var(--font-size-sm);
2869
+ }
2870
+
2871
+ .welcome-load-more svg {
2872
+ width: 14px;
2873
+ height: 14px;
2874
+ }
2875
+
2876
+ .welcome-load-more-hint {
2877
+ font-size: 10px;
2878
+ }
2879
+
2880
+ /* Favorites on mobile */
2881
+ .welcome-section--favorites {
2882
+ margin-bottom: var(--sp-14);
2883
+ padding-bottom: var(--sp-12);
2884
+ }
2885
+
2886
+ /* Compact session cards */
2887
+ .welcome-session-card {
2888
+ padding: var(--sp-10) var(--sp-12);
2889
+ }
2890
+
2891
+ .welcome-session-header {
2892
+ margin-bottom: var(--sp-6);
2893
+ }
2894
+
2895
+ .welcome-session-name {
2896
+ font-size: var(--font-size-md);
2897
+ }
2898
+
2899
+ .welcome-session-summary {
2900
+ font-size: var(--font-size-sm);
2901
+ margin-bottom: var(--sp-6);
2902
+ -webkit-line-clamp: 2;
2903
+ }
2904
+
2905
+ .welcome-session-tags {
2906
+ margin-bottom: var(--sp-6);
2907
+ gap: var(--sp-4);
2908
+ }
2909
+
2910
+ .welcome-tag {
2911
+ padding: var(--sp-2) var(--sp-6);
2912
+ font-size: 10px;
2913
+ }
2914
+
2915
+ .welcome-session-meta {
2916
+ flex-wrap: wrap;
2917
+ gap: var(--sp-6);
2918
+ font-size: var(--font-size-xs);
2919
+ }
2920
+
2921
+ .welcome-btn {
2922
+ padding: var(--sp-6) var(--sp-12);
2923
+ font-size: var(--font-size-sm);
2924
+ }
2925
+
2926
+ .welcome-sessions-grid {
2927
+ gap: var(--sp-8);
2928
+ }
2929
+
2930
+ /* Show hints on mobile but more compact */
2931
+ .welcome-hints {
2932
+ gap: var(--sp-8);
2933
+ flex-wrap: wrap;
2934
+ padding-top: var(--sp-8);
2935
+ margin-top: var(--sp-8);
2936
+ }
2937
+
2938
+ .welcome-hint {
2939
+ font-size: 10px;
2940
+ }
2941
+
2942
+ .welcome-hint kbd {
2943
+ font-size: 9px;
2944
+ padding: 1px var(--sp-4);
2945
+ }
2946
+
2947
+ /* Compact search results */
2948
+ .welcome-search-header {
2949
+ padding: var(--sp-8) var(--sp-10);
2950
+ font-size: var(--font-size-sm);
2951
+ }
2952
+
2953
+ .welcome-search-filters {
2954
+ padding: var(--sp-6) var(--sp-10);
2955
+ gap: var(--sp-4);
2956
+ }
2957
+
2958
+ .filter-chip {
2959
+ padding: var(--sp-2) var(--sp-6);
2960
+ font-size: 10px;
2961
+ }
2962
+
2963
+ /* Task mode on mobile */
2964
+ .welcome-task-header {
2965
+ padding: var(--sp-12);
2966
+ gap: var(--sp-10);
2967
+ }
2968
+
2969
+ .task-icon {
2970
+ width: 36px;
2971
+ height: 36px;
2972
+ }
2973
+
2974
+ .task-icon svg {
2975
+ width: 18px;
2976
+ height: 18px;
2977
+ }
2978
+
2979
+ .task-label {
2980
+ font-size: var(--font-size-base);
2981
+ }
2982
+
2983
+ .task-preview {
2984
+ font-size: var(--font-size-sm);
2985
+ }
2986
+
2987
+ .welcome-task-hint {
2988
+ font-size: var(--font-size-sm);
2989
+ }
2990
+
2991
+ .welcome-task-actions {
2992
+ flex-direction: column;
2993
+ gap: var(--sp-8);
2994
+ }
2995
+
2996
+ .welcome-session-card--task {
2997
+ padding: var(--sp-10);
2998
+ }
2999
+
3000
+ .welcome-task-card-actions {
3001
+ gap: var(--sp-6);
3002
+ margin-top: var(--sp-8);
3003
+ padding-top: var(--sp-8);
3004
+ }
3005
+
3006
+ .welcome-task-card-actions .welcome-btn {
3007
+ padding: var(--sp-5) var(--sp-10);
3008
+ font-size: var(--font-size-xs);
3009
+ }
3010
+
3011
+ .match-reason {
3012
+ font-size: 10px;
3013
+ }
3014
+
3015
+ /* Grouped view on mobile */
3016
+ .task-summary {
3017
+ gap: var(--sp-12);
3018
+ padding: var(--sp-6) 0;
3019
+ margin-bottom: var(--sp-12);
3020
+ }
3021
+
3022
+ .task-summary-stat {
3023
+ font-size: var(--font-size-xs);
3024
+ }
3025
+
3026
+ .task-section {
3027
+ margin-bottom: var(--sp-16);
3028
+ }
3029
+
3030
+ .task-section-header {
3031
+ margin-bottom: var(--sp-8);
3032
+ }
3033
+
3034
+ .task-section-title {
3035
+ font-size: var(--font-size-xs);
3036
+ }
3037
+
3038
+ .task-project-header {
3039
+ padding: var(--sp-8) var(--sp-10);
3040
+ }
3041
+
3042
+ .task-project-name {
3043
+ font-size: var(--font-size-sm);
3044
+ }
3045
+
3046
+ /* On touch devices, make play button more visible */
3047
+ .task-project-start {
3048
+ opacity: 0.7;
3049
+ }
3050
+
3051
+ .task-project-sessions {
3052
+ padding: 0 var(--sp-8) var(--sp-8);
3053
+ }
3054
+
3055
+ .task-session-row {
3056
+ padding: var(--sp-6) var(--sp-8);
3057
+ }
3058
+
3059
+ .task-session-name {
3060
+ font-size: var(--font-size-sm);
3061
+ }
3062
+
3063
+ .task-session-time {
3064
+ font-size: 10px;
3065
+ }
3066
+
3067
+ .task-action-btn {
3068
+ width: var(--layout-btn-md);
3069
+ height: var(--layout-btn-md);
3070
+ }
3071
+
3072
+ .task-action-btn svg {
3073
+ width: 16px;
3074
+ height: 16px;
3075
+ }
3076
+
3077
+ .task-period-label {
3078
+ font-size: 9px;
3079
+ }
3080
+
3081
+ /* Welcome session rows on mobile */
3082
+ .welcome-session-row {
3083
+ padding: var(--sp-8) var(--sp-10);
3084
+ }
3085
+
3086
+ .welcome-row-name {
3087
+ font-size: var(--font-size-sm);
3088
+ }
3089
+
3090
+ .welcome-row-time {
3091
+ font-size: 10px;
3092
+ }
3093
+ }
3094
+
3095
+