Dirbol commited on
Commit
6d57e0d
·
1 Parent(s): 7d34787

feat(frontend): two-step blueprint flow

Browse files

Moves the Next.js sources (lib/, configs, package manifest) from the
project root down into frontend/ so the FastAPI app/ tree doesn't
collide with the App Router. vercel.json now points at
frontend/package.json.

UI:
/ short explainer + entry
/blueprint two-step flow
step 1 — upload PDF / image → server extracts native text on all
pages → page list with stamp + title excerpts.
"Сводка по тексту" button calls /uploads/blueprint/{id}/extract-text
which LLM-summarises the whole document.
step 2 — multi-select pages → "VLM по выбранным (N)" button calls
/uploads/blueprint/{id}/extract-sheets which runs the real
VLM chain per selected page with sibling text context.

lib/api.ts adds typed wrappers for all 5 new endpoints
(uploadBlueprint, getBlueprintStatus, getPagePreview,
extractProjectText, extractProjectSheets) plus matching request and
response types. Page preview rendered inline as a data: URL modal.

tsc --noEmit -p frontend: clean.

frontend/app/blueprint/page.tsx ADDED
@@ -0,0 +1,376 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ /** Two-step project-documentation flow (D-light, no OCR).
4
+ *
5
+ * Step 1 — upload PDF → server extracts native text on all pages →
6
+ * render the page list (stamp + title). User can run
7
+ * "Сводка по тексту" to get an LLM project summary.
8
+ *
9
+ * Step 2 — user picks specific pages → server runs VLM *only* on
10
+ * those pages with sibling text as context.
11
+ */
12
+
13
+ import { useMemo, useState } from "react";
14
+ import {
15
+ extractProjectSheets,
16
+ extractProjectText,
17
+ getPagePreview,
18
+ uploadBlueprint,
19
+ type PageExcerpt,
20
+ type ProjectSummary,
21
+ type ProjectSummaryResponse,
22
+ type UploadBlueprintStatus,
23
+ } from "@/lib/api";
24
+
25
+ type Phase = "idle" | "uploading" | "ingested" | "text_summary" | "vision" | "error";
26
+
27
+ function summariseShort(p: PageExcerpt): string {
28
+ if (p.stamp) return p.stamp;
29
+ if (p.title_guess) return p.title_guess;
30
+ if (p.text_preview) return p.text_preview.slice(0, 60);
31
+ return `стр. ${p.page_no}`;
32
+ }
33
+
34
+ function Section({
35
+ title,
36
+ children,
37
+ }: {
38
+ title: string;
39
+ children: React.ReactNode;
40
+ }) {
41
+ return (
42
+ <section className="rounded-lg border border-slate-200 bg-white p-5 shadow-sm">
43
+ <h2 className="mb-3 text-lg font-semibold">{title}</h2>
44
+ {children}
45
+ </section>
46
+ );
47
+ }
48
+
49
+ function SummaryBlock({ s }: { s: ProjectSummary }) {
50
+ return (
51
+ <div className="space-y-3 text-sm">
52
+ <div>
53
+ <div className="text-slate-500 text-xs uppercase">Объект</div>
54
+ <div className="font-medium">{s.object_name}</div>
55
+ {s.object_address && (
56
+ <div className="text-slate-600">{s.object_address}</div>
57
+ )}
58
+ {s.project_section && (
59
+ <div className="text-slate-600">Раздел: {s.project_section}</div>
60
+ )}
61
+ </div>
62
+ <div className="grid grid-cols-3 gap-2 text-center">
63
+ <Stat label="Листов" value={s.totals.sheet_count} />
64
+ <Stat label="Со штампом" value={s.totals.sheets_with_stamp} />
65
+ <Stat label="Текст. стр." value={s.totals.text_pages} />
66
+ </div>
67
+ {s.spec_summary && (
68
+ <div>
69
+ <div className="text-slate-500 text-xs uppercase">Состав</div>
70
+ <p className="whitespace-pre-wrap text-slate-800">{s.spec_summary}</p>
71
+ </div>
72
+ )}
73
+ {s.sheets_index.length > 0 && (
74
+ <div>
75
+ <div className="text-slate-500 text-xs uppercase">Штамповый индекс</div>
76
+ <ul className="mt-1 grid grid-cols-2 gap-x-3 gap-y-1 md:grid-cols-3">
77
+ {s.sheets_index.map((x) => (
78
+ <li key={x.page_no} className="truncate">
79
+ <span className="text-slate-500">стр. {x.page_no}</span>{" "}
80
+ <span className="font-mono text-xs">
81
+ {x.stamp?.split(" ")[0] ?? "—"}
82
+ </span>
83
+ {x.title_guess && (
84
+ <span className="ml-1 text-slate-600 truncate">
85
+ — {x.title_guess.slice(0, 50)}
86
+ </span>
87
+ )}
88
+ </li>
89
+ ))}
90
+ </ul>
91
+ </div>
92
+ )}
93
+ {s.missing_info_prompts.length > 0 && (
94
+ <div>
95
+ <div className="text-slate-500 text-xs uppercase">
96
+ Что нужно уточнить
97
+ </div>
98
+ <ul className="list-disc pl-5 text-slate-800">
99
+ {s.missing_info_prompts.map((p, i) => (
100
+ <li key={i}>{p}</li>
101
+ ))}
102
+ </ul>
103
+ </div>
104
+ )}
105
+ </div>
106
+ );
107
+ }
108
+
109
+ function Stat({ label, value }: { label: string; value: number }) {
110
+ return (
111
+ <div className="rounded border border-slate-200 bg-slate-50 p-2">
112
+ <div className="text-2xl font-semibold tabular-nums">{value}</div>
113
+ <div className="text-[11px] uppercase text-slate-500">{label}</div>
114
+ </div>
115
+ );
116
+ }
117
+
118
+ export default function BlueprintPage() {
119
+ const [phase, setPhase] = useState<Phase>("idle");
120
+ const [error, setError] = useState<string | null>(null);
121
+ const [status, setStatus] = useState<UploadBlueprintStatus | null>(null);
122
+ const [textSummary, setTextSummary] =
123
+ useState<ProjectSummaryResponse | null>(null);
124
+ const [visionSummary, setVisionSummary] =
125
+ useState<ProjectSummaryResponse | null>(null);
126
+ const [selected, setSelected] = useState<Set<number>>(new Set());
127
+ const [previewUrl, setPreviewUrl] = useState<{ page_no: number; url: string } | null>(
128
+ null,
129
+ );
130
+
131
+ async function onFile(file: File | undefined) {
132
+ if (!file) return;
133
+ setError(null);
134
+ setStatus(null);
135
+ setTextSummary(null);
136
+ setVisionSummary(null);
137
+ setSelected(new Set());
138
+ setPhase("uploading");
139
+ try {
140
+ const s = await uploadBlueprint(file);
141
+ setStatus(s);
142
+ setPhase("ingested");
143
+ } catch (e) {
144
+ setError(e instanceof Error ? e.message : String(e));
145
+ setPhase("error");
146
+ }
147
+ }
148
+
149
+ async function runTextSummary() {
150
+ if (!status?.upload_id) return;
151
+ setError(null);
152
+ setPhase("text_summary");
153
+ try {
154
+ const r = await extractProjectText(status.upload_id);
155
+ setTextSummary(r);
156
+ setPhase("ingested");
157
+ } catch (e) {
158
+ setError(e instanceof Error ? e.message : String(e));
159
+ setPhase("error");
160
+ }
161
+ }
162
+
163
+ async function runVisionSummary() {
164
+ if (!status?.upload_id || selected.size === 0) return;
165
+ setError(null);
166
+ setPhase("vision");
167
+ try {
168
+ const r = await extractProjectSheets(
169
+ status.upload_id,
170
+ Array.from(selected).sort((a, b) => a - b),
171
+ );
172
+ setVisionSummary(r);
173
+ setPhase("ingested");
174
+ } catch (e) {
175
+ setError(e instanceof Error ? e.message : String(e));
176
+ setPhase("error");
177
+ }
178
+ }
179
+
180
+ async function showPreview(page_no: number) {
181
+ if (!status?.upload_id) return;
182
+ setError(null);
183
+ try {
184
+ const p = await getPagePreview(status.upload_id, page_no);
185
+ const url = `data:${p.mime};base64,${p.data_b64}`;
186
+ setPreviewUrl({ page_no, url });
187
+ } catch (e) {
188
+ setError(e instanceof Error ? e.message : String(e));
189
+ }
190
+ }
191
+
192
+ const pageRows = useMemo(() => status?.pages ?? [], [status?.pages]);
193
+
194
+ const toggleSelected = (no: number) =>
195
+ setSelected((prev) => {
196
+ const next = new Set(prev);
197
+ if (next.has(no)) next.delete(no);
198
+ else next.add(no);
199
+ return next;
200
+ });
201
+
202
+ return (
203
+ <main className="mx-auto max-w-5xl space-y-6 px-6 py-10">
204
+ <header>
205
+ <h1 className="text-2xl font-semibold tracking-tight">
206
+ Проектная документация
207
+ </h1>
208
+ <p className="mt-1 text-slate-600">
209
+ Шаг 1 — загрузите PDF: текст всех страниц распознаётся автоматически.
210
+ Шаг 2 — выберите конкретные листы, чтобы получить распознавание
211
+ через VLM с учётом соседних страниц.
212
+ </p>
213
+ </header>
214
+
215
+ {error && (
216
+ <div className="rounded border border-red-300 bg-red-50 px-3 py-2 text-sm text-red-800">
217
+ {error}
218
+ </div>
219
+ )}
220
+
221
+ <Section title="Шаг 1 — загрузка">
222
+ <label className="flex w-full cursor-pointer items-center justify-center rounded-md border-2 border-dashed border-slate-300 bg-slate-50 px-4 py-10 text-slate-500 hover:bg-slate-100">
223
+ <input
224
+ type="file"
225
+ accept="application/pdf,image/png,image/jpeg,image/heic,image/heif,image/webp"
226
+ className="hidden"
227
+ onChange={(e) => onFile(e.target.files?.[0])}
228
+ disabled={phase === "uploading" || phase === "text_summary" || phase === "vision"}
229
+ data-testid="blueprint-file"
230
+ />
231
+ {phase === "uploading"
232
+ ? "Загружаем и распознаём…"
233
+ : "Кликните или перетащите PDF / изображение сюда"}
234
+ </label>
235
+
236
+ {status && (
237
+ <div className="mt-4 space-y-3 text-sm">
238
+ <div className="flex flex-wrap gap-3 text-slate-700">
239
+ <span>Файл: <b>{status.file_name}</b></span>
240
+ <span>·</span>
241
+ <span>Стр.: <b>{status.page_count}</b></span>
242
+ <span>·</span>
243
+ <span>
244
+ В Supabase:{" "}
245
+ <b className={status.stored_in_supabase ? "text-emerald-600" : "text-amber-600"}>
246
+ {status.stored_in_supabase ? "да" : "нет"}
247
+ </b>
248
+ </span>
249
+ <span>·</span>
250
+ <span>
251
+ С текстом:{" "}
252
+ <b className={status.has_native_text ? "text-emerald-600" : "text-amber-600"}>
253
+ {status.has_native_text ? "да" : "нет"}
254
+ </b>
255
+ </span>
256
+ </div>
257
+
258
+ <div className="flex flex-wrap gap-2">
259
+ <button
260
+ type="button"
261
+ onClick={runTextSummary}
262
+ disabled={!status.has_native_text}
263
+ className="rounded bg-slate-900 px-3 py-1.5 text-white shadow hover:bg-slate-800 disabled:opacity-50"
264
+ >
265
+ Сводка по тексту (все страницы)
266
+ </button>
267
+ {!status.has_native_text && (
268
+ <span className="self-center text-xs text-amber-700">
269
+ Без native-текста (скан) — шаг 2 через VLM доступен.
270
+ </span>
271
+ )}
272
+ </div>
273
+ </div>
274
+ )}
275
+ </Section>
276
+
277
+ {textSummary && (
278
+ <Section title={`Текст-сводка · модель ${textSummary.model_used}`}>
279
+ <SummaryBlock s={textSummary.summary} />
280
+ </Section>
281
+ )}
282
+
283
+ {status && status.pages.length > 0 && (
284
+ <Section title="Шаг 2 — выберите листы для VLM-распознавания">
285
+ <p className="mb-3 text-xs text-slate-500">
286
+ Сервер прогонит vision-LLM только по выбранным страницам и
287
+ подаст соседние страницы как контекст.
288
+ </p>
289
+ <ul className="grid grid-cols-1 gap-2 md:grid-cols-2">
290
+ {pageRows.map((p) => (
291
+ <li
292
+ key={p.page_no}
293
+ className={`flex items-start gap-2 rounded border p-2 text-sm ${
294
+ selected.has(p.page_no)
295
+ ? "border-slate-900 bg-slate-50"
296
+ : "border-slate-200"
297
+ }`}
298
+ >
299
+ <input
300
+ type="checkbox"
301
+ className="mt-1"
302
+ checked={selected.has(p.page_no)}
303
+ onChange={() => toggleSelected(p.page_no)}
304
+ />
305
+ <div className="min-w-0 flex-1">
306
+ <div className="flex items-baseline gap-2">
307
+ <span className="font-mono text-xs text-slate-500">
308
+ стр. {p.page_no}
309
+ </span>
310
+ {p.stamp && (
311
+ <span className="font-mono text-xs font-semibold">
312
+ {p.stamp.split(" ")[0]}
313
+ </span>
314
+ )}
315
+ </div>
316
+ <div className="truncate text-slate-800">
317
+ {p.title_guess || summariseShort(p)}
318
+ </div>
319
+ {p.text_preview && (
320
+ <div className="line-clamp-2 text-[11px] text-slate-500">
321
+ {p.text_preview}
322
+ </div>
323
+ )}
324
+ </div>
325
+ <button
326
+ type="button"
327
+ onClick={() => showPreview(p.page_no)}
328
+ className="shrink-0 rounded border border-slate-300 px-2 py-0.5 text-xs hover:bg-slate-100"
329
+ >
330
+ превью
331
+ </button>
332
+ </li>
333
+ ))}
334
+ </ul>
335
+
336
+ <div className="mt-4 flex items-center gap-3">
337
+ <button
338
+ type="button"
339
+ onClick={runVisionSummary}
340
+ disabled={selected.size === 0}
341
+ className="rounded bg-slate-900 px-3 py-1.5 text-white shadow hover:bg-slate-800 disabled:opacity-50"
342
+ >
343
+ VLM по выбранным ({selected.size})
344
+ </button>
345
+ <button
346
+ type="button"
347
+ onClick={() => setSelected(new Set())}
348
+ className="text-xs text-slate-500 underline"
349
+ >
350
+ снять выделение
351
+ </button>
352
+ </div>
353
+ </Section>
354
+ )}
355
+
356
+ {visionSummary && (
357
+ <Section title={`VLM-сводка · модель ${visionSummary.model_used} · ${visionSummary.page_count} лист(а/ов)`}>
358
+ <SummaryBlock s={visionSummary.summary} />
359
+ </Section>
360
+ )}
361
+
362
+ {previewUrl && (
363
+ <div
364
+ className="fixed inset-0 z-40 flex items-center justify-center bg-black/60 p-4"
365
+ onClick={() => setPreviewUrl(null)}
366
+ >
367
+ <img
368
+ src={previewUrl.url}
369
+ alt={`стр. ${previewUrl.page_no}`}
370
+ className="max-h-full max-w-full rounded shadow-2xl"
371
+ />
372
+ </div>
373
+ )}
374
+ </main>
375
+ );
376
+ }
frontend/app/layout.tsx ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** Root layout — server component. Tailwind handles the rest. */
2
+
3
+ import type { ReactNode } from "react";
4
+
5
+ export const metadata = {
6
+ title: "Virtual Foreman",
7
+ description:
8
+ "Виртуальный Прораб — construction tech-stack inference & document engine (BY).",
9
+ };
10
+
11
+ export default function RootLayout({ children }: { children: ReactNode }) {
12
+ return (
13
+ <html lang="ru">
14
+ <body className="min-h-screen bg-slate-50 text-slate-900 antialiased">
15
+ {children}
16
+ </body>
17
+ </html>
18
+ );
19
+ }
frontend/app/page.tsx ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** Landing — short explainer + entry to the blueprint flow. */
2
+
3
+ export default function Page() {
4
+ return (
5
+ <main className="mx-auto max-w-3xl px-6 py-12">
6
+ <h1 className="text-3xl font-semibold tracking-tight">
7
+ Virtual Foreman
8
+ </h1>
9
+ <p className="mt-3 text-slate-600">
10
+ Виртуальный Прораб — конструктор тех-карт и сопровождение проектной
11
+ документации. Загрузите проектную документацию → мы разберём текст
12
+ по всем страницам и соберём сводку по проекту; дальше можно выбрать
13
+ конкретные листы и получить их распознавание через VLM.
14
+ </p>
15
+
16
+ <a
17
+ href="/blueprint"
18
+ className="mt-6 inline-block rounded-md bg-slate-900 px-4 py-2 text-white shadow hover:bg-slate-800"
19
+ >
20
+ Открыть разбор проектной документации →
21
+ </a>
22
+ </main>
23
+ );
24
+ }
{lib → frontend/lib}/api.ts RENAMED
@@ -228,3 +228,119 @@ export async function renderDocument(
228
  export async function listDocumentTemplates(): Promise<{ supported: string[] }> {
229
  return getJSON<{ supported: string[] }>("/documents/templates");
230
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
228
  export async function listDocumentTemplates(): Promise<{ supported: string[] }> {
229
  return getJSON<{ supported: string[] }>("/documents/templates");
230
  }
231
+
232
+ // ----- Project documentation (D-light) -----
233
+
234
+ export interface PageExcerpt {
235
+ page_no: number;
236
+ stamp: string | null;
237
+ title_guess: string | null;
238
+ char_count: number;
239
+ text_preview: string;
240
+ }
241
+
242
+ export interface UploadBlueprintStatus {
243
+ upload_id: string | null;
244
+ file_name: string;
245
+ mime_type: string;
246
+ page_count: number;
247
+ has_native_text: boolean;
248
+ stored_in_supabase: boolean;
249
+ preview_cached: boolean;
250
+ pages: PageExcerpt[];
251
+ }
252
+
253
+ export interface SheetIndexEntry {
254
+ page_no: number;
255
+ stamp: string | null;
256
+ title_guess: string | null;
257
+ }
258
+
259
+ export interface ProjectSummaryTotals {
260
+ sheet_count: number;
261
+ text_pages: number;
262
+ sheets_with_stamp: number;
263
+ }
264
+
265
+ export interface ProjectSummary {
266
+ object_name: string;
267
+ object_address: string | null;
268
+ project_section: string | null;
269
+ totals: ProjectSummaryTotals;
270
+ sheets_index: SheetIndexEntry[];
271
+ spec_summary: string;
272
+ missing_info_prompts: string[];
273
+ }
274
+
275
+ export interface ProjectSummaryResponse {
276
+ upload_id: string;
277
+ model_used: string;
278
+ page_count: number;
279
+ generated_at: string;
280
+ summary: ProjectSummary;
281
+ }
282
+
283
+ export interface PagePreview {
284
+ upload_id: string;
285
+ page_no: number;
286
+ mime: string;
287
+ width: number;
288
+ height: number;
289
+ data_b64: string;
290
+ }
291
+
292
+ /** Phase-1 — ingest a blueprint PDF (or image) and persist all pages. */
293
+ export async function uploadBlueprint(
294
+ file: File,
295
+ project_id?: string | null,
296
+ opts: { signal?: AbortSignal } = {}
297
+ ): Promise<UploadBlueprintStatus> {
298
+ const form = new FormData();
299
+ form.append("file", file);
300
+ if (project_id) form.append("project_id", project_id);
301
+ return postForm<UploadBlueprintStatus>(
302
+ "/uploads/blueprint",
303
+ form,
304
+ opts
305
+ );
306
+ }
307
+
308
+ /** Read the ingest status + per-page record list. */
309
+ export async function getBlueprintStatus(
310
+ upload_id: string
311
+ ): Promise<UploadBlueprintStatus> {
312
+ return getJSON<UploadBlueprintStatus>(
313
+ `/uploads/blueprint/${upload_id}`
314
+ );
315
+ }
316
+
317
+ /** Render page_no of the cached PDF to a PNG (base64). */
318
+ export async function getPagePreview(
319
+ upload_id: string,
320
+ page_no: number
321
+ ): Promise<PagePreview> {
322
+ return getJSON<PagePreview>(
323
+ `/uploads/blueprint/${upload_id}/pages/${page_no}/preview`
324
+ );
325
+ }
326
+
327
+ /** Phase-2 text-only — run the LLM over all extracted pages. */
328
+ export async function extractProjectText(
329
+ upload_id: string
330
+ ): Promise<ProjectSummaryResponse> {
331
+ return postJSON<ProjectSummaryResponse>(
332
+ `/uploads/blueprint/${upload_id}/extract-text`,
333
+ {}
334
+ );
335
+ }
336
+
337
+ /** Phase-2 vision — VLM only on the selected pages. */
338
+ export async function extractProjectSheets(
339
+ upload_id: string,
340
+ pages: number[]
341
+ ): Promise<ProjectSummaryResponse> {
342
+ return postJSON<ProjectSummaryResponse>(
343
+ `/uploads/blueprint/${upload_id}/extract-sheets`,
344
+ { pages }
345
+ );
346
+ }
{lib → frontend/lib}/config.ts RENAMED
File without changes
frontend/next.config.mjs ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ reactStrictMode: true,
4
+ output: "standalone",
5
+ };
6
+
7
+ export default nextConfig;
frontend/package-lock.json ADDED
@@ -0,0 +1,1808 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "virtforeman-frontend",
3
+ "version": "0.1.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "virtforeman-frontend",
9
+ "version": "0.1.0",
10
+ "dependencies": {
11
+ "@supabase/supabase-js": "2.46.1",
12
+ "next": "14.2.18",
13
+ "react": "18.3.1",
14
+ "react-dom": "18.3.1"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "22.9.0",
18
+ "@types/react": "18.3.12",
19
+ "@types/react-dom": "18.3.1",
20
+ "autoprefixer": "10.4.20",
21
+ "postcss": "8.4.49",
22
+ "tailwindcss": "3.4.15",
23
+ "typescript": "5.6.3"
24
+ }
25
+ },
26
+ "node_modules/@alloc/quick-lru": {
27
+ "version": "5.2.0",
28
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
29
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
30
+ "dev": true,
31
+ "license": "MIT",
32
+ "engines": {
33
+ "node": ">=10"
34
+ },
35
+ "funding": {
36
+ "url": "https://github.com/sponsors/sindresorhus"
37
+ }
38
+ },
39
+ "node_modules/@jridgewell/gen-mapping": {
40
+ "version": "0.3.13",
41
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
42
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
43
+ "dev": true,
44
+ "license": "MIT",
45
+ "dependencies": {
46
+ "@jridgewell/sourcemap-codec": "^1.5.0",
47
+ "@jridgewell/trace-mapping": "^0.3.24"
48
+ }
49
+ },
50
+ "node_modules/@jridgewell/resolve-uri": {
51
+ "version": "3.1.2",
52
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
53
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
54
+ "dev": true,
55
+ "license": "MIT",
56
+ "engines": {
57
+ "node": ">=6.0.0"
58
+ }
59
+ },
60
+ "node_modules/@jridgewell/sourcemap-codec": {
61
+ "version": "1.5.5",
62
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
63
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
64
+ "dev": true,
65
+ "license": "MIT"
66
+ },
67
+ "node_modules/@jridgewell/trace-mapping": {
68
+ "version": "0.3.31",
69
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
70
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
71
+ "dev": true,
72
+ "license": "MIT",
73
+ "dependencies": {
74
+ "@jridgewell/resolve-uri": "^3.1.0",
75
+ "@jridgewell/sourcemap-codec": "^1.4.14"
76
+ }
77
+ },
78
+ "node_modules/@next/env": {
79
+ "version": "14.2.18",
80
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.18.tgz",
81
+ "integrity": "sha512-2vWLOUwIPgoqMJKG6dt35fVXVhgM09tw4tK3/Q34GFXDrfiHlG7iS33VA4ggnjWxjiz9KV5xzfsQzJX6vGAekA==",
82
+ "license": "MIT"
83
+ },
84
+ "node_modules/@next/swc-darwin-arm64": {
85
+ "version": "14.2.18",
86
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.18.tgz",
87
+ "integrity": "sha512-tOBlDHCjGdyLf0ube/rDUs6VtwNOajaWV+5FV/ajPgrvHeisllEdymY/oDgv2cx561+gJksfMUtqf8crug7sbA==",
88
+ "cpu": [
89
+ "arm64"
90
+ ],
91
+ "license": "MIT",
92
+ "optional": true,
93
+ "os": [
94
+ "darwin"
95
+ ],
96
+ "engines": {
97
+ "node": ">= 10"
98
+ }
99
+ },
100
+ "node_modules/@next/swc-darwin-x64": {
101
+ "version": "14.2.18",
102
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.18.tgz",
103
+ "integrity": "sha512-uJCEjutt5VeJ30jjrHV1VIHCsbMYnEqytQgvREx+DjURd/fmKy15NaVK4aR/u98S1LGTnjq35lRTnRyygglxoA==",
104
+ "cpu": [
105
+ "x64"
106
+ ],
107
+ "license": "MIT",
108
+ "optional": true,
109
+ "os": [
110
+ "darwin"
111
+ ],
112
+ "engines": {
113
+ "node": ">= 10"
114
+ }
115
+ },
116
+ "node_modules/@next/swc-linux-arm64-gnu": {
117
+ "version": "14.2.18",
118
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.18.tgz",
119
+ "integrity": "sha512-IL6rU8vnBB+BAm6YSWZewc+qvdL1EaA+VhLQ6tlUc0xp+kkdxQrVqAnh8Zek1ccKHlTDFRyAft0e60gteYmQ4A==",
120
+ "cpu": [
121
+ "arm64"
122
+ ],
123
+ "libc": [
124
+ "glibc"
125
+ ],
126
+ "license": "MIT",
127
+ "optional": true,
128
+ "os": [
129
+ "linux"
130
+ ],
131
+ "engines": {
132
+ "node": ">= 10"
133
+ }
134
+ },
135
+ "node_modules/@next/swc-linux-arm64-musl": {
136
+ "version": "14.2.18",
137
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.18.tgz",
138
+ "integrity": "sha512-RCaENbIZqKKqTlL8KNd+AZV/yAdCsovblOpYFp0OJ7ZxgLNbV5w23CUU1G5On+0fgafrsGcW+GdMKdFjaRwyYA==",
139
+ "cpu": [
140
+ "arm64"
141
+ ],
142
+ "libc": [
143
+ "musl"
144
+ ],
145
+ "license": "MIT",
146
+ "optional": true,
147
+ "os": [
148
+ "linux"
149
+ ],
150
+ "engines": {
151
+ "node": ">= 10"
152
+ }
153
+ },
154
+ "node_modules/@next/swc-linux-x64-gnu": {
155
+ "version": "14.2.18",
156
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.18.tgz",
157
+ "integrity": "sha512-3kmv8DlyhPRCEBM1Vavn8NjyXtMeQ49ID0Olr/Sut7pgzaQTo4h01S7Z8YNE0VtbowyuAL26ibcz0ka6xCTH5g==",
158
+ "cpu": [
159
+ "x64"
160
+ ],
161
+ "libc": [
162
+ "glibc"
163
+ ],
164
+ "license": "MIT",
165
+ "optional": true,
166
+ "os": [
167
+ "linux"
168
+ ],
169
+ "engines": {
170
+ "node": ">= 10"
171
+ }
172
+ },
173
+ "node_modules/@next/swc-linux-x64-musl": {
174
+ "version": "14.2.18",
175
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.18.tgz",
176
+ "integrity": "sha512-mliTfa8seVSpTbVEcKEXGjC18+TDII8ykW4a36au97spm9XMPqQTpdGPNBJ9RySSFw9/hLuaCMByluQIAnkzlw==",
177
+ "cpu": [
178
+ "x64"
179
+ ],
180
+ "libc": [
181
+ "musl"
182
+ ],
183
+ "license": "MIT",
184
+ "optional": true,
185
+ "os": [
186
+ "linux"
187
+ ],
188
+ "engines": {
189
+ "node": ">= 10"
190
+ }
191
+ },
192
+ "node_modules/@next/swc-win32-arm64-msvc": {
193
+ "version": "14.2.18",
194
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.18.tgz",
195
+ "integrity": "sha512-J5g0UFPbAjKYmqS3Cy7l2fetFmWMY9Oao32eUsBPYohts26BdrMUyfCJnZFQkX9npYaHNDOWqZ6uV9hSDPw9NA==",
196
+ "cpu": [
197
+ "arm64"
198
+ ],
199
+ "license": "MIT",
200
+ "optional": true,
201
+ "os": [
202
+ "win32"
203
+ ],
204
+ "engines": {
205
+ "node": ">= 10"
206
+ }
207
+ },
208
+ "node_modules/@next/swc-win32-ia32-msvc": {
209
+ "version": "14.2.18",
210
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.18.tgz",
211
+ "integrity": "sha512-Ynxuk4ZgIpdcN7d16ivJdjsDG1+3hTvK24Pp8DiDmIa2+A4CfhJSEHHVndCHok6rnLUzAZD+/UOKESQgTsAZGg==",
212
+ "cpu": [
213
+ "ia32"
214
+ ],
215
+ "license": "MIT",
216
+ "optional": true,
217
+ "os": [
218
+ "win32"
219
+ ],
220
+ "engines": {
221
+ "node": ">= 10"
222
+ }
223
+ },
224
+ "node_modules/@next/swc-win32-x64-msvc": {
225
+ "version": "14.2.18",
226
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.18.tgz",
227
+ "integrity": "sha512-dtRGMhiU9TN5nyhwzce+7c/4CCeykYS+ipY/4mIrGzJ71+7zNo55ZxCB7cAVuNqdwtYniFNR2c9OFQ6UdFIMcg==",
228
+ "cpu": [
229
+ "x64"
230
+ ],
231
+ "license": "MIT",
232
+ "optional": true,
233
+ "os": [
234
+ "win32"
235
+ ],
236
+ "engines": {
237
+ "node": ">= 10"
238
+ }
239
+ },
240
+ "node_modules/@nodelib/fs.scandir": {
241
+ "version": "2.1.5",
242
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
243
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
244
+ "dev": true,
245
+ "license": "MIT",
246
+ "dependencies": {
247
+ "@nodelib/fs.stat": "2.0.5",
248
+ "run-parallel": "^1.1.9"
249
+ },
250
+ "engines": {
251
+ "node": ">= 8"
252
+ }
253
+ },
254
+ "node_modules/@nodelib/fs.stat": {
255
+ "version": "2.0.5",
256
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
257
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
258
+ "dev": true,
259
+ "license": "MIT",
260
+ "engines": {
261
+ "node": ">= 8"
262
+ }
263
+ },
264
+ "node_modules/@nodelib/fs.walk": {
265
+ "version": "1.2.8",
266
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
267
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
268
+ "dev": true,
269
+ "license": "MIT",
270
+ "dependencies": {
271
+ "@nodelib/fs.scandir": "2.1.5",
272
+ "fastq": "^1.6.0"
273
+ },
274
+ "engines": {
275
+ "node": ">= 8"
276
+ }
277
+ },
278
+ "node_modules/@supabase/auth-js": {
279
+ "version": "2.65.1",
280
+ "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.65.1.tgz",
281
+ "integrity": "sha512-IA7i2Xq2SWNCNMKxwmPlHafBQda0qtnFr8QnyyBr+KaSxoXXqEzFCnQ1dGTy6bsZjVBgXu++o3qrDypTspaAPw==",
282
+ "license": "MIT",
283
+ "dependencies": {
284
+ "@supabase/node-fetch": "^2.6.14"
285
+ }
286
+ },
287
+ "node_modules/@supabase/functions-js": {
288
+ "version": "2.4.3",
289
+ "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.4.3.tgz",
290
+ "integrity": "sha512-sOLXy+mWRyu4LLv1onYydq+10mNRQ4rzqQxNhbrKLTLTcdcmS9hbWif0bGz/NavmiQfPs4ZcmQJp4WqOXlR4AQ==",
291
+ "license": "MIT",
292
+ "dependencies": {
293
+ "@supabase/node-fetch": "^2.6.14"
294
+ }
295
+ },
296
+ "node_modules/@supabase/node-fetch": {
297
+ "version": "2.6.15",
298
+ "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz",
299
+ "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==",
300
+ "license": "MIT",
301
+ "dependencies": {
302
+ "whatwg-url": "^5.0.0"
303
+ },
304
+ "engines": {
305
+ "node": "4.x || >=6.0.0"
306
+ }
307
+ },
308
+ "node_modules/@supabase/postgrest-js": {
309
+ "version": "1.16.3",
310
+ "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.16.3.tgz",
311
+ "integrity": "sha512-HI6dsbW68AKlOPofUjDTaosiDBCtW4XAm0D18pPwxoW3zKOE2Ru13Z69Wuys9fd6iTpfDViNco5sgrtnP0666A==",
312
+ "license": "MIT",
313
+ "dependencies": {
314
+ "@supabase/node-fetch": "^2.6.14"
315
+ }
316
+ },
317
+ "node_modules/@supabase/realtime-js": {
318
+ "version": "2.10.7",
319
+ "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.10.7.tgz",
320
+ "integrity": "sha512-OLI0hiSAqQSqRpGMTUwoIWo51eUivSYlaNBgxsXZE7PSoWh12wPRdVt0psUMaUzEonSB85K21wGc7W5jHnT6uA==",
321
+ "license": "MIT",
322
+ "dependencies": {
323
+ "@supabase/node-fetch": "^2.6.14",
324
+ "@types/phoenix": "^1.5.4",
325
+ "@types/ws": "^8.5.10",
326
+ "ws": "^8.14.2"
327
+ }
328
+ },
329
+ "node_modules/@supabase/storage-js": {
330
+ "version": "2.7.1",
331
+ "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.7.1.tgz",
332
+ "integrity": "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==",
333
+ "license": "MIT",
334
+ "dependencies": {
335
+ "@supabase/node-fetch": "^2.6.14"
336
+ }
337
+ },
338
+ "node_modules/@supabase/supabase-js": {
339
+ "version": "2.46.1",
340
+ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.46.1.tgz",
341
+ "integrity": "sha512-HiBpd8stf7M6+tlr+/82L8b2QmCjAD8ex9YdSAKU+whB/SHXXJdus1dGlqiH9Umy9ePUuxaYmVkGd9BcvBnNvg==",
342
+ "license": "MIT",
343
+ "dependencies": {
344
+ "@supabase/auth-js": "2.65.1",
345
+ "@supabase/functions-js": "2.4.3",
346
+ "@supabase/node-fetch": "2.6.15",
347
+ "@supabase/postgrest-js": "1.16.3",
348
+ "@supabase/realtime-js": "2.10.7",
349
+ "@supabase/storage-js": "2.7.1"
350
+ }
351
+ },
352
+ "node_modules/@swc/counter": {
353
+ "version": "0.1.3",
354
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
355
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
356
+ "license": "Apache-2.0"
357
+ },
358
+ "node_modules/@swc/helpers": {
359
+ "version": "0.5.5",
360
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz",
361
+ "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==",
362
+ "license": "Apache-2.0",
363
+ "dependencies": {
364
+ "@swc/counter": "^0.1.3",
365
+ "tslib": "^2.4.0"
366
+ }
367
+ },
368
+ "node_modules/@types/node": {
369
+ "version": "22.9.0",
370
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
371
+ "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
372
+ "license": "MIT",
373
+ "dependencies": {
374
+ "undici-types": "~6.19.8"
375
+ }
376
+ },
377
+ "node_modules/@types/phoenix": {
378
+ "version": "1.6.7",
379
+ "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz",
380
+ "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==",
381
+ "license": "MIT"
382
+ },
383
+ "node_modules/@types/prop-types": {
384
+ "version": "15.7.15",
385
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
386
+ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
387
+ "dev": true,
388
+ "license": "MIT"
389
+ },
390
+ "node_modules/@types/react": {
391
+ "version": "18.3.12",
392
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz",
393
+ "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
394
+ "dev": true,
395
+ "license": "MIT",
396
+ "dependencies": {
397
+ "@types/prop-types": "*",
398
+ "csstype": "^3.0.2"
399
+ }
400
+ },
401
+ "node_modules/@types/react-dom": {
402
+ "version": "18.3.1",
403
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz",
404
+ "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==",
405
+ "dev": true,
406
+ "license": "MIT",
407
+ "dependencies": {
408
+ "@types/react": "*"
409
+ }
410
+ },
411
+ "node_modules/@types/ws": {
412
+ "version": "8.18.1",
413
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
414
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
415
+ "license": "MIT",
416
+ "dependencies": {
417
+ "@types/node": "*"
418
+ }
419
+ },
420
+ "node_modules/any-promise": {
421
+ "version": "1.3.0",
422
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
423
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
424
+ "dev": true,
425
+ "license": "MIT"
426
+ },
427
+ "node_modules/anymatch": {
428
+ "version": "3.1.3",
429
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
430
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
431
+ "dev": true,
432
+ "license": "ISC",
433
+ "dependencies": {
434
+ "normalize-path": "^3.0.0",
435
+ "picomatch": "^2.0.4"
436
+ },
437
+ "engines": {
438
+ "node": ">= 8"
439
+ }
440
+ },
441
+ "node_modules/arg": {
442
+ "version": "5.0.2",
443
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
444
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
445
+ "dev": true,
446
+ "license": "MIT"
447
+ },
448
+ "node_modules/autoprefixer": {
449
+ "version": "10.4.20",
450
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
451
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
452
+ "dev": true,
453
+ "funding": [
454
+ {
455
+ "type": "opencollective",
456
+ "url": "https://opencollective.com/postcss/"
457
+ },
458
+ {
459
+ "type": "tidelift",
460
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
461
+ },
462
+ {
463
+ "type": "github",
464
+ "url": "https://github.com/sponsors/ai"
465
+ }
466
+ ],
467
+ "license": "MIT",
468
+ "dependencies": {
469
+ "browserslist": "^4.23.3",
470
+ "caniuse-lite": "^1.0.30001646",
471
+ "fraction.js": "^4.3.7",
472
+ "normalize-range": "^0.1.2",
473
+ "picocolors": "^1.0.1",
474
+ "postcss-value-parser": "^4.2.0"
475
+ },
476
+ "bin": {
477
+ "autoprefixer": "bin/autoprefixer"
478
+ },
479
+ "engines": {
480
+ "node": "^10 || ^12 || >=14"
481
+ },
482
+ "peerDependencies": {
483
+ "postcss": "^8.1.0"
484
+ }
485
+ },
486
+ "node_modules/baseline-browser-mapping": {
487
+ "version": "2.10.38",
488
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz",
489
+ "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==",
490
+ "dev": true,
491
+ "license": "Apache-2.0",
492
+ "bin": {
493
+ "baseline-browser-mapping": "dist/cli.cjs"
494
+ },
495
+ "engines": {
496
+ "node": ">=6.0.0"
497
+ }
498
+ },
499
+ "node_modules/binary-extensions": {
500
+ "version": "2.3.0",
501
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
502
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
503
+ "dev": true,
504
+ "license": "MIT",
505
+ "engines": {
506
+ "node": ">=8"
507
+ },
508
+ "funding": {
509
+ "url": "https://github.com/sponsors/sindresorhus"
510
+ }
511
+ },
512
+ "node_modules/braces": {
513
+ "version": "3.0.3",
514
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
515
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
516
+ "dev": true,
517
+ "license": "MIT",
518
+ "dependencies": {
519
+ "fill-range": "^7.1.1"
520
+ },
521
+ "engines": {
522
+ "node": ">=8"
523
+ }
524
+ },
525
+ "node_modules/browserslist": {
526
+ "version": "4.28.4",
527
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz",
528
+ "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==",
529
+ "dev": true,
530
+ "funding": [
531
+ {
532
+ "type": "opencollective",
533
+ "url": "https://opencollective.com/browserslist"
534
+ },
535
+ {
536
+ "type": "tidelift",
537
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
538
+ },
539
+ {
540
+ "type": "github",
541
+ "url": "https://github.com/sponsors/ai"
542
+ }
543
+ ],
544
+ "license": "MIT",
545
+ "dependencies": {
546
+ "baseline-browser-mapping": "^2.10.38",
547
+ "caniuse-lite": "^1.0.30001799",
548
+ "electron-to-chromium": "^1.5.376",
549
+ "node-releases": "^2.0.48",
550
+ "update-browserslist-db": "^1.2.3"
551
+ },
552
+ "bin": {
553
+ "browserslist": "cli.js"
554
+ },
555
+ "engines": {
556
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
557
+ }
558
+ },
559
+ "node_modules/busboy": {
560
+ "version": "1.6.0",
561
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
562
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
563
+ "dependencies": {
564
+ "streamsearch": "^1.1.0"
565
+ },
566
+ "engines": {
567
+ "node": ">=10.16.0"
568
+ }
569
+ },
570
+ "node_modules/camelcase-css": {
571
+ "version": "2.0.1",
572
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
573
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
574
+ "dev": true,
575
+ "license": "MIT",
576
+ "engines": {
577
+ "node": ">= 6"
578
+ }
579
+ },
580
+ "node_modules/caniuse-lite": {
581
+ "version": "1.0.30001799",
582
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz",
583
+ "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==",
584
+ "funding": [
585
+ {
586
+ "type": "opencollective",
587
+ "url": "https://opencollective.com/browserslist"
588
+ },
589
+ {
590
+ "type": "tidelift",
591
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
592
+ },
593
+ {
594
+ "type": "github",
595
+ "url": "https://github.com/sponsors/ai"
596
+ }
597
+ ],
598
+ "license": "CC-BY-4.0"
599
+ },
600
+ "node_modules/chokidar": {
601
+ "version": "3.6.0",
602
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
603
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
604
+ "dev": true,
605
+ "license": "MIT",
606
+ "dependencies": {
607
+ "anymatch": "~3.1.2",
608
+ "braces": "~3.0.2",
609
+ "glob-parent": "~5.1.2",
610
+ "is-binary-path": "~2.1.0",
611
+ "is-glob": "~4.0.1",
612
+ "normalize-path": "~3.0.0",
613
+ "readdirp": "~3.6.0"
614
+ },
615
+ "engines": {
616
+ "node": ">= 8.10.0"
617
+ },
618
+ "funding": {
619
+ "url": "https://paulmillr.com/funding/"
620
+ },
621
+ "optionalDependencies": {
622
+ "fsevents": "~2.3.2"
623
+ }
624
+ },
625
+ "node_modules/chokidar/node_modules/glob-parent": {
626
+ "version": "5.1.2",
627
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
628
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
629
+ "dev": true,
630
+ "license": "ISC",
631
+ "dependencies": {
632
+ "is-glob": "^4.0.1"
633
+ },
634
+ "engines": {
635
+ "node": ">= 6"
636
+ }
637
+ },
638
+ "node_modules/client-only": {
639
+ "version": "0.0.1",
640
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
641
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
642
+ "license": "MIT"
643
+ },
644
+ "node_modules/commander": {
645
+ "version": "4.1.1",
646
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
647
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
648
+ "dev": true,
649
+ "license": "MIT",
650
+ "engines": {
651
+ "node": ">= 6"
652
+ }
653
+ },
654
+ "node_modules/cssesc": {
655
+ "version": "3.0.0",
656
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
657
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
658
+ "dev": true,
659
+ "license": "MIT",
660
+ "bin": {
661
+ "cssesc": "bin/cssesc"
662
+ },
663
+ "engines": {
664
+ "node": ">=4"
665
+ }
666
+ },
667
+ "node_modules/csstype": {
668
+ "version": "3.2.3",
669
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
670
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
671
+ "dev": true,
672
+ "license": "MIT"
673
+ },
674
+ "node_modules/didyoumean": {
675
+ "version": "1.2.2",
676
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
677
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
678
+ "dev": true,
679
+ "license": "Apache-2.0"
680
+ },
681
+ "node_modules/dlv": {
682
+ "version": "1.1.3",
683
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
684
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
685
+ "dev": true,
686
+ "license": "MIT"
687
+ },
688
+ "node_modules/electron-to-chromium": {
689
+ "version": "1.5.378",
690
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.378.tgz",
691
+ "integrity": "sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==",
692
+ "dev": true,
693
+ "license": "ISC"
694
+ },
695
+ "node_modules/es-errors": {
696
+ "version": "1.3.0",
697
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
698
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
699
+ "dev": true,
700
+ "license": "MIT",
701
+ "engines": {
702
+ "node": ">= 0.4"
703
+ }
704
+ },
705
+ "node_modules/escalade": {
706
+ "version": "3.2.0",
707
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
708
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
709
+ "dev": true,
710
+ "license": "MIT",
711
+ "engines": {
712
+ "node": ">=6"
713
+ }
714
+ },
715
+ "node_modules/fast-glob": {
716
+ "version": "3.3.3",
717
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
718
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
719
+ "dev": true,
720
+ "license": "MIT",
721
+ "dependencies": {
722
+ "@nodelib/fs.stat": "^2.0.2",
723
+ "@nodelib/fs.walk": "^1.2.3",
724
+ "glob-parent": "^5.1.2",
725
+ "merge2": "^1.3.0",
726
+ "micromatch": "^4.0.8"
727
+ },
728
+ "engines": {
729
+ "node": ">=8.6.0"
730
+ }
731
+ },
732
+ "node_modules/fast-glob/node_modules/glob-parent": {
733
+ "version": "5.1.2",
734
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
735
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
736
+ "dev": true,
737
+ "license": "ISC",
738
+ "dependencies": {
739
+ "is-glob": "^4.0.1"
740
+ },
741
+ "engines": {
742
+ "node": ">= 6"
743
+ }
744
+ },
745
+ "node_modules/fastq": {
746
+ "version": "1.20.1",
747
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
748
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
749
+ "dev": true,
750
+ "license": "ISC",
751
+ "dependencies": {
752
+ "reusify": "^1.0.4"
753
+ }
754
+ },
755
+ "node_modules/fill-range": {
756
+ "version": "7.1.1",
757
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
758
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
759
+ "dev": true,
760
+ "license": "MIT",
761
+ "dependencies": {
762
+ "to-regex-range": "^5.0.1"
763
+ },
764
+ "engines": {
765
+ "node": ">=8"
766
+ }
767
+ },
768
+ "node_modules/fraction.js": {
769
+ "version": "4.3.7",
770
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
771
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
772
+ "dev": true,
773
+ "license": "MIT",
774
+ "engines": {
775
+ "node": "*"
776
+ },
777
+ "funding": {
778
+ "type": "patreon",
779
+ "url": "https://github.com/sponsors/rawify"
780
+ }
781
+ },
782
+ "node_modules/fsevents": {
783
+ "version": "2.3.3",
784
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
785
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
786
+ "dev": true,
787
+ "hasInstallScript": true,
788
+ "license": "MIT",
789
+ "optional": true,
790
+ "os": [
791
+ "darwin"
792
+ ],
793
+ "engines": {
794
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
795
+ }
796
+ },
797
+ "node_modules/function-bind": {
798
+ "version": "1.1.2",
799
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
800
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
801
+ "dev": true,
802
+ "license": "MIT",
803
+ "funding": {
804
+ "url": "https://github.com/sponsors/ljharb"
805
+ }
806
+ },
807
+ "node_modules/glob-parent": {
808
+ "version": "6.0.2",
809
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
810
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
811
+ "dev": true,
812
+ "license": "ISC",
813
+ "dependencies": {
814
+ "is-glob": "^4.0.3"
815
+ },
816
+ "engines": {
817
+ "node": ">=10.13.0"
818
+ }
819
+ },
820
+ "node_modules/graceful-fs": {
821
+ "version": "4.2.11",
822
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
823
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
824
+ "license": "ISC"
825
+ },
826
+ "node_modules/hasown": {
827
+ "version": "2.0.4",
828
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
829
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
830
+ "dev": true,
831
+ "license": "MIT",
832
+ "dependencies": {
833
+ "function-bind": "^1.1.2"
834
+ },
835
+ "engines": {
836
+ "node": ">= 0.4"
837
+ }
838
+ },
839
+ "node_modules/is-binary-path": {
840
+ "version": "2.1.0",
841
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
842
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
843
+ "dev": true,
844
+ "license": "MIT",
845
+ "dependencies": {
846
+ "binary-extensions": "^2.0.0"
847
+ },
848
+ "engines": {
849
+ "node": ">=8"
850
+ }
851
+ },
852
+ "node_modules/is-core-module": {
853
+ "version": "2.16.2",
854
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
855
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
856
+ "dev": true,
857
+ "license": "MIT",
858
+ "dependencies": {
859
+ "hasown": "^2.0.3"
860
+ },
861
+ "engines": {
862
+ "node": ">= 0.4"
863
+ },
864
+ "funding": {
865
+ "url": "https://github.com/sponsors/ljharb"
866
+ }
867
+ },
868
+ "node_modules/is-extglob": {
869
+ "version": "2.1.1",
870
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
871
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
872
+ "dev": true,
873
+ "license": "MIT",
874
+ "engines": {
875
+ "node": ">=0.10.0"
876
+ }
877
+ },
878
+ "node_modules/is-glob": {
879
+ "version": "4.0.3",
880
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
881
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
882
+ "dev": true,
883
+ "license": "MIT",
884
+ "dependencies": {
885
+ "is-extglob": "^2.1.1"
886
+ },
887
+ "engines": {
888
+ "node": ">=0.10.0"
889
+ }
890
+ },
891
+ "node_modules/is-number": {
892
+ "version": "7.0.0",
893
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
894
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
895
+ "dev": true,
896
+ "license": "MIT",
897
+ "engines": {
898
+ "node": ">=0.12.0"
899
+ }
900
+ },
901
+ "node_modules/jiti": {
902
+ "version": "1.21.7",
903
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
904
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
905
+ "dev": true,
906
+ "license": "MIT",
907
+ "bin": {
908
+ "jiti": "bin/jiti.js"
909
+ }
910
+ },
911
+ "node_modules/js-tokens": {
912
+ "version": "4.0.0",
913
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
914
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
915
+ "license": "MIT"
916
+ },
917
+ "node_modules/lilconfig": {
918
+ "version": "2.1.0",
919
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
920
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
921
+ "dev": true,
922
+ "license": "MIT",
923
+ "engines": {
924
+ "node": ">=10"
925
+ }
926
+ },
927
+ "node_modules/lines-and-columns": {
928
+ "version": "1.2.4",
929
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
930
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
931
+ "dev": true,
932
+ "license": "MIT"
933
+ },
934
+ "node_modules/loose-envify": {
935
+ "version": "1.4.0",
936
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
937
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
938
+ "license": "MIT",
939
+ "dependencies": {
940
+ "js-tokens": "^3.0.0 || ^4.0.0"
941
+ },
942
+ "bin": {
943
+ "loose-envify": "cli.js"
944
+ }
945
+ },
946
+ "node_modules/merge2": {
947
+ "version": "1.4.1",
948
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
949
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
950
+ "dev": true,
951
+ "license": "MIT",
952
+ "engines": {
953
+ "node": ">= 8"
954
+ }
955
+ },
956
+ "node_modules/micromatch": {
957
+ "version": "4.0.8",
958
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
959
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
960
+ "dev": true,
961
+ "license": "MIT",
962
+ "dependencies": {
963
+ "braces": "^3.0.3",
964
+ "picomatch": "^2.3.1"
965
+ },
966
+ "engines": {
967
+ "node": ">=8.6"
968
+ }
969
+ },
970
+ "node_modules/mz": {
971
+ "version": "2.7.0",
972
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
973
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
974
+ "dev": true,
975
+ "license": "MIT",
976
+ "dependencies": {
977
+ "any-promise": "^1.0.0",
978
+ "object-assign": "^4.0.1",
979
+ "thenify-all": "^1.0.0"
980
+ }
981
+ },
982
+ "node_modules/nanoid": {
983
+ "version": "3.3.15",
984
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz",
985
+ "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==",
986
+ "funding": [
987
+ {
988
+ "type": "github",
989
+ "url": "https://github.com/sponsors/ai"
990
+ }
991
+ ],
992
+ "license": "MIT",
993
+ "bin": {
994
+ "nanoid": "bin/nanoid.cjs"
995
+ },
996
+ "engines": {
997
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
998
+ }
999
+ },
1000
+ "node_modules/next": {
1001
+ "version": "14.2.18",
1002
+ "resolved": "https://registry.npmjs.org/next/-/next-14.2.18.tgz",
1003
+ "integrity": "sha512-H9qbjDuGivUDEnK6wa+p2XKO+iMzgVgyr9Zp/4Iv29lKa+DYaxJGjOeEA+5VOvJh/M7HLiskehInSa0cWxVXUw==",
1004
+ "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details.",
1005
+ "license": "MIT",
1006
+ "dependencies": {
1007
+ "@next/env": "14.2.18",
1008
+ "@swc/helpers": "0.5.5",
1009
+ "busboy": "1.6.0",
1010
+ "caniuse-lite": "^1.0.30001579",
1011
+ "graceful-fs": "^4.2.11",
1012
+ "postcss": "8.4.31",
1013
+ "styled-jsx": "5.1.1"
1014
+ },
1015
+ "bin": {
1016
+ "next": "dist/bin/next"
1017
+ },
1018
+ "engines": {
1019
+ "node": ">=18.17.0"
1020
+ },
1021
+ "optionalDependencies": {
1022
+ "@next/swc-darwin-arm64": "14.2.18",
1023
+ "@next/swc-darwin-x64": "14.2.18",
1024
+ "@next/swc-linux-arm64-gnu": "14.2.18",
1025
+ "@next/swc-linux-arm64-musl": "14.2.18",
1026
+ "@next/swc-linux-x64-gnu": "14.2.18",
1027
+ "@next/swc-linux-x64-musl": "14.2.18",
1028
+ "@next/swc-win32-arm64-msvc": "14.2.18",
1029
+ "@next/swc-win32-ia32-msvc": "14.2.18",
1030
+ "@next/swc-win32-x64-msvc": "14.2.18"
1031
+ },
1032
+ "peerDependencies": {
1033
+ "@opentelemetry/api": "^1.1.0",
1034
+ "@playwright/test": "^1.41.2",
1035
+ "react": "^18.2.0",
1036
+ "react-dom": "^18.2.0",
1037
+ "sass": "^1.3.0"
1038
+ },
1039
+ "peerDependenciesMeta": {
1040
+ "@opentelemetry/api": {
1041
+ "optional": true
1042
+ },
1043
+ "@playwright/test": {
1044
+ "optional": true
1045
+ },
1046
+ "sass": {
1047
+ "optional": true
1048
+ }
1049
+ }
1050
+ },
1051
+ "node_modules/next/node_modules/postcss": {
1052
+ "version": "8.4.31",
1053
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
1054
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
1055
+ "funding": [
1056
+ {
1057
+ "type": "opencollective",
1058
+ "url": "https://opencollective.com/postcss/"
1059
+ },
1060
+ {
1061
+ "type": "tidelift",
1062
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1063
+ },
1064
+ {
1065
+ "type": "github",
1066
+ "url": "https://github.com/sponsors/ai"
1067
+ }
1068
+ ],
1069
+ "license": "MIT",
1070
+ "dependencies": {
1071
+ "nanoid": "^3.3.6",
1072
+ "picocolors": "^1.0.0",
1073
+ "source-map-js": "^1.0.2"
1074
+ },
1075
+ "engines": {
1076
+ "node": "^10 || ^12 || >=14"
1077
+ }
1078
+ },
1079
+ "node_modules/node-releases": {
1080
+ "version": "2.0.49",
1081
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.49.tgz",
1082
+ "integrity": "sha512-f06bl1D+8ZDkn2oOQQKAh5/otFWqVnM1Q5oerA8Pex7UfT66Tx4IPHIqVVFKqFT3FUtaDstdgkM7yT7JWhqxfw==",
1083
+ "dev": true,
1084
+ "license": "MIT",
1085
+ "engines": {
1086
+ "node": ">=18"
1087
+ }
1088
+ },
1089
+ "node_modules/normalize-path": {
1090
+ "version": "3.0.0",
1091
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1092
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1093
+ "dev": true,
1094
+ "license": "MIT",
1095
+ "engines": {
1096
+ "node": ">=0.10.0"
1097
+ }
1098
+ },
1099
+ "node_modules/normalize-range": {
1100
+ "version": "0.1.2",
1101
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
1102
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
1103
+ "dev": true,
1104
+ "license": "MIT",
1105
+ "engines": {
1106
+ "node": ">=0.10.0"
1107
+ }
1108
+ },
1109
+ "node_modules/object-assign": {
1110
+ "version": "4.1.1",
1111
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1112
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1113
+ "dev": true,
1114
+ "license": "MIT",
1115
+ "engines": {
1116
+ "node": ">=0.10.0"
1117
+ }
1118
+ },
1119
+ "node_modules/object-hash": {
1120
+ "version": "3.0.0",
1121
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1122
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
1123
+ "dev": true,
1124
+ "license": "MIT",
1125
+ "engines": {
1126
+ "node": ">= 6"
1127
+ }
1128
+ },
1129
+ "node_modules/path-parse": {
1130
+ "version": "1.0.7",
1131
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1132
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1133
+ "dev": true,
1134
+ "license": "MIT"
1135
+ },
1136
+ "node_modules/picocolors": {
1137
+ "version": "1.1.1",
1138
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1139
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1140
+ "license": "ISC"
1141
+ },
1142
+ "node_modules/picomatch": {
1143
+ "version": "2.3.2",
1144
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
1145
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
1146
+ "dev": true,
1147
+ "license": "MIT",
1148
+ "engines": {
1149
+ "node": ">=8.6"
1150
+ },
1151
+ "funding": {
1152
+ "url": "https://github.com/sponsors/jonschlinkert"
1153
+ }
1154
+ },
1155
+ "node_modules/pify": {
1156
+ "version": "2.3.0",
1157
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1158
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
1159
+ "dev": true,
1160
+ "license": "MIT",
1161
+ "engines": {
1162
+ "node": ">=0.10.0"
1163
+ }
1164
+ },
1165
+ "node_modules/pirates": {
1166
+ "version": "4.0.7",
1167
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
1168
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
1169
+ "dev": true,
1170
+ "license": "MIT",
1171
+ "engines": {
1172
+ "node": ">= 6"
1173
+ }
1174
+ },
1175
+ "node_modules/postcss": {
1176
+ "version": "8.4.49",
1177
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
1178
+ "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
1179
+ "dev": true,
1180
+ "funding": [
1181
+ {
1182
+ "type": "opencollective",
1183
+ "url": "https://opencollective.com/postcss/"
1184
+ },
1185
+ {
1186
+ "type": "tidelift",
1187
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1188
+ },
1189
+ {
1190
+ "type": "github",
1191
+ "url": "https://github.com/sponsors/ai"
1192
+ }
1193
+ ],
1194
+ "license": "MIT",
1195
+ "dependencies": {
1196
+ "nanoid": "^3.3.7",
1197
+ "picocolors": "^1.1.1",
1198
+ "source-map-js": "^1.2.1"
1199
+ },
1200
+ "engines": {
1201
+ "node": "^10 || ^12 || >=14"
1202
+ }
1203
+ },
1204
+ "node_modules/postcss-import": {
1205
+ "version": "15.1.0",
1206
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
1207
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
1208
+ "dev": true,
1209
+ "license": "MIT",
1210
+ "dependencies": {
1211
+ "postcss-value-parser": "^4.0.0",
1212
+ "read-cache": "^1.0.0",
1213
+ "resolve": "^1.1.7"
1214
+ },
1215
+ "engines": {
1216
+ "node": ">=14.0.0"
1217
+ },
1218
+ "peerDependencies": {
1219
+ "postcss": "^8.0.0"
1220
+ }
1221
+ },
1222
+ "node_modules/postcss-js": {
1223
+ "version": "4.1.0",
1224
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz",
1225
+ "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==",
1226
+ "dev": true,
1227
+ "funding": [
1228
+ {
1229
+ "type": "opencollective",
1230
+ "url": "https://opencollective.com/postcss/"
1231
+ },
1232
+ {
1233
+ "type": "github",
1234
+ "url": "https://github.com/sponsors/ai"
1235
+ }
1236
+ ],
1237
+ "license": "MIT",
1238
+ "dependencies": {
1239
+ "camelcase-css": "^2.0.1"
1240
+ },
1241
+ "engines": {
1242
+ "node": "^12 || ^14 || >= 16"
1243
+ },
1244
+ "peerDependencies": {
1245
+ "postcss": "^8.4.21"
1246
+ }
1247
+ },
1248
+ "node_modules/postcss-nested": {
1249
+ "version": "6.2.0",
1250
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
1251
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
1252
+ "dev": true,
1253
+ "funding": [
1254
+ {
1255
+ "type": "opencollective",
1256
+ "url": "https://opencollective.com/postcss/"
1257
+ },
1258
+ {
1259
+ "type": "github",
1260
+ "url": "https://github.com/sponsors/ai"
1261
+ }
1262
+ ],
1263
+ "license": "MIT",
1264
+ "dependencies": {
1265
+ "postcss-selector-parser": "^6.1.1"
1266
+ },
1267
+ "engines": {
1268
+ "node": ">=12.0"
1269
+ },
1270
+ "peerDependencies": {
1271
+ "postcss": "^8.2.14"
1272
+ }
1273
+ },
1274
+ "node_modules/postcss-selector-parser": {
1275
+ "version": "6.1.4",
1276
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
1277
+ "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
1278
+ "dev": true,
1279
+ "license": "MIT",
1280
+ "dependencies": {
1281
+ "cssesc": "^3.0.0",
1282
+ "util-deprecate": "^1.0.2"
1283
+ },
1284
+ "engines": {
1285
+ "node": ">=4"
1286
+ }
1287
+ },
1288
+ "node_modules/postcss-value-parser": {
1289
+ "version": "4.2.0",
1290
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
1291
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
1292
+ "dev": true,
1293
+ "license": "MIT"
1294
+ },
1295
+ "node_modules/queue-microtask": {
1296
+ "version": "1.2.3",
1297
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1298
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1299
+ "dev": true,
1300
+ "funding": [
1301
+ {
1302
+ "type": "github",
1303
+ "url": "https://github.com/sponsors/feross"
1304
+ },
1305
+ {
1306
+ "type": "patreon",
1307
+ "url": "https://www.patreon.com/feross"
1308
+ },
1309
+ {
1310
+ "type": "consulting",
1311
+ "url": "https://feross.org/support"
1312
+ }
1313
+ ],
1314
+ "license": "MIT"
1315
+ },
1316
+ "node_modules/react": {
1317
+ "version": "18.3.1",
1318
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
1319
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
1320
+ "license": "MIT",
1321
+ "dependencies": {
1322
+ "loose-envify": "^1.1.0"
1323
+ },
1324
+ "engines": {
1325
+ "node": ">=0.10.0"
1326
+ }
1327
+ },
1328
+ "node_modules/react-dom": {
1329
+ "version": "18.3.1",
1330
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
1331
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
1332
+ "license": "MIT",
1333
+ "dependencies": {
1334
+ "loose-envify": "^1.1.0",
1335
+ "scheduler": "^0.23.2"
1336
+ },
1337
+ "peerDependencies": {
1338
+ "react": "^18.3.1"
1339
+ }
1340
+ },
1341
+ "node_modules/read-cache": {
1342
+ "version": "1.0.0",
1343
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
1344
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
1345
+ "dev": true,
1346
+ "license": "MIT",
1347
+ "dependencies": {
1348
+ "pify": "^2.3.0"
1349
+ }
1350
+ },
1351
+ "node_modules/readdirp": {
1352
+ "version": "3.6.0",
1353
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1354
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1355
+ "dev": true,
1356
+ "license": "MIT",
1357
+ "dependencies": {
1358
+ "picomatch": "^2.2.1"
1359
+ },
1360
+ "engines": {
1361
+ "node": ">=8.10.0"
1362
+ }
1363
+ },
1364
+ "node_modules/resolve": {
1365
+ "version": "1.22.12",
1366
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
1367
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
1368
+ "dev": true,
1369
+ "license": "MIT",
1370
+ "dependencies": {
1371
+ "es-errors": "^1.3.0",
1372
+ "is-core-module": "^2.16.1",
1373
+ "path-parse": "^1.0.7",
1374
+ "supports-preserve-symlinks-flag": "^1.0.0"
1375
+ },
1376
+ "bin": {
1377
+ "resolve": "bin/resolve"
1378
+ },
1379
+ "engines": {
1380
+ "node": ">= 0.4"
1381
+ },
1382
+ "funding": {
1383
+ "url": "https://github.com/sponsors/ljharb"
1384
+ }
1385
+ },
1386
+ "node_modules/reusify": {
1387
+ "version": "1.1.0",
1388
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
1389
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
1390
+ "dev": true,
1391
+ "license": "MIT",
1392
+ "engines": {
1393
+ "iojs": ">=1.0.0",
1394
+ "node": ">=0.10.0"
1395
+ }
1396
+ },
1397
+ "node_modules/run-parallel": {
1398
+ "version": "1.2.0",
1399
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1400
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1401
+ "dev": true,
1402
+ "funding": [
1403
+ {
1404
+ "type": "github",
1405
+ "url": "https://github.com/sponsors/feross"
1406
+ },
1407
+ {
1408
+ "type": "patreon",
1409
+ "url": "https://www.patreon.com/feross"
1410
+ },
1411
+ {
1412
+ "type": "consulting",
1413
+ "url": "https://feross.org/support"
1414
+ }
1415
+ ],
1416
+ "license": "MIT",
1417
+ "dependencies": {
1418
+ "queue-microtask": "^1.2.2"
1419
+ }
1420
+ },
1421
+ "node_modules/scheduler": {
1422
+ "version": "0.23.2",
1423
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
1424
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
1425
+ "license": "MIT",
1426
+ "dependencies": {
1427
+ "loose-envify": "^1.1.0"
1428
+ }
1429
+ },
1430
+ "node_modules/source-map-js": {
1431
+ "version": "1.2.1",
1432
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1433
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1434
+ "license": "BSD-3-Clause",
1435
+ "engines": {
1436
+ "node": ">=0.10.0"
1437
+ }
1438
+ },
1439
+ "node_modules/streamsearch": {
1440
+ "version": "1.1.0",
1441
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1442
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1443
+ "engines": {
1444
+ "node": ">=10.0.0"
1445
+ }
1446
+ },
1447
+ "node_modules/styled-jsx": {
1448
+ "version": "5.1.1",
1449
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz",
1450
+ "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==",
1451
+ "license": "MIT",
1452
+ "dependencies": {
1453
+ "client-only": "0.0.1"
1454
+ },
1455
+ "engines": {
1456
+ "node": ">= 12.0.0"
1457
+ },
1458
+ "peerDependencies": {
1459
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0"
1460
+ },
1461
+ "peerDependenciesMeta": {
1462
+ "@babel/core": {
1463
+ "optional": true
1464
+ },
1465
+ "babel-plugin-macros": {
1466
+ "optional": true
1467
+ }
1468
+ }
1469
+ },
1470
+ "node_modules/sucrase": {
1471
+ "version": "3.35.1",
1472
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
1473
+ "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
1474
+ "dev": true,
1475
+ "license": "MIT",
1476
+ "dependencies": {
1477
+ "@jridgewell/gen-mapping": "^0.3.2",
1478
+ "commander": "^4.0.0",
1479
+ "lines-and-columns": "^1.1.6",
1480
+ "mz": "^2.7.0",
1481
+ "pirates": "^4.0.1",
1482
+ "tinyglobby": "^0.2.11",
1483
+ "ts-interface-checker": "^0.1.9"
1484
+ },
1485
+ "bin": {
1486
+ "sucrase": "bin/sucrase",
1487
+ "sucrase-node": "bin/sucrase-node"
1488
+ },
1489
+ "engines": {
1490
+ "node": ">=16 || 14 >=14.17"
1491
+ }
1492
+ },
1493
+ "node_modules/supports-preserve-symlinks-flag": {
1494
+ "version": "1.0.0",
1495
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1496
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
1497
+ "dev": true,
1498
+ "license": "MIT",
1499
+ "engines": {
1500
+ "node": ">= 0.4"
1501
+ },
1502
+ "funding": {
1503
+ "url": "https://github.com/sponsors/ljharb"
1504
+ }
1505
+ },
1506
+ "node_modules/tailwindcss": {
1507
+ "version": "3.4.15",
1508
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz",
1509
+ "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==",
1510
+ "dev": true,
1511
+ "license": "MIT",
1512
+ "dependencies": {
1513
+ "@alloc/quick-lru": "^5.2.0",
1514
+ "arg": "^5.0.2",
1515
+ "chokidar": "^3.6.0",
1516
+ "didyoumean": "^1.2.2",
1517
+ "dlv": "^1.1.3",
1518
+ "fast-glob": "^3.3.2",
1519
+ "glob-parent": "^6.0.2",
1520
+ "is-glob": "^4.0.3",
1521
+ "jiti": "^1.21.6",
1522
+ "lilconfig": "^2.1.0",
1523
+ "micromatch": "^4.0.8",
1524
+ "normalize-path": "^3.0.0",
1525
+ "object-hash": "^3.0.0",
1526
+ "picocolors": "^1.1.1",
1527
+ "postcss": "^8.4.47",
1528
+ "postcss-import": "^15.1.0",
1529
+ "postcss-js": "^4.0.1",
1530
+ "postcss-load-config": "^4.0.2",
1531
+ "postcss-nested": "^6.2.0",
1532
+ "postcss-selector-parser": "^6.1.2",
1533
+ "resolve": "^1.22.8",
1534
+ "sucrase": "^3.35.0"
1535
+ },
1536
+ "bin": {
1537
+ "tailwind": "lib/cli.js",
1538
+ "tailwindcss": "lib/cli.js"
1539
+ },
1540
+ "engines": {
1541
+ "node": ">=14.0.0"
1542
+ }
1543
+ },
1544
+ "node_modules/tailwindcss/node_modules/postcss-load-config": {
1545
+ "version": "4.0.2",
1546
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
1547
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
1548
+ "dev": true,
1549
+ "funding": [
1550
+ {
1551
+ "type": "opencollective",
1552
+ "url": "https://opencollective.com/postcss/"
1553
+ },
1554
+ {
1555
+ "type": "github",
1556
+ "url": "https://github.com/sponsors/ai"
1557
+ }
1558
+ ],
1559
+ "license": "MIT",
1560
+ "dependencies": {
1561
+ "lilconfig": "^3.0.0",
1562
+ "yaml": "^2.3.4"
1563
+ },
1564
+ "engines": {
1565
+ "node": ">= 14"
1566
+ },
1567
+ "peerDependencies": {
1568
+ "postcss": ">=8.0.9",
1569
+ "ts-node": ">=9.0.0"
1570
+ },
1571
+ "peerDependenciesMeta": {
1572
+ "postcss": {
1573
+ "optional": true
1574
+ },
1575
+ "ts-node": {
1576
+ "optional": true
1577
+ }
1578
+ }
1579
+ },
1580
+ "node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": {
1581
+ "version": "3.1.3",
1582
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
1583
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
1584
+ "dev": true,
1585
+ "license": "MIT",
1586
+ "engines": {
1587
+ "node": ">=14"
1588
+ },
1589
+ "funding": {
1590
+ "url": "https://github.com/sponsors/antonk52"
1591
+ }
1592
+ },
1593
+ "node_modules/thenify": {
1594
+ "version": "3.3.1",
1595
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
1596
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
1597
+ "dev": true,
1598
+ "license": "MIT",
1599
+ "dependencies": {
1600
+ "any-promise": "^1.0.0"
1601
+ }
1602
+ },
1603
+ "node_modules/thenify-all": {
1604
+ "version": "1.6.0",
1605
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
1606
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
1607
+ "dev": true,
1608
+ "license": "MIT",
1609
+ "dependencies": {
1610
+ "thenify": ">= 3.1.0 < 4"
1611
+ },
1612
+ "engines": {
1613
+ "node": ">=0.8"
1614
+ }
1615
+ },
1616
+ "node_modules/tinyglobby": {
1617
+ "version": "0.2.17",
1618
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
1619
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
1620
+ "dev": true,
1621
+ "license": "MIT",
1622
+ "dependencies": {
1623
+ "fdir": "^6.5.0",
1624
+ "picomatch": "^4.0.4"
1625
+ },
1626
+ "engines": {
1627
+ "node": ">=12.0.0"
1628
+ },
1629
+ "funding": {
1630
+ "url": "https://github.com/sponsors/SuperchupuDev"
1631
+ }
1632
+ },
1633
+ "node_modules/tinyglobby/node_modules/fdir": {
1634
+ "version": "6.5.0",
1635
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
1636
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
1637
+ "dev": true,
1638
+ "license": "MIT",
1639
+ "engines": {
1640
+ "node": ">=12.0.0"
1641
+ },
1642
+ "peerDependencies": {
1643
+ "picomatch": "^3 || ^4"
1644
+ },
1645
+ "peerDependenciesMeta": {
1646
+ "picomatch": {
1647
+ "optional": true
1648
+ }
1649
+ }
1650
+ },
1651
+ "node_modules/tinyglobby/node_modules/picomatch": {
1652
+ "version": "4.0.4",
1653
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
1654
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
1655
+ "dev": true,
1656
+ "license": "MIT",
1657
+ "engines": {
1658
+ "node": ">=12"
1659
+ },
1660
+ "funding": {
1661
+ "url": "https://github.com/sponsors/jonschlinkert"
1662
+ }
1663
+ },
1664
+ "node_modules/to-regex-range": {
1665
+ "version": "5.0.1",
1666
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1667
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1668
+ "dev": true,
1669
+ "license": "MIT",
1670
+ "dependencies": {
1671
+ "is-number": "^7.0.0"
1672
+ },
1673
+ "engines": {
1674
+ "node": ">=8.0"
1675
+ }
1676
+ },
1677
+ "node_modules/tr46": {
1678
+ "version": "0.0.3",
1679
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1680
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
1681
+ "license": "MIT"
1682
+ },
1683
+ "node_modules/ts-interface-checker": {
1684
+ "version": "0.1.13",
1685
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
1686
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
1687
+ "dev": true,
1688
+ "license": "Apache-2.0"
1689
+ },
1690
+ "node_modules/tslib": {
1691
+ "version": "2.8.1",
1692
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
1693
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
1694
+ "license": "0BSD"
1695
+ },
1696
+ "node_modules/typescript": {
1697
+ "version": "5.6.3",
1698
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
1699
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
1700
+ "dev": true,
1701
+ "license": "Apache-2.0",
1702
+ "bin": {
1703
+ "tsc": "bin/tsc",
1704
+ "tsserver": "bin/tsserver"
1705
+ },
1706
+ "engines": {
1707
+ "node": ">=14.17"
1708
+ }
1709
+ },
1710
+ "node_modules/undici-types": {
1711
+ "version": "6.19.8",
1712
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
1713
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
1714
+ "license": "MIT"
1715
+ },
1716
+ "node_modules/update-browserslist-db": {
1717
+ "version": "1.2.3",
1718
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
1719
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
1720
+ "dev": true,
1721
+ "funding": [
1722
+ {
1723
+ "type": "opencollective",
1724
+ "url": "https://opencollective.com/browserslist"
1725
+ },
1726
+ {
1727
+ "type": "tidelift",
1728
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1729
+ },
1730
+ {
1731
+ "type": "github",
1732
+ "url": "https://github.com/sponsors/ai"
1733
+ }
1734
+ ],
1735
+ "license": "MIT",
1736
+ "dependencies": {
1737
+ "escalade": "^3.2.0",
1738
+ "picocolors": "^1.1.1"
1739
+ },
1740
+ "bin": {
1741
+ "update-browserslist-db": "cli.js"
1742
+ },
1743
+ "peerDependencies": {
1744
+ "browserslist": ">= 4.21.0"
1745
+ }
1746
+ },
1747
+ "node_modules/util-deprecate": {
1748
+ "version": "1.0.2",
1749
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1750
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1751
+ "dev": true,
1752
+ "license": "MIT"
1753
+ },
1754
+ "node_modules/webidl-conversions": {
1755
+ "version": "3.0.1",
1756
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1757
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
1758
+ "license": "BSD-2-Clause"
1759
+ },
1760
+ "node_modules/whatwg-url": {
1761
+ "version": "5.0.0",
1762
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1763
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1764
+ "license": "MIT",
1765
+ "dependencies": {
1766
+ "tr46": "~0.0.3",
1767
+ "webidl-conversions": "^3.0.0"
1768
+ }
1769
+ },
1770
+ "node_modules/ws": {
1771
+ "version": "8.21.0",
1772
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
1773
+ "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
1774
+ "license": "MIT",
1775
+ "engines": {
1776
+ "node": ">=10.0.0"
1777
+ },
1778
+ "peerDependencies": {
1779
+ "bufferutil": "^4.0.1",
1780
+ "utf-8-validate": ">=5.0.2"
1781
+ },
1782
+ "peerDependenciesMeta": {
1783
+ "bufferutil": {
1784
+ "optional": true
1785
+ },
1786
+ "utf-8-validate": {
1787
+ "optional": true
1788
+ }
1789
+ }
1790
+ },
1791
+ "node_modules/yaml": {
1792
+ "version": "2.9.0",
1793
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
1794
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
1795
+ "dev": true,
1796
+ "license": "ISC",
1797
+ "bin": {
1798
+ "yaml": "bin.mjs"
1799
+ },
1800
+ "engines": {
1801
+ "node": ">= 14.6"
1802
+ },
1803
+ "funding": {
1804
+ "url": "https://github.com/sponsors/eemeli"
1805
+ }
1806
+ }
1807
+ }
1808
+ }
frontend/package.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "virtforeman-frontend",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "next lint"
10
+ },
11
+ "dependencies": {
12
+ "next": "14.2.18",
13
+ "react": "18.3.1",
14
+ "react-dom": "18.3.1",
15
+ "@supabase/supabase-js": "2.46.1"
16
+ },
17
+ "devDependencies": {
18
+ "@types/node": "22.9.0",
19
+ "@types/react": "18.3.12",
20
+ "@types/react-dom": "18.3.1",
21
+ "autoprefixer": "10.4.20",
22
+ "postcss": "8.4.49",
23
+ "tailwindcss": "3.4.15",
24
+ "typescript": "5.6.3"
25
+ }
26
+ }
frontend/postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
frontend/tailwind.config.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import type { Config } from "tailwindcss";
2
+
3
+ const config: Config = {
4
+ content: ["./app/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}"],
5
+ theme: { extend: {} },
6
+ plugins: [],
7
+ };
8
+
9
+ export default config;
frontend/tsconfig.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "preserve",
15
+ "incremental": true,
16
+ "plugins": [{ "name": "next" }],
17
+ "paths": { "@/*": ["./*"] }
18
+ },
19
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
20
+ "exclude": ["node_modules"]
21
+ }
vercel.json CHANGED
@@ -2,7 +2,7 @@
2
  "version": 2,
3
  "builds": [
4
  {
5
- "src": "package.json",
6
  "use": "@vercel/next"
7
  }
8
  ],
 
2
  "version": 2,
3
  "builds": [
4
  {
5
+ "src": "frontend/package.json",
6
  "use": "@vercel/next"
7
  }
8
  ],