@agent-native/core 0.161.16 → 0.161.20
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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/analytics/AGENTS.md +1 -0
- package/corpus/templates/analytics/server/plugins/auth.ts +4 -0
- package/corpus/templates/assets/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/assets/AGENTS.md +1 -0
- package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/brain/AGENTS.md +1 -0
- package/corpus/templates/calendar/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/calendar/AGENTS.md +1 -0
- package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/chat/AGENTS.md +4 -0
- package/corpus/templates/chat/vitest.config.ts +12 -7
- package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/clips/AGENTS.md +1 -0
- package/corpus/templates/clips/app/components/player/video-player.tsx +4 -0
- package/corpus/templates/clips/app/hooks/use-playback-position.ts +10 -2
- package/corpus/templates/clips/app/routes/embed.$shareId.tsx +1 -0
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +26 -25
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +1 -0
- package/corpus/templates/clips/changelog/2026-08-18-clips-no-longer-opens-welcome-window-on-first-launch.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-18-clips-now-recovers-interrupted-uploads-and-reliably-restarts.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-18-meeting-notifications-no-longer-show-decorative-left-side-lines.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-18-pending-recording-files-now-use-a-clips-prefixed-name.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/updater.ts +21 -1
- package/corpus/templates/clips/desktop/src/main.tsx +0 -3
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +0 -4
- package/corpus/templates/clips/desktop/src/shared/config.ts +0 -1
- package/corpus/templates/clips/desktop/src/styles.css +0 -136
- package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +0 -1
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +0 -45
- package/corpus/templates/clips/desktop/src-tauri/src/config.rs +1 -4
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +3 -11
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +63 -8
- package/corpus/templates/clips/desktop/src-tauri/src/util.rs +98 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +54 -20
- package/corpus/templates/content/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/content/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/content/AGENTS.md +1 -0
- package/corpus/templates/crm/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/crm/AGENTS.md +1 -0
- package/corpus/templates/design/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/design/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/design/AGENTS.md +1 -0
- package/corpus/templates/design/app/global.css +6 -0
- package/corpus/templates/design/app/i18n-data.ts +11 -0
- package/corpus/templates/design/app/lib/agent-chat.ts +9 -8
- package/corpus/templates/design/app/root.tsx +1 -1
- package/corpus/templates/design/changelog/2026-08-18-design-chat-context-stays-out-of-the-composer.md +6 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +2 -0
- package/corpus/templates/dispatch/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/dispatch/AGENTS.md +5 -5
- package/corpus/templates/factory/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/factory/AGENTS.md +1 -0
- package/corpus/templates/forms/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/forms/AGENTS.md +1 -0
- package/corpus/templates/macros/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/macros/AGENTS.md +1 -0
- package/corpus/templates/mail/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/mail/AGENTS.md +1 -0
- package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/plan/AGENTS.md +1 -0
- package/corpus/templates/slides/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/slides/AGENTS.md +2 -1
- package/corpus/templates/tasks/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +29 -2
- package/corpus/templates/tasks/AGENTS.md +1 -0
- package/dist/action.d.ts +1 -0
- package/dist/action.js +44 -2
- package/dist/agent/production-agent.js +28 -5
- package/dist/client/chat/run-recovery.js +1 -1
- package/dist/client/route-state.js +17 -13
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +5 -5
- package/dist/secrets/routes.d.ts +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.d.ts +6 -0
- package/dist/server/auth.js +23 -5
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/templates/chat/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/dist/templates/chat/.agents/skills/secrets/SKILL.md +29 -2
- package/dist/templates/chat/AGENTS.md +4 -0
- package/dist/templates/chat/vitest.config.ts +12 -7
- package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +29 -2
- package/dist/templates/default/AGENTS.md +4 -0
- package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +29 -2
- package/dist/templates/headless/AGENTS.md +4 -0
- package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +29 -2
- package/dist/templates/workspace-core/AGENTS.md +4 -0
- package/dist/templates/workspace-root/AGENTS.md +9 -0
- package/docs/content/deployment.mdx +70 -0
- package/docs/content/faq.mdx +1 -1
- package/package.json +1 -1
- package/src/templates/chat/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/src/templates/chat/.agents/skills/secrets/SKILL.md +29 -2
- package/src/templates/chat/AGENTS.md +4 -0
- package/src/templates/chat/vitest.config.ts +12 -7
- package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/src/templates/default/.agents/skills/secrets/SKILL.md +29 -2
- package/src/templates/default/AGENTS.md +4 -0
- package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +29 -2
- package/src/templates/headless/AGENTS.md +4 -0
- package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +10 -0
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +24 -0
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +29 -2
- package/src/templates/workspace-core/AGENTS.md +4 -0
- package/src/templates/workspace-root/AGENTS.md +9 -0
- package/corpus/templates/clips/desktop/src/overlays/onboarding.tsx +0 -314
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import { IconCircleCheck, IconCircleOff } from "@tabler/icons-react";
|
|
2
|
-
import { invoke } from "@tauri-apps/api/core";
|
|
3
|
-
import { open as openExternal } from "@tauri-apps/plugin-shell";
|
|
4
|
-
import { useEffect, useState } from "react";
|
|
5
|
-
|
|
6
|
-
import { isMacPlatform } from "../lib/platform";
|
|
7
|
-
|
|
8
|
-
type PermissionPane =
|
|
9
|
-
| "microphone"
|
|
10
|
-
| "speech"
|
|
11
|
-
| "accessibility"
|
|
12
|
-
| "input-monitoring";
|
|
13
|
-
|
|
14
|
-
type PermissionStatuses = {
|
|
15
|
-
screen: boolean;
|
|
16
|
-
camera: boolean;
|
|
17
|
-
microphone: boolean;
|
|
18
|
-
speech: boolean;
|
|
19
|
-
accessibility: boolean;
|
|
20
|
-
inputMonitoring: boolean;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const PERMISSION_CARDS: Array<{
|
|
24
|
-
pane: PermissionPane;
|
|
25
|
-
key: keyof PermissionStatuses;
|
|
26
|
-
name: string;
|
|
27
|
-
desc: string;
|
|
28
|
-
}> = [
|
|
29
|
-
{
|
|
30
|
-
pane: "microphone",
|
|
31
|
-
key: "microphone",
|
|
32
|
-
name: "Microphone",
|
|
33
|
-
desc: "Needed to hear you for dictation and meeting transcripts.",
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
pane: "speech",
|
|
37
|
-
key: "speech",
|
|
38
|
-
name: "Speech Recognition",
|
|
39
|
-
desc: "Turns your voice into text on-device.",
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
pane: "accessibility",
|
|
43
|
-
key: "accessibility",
|
|
44
|
-
name: "Accessibility",
|
|
45
|
-
desc: "Lets Clips paste dictated text into other apps.",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
pane: "input-monitoring",
|
|
49
|
-
key: "inputMonitoring",
|
|
50
|
-
name: "Input Monitoring",
|
|
51
|
-
desc: "Only needed for the hold-Fn dictation shortcut.",
|
|
52
|
-
},
|
|
53
|
-
];
|
|
54
|
-
|
|
55
|
-
// Fallback deep-links when the native `open_macos_privacy_settings` command
|
|
56
|
-
// fails — same URLs the main app window uses.
|
|
57
|
-
const MACOS_PRIVACY_URLS: Record<PermissionPane, string> = {
|
|
58
|
-
microphone:
|
|
59
|
-
"x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension?Privacy_Microphone",
|
|
60
|
-
speech:
|
|
61
|
-
"x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension?Privacy_SpeechRecognition",
|
|
62
|
-
accessibility:
|
|
63
|
-
"x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension?Privacy_Accessibility",
|
|
64
|
-
"input-monitoring":
|
|
65
|
-
"x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension?Privacy_ListenEvent",
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
function openPermissionSettings(pane: PermissionPane): void {
|
|
69
|
-
invoke("open_macos_privacy_settings", { pane }).catch(() => {
|
|
70
|
-
openExternal(MACOS_PRIVACY_URLS[pane]).catch((err) => {
|
|
71
|
-
console.error("[onboarding] open privacy settings failed", err);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* First-launch overlay. Full-screen with a solid dark background — NOT
|
|
78
|
-
* transparent like countdown/finalizing.
|
|
79
|
-
*
|
|
80
|
-
* Two steps:
|
|
81
|
-
* 1. Feature selection — three cards with checkboxes (all checked by
|
|
82
|
-
* default).
|
|
83
|
-
* 2. Permissions (macOS, when Voice Dictation or Meetings is enabled) —
|
|
84
|
-
* live permission-status cards polled every 2s so they flip to granted
|
|
85
|
-
* as the user works through System Settings. Never blocks: the primary
|
|
86
|
-
* button always continues.
|
|
87
|
-
*
|
|
88
|
-
* Finishing calls `set_feature_config` with the chosen features +
|
|
89
|
-
* `onboardingComplete: true`, then opens the popover via `show_popover`.
|
|
90
|
-
*/
|
|
91
|
-
export function Onboarding() {
|
|
92
|
-
const [clips, setClips] = useState(true);
|
|
93
|
-
const [meetings, setMeetings] = useState(true);
|
|
94
|
-
const [voice, setVoice] = useState(true);
|
|
95
|
-
const [submitting, setSubmitting] = useState(false);
|
|
96
|
-
const [step, setStep] = useState<"features" | "permissions">("features");
|
|
97
|
-
const [statuses, setStatuses] = useState<PermissionStatuses | null>(null);
|
|
98
|
-
|
|
99
|
-
const needsPermissionsStep = (voice || meetings) && isMacPlatform();
|
|
100
|
-
|
|
101
|
-
useEffect(() => {
|
|
102
|
-
if (step !== "permissions") return;
|
|
103
|
-
let cancelled = false;
|
|
104
|
-
const check = () => {
|
|
105
|
-
invoke<PermissionStatuses>("check_permission_statuses")
|
|
106
|
-
.then((next) => {
|
|
107
|
-
if (!cancelled) setStatuses(next);
|
|
108
|
-
})
|
|
109
|
-
.catch(() => {
|
|
110
|
-
// Command unavailable — leave statuses null (cards show no status).
|
|
111
|
-
});
|
|
112
|
-
};
|
|
113
|
-
check();
|
|
114
|
-
const id = setInterval(check, 2_000);
|
|
115
|
-
return () => {
|
|
116
|
-
cancelled = true;
|
|
117
|
-
clearInterval(id);
|
|
118
|
-
};
|
|
119
|
-
}, [step]);
|
|
120
|
-
|
|
121
|
-
async function finish() {
|
|
122
|
-
if (submitting) return;
|
|
123
|
-
setSubmitting(true);
|
|
124
|
-
try {
|
|
125
|
-
await invoke("set_feature_config", {
|
|
126
|
-
config: {
|
|
127
|
-
clipsEnabled: clips,
|
|
128
|
-
meetingsEnabled: meetings,
|
|
129
|
-
voiceEnabled: voice,
|
|
130
|
-
voiceCleanupEnabled: true,
|
|
131
|
-
launchAtLoginEnabled: true,
|
|
132
|
-
autoHidePopoverEnabled: false,
|
|
133
|
-
meetingTranscriptionMode: "ask",
|
|
134
|
-
showMeetingWidgetEnabled: true,
|
|
135
|
-
showInScreenCapture: false,
|
|
136
|
-
onboardingComplete: true,
|
|
137
|
-
},
|
|
138
|
-
});
|
|
139
|
-
await invoke("show_popover");
|
|
140
|
-
// Close the onboarding window itself — show_popover only opens the
|
|
141
|
-
// popover, it doesn't know an onboarding window exists to dismiss.
|
|
142
|
-
await invoke("hide_onboarding_window");
|
|
143
|
-
} catch (err) {
|
|
144
|
-
console.error(
|
|
145
|
-
"[onboarding] set_feature_config / show_popover failed",
|
|
146
|
-
err,
|
|
147
|
-
);
|
|
148
|
-
setSubmitting(false);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function handleFeaturesContinue() {
|
|
153
|
-
if (needsPermissionsStep) {
|
|
154
|
-
setStep("permissions");
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
void finish();
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
if (step === "permissions") {
|
|
161
|
-
const allGranted =
|
|
162
|
-
statuses !== null && PERMISSION_CARDS.every((card) => statuses[card.key]);
|
|
163
|
-
return (
|
|
164
|
-
<div className="onboarding-root">
|
|
165
|
-
<div className="onboarding-card">
|
|
166
|
-
<h1 className="onboarding-title">Permissions</h1>
|
|
167
|
-
<p className="onboarding-subtitle">
|
|
168
|
-
Grant these in System Settings — Clips updates automatically
|
|
169
|
-
</p>
|
|
170
|
-
|
|
171
|
-
<div className="onboarding-features">
|
|
172
|
-
{PERMISSION_CARDS.map((card) => {
|
|
173
|
-
const granted = statuses ? statuses[card.key] : null;
|
|
174
|
-
return (
|
|
175
|
-
<div
|
|
176
|
-
className="onboarding-feature"
|
|
177
|
-
key={card.pane}
|
|
178
|
-
style={{ cursor: "default" }}
|
|
179
|
-
>
|
|
180
|
-
<span
|
|
181
|
-
aria-label={
|
|
182
|
-
granted === null
|
|
183
|
-
? undefined
|
|
184
|
-
: granted
|
|
185
|
-
? "Granted"
|
|
186
|
-
: "Not granted"
|
|
187
|
-
}
|
|
188
|
-
style={{
|
|
189
|
-
display: "inline-flex",
|
|
190
|
-
flexShrink: 0,
|
|
191
|
-
marginTop: 1,
|
|
192
|
-
color: granted ? "#4ade80" : "#a3a3a3",
|
|
193
|
-
}}
|
|
194
|
-
>
|
|
195
|
-
{granted ? (
|
|
196
|
-
<IconCircleCheck size={18} stroke={2} />
|
|
197
|
-
) : (
|
|
198
|
-
<IconCircleOff size={18} stroke={2} />
|
|
199
|
-
)}
|
|
200
|
-
</span>
|
|
201
|
-
<div className="onboarding-feature-text">
|
|
202
|
-
<span className="onboarding-feature-name">{card.name}</span>
|
|
203
|
-
<span className="onboarding-feature-desc">{card.desc}</span>
|
|
204
|
-
</div>
|
|
205
|
-
{!granted ? (
|
|
206
|
-
<button
|
|
207
|
-
type="button"
|
|
208
|
-
onClick={() => openPermissionSettings(card.pane)}
|
|
209
|
-
style={{
|
|
210
|
-
marginLeft: "auto",
|
|
211
|
-
alignSelf: "center",
|
|
212
|
-
flexShrink: 0,
|
|
213
|
-
padding: "5px 10px",
|
|
214
|
-
borderRadius: 8,
|
|
215
|
-
border: "1px solid rgba(255, 255, 255, 0.15)",
|
|
216
|
-
background: "rgba(255, 255, 255, 0.08)",
|
|
217
|
-
color: "#f5f5f5",
|
|
218
|
-
fontSize: 12,
|
|
219
|
-
fontWeight: 500,
|
|
220
|
-
cursor: "pointer",
|
|
221
|
-
}}
|
|
222
|
-
>
|
|
223
|
-
Open
|
|
224
|
-
</button>
|
|
225
|
-
) : null}
|
|
226
|
-
</div>
|
|
227
|
-
);
|
|
228
|
-
})}
|
|
229
|
-
</div>
|
|
230
|
-
|
|
231
|
-
<button
|
|
232
|
-
className="onboarding-cta"
|
|
233
|
-
onClick={() => void finish()}
|
|
234
|
-
disabled={submitting}
|
|
235
|
-
>
|
|
236
|
-
{submitting
|
|
237
|
-
? "Setting up..."
|
|
238
|
-
: allGranted
|
|
239
|
-
? "Get Started"
|
|
240
|
-
: "Continue anyway"}
|
|
241
|
-
</button>
|
|
242
|
-
</div>
|
|
243
|
-
</div>
|
|
244
|
-
);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return (
|
|
248
|
-
<div className="onboarding-root">
|
|
249
|
-
<div className="onboarding-card">
|
|
250
|
-
<h1 className="onboarding-title">Welcome to Clips</h1>
|
|
251
|
-
<p className="onboarding-subtitle">Choose your features</p>
|
|
252
|
-
|
|
253
|
-
<div className="onboarding-features">
|
|
254
|
-
<label className="onboarding-feature">
|
|
255
|
-
<input
|
|
256
|
-
type="checkbox"
|
|
257
|
-
checked={clips}
|
|
258
|
-
onChange={(e) => setClips(e.target.checked)}
|
|
259
|
-
className="onboarding-checkbox"
|
|
260
|
-
/>
|
|
261
|
-
<div className="onboarding-feature-text">
|
|
262
|
-
<span className="onboarding-feature-name">Screen Recording</span>
|
|
263
|
-
<span className="onboarding-feature-desc">
|
|
264
|
-
Record your screen, camera, or both
|
|
265
|
-
</span>
|
|
266
|
-
</div>
|
|
267
|
-
</label>
|
|
268
|
-
|
|
269
|
-
<label className="onboarding-feature">
|
|
270
|
-
<input
|
|
271
|
-
type="checkbox"
|
|
272
|
-
checked={meetings}
|
|
273
|
-
onChange={(e) => setMeetings(e.target.checked)}
|
|
274
|
-
className="onboarding-checkbox"
|
|
275
|
-
/>
|
|
276
|
-
<div className="onboarding-feature-text">
|
|
277
|
-
<span className="onboarding-feature-name">Meeting Notes</span>
|
|
278
|
-
<span className="onboarding-feature-desc">
|
|
279
|
-
AI-powered meeting transcription and note enhancement
|
|
280
|
-
</span>
|
|
281
|
-
</div>
|
|
282
|
-
</label>
|
|
283
|
-
|
|
284
|
-
<label className="onboarding-feature">
|
|
285
|
-
<input
|
|
286
|
-
type="checkbox"
|
|
287
|
-
checked={voice}
|
|
288
|
-
onChange={(e) => setVoice(e.target.checked)}
|
|
289
|
-
className="onboarding-checkbox"
|
|
290
|
-
/>
|
|
291
|
-
<div className="onboarding-feature-text">
|
|
292
|
-
<span className="onboarding-feature-name">Voice Dictation</span>
|
|
293
|
-
<span className="onboarding-feature-desc">
|
|
294
|
-
Speak to type anywhere on your Mac
|
|
295
|
-
</span>
|
|
296
|
-
</div>
|
|
297
|
-
</label>
|
|
298
|
-
</div>
|
|
299
|
-
|
|
300
|
-
<button
|
|
301
|
-
className="onboarding-cta"
|
|
302
|
-
onClick={handleFeaturesContinue}
|
|
303
|
-
disabled={submitting}
|
|
304
|
-
>
|
|
305
|
-
{submitting
|
|
306
|
-
? "Setting up..."
|
|
307
|
-
: needsPermissionsStep
|
|
308
|
-
? "Continue"
|
|
309
|
-
: "Get Started"}
|
|
310
|
-
</button>
|
|
311
|
-
</div>
|
|
312
|
-
</div>
|
|
313
|
-
);
|
|
314
|
-
}
|