bingocode 1.0.3 → 1.0.5

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 (184) hide show
  1. package/package.json +3 -7
  2. package/desktop/README.md +0 -30
  3. package/desktop/bunfig.toml +0 -1
  4. package/desktop/index.html +0 -17
  5. package/desktop/package.json +0 -55
  6. package/desktop/pnpm-lock.yaml +0 -3832
  7. package/desktop/public/app-icon.jpg +0 -0
  8. package/desktop/public/fonts/inter-latin-ext.woff2 +0 -0
  9. package/desktop/public/fonts/inter-latin.woff2 +0 -0
  10. package/desktop/public/fonts/jetbrains-mono-latin-ext.woff2 +0 -0
  11. package/desktop/public/fonts/jetbrains-mono-latin.woff2 +0 -0
  12. package/desktop/public/fonts/manrope-latin-ext.woff2 +0 -0
  13. package/desktop/public/fonts/manrope-latin.woff2 +0 -0
  14. package/desktop/public/fonts/material-symbols-outlined.woff2 +0 -0
  15. package/desktop/public/icons/bilibili.svg +0 -1
  16. package/desktop/public/icons/douyin.svg +0 -1
  17. package/desktop/public/icons/github.svg +0 -3
  18. package/desktop/public/icons/xiaohongshu.svg +0 -1
  19. package/desktop/scripts/build-macos-arm64.sh +0 -270
  20. package/desktop/scripts/build-sidecars.ts +0 -183
  21. package/desktop/scripts/build-windows-x64.ps1 +0 -295
  22. package/desktop/scripts/scan-missing-imports.ts +0 -235
  23. package/desktop/sidecars/claude-sidecar.ts +0 -156
  24. package/desktop/src/App.tsx +0 -5
  25. package/desktop/src/__tests__/agentsSettings.test.tsx +0 -349
  26. package/desktop/src/__tests__/pages.test.tsx +0 -290
  27. package/desktop/src/__tests__/skillsSettings.test.tsx +0 -205
  28. package/desktop/src/api/adapters.ts +0 -12
  29. package/desktop/src/api/agents.ts +0 -36
  30. package/desktop/src/api/cliTasks.ts +0 -28
  31. package/desktop/src/api/client.ts +0 -63
  32. package/desktop/src/api/computerUse.ts +0 -76
  33. package/desktop/src/api/filesystem.ts +0 -30
  34. package/desktop/src/api/hahaOAuth.ts +0 -38
  35. package/desktop/src/api/models.ts +0 -28
  36. package/desktop/src/api/providers.ts +0 -63
  37. package/desktop/src/api/search.ts +0 -29
  38. package/desktop/src/api/sessions.ts +0 -56
  39. package/desktop/src/api/settings.ts +0 -20
  40. package/desktop/src/api/skills.ts +0 -19
  41. package/desktop/src/api/tasks.ts +0 -36
  42. package/desktop/src/api/teams.ts +0 -44
  43. package/desktop/src/api/websocket.ts +0 -164
  44. package/desktop/src/components/chat/AskUserQuestion.tsx +0 -268
  45. package/desktop/src/components/chat/AssistantMessage.tsx +0 -29
  46. package/desktop/src/components/chat/AttachmentGallery.tsx +0 -113
  47. package/desktop/src/components/chat/ChatInput.tsx +0 -622
  48. package/desktop/src/components/chat/CodeViewer.tsx +0 -161
  49. package/desktop/src/components/chat/ComputerUsePermissionModal.test.tsx +0 -174
  50. package/desktop/src/components/chat/ComputerUsePermissionModal.tsx +0 -311
  51. package/desktop/src/components/chat/DiffViewer.tsx +0 -157
  52. package/desktop/src/components/chat/FileSearchMenu.tsx +0 -198
  53. package/desktop/src/components/chat/ImageGalleryModal.tsx +0 -91
  54. package/desktop/src/components/chat/InlineImageGallery.tsx +0 -106
  55. package/desktop/src/components/chat/InlineTaskSummary.tsx +0 -60
  56. package/desktop/src/components/chat/MermaidRenderer.test.tsx +0 -98
  57. package/desktop/src/components/chat/MermaidRenderer.tsx +0 -361
  58. package/desktop/src/components/chat/MessageActionBar.tsx +0 -27
  59. package/desktop/src/components/chat/MessageList.test.tsx +0 -313
  60. package/desktop/src/components/chat/MessageList.tsx +0 -249
  61. package/desktop/src/components/chat/PermissionDialog.tsx +0 -262
  62. package/desktop/src/components/chat/SessionTaskBar.test.tsx +0 -99
  63. package/desktop/src/components/chat/SessionTaskBar.tsx +0 -159
  64. package/desktop/src/components/chat/StreamingIndicator.tsx +0 -41
  65. package/desktop/src/components/chat/TerminalChrome.tsx +0 -35
  66. package/desktop/src/components/chat/ThinkingBlock.tsx +0 -87
  67. package/desktop/src/components/chat/ToolCallBlock.tsx +0 -247
  68. package/desktop/src/components/chat/ToolCallGroup.tsx +0 -617
  69. package/desktop/src/components/chat/ToolResultBlock.tsx +0 -107
  70. package/desktop/src/components/chat/UserMessage.tsx +0 -38
  71. package/desktop/src/components/chat/chatBlocks.test.tsx +0 -136
  72. package/desktop/src/components/chat/clipboard.ts +0 -25
  73. package/desktop/src/components/chat/composerUtils.test.ts +0 -55
  74. package/desktop/src/components/chat/composerUtils.ts +0 -149
  75. package/desktop/src/components/controls/ModelSelector.tsx +0 -156
  76. package/desktop/src/components/controls/PermissionModeSelector.tsx +0 -229
  77. package/desktop/src/components/layout/AppShell.tsx +0 -107
  78. package/desktop/src/components/layout/ContentRouter.tsx +0 -27
  79. package/desktop/src/components/layout/ProjectFilter.tsx +0 -126
  80. package/desktop/src/components/layout/Sidebar.test.tsx +0 -158
  81. package/desktop/src/components/layout/Sidebar.tsx +0 -384
  82. package/desktop/src/components/layout/StatusBar.tsx +0 -31
  83. package/desktop/src/components/layout/TabBar.test.tsx +0 -136
  84. package/desktop/src/components/layout/TabBar.tsx +0 -318
  85. package/desktop/src/components/layout/TitleBar.tsx +0 -96
  86. package/desktop/src/components/layout/WindowControls.test.tsx +0 -69
  87. package/desktop/src/components/layout/WindowControls.tsx +0 -89
  88. package/desktop/src/components/markdown/MarkdownRenderer.test.tsx +0 -100
  89. package/desktop/src/components/markdown/MarkdownRenderer.tsx +0 -229
  90. package/desktop/src/components/settings/ClaudeOfficialLogin.tsx +0 -107
  91. package/desktop/src/components/shared/Button.tsx +0 -63
  92. package/desktop/src/components/shared/CopyButton.tsx +0 -58
  93. package/desktop/src/components/shared/DirectoryPicker.tsx +0 -316
  94. package/desktop/src/components/shared/Dropdown.tsx +0 -91
  95. package/desktop/src/components/shared/Input.tsx +0 -38
  96. package/desktop/src/components/shared/Modal.tsx +0 -65
  97. package/desktop/src/components/shared/ProjectContextChip.tsx +0 -30
  98. package/desktop/src/components/shared/Spinner.tsx +0 -30
  99. package/desktop/src/components/shared/Textarea.tsx +0 -38
  100. package/desktop/src/components/shared/Toast.tsx +0 -47
  101. package/desktop/src/components/shared/UpdateChecker.tsx +0 -90
  102. package/desktop/src/components/skills/SkillDetail.test.tsx +0 -89
  103. package/desktop/src/components/skills/SkillDetail.tsx +0 -403
  104. package/desktop/src/components/skills/SkillList.tsx +0 -254
  105. package/desktop/src/components/tasks/DayOfWeekPicker.tsx +0 -57
  106. package/desktop/src/components/tasks/NewTaskModal.tsx +0 -407
  107. package/desktop/src/components/tasks/PromptEditor.tsx +0 -74
  108. package/desktop/src/components/tasks/TaskEmptyState.tsx +0 -30
  109. package/desktop/src/components/tasks/TaskList.tsx +0 -46
  110. package/desktop/src/components/tasks/TaskRow.tsx +0 -253
  111. package/desktop/src/components/tasks/TaskRunsPanel.tsx +0 -195
  112. package/desktop/src/components/teams/TeamStatusBar.tsx +0 -147
  113. package/desktop/src/config/providerPresets.ts +0 -78
  114. package/desktop/src/config/spinnerVerbs.ts +0 -193
  115. package/desktop/src/hooks/useKeyboardShortcuts.ts +0 -60
  116. package/desktop/src/i18n/index.ts +0 -54
  117. package/desktop/src/i18n/locales/en.ts +0 -670
  118. package/desktop/src/i18n/locales/zh.ts +0 -670
  119. package/desktop/src/lib/__tests__/cronDescribe.test.ts +0 -93
  120. package/desktop/src/lib/cronDescribe.ts +0 -188
  121. package/desktop/src/lib/desktopRuntime.ts +0 -54
  122. package/desktop/src/lib/parseRunOutput.ts +0 -79
  123. package/desktop/src/main.tsx +0 -13
  124. package/desktop/src/mocks/data.ts +0 -202
  125. package/desktop/src/pages/ActiveSession.test.tsx +0 -181
  126. package/desktop/src/pages/ActiveSession.tsx +0 -219
  127. package/desktop/src/pages/AdapterSettings.tsx +0 -375
  128. package/desktop/src/pages/AgentTeams.tsx +0 -200
  129. package/desktop/src/pages/ComputerUseSettings.tsx +0 -420
  130. package/desktop/src/pages/EmptySession.tsx +0 -518
  131. package/desktop/src/pages/NewTaskModal.tsx +0 -346
  132. package/desktop/src/pages/ScheduledTasks.tsx +0 -66
  133. package/desktop/src/pages/ScheduledTasksEmpty.tsx +0 -152
  134. package/desktop/src/pages/ScheduledTasksList.tsx +0 -416
  135. package/desktop/src/pages/SessionControls.tsx +0 -460
  136. package/desktop/src/pages/Settings.tsx +0 -1448
  137. package/desktop/src/pages/ToolInspection.tsx +0 -235
  138. package/desktop/src/stores/adapterStore.ts +0 -106
  139. package/desktop/src/stores/agentStore.ts +0 -34
  140. package/desktop/src/stores/chatStore.test.ts +0 -505
  141. package/desktop/src/stores/chatStore.ts +0 -850
  142. package/desktop/src/stores/cliTaskStore.ts +0 -152
  143. package/desktop/src/stores/hahaOAuthStore.test.ts +0 -77
  144. package/desktop/src/stores/hahaOAuthStore.ts +0 -97
  145. package/desktop/src/stores/providerStore.ts +0 -101
  146. package/desktop/src/stores/sessionStore.test.ts +0 -63
  147. package/desktop/src/stores/sessionStore.ts +0 -102
  148. package/desktop/src/stores/settingsStore.ts +0 -120
  149. package/desktop/src/stores/skillStore.ts +0 -51
  150. package/desktop/src/stores/tabStore.ts +0 -169
  151. package/desktop/src/stores/taskStore.ts +0 -68
  152. package/desktop/src/stores/teamStore.ts +0 -344
  153. package/desktop/src/stores/uiStore.ts +0 -100
  154. package/desktop/src/stores/updateStore.test.ts +0 -71
  155. package/desktop/src/stores/updateStore.ts +0 -221
  156. package/desktop/src/theme/globals.css +0 -465
  157. package/desktop/src/types/adapter.ts +0 -33
  158. package/desktop/src/types/chat.ts +0 -152
  159. package/desktop/src/types/cliTask.ts +0 -24
  160. package/desktop/src/types/provider.ts +0 -62
  161. package/desktop/src/types/session.ts +0 -27
  162. package/desktop/src/types/settings.ts +0 -22
  163. package/desktop/src/types/skill.ts +0 -38
  164. package/desktop/src/types/task.ts +0 -56
  165. package/desktop/src/types/team.ts +0 -38
  166. package/desktop/src-tauri/Cargo.lock +0 -5549
  167. package/desktop/src-tauri/Cargo.toml +0 -20
  168. package/desktop/src-tauri/app-icon.svg +0 -13
  169. package/desktop/src-tauri/build.rs +0 -3
  170. package/desktop/src-tauri/capabilities/default.json +0 -106
  171. package/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml +0 -5
  172. package/desktop/src-tauri/icons/android/values/ic_launcher_background.xml +0 -4
  173. package/desktop/src-tauri/icons/icon.icns +0 -0
  174. package/desktop/src-tauri/icons/icon.ico +0 -0
  175. package/desktop/src-tauri/src/lib.rs +0 -408
  176. package/desktop/src-tauri/src/main.rs +0 -6
  177. package/desktop/src-tauri/tauri.conf.json +0 -78
  178. package/desktop/src-tauri/tauri.macos.conf.json +0 -18
  179. package/desktop/src-tauri/tauri.release-ci.json +0 -5
  180. package/desktop/src-tauri/tauri.windows.conf.json +0 -16
  181. package/desktop/src-tauri/windows-installer-hooks.nsh +0 -17
  182. package/desktop/tsconfig.json +0 -25
  183. package/desktop/vite.config.ts +0 -26
  184. package/desktop/vitest.config.ts +0 -18
