visionos-monorepo 0.1.0
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/.claude/worktrees/competent-burnell-8d1330/README.md +138 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/package.json +35 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/scripts/copy-web-assets.mjs +12 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/logout.ts +12 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/open.ts +19 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/start.ts +97 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/status.ts +23 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/userinfo.ts +47 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/index.ts +23 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/lib/auth.ts +84 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/lib/browser.ts +37 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/lib/localState.ts +80 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/lib/runtime.ts +203 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/runtime/index.ts +36 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/src/types/inquirer.d.ts +9 -0
- package/.claude/worktrees/competent-burnell-8d1330/cli/tsconfig.json +19 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/index.html +15 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/package.json +27 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/postcss.config.cjs +7 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/src/App.tsx +57 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/src/components/CliAuthPage.tsx +385 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/src/components/ManifestoPage.tsx +946 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/src/components/TrackCard.tsx +19 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/src/lib/api.ts +58 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/src/main.tsx +11 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/src/styles/index.css +33 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/src/styles/manifesto.css +1398 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/tailwind.config.ts +36 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/tsconfig.json +25 -0
- package/.claude/worktrees/competent-burnell-8d1330/client/vite.config.ts +20 -0
- package/.claude/worktrees/competent-burnell-8d1330/package-lock.json +5278 -0
- package/.claude/worktrees/competent-burnell-8d1330/package.json +24 -0
- package/.claude/worktrees/competent-burnell-8d1330/server/package.json +25 -0
- package/.claude/worktrees/competent-burnell-8d1330/server/src/app.ts +71 -0
- package/.claude/worktrees/competent-burnell-8d1330/server/src/config/env.ts +14 -0
- package/.claude/worktrees/competent-burnell-8d1330/server/src/features/auth/sessionStore.ts +74 -0
- package/.claude/worktrees/competent-burnell-8d1330/server/src/index.ts +8 -0
- package/.claude/worktrees/competent-burnell-8d1330/server/src/routes/auth.ts +112 -0
- package/.claude/worktrees/competent-burnell-8d1330/server/src/routes/health.ts +14 -0
- package/.claude/worktrees/competent-burnell-8d1330/server/tsconfig.json +19 -0
- package/.claude/worktrees/competent-burnell-8d1330/shared/package.json +24 -0
- package/.claude/worktrees/competent-burnell-8d1330/shared/src/index.ts +91 -0
- package/.claude/worktrees/competent-burnell-8d1330/shared/tsconfig.json +16 -0
- package/.claude/worktrees/competent-burnell-8d1330/tsconfig.base.json +12 -0
- package/.claude/worktrees/competent-burnell-8d1330/visionos-manifesto/index.html +392 -0
- package/.claude/worktrees/competent-burnell-8d1330/visionos-manifesto/script.js +146 -0
- package/.claude/worktrees/competent-burnell-8d1330/visionos-manifesto/styles.css +1082 -0
- package/.claude/worktrees/vigilant-napier-0de76f/README.md +138 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/package.json +35 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/scripts/copy-web-assets.mjs +12 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/logout.ts +12 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/open.ts +19 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/start.ts +97 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/status.ts +23 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/userinfo.ts +47 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/index.ts +23 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/lib/auth.ts +84 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/lib/browser.ts +37 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/lib/localState.ts +80 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/lib/runtime.ts +203 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/runtime/index.ts +36 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/src/types/inquirer.d.ts +9 -0
- package/.claude/worktrees/vigilant-napier-0de76f/cli/tsconfig.json +19 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/index.html +15 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/package.json +27 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/postcss.config.cjs +7 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/src/App.tsx +57 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/src/components/CliAuthPage.tsx +385 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/src/components/ManifestoPage.tsx +946 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/src/components/TrackCard.tsx +19 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/src/lib/api.ts +58 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/src/main.tsx +11 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/src/styles/index.css +33 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/src/styles/manifesto.css +1398 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/tailwind.config.ts +36 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/tsconfig.json +25 -0
- package/.claude/worktrees/vigilant-napier-0de76f/client/vite.config.ts +20 -0
- package/.claude/worktrees/vigilant-napier-0de76f/package-lock.json +5278 -0
- package/.claude/worktrees/vigilant-napier-0de76f/package.json +24 -0
- package/.claude/worktrees/vigilant-napier-0de76f/server/package.json +25 -0
- package/.claude/worktrees/vigilant-napier-0de76f/server/src/app.ts +71 -0
- package/.claude/worktrees/vigilant-napier-0de76f/server/src/config/env.ts +14 -0
- package/.claude/worktrees/vigilant-napier-0de76f/server/src/features/auth/sessionStore.ts +74 -0
- package/.claude/worktrees/vigilant-napier-0de76f/server/src/index.ts +8 -0
- package/.claude/worktrees/vigilant-napier-0de76f/server/src/routes/auth.ts +112 -0
- package/.claude/worktrees/vigilant-napier-0de76f/server/src/routes/health.ts +14 -0
- package/.claude/worktrees/vigilant-napier-0de76f/server/tsconfig.json +19 -0
- package/.claude/worktrees/vigilant-napier-0de76f/shared/package.json +24 -0
- package/.claude/worktrees/vigilant-napier-0de76f/shared/src/index.ts +91 -0
- package/.claude/worktrees/vigilant-napier-0de76f/shared/tsconfig.json +16 -0
- package/.claude/worktrees/vigilant-napier-0de76f/tsconfig.base.json +12 -0
- package/.claude/worktrees/vigilant-napier-0de76f/visionos-manifesto/index.html +392 -0
- package/.claude/worktrees/vigilant-napier-0de76f/visionos-manifesto/script.js +146 -0
- package/.claude/worktrees/vigilant-napier-0de76f/visionos-manifesto/styles.css +1082 -0
- package/.github/workflows/publish.yml +30 -0
- package/README.md +175 -0
- package/cli/README.md +165 -0
- package/cli/package.json +36 -0
- package/cli/scripts/copy-web-assets.mjs +12 -0
- package/cli/src/commands/lessons.ts +68 -0
- package/cli/src/commands/login.ts +46 -0
- package/cli/src/commands/logout.ts +12 -0
- package/cli/src/commands/open.ts +29 -0
- package/cli/src/commands/start.ts +146 -0
- package/cli/src/commands/status.ts +28 -0
- package/cli/src/commands/userinfo.ts +59 -0
- package/cli/src/index.ts +109 -0
- package/cli/src/lib/auth.ts +84 -0
- package/cli/src/lib/browser.ts +37 -0
- package/cli/src/lib/content.ts +57 -0
- package/cli/src/lib/lessonPrinter.ts +38 -0
- package/cli/src/lib/lessonRunner.ts +381 -0
- package/cli/src/lib/localState.ts +114 -0
- package/cli/src/lib/loginFlow.ts +74 -0
- package/cli/src/lib/progress.ts +94 -0
- package/cli/src/lib/runtime.ts +220 -0
- package/cli/src/lib/validator.ts +401 -0
- package/cli/src/runtime/index.ts +108 -0
- package/cli/src/types/inquirer.d.ts +9 -0
- package/cli/tsconfig.json +19 -0
- package/client/index.html +15 -0
- package/client/package.json +27 -0
- package/client/postcss.config.cjs +7 -0
- package/client/src/App.tsx +102 -0
- package/client/src/components/AccountPage.tsx +79 -0
- package/client/src/components/AuthPanel.tsx +312 -0
- package/client/src/components/CliAuthPage.tsx +367 -0
- package/client/src/components/CreatorPortal.tsx +885 -0
- package/client/src/components/ErrorBoundary.tsx +92 -0
- package/client/src/components/ManifestoPage.tsx +1126 -0
- package/client/src/components/TrackCard.tsx +19 -0
- package/client/src/lib/api.ts +215 -0
- package/client/src/main.tsx +14 -0
- package/client/src/styles/index.css +33 -0
- package/client/src/styles/manifesto.css +1828 -0
- package/client/tailwind.config.ts +36 -0
- package/client/tsconfig.json +25 -0
- package/client/vercel.json +8 -0
- package/client/vite.config.ts +33 -0
- package/package.json +27 -0
- package/server/package.json +26 -0
- package/server/src/app.ts +132 -0
- package/server/src/config/env.ts +135 -0
- package/server/src/features/accounts/accountStore.ts +359 -0
- package/server/src/features/accounts/contentStore.ts +264 -0
- package/server/src/features/accounts/password.ts +26 -0
- package/server/src/features/auth/sessionStore.ts +79 -0
- package/server/src/index.ts +8 -0
- package/server/src/routes/auth.ts +328 -0
- package/server/src/routes/content.ts +174 -0
- package/server/src/routes/health.ts +14 -0
- package/server/src/routes/progress.ts +105 -0
- package/server/tsconfig.json +19 -0
- package/shared/package.json +24 -0
- package/shared/src/index.ts +455 -0
- package/shared/tsconfig.json +16 -0
- package/tsconfig.base.json +12 -0
- package/visionos-manifesto/index.html +392 -0
- package/visionos-manifesto/script.js +146 -0
- package/visionos-manifesto/styles.css +1082 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface TrackCardProps {
|
|
2
|
+
title: string;
|
|
3
|
+
description: string;
|
|
4
|
+
accentClass: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function TrackCard({ title, description, accentClass }: TrackCardProps) {
|
|
8
|
+
return (
|
|
9
|
+
<article
|
|
10
|
+
className={`rounded-[1.75rem] border p-6 shadow-panel transition-transform duration-300 hover:-translate-y-1 ${accentClass}`}
|
|
11
|
+
>
|
|
12
|
+
<div className="space-y-3">
|
|
13
|
+
<h3 className="text-2xl font-bold text-ink">{title}</h3>
|
|
14
|
+
<p className="text-sm leading-7 text-slate-600">{description}</p>
|
|
15
|
+
</div>
|
|
16
|
+
</article>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type AccountAuthRequest,
|
|
3
|
+
type AccountAuthResponse,
|
|
4
|
+
type CliAuthSessionEnvelope,
|
|
5
|
+
type CompleteCliAuthSessionRequest,
|
|
6
|
+
type GoogleAuthRequest,
|
|
7
|
+
type LearningProgressResponse,
|
|
8
|
+
type UpsertLearningProgressRequest,
|
|
9
|
+
type VisionOsRuntimeInfoResponse,
|
|
10
|
+
type VisionOsUserInfoResponse
|
|
11
|
+
} from "../../../shared/src/index.js";
|
|
12
|
+
|
|
13
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
14
|
+
let urlEmbeddedApi = urlParams.get("embeddedApi");
|
|
15
|
+
|
|
16
|
+
if (urlEmbeddedApi) {
|
|
17
|
+
try {
|
|
18
|
+
window.sessionStorage.setItem("visionos.embeddedApi", urlEmbeddedApi);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
// Ignore Storage errors in nested iframe or restricted contexts
|
|
21
|
+
}
|
|
22
|
+
} else {
|
|
23
|
+
try {
|
|
24
|
+
urlEmbeddedApi = window.sessionStorage.getItem("visionos.embeddedApi");
|
|
25
|
+
} catch (e) {
|
|
26
|
+
// Ignore Storage errors
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const defaultApiBaseUrl = import.meta.env.DEV ? "http://127.0.0.1:4000" : window.location.origin;
|
|
31
|
+
const apiBaseUrl = (urlEmbeddedApi ?? import.meta.env.VITE_API_BASE_URL ?? defaultApiBaseUrl).replace(/\/$/, "");
|
|
32
|
+
|
|
33
|
+
export class VisionOsApiError extends Error {
|
|
34
|
+
constructor(
|
|
35
|
+
message: string,
|
|
36
|
+
readonly status: number
|
|
37
|
+
) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = "VisionOsApiError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const authTokenStorageKey = "visionos.authToken";
|
|
44
|
+
|
|
45
|
+
export function getStoredAuthToken() {
|
|
46
|
+
return window.localStorage.getItem(authTokenStorageKey);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function storeAuthToken(token: string) {
|
|
50
|
+
window.localStorage.setItem(authTokenStorageKey, token);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function clearStoredAuthToken() {
|
|
54
|
+
window.localStorage.removeItem(authTokenStorageKey);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function request<T>(path: string, init?: RequestInit): Promise<T> {
|
|
58
|
+
const token = getStoredAuthToken();
|
|
59
|
+
const headers = new Headers(init?.headers);
|
|
60
|
+
|
|
61
|
+
if (token && !headers.has("Authorization")) {
|
|
62
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const response = await fetch(`${apiBaseUrl}${path}`, {
|
|
66
|
+
...init,
|
|
67
|
+
headers
|
|
68
|
+
});
|
|
69
|
+
const payload = (await response.json().catch(() => null)) as { message?: string } | null;
|
|
70
|
+
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
throw new VisionOsApiError(
|
|
73
|
+
payload?.message ?? `VisionOS API request failed with status ${response.status}.`,
|
|
74
|
+
response.status
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return payload as T;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function registerAccount(body: AccountAuthRequest) {
|
|
82
|
+
return request<AccountAuthResponse>("/auth/register", {
|
|
83
|
+
method: "POST",
|
|
84
|
+
headers: {
|
|
85
|
+
"Content-Type": "application/json"
|
|
86
|
+
},
|
|
87
|
+
body: JSON.stringify(body)
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function loginAccount(body: AccountAuthRequest) {
|
|
92
|
+
return request<AccountAuthResponse>("/auth/login", {
|
|
93
|
+
method: "POST",
|
|
94
|
+
headers: {
|
|
95
|
+
"Content-Type": "application/json"
|
|
96
|
+
},
|
|
97
|
+
body: JSON.stringify(body)
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function loginWithGoogle(body: GoogleAuthRequest) {
|
|
102
|
+
return request<AccountAuthResponse>("/auth/google", {
|
|
103
|
+
method: "POST",
|
|
104
|
+
headers: {
|
|
105
|
+
"Content-Type": "application/json"
|
|
106
|
+
},
|
|
107
|
+
body: JSON.stringify(body)
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function getCliAuthSession(sessionId: string) {
|
|
112
|
+
return request<CliAuthSessionEnvelope>(`/auth/cli/sessions/${sessionId}`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function completeCliAuthSession(
|
|
116
|
+
sessionId: string,
|
|
117
|
+
body: CompleteCliAuthSessionRequest
|
|
118
|
+
) {
|
|
119
|
+
return request<CliAuthSessionEnvelope>(`/auth/cli/sessions/${sessionId}/complete`, {
|
|
120
|
+
method: "POST",
|
|
121
|
+
headers: {
|
|
122
|
+
"Content-Type": "application/json"
|
|
123
|
+
},
|
|
124
|
+
body: JSON.stringify(body)
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function completeCliAuthSessionWithGoogle(sessionId: string, body: GoogleAuthRequest) {
|
|
129
|
+
return request<CliAuthSessionEnvelope>(`/auth/cli/sessions/${sessionId}/google`, {
|
|
130
|
+
method: "POST",
|
|
131
|
+
headers: {
|
|
132
|
+
"Content-Type": "application/json"
|
|
133
|
+
},
|
|
134
|
+
body: JSON.stringify(body)
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function confirmCliAuthSession(sessionId: string) {
|
|
139
|
+
return request<CliAuthSessionEnvelope>(`/auth/cli/sessions/${sessionId}/confirm`, {
|
|
140
|
+
method: "POST"
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function getCurrentUser() {
|
|
145
|
+
return request<VisionOsUserInfoResponse>("/auth/me");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function getRuntimeInfo() {
|
|
149
|
+
return request<VisionOsRuntimeInfoResponse>("/runtime/info");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export function getProgress() {
|
|
153
|
+
return request<LearningProgressResponse>("/progress");
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function upsertProgress(body: UpsertLearningProgressRequest) {
|
|
157
|
+
return request<{ progress: LearningProgressResponse["progress"][number] }>("/progress", {
|
|
158
|
+
method: "PUT",
|
|
159
|
+
headers: {
|
|
160
|
+
"Content-Type": "application/json"
|
|
161
|
+
},
|
|
162
|
+
body: JSON.stringify(body)
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ── Content API Helpers ──────────────────────────────────────────────────
|
|
167
|
+
|
|
168
|
+
export function getTracks() {
|
|
169
|
+
return request<{ tracks: any[] }>("/content/tracks");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function getLessons(trackId: string) {
|
|
173
|
+
return request<{ lessons: any[] }>(`/content/tracks/${trackId}/lessons`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export function createTrack(body: { id: string; label: string; description: string }) {
|
|
177
|
+
return request<{ track: any }>("/content/tracks", {
|
|
178
|
+
method: "POST",
|
|
179
|
+
headers: {
|
|
180
|
+
"Content-Type": "application/json"
|
|
181
|
+
},
|
|
182
|
+
body: JSON.stringify(body)
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export function updateTrack(trackId: string, body: { label: string; description: string }) {
|
|
187
|
+
return request<{ track: any }>(`/content/tracks/${trackId}`, {
|
|
188
|
+
method: "PUT",
|
|
189
|
+
headers: {
|
|
190
|
+
"Content-Type": "application/json"
|
|
191
|
+
},
|
|
192
|
+
body: JSON.stringify(body)
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export function createLesson(trackId: string, body: any) {
|
|
197
|
+
return request<{ lesson: any }>(`/content/tracks/${trackId}/lessons`, {
|
|
198
|
+
method: "POST",
|
|
199
|
+
headers: {
|
|
200
|
+
"Content-Type": "application/json"
|
|
201
|
+
},
|
|
202
|
+
body: JSON.stringify(body)
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export function updateLesson(lessonId: string, body: any) {
|
|
207
|
+
return request<{ lesson: any }>(`/content/lessons/${lessonId}`, {
|
|
208
|
+
method: "PUT",
|
|
209
|
+
headers: {
|
|
210
|
+
"Content-Type": "application/json"
|
|
211
|
+
},
|
|
212
|
+
body: JSON.stringify(body)
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ReactDOM from "react-dom/client";
|
|
3
|
+
import App from "./App.js";
|
|
4
|
+
import { ErrorBoundary } from "./components/ErrorBoundary.js";
|
|
5
|
+
import "./styles/index.css";
|
|
6
|
+
|
|
7
|
+
ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
8
|
+
<React.StrictMode>
|
|
9
|
+
<ErrorBoundary>
|
|
10
|
+
<App />
|
|
11
|
+
</ErrorBoundary>
|
|
12
|
+
</React.StrictMode>
|
|
13
|
+
);
|
|
14
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
@import "./manifesto.css";
|
|
2
|
+
|
|
3
|
+
@tailwind base;
|
|
4
|
+
@tailwind components;
|
|
5
|
+
@tailwind utilities;
|
|
6
|
+
|
|
7
|
+
:root {
|
|
8
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
9
|
+
color: #0A0A0A;
|
|
10
|
+
background: #E0DFD5;
|
|
11
|
+
font-synthesis: none;
|
|
12
|
+
text-rendering: optimizeLegibility;
|
|
13
|
+
-webkit-font-smoothing: antialiased;
|
|
14
|
+
-moz-osx-font-smoothing: grayscale;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
html {
|
|
18
|
+
scroll-behavior: smooth;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
body {
|
|
22
|
+
margin: 0;
|
|
23
|
+
min-width: 320px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
* {
|
|
27
|
+
box-sizing: border-box;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
a {
|
|
31
|
+
text-decoration: none;
|
|
32
|
+
color: inherit;
|
|
33
|
+
}
|