@@ -1,346 +0,0 @@
1
- import { useState } from 'react'
2
- import { mockNewTaskDefaults, mockSessions, mockStatusBar } from '../mocks/data'
3
-
4
- /**
5
- * NewTaskModal page -- pixel-perfect replica of the HTML prototype.
6
- * Renders the full app chrome (header, sidebar, content, footer) dimmed/blurred
7
- * behind a centered "New Scheduled Task" modal overlay.
8
- *
9
- * Everything lives in this single file. Mock data is imported from ../mocks/data.
10
- */
11
- export default function NewTaskModal() {
12
- /* ── form state ─────────────────────────────────────────────────── */
13
- const [taskName, setTaskName] = useState('')
14
- const [description, setDescription] = useState('')
15
- const [systemPrompt, setSystemPrompt] = useState('')
16
- const [permissionMode, setPermissionMode] = useState(mockNewTaskDefaults.permissionModes[0])
17
- const [model, setModel] = useState(mockNewTaskDefaults.models[0])
18
- const [rootFolder, setRootFolder] = useState('')
19
- const [frequency, setFrequency] = useState(mockNewTaskDefaults.frequencies[1])
20
- const [worktree, setWorktree] = useState(false)
21
-
22
- return (
23
- <div className="bg-[var(--color-background)] text-[var(--color-on-surface)] font-[var(--font-body)] min-h-screen flex flex-col">
24
- {/* ─── TopAppBar / Header ──────────────────────────────────── */}
25
- <header className="bg-[#FAF9F5] flex justify-between items-center px-6 h-12 w-full z-40">
26
- <div className="flex items-center gap-6">
27
- <span className="text-sm font-bold text-[#1B1C1A] uppercase tracking-tighter font-[var(--font-headline)]">
28
- Claude Code Companion
29
- </span>
30
- <nav className="hidden md:flex gap-4 font-[var(--font-headline)] font-semibold tracking-wide text-sm">
31
- <a className="text-[#87736D] hover:text-[#8F482F] transition-colors cursor-pointer">Code</a>
32
- <a className="text-[#87736D] hover:text-[#8F482F] transition-colors cursor-pointer">Terminal</a>
33
- <a className="text-[#87736D] hover:text-[#8F482F] transition-colors cursor-pointer">History</a>
34
- </nav>
35
- </div>
36
- <div className="flex items-center gap-4">
37
- <div className="flex items-center gap-2 text-[#8F482F]">
38
- <span className="material-symbols-outlined cursor-pointer active:opacity-70 text-sm">arrow_back_ios</span>
39
- <span className="material-symbols-outlined cursor-pointer active:opacity-70 text-sm">arrow_forward_ios</span>
40
- </div>
41
- <span className="font-[var(--font-headline)] font-semibold tracking-wide text-sm text-[#87736D] cursor-pointer hover:text-[#8F482F] transition-colors">
42
- Settings
43
- </span>
44
- </div>
45
- </header>
46
-
47
- {/* header divider */}
48
- <div className="bg-[#F4F4F0] h-px w-full" />
49
-
50
- {/* ─── Main area (sidebar + content + overlay) ──────────────── */}
51
- <main className="flex-1 flex overflow-hidden relative">
52
- {/* ── Sidebar (dimmed) ────────────────────────────────────── */}
53
- <aside className="hidden md:flex flex-col p-4 gap-2 bg-[#F4F4F0] h-full w-[280px] opacity-30 pointer-events-none">
54
- {/* project selector */}
55
- <div className="flex items-center gap-3 px-2 py-3 mb-2">
56
- <div className="w-8 h-8 rounded bg-[var(--color-surface-dim)] flex items-center justify-center">
57
- <span className="material-symbols-outlined text-[var(--color-outline)]">filter</span>
58
- </div>
59
- <div>
60
- <div className="text-[var(--color-on-surface)] font-semibold text-xs">All projects</div>
61
- <div className="text-[10px] text-[var(--color-outline)]">Active Session</div>
62
- </div>
63
- </div>
64
-
65
- {/* nav items -- session counts derived from mockSessions */}
66
- <div className="font-[var(--font-body)] text-sm font-medium space-y-1">
67
- <div className="flex items-center gap-3 px-3 py-2 text-[#87736D]">
68
- <span className="material-symbols-outlined">add</span>New session
69
- </div>
70
- <div className="flex items-center gap-3 px-3 py-2 bg-[#FAF9F5] text-[#1B1C1A] rounded-lg relative before:content-[''] before:absolute before:left-[-8px] before:w-1 before:h-4 before:bg-[#8F482F] before:rounded-full">
71
- <span className="material-symbols-outlined">calendar_today</span>Scheduled
72
- </div>
73
- <div className="flex items-center gap-3 px-3 py-2 text-[#87736D]">
74
- <span className="material-symbols-outlined">history</span>Today
75
- {mockSessions.today.length > 0 && (
76
- <span className="ml-auto text-[10px] text-[#87736D]">{mockSessions.today.length}</span>
77
- )}
78
- </div>
79
- <div className="flex items-center gap-3 px-3 py-2 text-[#87736D]">
80
- <span className="material-symbols-outlined">event_note</span>Previous 7 Days
81
- {mockSessions.previous7Days.length > 0 && (
82
- <span className="ml-auto text-[10px] text-[#87736D]">{mockSessions.previous7Days.length}</span>
83
- )}
84
- </div>
85
- </div>
86
- </aside>
87
-
88
- {/* ── Content area (dimmed canvas) ────────────────────────── */}
89
- <div className="flex-1 bg-[var(--color-surface-container-low)] flex flex-col p-8 overflow-y-auto relative">
90
- {/* faded background content */}
91
- <div className="max-w-4xl mx-auto w-full space-y-6 opacity-20">
92
- <h1 className="font-[var(--font-headline)] text-3xl font-bold tracking-tight">
93
- Scheduled Tasks
94
- </h1>
95
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
96
- <div className="h-40 bg-[var(--color-surface-container-lowest)] rounded-xl border border-[var(--color-outline-variant)]/20 p-4" />
97
- <div className="h-40 bg-[var(--color-surface-container-lowest)] rounded-xl border border-[var(--color-outline-variant)]/20 p-4" />
98
- </div>
99
- </div>
100
-
101
- {/* ═══ MODAL OVERLAY ═══════════════════════════════════════ */}
102
- <div className="absolute inset-0 z-50 flex items-center justify-center p-4 bg-[var(--color-on-surface)]/40 backdrop-blur-sm">
103
- <div
104
- className="bg-[var(--color-surface-container-lowest)] w-full max-w-lg rounded-xl overflow-hidden flex flex-col"
105
- style={{
106
- boxShadow:
107
- '0 4px 20px rgba(27,28,26,0.04), 0 12px 40px rgba(27,28,26,0.08)',
108
- }}
109
- >
110
- {/* ── Modal Header ─────────────────────────────────── */}
111
- <div className="px-6 py-4 flex items-center justify-between border-b border-[var(--color-outline-variant)]/10">
112
- <h2 className="font-[var(--font-headline)] font-bold text-lg text-[var(--color-on-surface)]">
113
- New Scheduled Task
114
- </h2>
115
- <span className="material-symbols-outlined text-[var(--color-outline)] cursor-pointer hover:text-[var(--color-on-surface)] transition-colors">
116
- close
117
- </span>
118
- </div>
119
-
120
- {/* ── Modal Body ───────────────────────────────────── */}
121
- <div
122
- className="p-6 overflow-y-auto space-y-5"
123
- style={{
124
- maxHeight: 768,
125
- scrollbarWidth: 'none',
126
- msOverflowStyle: 'none',
127
- }}
128
- >
129
- {/* Info Banner */}
130
- <div className="bg-[var(--color-surface-container-high)]/50 rounded-lg p-3 flex gap-3 items-start">
131
- <span className="material-symbols-outlined text-[var(--color-primary)] text-sm mt-0.5">
132
- info
133
- </span>
134
- <p className="text-xs text-[var(--color-on-surface-variant)] font-medium">
135
- Local tasks only run while your computer is awake.
136
- </p>
137
- </div>
138
-
139
- {/* ── Form ───────────────────────────────────────── */}
140
- <div className="space-y-4">
141
- <div className="grid grid-cols-1 gap-4">
142
- {/* Task Name */}
143
- <div className="space-y-1.5">
144
- <label className="text-[11px] font-bold uppercase tracking-wider text-[var(--color-outline)] px-1">
145
- Task Name
146
- </label>
147
- <input
148
- type="text"
149
- value={taskName}
150
- onChange={(e) => setTaskName(e.target.value)}
151
- placeholder="e.g., Weekly Code Audit"
152
- className="w-full bg-[var(--color-surface-container)] rounded-lg border-none focus:ring-1 focus:ring-[var(--color-primary)] text-sm placeholder:text-[var(--color-outline)]/50 px-4 py-2.5 transition-all outline-none"
153
- />
154
- </div>
155
-
156
- {/* Description */}
157
- <div className="space-y-1.5">
158
- <label className="text-[11px] font-bold uppercase tracking-wider text-[var(--color-outline)] px-1">
159
- Description
160
- </label>
161
- <input
162
- type="text"
163
- value={description}
164
- onChange={(e) => setDescription(e.target.value)}
165
- placeholder="Brief purpose of this schedule..."
166
- className="w-full bg-[var(--color-surface-container)] rounded-lg border-none focus:ring-1 focus:ring-[var(--color-primary)] text-sm placeholder:text-[var(--color-outline)]/50 px-4 py-2.5 transition-all outline-none"
167
- />
168
- </div>
169
-
170
- {/* System Prompt */}
171
- <div className="space-y-1.5">
172
- <label className="text-[11px] font-bold uppercase tracking-wider text-[var(--color-outline)] px-1">
173
- System Prompt
174
- </label>
175
- <textarea
176
- value={systemPrompt}
177
- onChange={(e) => setSystemPrompt(e.target.value)}
178
- placeholder="Define the agent's goal and behavior..."
179
- rows={3}
180
- className="w-full bg-[var(--color-surface-container)] rounded-lg border-none focus:ring-1 focus:ring-[var(--color-primary)] text-sm placeholder:text-[var(--color-outline)]/50 px-4 py-2.5 transition-all resize-none outline-none"
181
- />
182
- </div>
183
- </div>
184
-
185
- {/* Two-column row: Permission Mode + Model */}
186
- <div className="grid grid-cols-2 gap-4">
187
- {/* Permission Mode */}
188
- <div className="space-y-1.5">
189
- <label className="text-[11px] font-bold uppercase tracking-wider text-[var(--color-outline)] px-1">
190
- Permission Mode
191
- </label>
192
- <div className="relative">
193
- <select
194
- value={permissionMode}
195
- onChange={(e) => setPermissionMode(e.target.value)}
196
- className="w-full bg-[var(--color-surface-container)] rounded-lg border-none focus:ring-1 focus:ring-[var(--color-primary)] text-sm px-4 py-2.5 appearance-none cursor-pointer outline-none"
197
- >
198
- {mockNewTaskDefaults.permissionModes.map((pm) => (
199
- <option key={pm} value={pm}>
200
- {pm}
201
- </option>
202
- ))}
203
- </select>
204
- <span className="material-symbols-outlined absolute right-3 top-2.5 pointer-events-none text-[var(--color-outline)] text-sm">
205
- unfold_more
206
- </span>
207
- </div>
208
- </div>
209
-
210
- {/* Model */}
211
- <div className="space-y-1.5">
212
- <label className="text-[11px] font-bold uppercase tracking-wider text-[var(--color-outline)] px-1">
213
- Model
214
- </label>
215
- <div className="relative">
216
- <select
217
- value={model}
218
- onChange={(e) => setModel(e.target.value)}
219
- className="w-full bg-[var(--color-surface-container)] rounded-lg border-none focus:ring-1 focus:ring-[var(--color-primary)] text-sm px-4 py-2.5 appearance-none cursor-pointer outline-none"
220
- >
221
- {mockNewTaskDefaults.models.map((m) => (
222
- <option key={m} value={m}>
223
- {m}
224
- </option>
225
- ))}
226
- </select>
227
- <span className="material-symbols-outlined absolute right-3 top-2.5 pointer-events-none text-[var(--color-outline)] text-sm">
228
- unfold_more
229
- </span>
230
- </div>
231
- </div>
232
- </div>
233
-
234
- {/* Root Folder Path */}
235
- <div className="space-y-1.5">
236
- <label className="text-[11px] font-bold uppercase tracking-wider text-[var(--color-outline)] px-1">
237
- Root Folder Path
238
- </label>
239
- <div className="flex gap-2">
240
- <input
241
- type="text"
242
- value={rootFolder}
243
- onChange={(e) => setRootFolder(e.target.value)}
244
- placeholder="/users/projects/claude-app"
245
- className="flex-1 bg-[var(--color-surface-container)] rounded-lg border-none focus:ring-1 focus:ring-[var(--color-primary)] text-sm placeholder:text-[var(--color-outline)]/50 px-4 py-2.5 transition-all outline-none"
246
- />
247
- <button className="bg-[var(--color-surface-container-high)] px-3 rounded-lg flex items-center justify-center hover:bg-[var(--color-surface-variant)] transition-colors">
248
- <span className="material-symbols-outlined text-[var(--color-on-surface-variant)] text-sm">
249
- folder_open
250
- </span>
251
- </button>
252
- </div>
253
- </div>
254
-
255
- {/* Frequency */}
256
- <div className="space-y-1.5">
257
- <label className="text-[11px] font-bold uppercase tracking-wider text-[var(--color-outline)] px-1">
258
- Frequency
259
- </label>
260
- <div className="relative">
261
- <select
262
- value={frequency}
263
- onChange={(e) => setFrequency(e.target.value)}
264
- className="w-full bg-[var(--color-surface-container)] rounded-lg border-none focus:ring-1 focus:ring-[var(--color-primary)] text-sm px-4 py-2.5 appearance-none cursor-pointer outline-none"
265
- >
266
- {mockNewTaskDefaults.frequencies.map((f) => (
267
- <option key={f} value={f}>
268
- {f}
269
- </option>
270
- ))}
271
- </select>
272
- <span className="material-symbols-outlined absolute right-3 top-2.5 pointer-events-none text-[var(--color-outline)] text-sm">
273
- schedule
274
- </span>
275
- </div>
276
- </div>
277
-
278
- {/* Worktree Checkbox */}
279
- <div className="flex items-center gap-3 pt-2">
280
- <div className="relative flex items-center">
281
- <input
282
- id="worktree"
283
- type="checkbox"
284
- checked={worktree}
285
- onChange={(e) => setWorktree(e.target.checked)}
286
- className="w-4 h-4 rounded text-[var(--color-primary)] focus:ring-[var(--color-primary)] border-[var(--color-outline-variant)] bg-[var(--color-surface-container)] accent-[var(--color-primary)]"
287
- />
288
- </div>
289
- <label
290
- htmlFor="worktree"
291
- className="text-sm text-[var(--color-on-surface)] font-medium cursor-pointer"
292
- >
293
- Create separate worktree for execution
294
- </label>
295
- </div>
296
- </div>
297
- </div>
298
-
299
- {/* ── Modal Footer ─────────────────────────────────── */}
300
- <div className="px-6 py-4 bg-[var(--color-surface-container-low)]/50 flex items-center justify-end gap-3">
301
- <button className="px-5 py-2 text-sm font-semibold text-[var(--color-outline)] hover:text-[var(--color-on-surface)] transition-colors">
302
- Cancel
303
- </button>
304
- <button
305
- className="px-6 py-2 rounded-lg text-sm font-bold text-[var(--color-on-primary)] shadow-sm hover:opacity-90 active:scale-95 transition-all"
306
- style={{
307
- backgroundImage:
308
- 'linear-gradient(to bottom, var(--color-primary), var(--color-primary-container))',
309
- }}
310
- >
311
- Create task
312
- </button>
313
- </div>
314
- </div>
315
- </div>
316
- </div>
317
- </main>
318
-
319
- {/* ─── Footer / Status Bar ─────────────────────────────────── */}
320
- <footer className="bg-[#FAF9F5] flex items-center justify-between px-4 z-50 fixed bottom-0 left-0 w-full h-8 border-t border-[#87736D]/20 font-[var(--font-body)] text-xs tracking-tight">
321
- <div className="flex items-center gap-3">
322
- <span className="text-[#87736D]">
323
- {mockStatusBar.user} &bull; {mockStatusBar.username} &bull; {mockStatusBar.plan}
324
- </span>
325
- <div className="flex items-center gap-4 ml-4">
326
- <span className="text-[#87736D] hover:bg-[#F4F4F0] px-2 py-0.5 rounded cursor-pointer transition-colors">
327
- {mockStatusBar.branch}
328
- </span>
329
- <span className="text-[#87736D] hover:bg-[#F4F4F0] px-2 py-0.5 rounded cursor-pointer transition-colors">
330
- {mockStatusBar.worktreeToggle}
331
- </span>
332
- </div>
333
- </div>
334
- <div className="flex items-center gap-4">
335
- <span className="text-[#8F482F] font-bold cursor-pointer">
336
- {mockStatusBar.localSwitch}
337
- </span>
338
- <div className="flex items-center gap-1 text-[#87736D]">
339
- <span className="material-symbols-outlined text-[14px]">terminal</span>
340
- <span>{mockStatusBar.status === 'Ready' ? 'Active' : mockStatusBar.status}</span>
341
- </div>
342
- </div>
343
- </footer>
344
- </div>
345
- )
346
- }
@@ -1,66 +0,0 @@
1
- import { useEffect, useState } from 'react'
2
- import { useTaskStore } from '../stores/taskStore'
3
- import { useUIStore } from '../stores/uiStore'
4
- import { useTranslation } from '../i18n'
5
- import { Button } from '../components/shared/Button'
6
- import { TaskList } from '../components/tasks/TaskList'
7
- import { TaskEmptyState } from '../components/tasks/TaskEmptyState'
8
- import { NewTaskModal } from '../components/tasks/NewTaskModal'
9
-
10
- export function ScheduledTasks() {
11
- const { tasks, fetchTasks, isLoading } = useTaskStore()
12
- const { activeModal, openModal, closeModal } = useUIStore()
13
- const t = useTranslation()
14
- const [initialized, setInitialized] = useState(false)
15
-
16
- useEffect(() => {
17
- fetchTasks().then(() => setInitialized(true))
18
- }, [fetchTasks])
19
-
20
- return (
21
- <div className="flex-1 overflow-y-auto">
22
- <div className="px-10 py-8">
23
- {/* Header */}
24
- <div className="flex items-center justify-between mb-4">
25
- <div>
26
- <h1 className="text-2xl font-bold text-[var(--color-text-primary)]">{t('scheduledPage.title')}</h1>
27
- <p className="mt-1 text-sm text-[var(--color-text-secondary)]">
28
- {(() => {
29
- const parts = t('scheduledPage.subtitle').split('{code}')
30
- return <>{parts[0]}<code className="px-1 py-0.5 rounded bg-[var(--color-surface-container)] text-xs font-[var(--font-mono)]">/schedule</code>{parts[1]}</>
31
- })()}
32
- </p>
33
- </div>
34
- <Button onClick={() => openModal('new-task')}>{t('tasks.newTask')}</Button>
35
- </div>
36
-
37
- {/* Desktop-online notice */}
38
- <div className="flex items-center gap-2.5 px-3.5 py-2.5 rounded-[var(--radius-md)] bg-[var(--color-warning)]/8 border border-[var(--color-warning)]/15 mb-6">
39
- <span className="material-symbols-outlined text-[18px] text-[var(--color-warning)]">schedule</span>
40
- <span className="text-xs text-[var(--color-text-secondary)]">
41
- {t('scheduledPage.desktopNotice')}
42
- </span>
43
- </div>
44
-
45
- {/* Content */}
46
- {!initialized && isLoading ? (
47
- <div className="flex items-center justify-center py-16">
48
- <div className="animate-spin w-6 h-6 border-2 border-[var(--color-brand)] border-t-transparent rounded-full" />
49
- </div>
50
- ) : tasks.length === 0 ? (
51
- <TaskEmptyState onCreateTask={() => openModal('new-task')} />
52
- ) : (
53
- <TaskList tasks={tasks} />
54
- )}
55
- </div>
56
-
57
- {/* New Task Modal */}
58
- {activeModal === 'new-task' && (
59
- <NewTaskModal
60
- open
61
- onClose={closeModal}
62
- />
63
- )}
64
- </div>
65
- )
66
- }
@@ -1,152 +0,0 @@
1
- import { useTranslation } from '../i18n'
2
- import { mockStatusBar } from '../mocks/data'
3
-
4
- export function ScheduledTasksEmpty() {
5
- const t = useTranslation()
6
- return (
7
- <div className="bg-[#FAF9F5] text-[#1B1C1A] flex min-h-screen font-[Inter,sans-serif]">
8
- {/* SideNavBar */}
9
- <aside className="fixed left-0 top-0 h-full w-[280px] bg-[#F4F4F0] flex flex-col p-4 gap-2 text-sm font-medium z-40">
10
- <div className="flex items-center gap-3 px-2 mb-6 mt-12">
11
- <div className="w-8 h-8 rounded bg-[#E3E2DF] flex items-center justify-center">
12
- <span className="material-symbols-outlined text-[#87736D]">filter_list</span>
13
- </div>
14
- <div>
15
- <div className="text-[#1B1C1A] font-bold">{t('sidebar.allProjects')}</div>
16
- <div className="text-[10px] text-[#87736D] uppercase tracking-widest">{t('scheduledPage.activeSession')}</div>
17
- </div>
18
- </div>
19
-
20
- <nav className="flex-1 space-y-1">
21
- <div className="px-3 py-2 text-[#87736D] hover:bg-[#EBEBE6] transition-all rounded-lg cursor-pointer duration-200 ease-in-out flex items-center gap-3">
22
- <span className="material-symbols-outlined">add</span>
23
- <span>{t('sidebar.newSession')}</span>
24
- </div>
25
- {/* Active State: Scheduled */}
26
- <div className="px-3 py-2 bg-[#FAF9F5] text-[#1B1C1A] rounded-lg relative before:content-[''] before:absolute before:left-[-8px] before:w-1 before:h-4 before:bg-[#8F482F] before:rounded-full cursor-pointer duration-200 ease-in-out flex items-center gap-3">
27
- <span className="material-symbols-outlined">calendar_today</span>
28
- <span>{t('sidebar.scheduled')}</span>
29
- </div>
30
- <div className="px-3 py-2 text-[#87736D] hover:bg-[#EBEBE6] transition-all rounded-lg cursor-pointer duration-200 ease-in-out flex items-center gap-3">
31
- <span className="material-symbols-outlined">history</span>
32
- <span>{t('sidebar.timeGroup.today')}</span>
33
- </div>
34
- <div className="px-3 py-2 text-[#87736D] hover:bg-[#EBEBE6] transition-all rounded-lg cursor-pointer duration-200 ease-in-out flex items-center gap-3">
35
- <span className="material-symbols-outlined">event_note</span>
36
- <span>{t('sidebar.timeGroup.last7days')}</span>
37
- </div>
38
- <div className="px-3 py-2 text-[#87736D] hover:bg-[#EBEBE6] transition-all rounded-lg cursor-pointer duration-200 ease-in-out flex items-center gap-3">
39
- <span className="material-symbols-outlined">archive</span>
40
- <span>{t('sidebar.timeGroup.older')}</span>
41
- </div>
42
- </nav>
43
-
44
- <div className="mt-auto pt-4 border-t border-[#87736D]/10">
45
- <div className="text-[10px] text-[#87736D] uppercase tracking-widest px-3 mb-2">{t('scheduledPage.executionMode')}</div>
46
- <div className="px-3 py-2 text-[#87736D] hover:bg-[#EBEBE6] transition-all rounded-lg cursor-pointer duration-200 ease-in-out flex items-center gap-3">
47
- <span className="material-symbols-outlined">computer</span>
48
- <span>{t('scheduledPage.localMode')}</span>
49
- </div>
50
- <div className="px-3 py-2 text-[#87736D] hover:bg-[#EBEBE6] transition-all rounded-lg cursor-pointer duration-200 ease-in-out flex items-center gap-3">
51
- <span className="material-symbols-outlined">cloud</span>
52
- <span>{t('scheduledPage.remoteMode')}</span>
53
- </div>
54
- </div>
55
- </aside>
56
-
57
- {/* Main Canvas */}
58
- <main className="flex-1 ml-[280px] flex flex-col min-h-screen">
59
- {/* TopAppBar */}
60
- <header className="fixed top-0 right-0 left-[280px] z-30 bg-[#FAF9F5] flex justify-between items-center px-6 h-12 w-full border-b border-[#F4F4F0]">
61
- <div className="flex items-center gap-6 h-full">
62
- <div className="text-sm font-bold text-[#1B1C1A] uppercase tracking-tighter font-[Manrope,sans-serif]">Claude Code Companion</div>
63
- <nav className="flex items-center gap-4 h-full font-[Manrope,sans-serif] font-semibold tracking-wide text-sm">
64
- <span className="text-[#87736D] hover:text-[#8F482F] transition-colors cursor-pointer active:opacity-70 h-full flex items-center">{t('titlebar.code')}</span>
65
- <span className="text-[#87736D] hover:text-[#8F482F] transition-colors cursor-pointer active:opacity-70 h-full flex items-center">{t('titlebar.terminal')}</span>
66
- <span className="text-[#1B1C1A] border-b-2 border-[#8F482F] pb-1 h-full flex items-center pt-1">{t('titlebar.history')}</span>
67
- </nav>
68
- </div>
69
- <div className="flex items-center gap-4">
70
- <div className="flex items-center gap-1">
71
- <span className="material-symbols-outlined text-[#87736D] text-sm cursor-pointer">arrow_back_ios</span>
72
- <span className="material-symbols-outlined text-[#87736D] text-sm cursor-pointer">arrow_forward_ios</span>
73
- </div>
74
- <div className="h-4 w-[1px] bg-[#87736D]/20"></div>
75
- <div className="text-[#87736D] hover:text-[#8F482F] transition-colors cursor-pointer text-xs font-semibold uppercase tracking-wider">{t('sidebar.settings')}</div>
76
- </div>
77
- </header>
78
-
79
- {/* Content Area */}
80
- <div className="flex-1 mt-12 mb-8 flex flex-col items-center justify-center p-8 bg-[#FAF9F5]">
81
- <div className="max-w-2xl w-full text-center">
82
- <h1 className="text-3xl font-[Manrope,sans-serif] font-extrabold text-[#1B1C1A] tracking-tight mb-16">{t('scheduledPage.title')}</h1>
83
-
84
- {/* Empty State Illustration/Card */}
85
- <div className="relative group">
86
- {/* Architectural Background Detail */}
87
- <div className="absolute -inset-4 bg-[#F4F4F0] rounded-[32px] -z-10 transition-all"></div>
88
- <div className="flex flex-col items-center py-20 px-8">
89
- <div className="w-32 h-32 rounded-full bg-[#E9E8E4] flex items-center justify-center mb-10 shadow-sm">
90
- <div className="w-20 h-20 rounded-full bg-white flex items-center justify-center border border-[#DAC1BA]/10">
91
- <span
92
- className="material-symbols-outlined text-[#8F482F] text-5xl"
93
- style={{ fontVariationSettings: "'wght' 300" }}
94
- >
95
- schedule
96
- </span>
97
- </div>
98
- </div>
99
- <p className="text-[#54433E] font-[Inter,sans-serif] text-lg max-w-sm mx-auto leading-relaxed mb-12">
100
- {t('tasks.emptyTitle')} {t('tasks.emptyDesc')}
101
- </p>
102
- <button className="group relative px-8 py-4 bg-[#8F482F] text-white rounded-xl font-[Manrope,sans-serif] font-bold text-sm tracking-wide shadow-lg hover:shadow-[#8F482F]/20 transition-all flex items-center gap-3 overflow-hidden">
103
- <div className="absolute inset-0 bg-gradient-to-b from-white/10 to-transparent opacity-30"></div>
104
- <span className="material-symbols-outlined text-lg">add_task</span>
105
- <span>{t('tasks.newTask')}</span>
106
- </button>
107
- </div>
108
- </div>
109
-
110
- {/* Subtle Decorative Bento Elements */}
111
- <div className="grid grid-cols-3 gap-4 mt-20 opacity-40">
112
- <div className="h-24 bg-[#F4F4F0] rounded-xl border border-[#DAC1BA]/10 flex flex-col items-center justify-center p-4">
113
- <span className="material-symbols-outlined text-[#87736D] mb-2">commit</span>
114
- <div className="w-12 h-1 bg-[#DAC1BA]/30 rounded-full"></div>
115
- </div>
116
- <div className="h-24 bg-[#F4F4F0] rounded-xl border border-[#DAC1BA]/10 flex flex-col items-center justify-center p-4">
117
- <span className="material-symbols-outlined text-[#87736D] mb-2">terminal</span>
118
- <div className="w-8 h-1 bg-[#DAC1BA]/30 rounded-full"></div>
119
- </div>
120
- <div className="h-24 bg-[#F4F4F0] rounded-xl border border-[#DAC1BA]/10 flex flex-col items-center justify-center p-4">
121
- <span className="material-symbols-outlined text-[#87736D] mb-2">code_blocks</span>
122
- <div className="w-10 h-1 bg-[#DAC1BA]/30 rounded-full"></div>
123
- </div>
124
- </div>
125
- </div>
126
- </div>
127
-
128
- {/* Footer */}
129
- <footer className="fixed bottom-0 left-0 w-full h-8 bg-[#FAF9F5] flex items-center justify-between px-4 z-50 border-t border-[#87736D]/20 font-[Inter,sans-serif] text-xs tracking-tight">
130
- <div className="flex items-center gap-3 text-[#87736D]">
131
- <div className="w-2 h-2 rounded-full bg-[#677B4E]"></div>
132
- <span>{mockStatusBar.user} &bull; {mockStatusBar.username} &bull; {mockStatusBar.plan}</span>
133
- </div>
134
- <div className="flex items-center gap-6">
135
- <span className="text-[#87736D] hover:bg-[#F4F4F0] px-2 py-0.5 rounded transition-colors cursor-pointer flex items-center gap-1">
136
- <span className="material-symbols-outlined text-[14px]">account_tree</span>
137
- {mockStatusBar.branch}
138
- </span>
139
- <span className="text-[#87736D] hover:bg-[#F4F4F0] px-2 py-0.5 rounded transition-colors cursor-pointer flex items-center gap-1">
140
- <span className="material-symbols-outlined text-[14px]">workspaces</span>
141
- {mockStatusBar.worktreeToggle}
142
- </span>
143
- <span className="text-[#8F482F] font-bold hover:bg-[#F4F4F0] px-2 py-0.5 rounded transition-colors cursor-pointer flex items-center gap-1">
144
- <span className="material-symbols-outlined text-[14px]">toggle_on</span>
145
- {mockStatusBar.localSwitch}
146
- </span>
147
- </div>
148
- </footer>
149
- </main>
150
- </div>
151
- )
152
- }