feat(frontend): implement all views using Svelte 5 runes and TS 7.0

This commit is contained in:
2026-04-28 05:19:30 +02:00
parent f9c721d841
commit c7ab5d8689
389 changed files with 600707 additions and 399 deletions

View File

@@ -3,13 +3,32 @@ export { matchers } from './matchers.js';
export const nodes = [
() => import('./nodes/0'),
() => import('./nodes/1'),
() => import('./nodes/2')
() => import('./nodes/2'),
() => import('./nodes/3'),
() => import('./nodes/4'),
() => import('./nodes/5'),
() => import('./nodes/6'),
() => import('./nodes/7'),
() => import('./nodes/8'),
() => import('./nodes/9'),
() => import('./nodes/10'),
() => import('./nodes/11'),
() => import('./nodes/12')
];
export const server_loads = [];
export const dictionary = {
"/": [2]
"/": [3],
"/admin": [4,[2]],
"/admin/attendance": [5,[2]],
"/admin/courses": [6,[2]],
"/admin/export": [7,[2]],
"/admin/notes": [8,[2]],
"/admin/rooms": [9,[2]],
"/admin/sessions": [10,[2]],
"/login": [11],
"/s/[code]": [12]
};
export const hooks = {

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/sessions/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/login/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/s/[code]/+page.svelte";

View File

@@ -1 +1 @@
export { default as component } from "../../../../src/routes/+page.svelte";
export { default as component } from "../../../../src/routes/admin/+layout.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/attendance/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/courses/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/export/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/notes/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/rooms/+page.svelte";

View File

@@ -3,13 +3,32 @@ export { matchers } from './matchers.js';
export const nodes = [
() => import('./nodes/0'),
() => import('./nodes/1'),
() => import('./nodes/2')
() => import('./nodes/2'),
() => import('./nodes/3'),
() => import('./nodes/4'),
() => import('./nodes/5'),
() => import('./nodes/6'),
() => import('./nodes/7'),
() => import('./nodes/8'),
() => import('./nodes/9'),
() => import('./nodes/10'),
() => import('./nodes/11'),
() => import('./nodes/12')
];
export const server_loads = [];
export const dictionary = {
"/": [2]
"/": [3],
"/admin": [4,[2]],
"/admin/attendance": [5,[2]],
"/admin/courses": [6,[2]],
"/admin/export": [7,[2]],
"/admin/notes": [8,[2]],
"/admin/rooms": [9,[2]],
"/admin/sessions": [10,[2]],
"/login": [11],
"/s/[code]": [12]
};
export const hooks = {

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/sessions/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/login/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/s/[code]/+page.svelte";

View File

@@ -1 +1 @@
export { default as component } from "../../../../src/routes/+page.svelte";
export { default as component } from "../../../../src/routes/admin/+layout.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/attendance/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/courses/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/export/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/notes/+page.svelte";

View File

@@ -0,0 +1 @@
export { default as component } from "../../../../src/routes/admin/rooms/+page.svelte";

View File

@@ -5,7 +5,7 @@
import { browser } from '$app/environment';
// stores
let { stores, page, constructors, components = [], form, data_0 = null, data_1 = null } = $props();
let { stores, page, constructors, components = [], form, data_0 = null, data_1 = null, data_2 = null } = $props();
if (!browser) {
// svelte-ignore state_referenced_locally
@@ -19,7 +19,7 @@
stores.page.set(page);
}
$effect(() => {
stores;page;constructors;components;form;data_0;data_1;
stores;page;constructors;components;form;data_0;data_1;data_2;
stores.page.notify();
});
@@ -41,15 +41,27 @@
return unsubscribe;
});
const Pyramid_1=$derived(constructors[1])
const Pyramid_2=$derived(constructors[2])
</script>
{#if constructors[1]}
{@const Pyramid_0 = constructors[0]}
<!-- svelte-ignore binding_property_non_reactive -->
<Pyramid_0 bind:this={components[0]} data={data_0} {form} params={page.params}>
<!-- svelte-ignore binding_property_non_reactive -->
<Pyramid_1 bind:this={components[1]} data={data_1} {form} params={page.params} />
{#if constructors[2]}
{@const Pyramid_1 = constructors[1]}
<!-- svelte-ignore binding_property_non_reactive -->
<Pyramid_1 bind:this={components[1]} data={data_1} {form} params={page.params}>
<!-- svelte-ignore binding_property_non_reactive -->
<Pyramid_2 bind:this={components[2]} data={data_2} {form} params={page.params} />
</Pyramid_1>
{:else}
{@const Pyramid_1 = constructors[1]}
<!-- svelte-ignore binding_property_non_reactive -->
<Pyramid_1 bind:this={components[1]} data={data_1} {form} params={page.params} />
{/if}
</Pyramid_0>
{:else}

View File

@@ -25,7 +25,7 @@ export const options = {
app: ({ head, body, assets, nonce, env }) => "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<link rel=\"icon\" href=\"" + assets + "/favicon.png\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t\t" + head + "\n\t</head>\n\t<body data-sveltekit-preload-data=\"hover\">\n\t\t<div style=\"display: contents\">" + body + "</div>\n\t</body>\n</html>\n",
error: ({ status, message }) => "<!doctype html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>" + message + "</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family:\n\t\t\t\t\tsystem-ui,\n\t\t\t\t\t-apple-system,\n\t\t\t\t\tBlinkMacSystemFont,\n\t\t\t\t\t'Segoe UI',\n\t\t\t\t\tRoboto,\n\t\t\t\t\tOxygen,\n\t\t\t\t\tUbuntu,\n\t\t\t\t\tCantarell,\n\t\t\t\t\t'Open Sans',\n\t\t\t\t\t'Helvetica Neue',\n\t\t\t\t\tsans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">" + status + "</span>\n\t\t\t<div class=\"message\">\n\t\t\t\t<h1>" + message + "</h1>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
},
version_hash: "4xp95d"
version_hash: "eq7x7d"
};
export async function get_hooks() {

View File

@@ -29,14 +29,24 @@ declare module "$app/types" {
type MatcherParam<M> = M extends (param : string) => param is (infer U extends string) ? U : string;
export interface AppTypes {
RouteId(): "/";
RouteId(): "/" | "/admin" | "/admin/attendance" | "/admin/courses" | "/admin/export" | "/admin/notes" | "/admin/rooms" | "/admin/sessions" | "/login" | "/s" | "/s/[code]";
RouteParams(): {
"/s/[code]": { code: string }
};
LayoutParams(): {
"/": Record<string, never>
"/": { code?: string };
"/admin": Record<string, never>;
"/admin/attendance": Record<string, never>;
"/admin/courses": Record<string, never>;
"/admin/export": Record<string, never>;
"/admin/notes": Record<string, never>;
"/admin/rooms": Record<string, never>;
"/admin/sessions": Record<string, never>;
"/login": Record<string, never>;
"/s": { code?: string };
"/s/[code]": { code: string }
};
Pathname(): "/";
Pathname(): "/" | "/admin" | "/admin/attendance" | "/admin/courses" | "/admin/export" | "/admin/notes" | "/admin/rooms" | "/admin/sessions" | "/login" | `/s/${string}` & {};
ResolvedPathname(): `${"" | `/${string}`}${ReturnType<AppTypes['Pathname']>}`;
Asset(): string & {};
}

View File

@@ -1,86 +1,300 @@
{
".svelte-kit/generated/client-optimized/app.js": {
"file": "_app/immutable/entry/app.nZlaNymk.js",
"file": "_app/immutable/entry/app.CYjzVzWt.js",
"name": "entry/app",
"src": ".svelte-kit/generated/client-optimized/app.js",
"isEntry": true,
"imports": [
"_BymsAeK4.js",
"_smLyJ_zi.js",
"_DEDqjojZ.js"
"_egdMPJ-g.js",
"_DXhpcOT6.js",
"_BMRk7WTg.js"
],
"dynamicImports": [
".svelte-kit/generated/client-optimized/nodes/0.js",
".svelte-kit/generated/client-optimized/nodes/1.js",
".svelte-kit/generated/client-optimized/nodes/2.js"
".svelte-kit/generated/client-optimized/nodes/2.js",
".svelte-kit/generated/client-optimized/nodes/3.js",
".svelte-kit/generated/client-optimized/nodes/4.js",
".svelte-kit/generated/client-optimized/nodes/5.js",
".svelte-kit/generated/client-optimized/nodes/6.js",
".svelte-kit/generated/client-optimized/nodes/7.js",
".svelte-kit/generated/client-optimized/nodes/8.js",
".svelte-kit/generated/client-optimized/nodes/9.js",
".svelte-kit/generated/client-optimized/nodes/10.js",
".svelte-kit/generated/client-optimized/nodes/11.js",
".svelte-kit/generated/client-optimized/nodes/12.js"
]
},
".svelte-kit/generated/client-optimized/nodes/0.js": {
"file": "_app/immutable/nodes/0.BI2104Lw.js",
"file": "_app/immutable/nodes/0.Ddm7H9s-.js",
"name": "nodes/0",
"src": ".svelte-kit/generated/client-optimized/nodes/0.js",
"isEntry": true,
"imports": [
"_BymsAeK4.js",
"_DEDqjojZ.js",
"_BLiAG49H.js"
"_egdMPJ-g.js",
"_BMRk7WTg.js",
"_Dt4wv1ei.js"
]
},
".svelte-kit/generated/client-optimized/nodes/1.js": {
"file": "_app/immutable/nodes/1.7VgG-JZk.js",
"file": "_app/immutable/nodes/1.DFtas2MP.js",
"name": "nodes/1",
"src": ".svelte-kit/generated/client-optimized/nodes/1.js",
"isEntry": true,
"imports": [
"_BymsAeK4.js",
"_bq2dQ5MW.js",
"_DEDqjojZ.js"
"_egdMPJ-g.js",
"_DKRuQnts.js",
"_BMRk7WTg.js"
]
},
".svelte-kit/generated/client-optimized/nodes/10.js": {
"file": "_app/immutable/nodes/10.BLeYuhst.js",
"name": "nodes/10",
"src": ".svelte-kit/generated/client-optimized/nodes/10.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_BMRk7WTg.js",
"_DNBIa2Bh.js"
],
"css": [
"_app/immutable/assets/10.BhkUjvVr.css"
]
},
".svelte-kit/generated/client-optimized/nodes/11.js": {
"file": "_app/immutable/nodes/11.DB6yXGVc.js",
"name": "nodes/11",
"src": ".svelte-kit/generated/client-optimized/nodes/11.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_DKRuQnts.js",
"_vL8MaPP-.js",
"_BMRk7WTg.js",
"_Dt4wv1ei.js",
"_DNBIa2Bh.js",
"_CS5Tuebd.js"
],
"css": [
"_app/immutable/assets/11.LkBq3xGq.css"
]
},
".svelte-kit/generated/client-optimized/nodes/12.js": {
"file": "_app/immutable/nodes/12.5DAleB6K.js",
"name": "nodes/12",
"src": ".svelte-kit/generated/client-optimized/nodes/12.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_DKRuQnts.js",
"_BMRk7WTg.js",
"_BYEkGdSH.js",
"_DNBIa2Bh.js"
],
"css": [
"_app/immutable/assets/12.BboNMIwd.css"
]
},
".svelte-kit/generated/client-optimized/nodes/2.js": {
"file": "_app/immutable/nodes/2.DsEO-gDS.js",
"file": "_app/immutable/nodes/2.BZoTn0Qw.js",
"name": "nodes/2",
"src": ".svelte-kit/generated/client-optimized/nodes/2.js",
"isEntry": true,
"imports": [
"_BymsAeK4.js",
"_DEDqjojZ.js",
"_BLiAG49H.js"
"_egdMPJ-g.js",
"_DKRuQnts.js",
"_vL8MaPP-.js",
"_BMRk7WTg.js",
"_Dt4wv1ei.js",
"_CS5Tuebd.js"
],
"css": [
"_app/immutable/assets/2.BQQYIMLK.css"
]
},
"_BLiAG49H.js": {
"file": "_app/immutable/chunks/BLiAG49H.js",
"name": "legacy",
".svelte-kit/generated/client-optimized/nodes/3.js": {
"file": "_app/immutable/nodes/3.CTDAi9vF.js",
"name": "nodes/3",
"src": ".svelte-kit/generated/client-optimized/nodes/3.js",
"isEntry": true,
"imports": [
"_BymsAeK4.js"
"_egdMPJ-g.js",
"_DKRuQnts.js",
"_vL8MaPP-.js",
"_BMRk7WTg.js",
"_Dt4wv1ei.js",
"_CS5Tuebd.js"
],
"css": [
"_app/immutable/assets/3.Dzrf4zX4.css"
]
},
"_BymsAeK4.js": {
"file": "_app/immutable/chunks/BymsAeK4.js",
"name": "index-client"
".svelte-kit/generated/client-optimized/nodes/4.js": {
"file": "_app/immutable/nodes/4.DmI7a2Dc.js",
"name": "nodes/4",
"src": ".svelte-kit/generated/client-optimized/nodes/4.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_BMRk7WTg.js",
"_DNBIa2Bh.js"
],
"css": [
"_app/immutable/assets/4.b2bZrlfC.css"
]
},
"_DEDqjojZ.js": {
"file": "_app/immutable/chunks/DEDqjojZ.js",
".svelte-kit/generated/client-optimized/nodes/5.js": {
"file": "_app/immutable/nodes/5.CFS15qnw.js",
"name": "nodes/5",
"src": ".svelte-kit/generated/client-optimized/nodes/5.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_BMRk7WTg.js",
"_DNBIa2Bh.js"
],
"css": [
"_app/immutable/assets/5.DDTZ5v3E.css"
]
},
".svelte-kit/generated/client-optimized/nodes/6.js": {
"file": "_app/immutable/nodes/6.yU_a9j7E.js",
"name": "nodes/6",
"src": ".svelte-kit/generated/client-optimized/nodes/6.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_BMRk7WTg.js",
"_DNBIa2Bh.js"
],
"css": [
"_app/immutable/assets/6.Bfx4fGBa.css"
]
},
".svelte-kit/generated/client-optimized/nodes/7.js": {
"file": "_app/immutable/nodes/7.CN50pfZX.js",
"name": "nodes/7",
"src": ".svelte-kit/generated/client-optimized/nodes/7.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_BMRk7WTg.js",
"_DNBIa2Bh.js"
],
"css": [
"_app/immutable/assets/7.DkoPrtit.css"
]
},
".svelte-kit/generated/client-optimized/nodes/8.js": {
"file": "_app/immutable/nodes/8.Bs7k9fxR.js",
"name": "nodes/8",
"src": ".svelte-kit/generated/client-optimized/nodes/8.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_BMRk7WTg.js",
"_BYEkGdSH.js",
"_DNBIa2Bh.js"
],
"css": [
"_app/immutable/assets/8.DigLoqRm.css"
]
},
".svelte-kit/generated/client-optimized/nodes/9.js": {
"file": "_app/immutable/nodes/9.wReU4Q8t.js",
"name": "nodes/9",
"src": ".svelte-kit/generated/client-optimized/nodes/9.js",
"isEntry": true,
"imports": [
"_egdMPJ-g.js",
"_BMRk7WTg.js",
"_BYEkGdSH.js",
"_DNBIa2Bh.js"
],
"css": [
"_app/immutable/assets/9.C7KB5jd4.css"
]
},
"_BMRk7WTg.js": {
"file": "_app/immutable/chunks/BMRk7WTg.js",
"name": "disclose-version"
},
"_bq2dQ5MW.js": {
"file": "_app/immutable/chunks/bq2dQ5MW.js",
"name": "client",
"_BYEkGdSH.js": {
"file": "_app/immutable/chunks/BYEkGdSH.js",
"name": "RoomCanvas",
"imports": [
"_BymsAeK4.js"
"_egdMPJ-g.js",
"_BMRk7WTg.js"
],
"css": [
"_app/immutable/assets/RoomCanvas.DJ9xbYNe.css"
]
},
"_smLyJ_zi.js": {
"file": "_app/immutable/chunks/smLyJ_zi.js",
"_CS5Tuebd.js": {
"file": "_app/immutable/chunks/CS5Tuebd.js",
"name": "auth",
"imports": [
"_egdMPJ-g.js",
"_ChnYctHm.js"
]
},
"_ChnYctHm.js": {
"file": "_app/immutable/chunks/ChnYctHm.js",
"name": "index-client",
"imports": [
"_egdMPJ-g.js"
]
},
"_DKRuQnts.js": {
"file": "_app/immutable/chunks/DKRuQnts.js",
"name": "client",
"imports": [
"_egdMPJ-g.js",
"_ChnYctHm.js"
]
},
"_DNBIa2Bh.js": {
"file": "_app/immutable/chunks/DNBIa2Bh.js",
"name": "api",
"imports": [
"_egdMPJ-g.js",
"_ChnYctHm.js",
"_CS5Tuebd.js"
]
},
"_DXhpcOT6.js": {
"file": "_app/immutable/chunks/DXhpcOT6.js",
"name": "preload-helper"
},
"_Dt4wv1ei.js": {
"file": "_app/immutable/chunks/Dt4wv1ei.js",
"name": "legacy",
"imports": [
"_egdMPJ-g.js"
]
},
"_RoomCanvas.DJ9xbYNe.css": {
"file": "_app/immutable/assets/RoomCanvas.DJ9xbYNe.css",
"src": "_RoomCanvas.DJ9xbYNe.css"
},
"_egdMPJ-g.js": {
"file": "_app/immutable/chunks/egdMPJ-g.js",
"name": "index-client"
},
"_vL8MaPP-.js": {
"file": "_app/immutable/chunks/vL8MaPP-.js",
"name": "navigation",
"imports": [
"_DKRuQnts.js"
]
},
"node_modules/@sveltejs/kit/src/runtime/client/entry.js": {
"file": "_app/immutable/entry/start.2LB97QYQ.js",
"file": "_app/immutable/entry/start.DNbyqWQO.js",
"name": "entry/start",
"src": "node_modules/@sveltejs/kit/src/runtime/client/entry.js",
"isEntry": true,
"imports": [
"_bq2dQ5MW.js"
"_DKRuQnts.js"
]
}
}

View File

@@ -0,0 +1 @@
.course-selector.svelte-1x3d7ra{border-bottom:1px solid #eee;margin-bottom:20px;padding-bottom:20px}.add-session.svelte-1x3d7ra{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:15px}.form-row.svelte-1x3d7ra{gap:10px;display:flex}.sessions-grid.svelte-1x3d7ra{grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:20px;display:grid}.session-block.svelte-1x3d7ra{border:1px solid #ddd;border-radius:8px;overflow:hidden}.session-header.svelte-1x3d7ra{background:#eee;justify-content:space-between;align-items:center;padding:10px;display:flex}.slots-list.svelte-1x3d7ra{padding:10px}.slot-item.svelte-1x3d7ra{border-bottom:1px solid #f0f0f0;justify-content:space-between;padding:5px 0;display:flex}.delete-btn.svelte-1x3d7ra{color:#dc3545;cursor:pointer;background:0 0;border:none;font-weight:700}.modal-overlay.svelte-1x3d7ra{background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal.svelte-1x3d7ra{background:#fff;border-radius:8px;width:400px;padding:30px}.field.svelte-1x3d7ra{margin-bottom:15px}.field.svelte-1x3d7ra label:where(.svelte-1x3d7ra){margin-bottom:5px;display:block}.field.svelte-1x3d7ra input:where(.svelte-1x3d7ra),.field.svelte-1x3d7ra select:where(.svelte-1x3d7ra){width:100%;padding:8px}.modal-actions.svelte-1x3d7ra{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}.primary.svelte-1x3d7ra{color:#fff;background:#007bff;border:none;border-radius:4px;padding:8px 16px}

View File

@@ -0,0 +1 @@
.login-container.svelte-1x05zx6{border:1px solid #ccc;border-radius:8px;max-width:400px;margin:100px auto;padding:20px}.field.svelte-1x05zx6{margin-bottom:15px}label.svelte-1x05zx6{margin-bottom:5px;display:block}input.svelte-1x05zx6{box-sizing:border-box;width:100%;padding:8px}.error.svelte-1x05zx6{color:red;margin-bottom:15px}button.svelte-1x05zx6{color:#fff;cursor:pointer;background:#007bff;border:none;border-radius:4px;width:100%;padding:10px}button.svelte-1x05zx6:disabled{background:#ccc}

View File

@@ -0,0 +1 @@
.checkin-page.svelte-1gdz5lm{text-align:center;max-width:800px;margin:40px auto}.identity-selector.svelte-1gdz5lm{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:20px}select.svelte-1gdz5lm{padding:8px;font-size:1.1em}.error.svelte-1gdz5lm{color:red}.success.svelte-1gdz5lm{color:#28a745;font-size:1.2em}.warning.svelte-1gdz5lm{color:#856404;background:#fff3cd;border-radius:4px;padding:10px}.map-container.svelte-1gdz5lm{margin-top:30px}

View File

@@ -0,0 +1 @@
nav.svelte-1qg5d05{background:#f8f9fa;border-bottom:1px solid #dee2e6;padding:10px 20px}.nav-content.svelte-1qg5d05{justify-content:space-between;align-items:center;max-width:1200px;margin:0 auto;display:flex}.links.svelte-1qg5d05 a:where(.svelte-1qg5d05){color:#333;margin-right:20px;text-decoration:none}.links.svelte-1qg5d05 a:where(.svelte-1qg5d05):hover{color:#007bff}main.svelte-1qg5d05{max-width:1200px;margin:20px auto;padding:0 20px}

View File

@@ -0,0 +1 @@
.welcome.svelte-1uha8ag{text-align:center;background:#f8f9fa;border-radius:12px;max-width:600px;margin:100px auto;padding:40px}h1.svelte-1uha8ag{color:#333;margin-bottom:10px;font-size:2.5em}p.svelte-1uha8ag{color:#666;font-size:1.2em}.actions.svelte-1uha8ag{margin-top:40px}.btn.svelte-1uha8ag{color:#fff;background:#007bff;border-radius:6px;padding:12px 30px;font-weight:700;text-decoration:none}.footer.svelte-1uha8ag{color:#888;margin-top:60px;font-size:.9em}

View File

@@ -0,0 +1 @@
.course-selector.svelte-1jef3w8{margin-bottom:20px}.session-card.svelte-1jef3w8{border:1px solid #ddd;border-radius:8px;margin-bottom:15px;padding:15px}.slot-row.svelte-1jef3w8{border-top:1px solid #eee;justify-content:space-between;align-items:center;padding:10px 0;display:flex}.status-badge.svelte-1jef3w8{text-transform:uppercase;border-radius:12px;margin-right:10px;padding:2px 8px;font-size:.8em}.status-badge.closed.svelte-1jef3w8{color:#fff;background:#6c757d}.status-badge.open.svelte-1jef3w8{color:#fff;background:#28a745}.status-badge.locked.svelte-1jef3w8{color:#000;background:#ffc107}.checkin-code.svelte-1jef3w8{background:#f0f0f0;border-radius:4px;margin-left:10px;padding:2px 5px}.actions.svelte-1jef3w8 button:where(.svelte-1jef3w8){margin-left:5px}

View File

@@ -0,0 +1 @@
.selectors.svelte-190s2eg{margin-bottom:20px}select.svelte-190s2eg{margin-right:10px;padding:5px}.matrix-container.svelte-190s2eg{overflow-x:auto}table.svelte-190s2eg{border-collapse:collapse;background:#fff;width:100%}th.svelte-190s2eg,td.svelte-190s2eg{text-align:center;border:1px solid #ddd;padding:10px}th.svelte-190s2eg{background:#f8f9fa}.cell.svelte-190s2eg{cursor:pointer;width:60px;height:40px}.cell.svelte-190s2eg:hover{background:#f0f0f0}.cell.present.svelte-190s2eg{color:#155724;background:#d4edda;font-weight:700}

View File

@@ -0,0 +1 @@
.management-grid.svelte-nbog41{grid-template-columns:300px 1fr;gap:30px;display:grid}.course-item.svelte-nbog41{cursor:pointer;border:1px solid #eee;border-radius:4px;margin-bottom:5px;padding:10px}.course-item.selected.svelte-nbog41{background:#e7f1ff;border-color:#007bff}.student-actions.svelte-nbog41{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:15px}.import-box.svelte-nbog41{margin-top:10px;font-size:.9em}table.svelte-nbog41{border-collapse:collapse;width:100%}th.svelte-nbog41,td.svelte-nbog41{text-align:left;border-bottom:1px solid #eee;padding:10px}input.svelte-nbog41{margin-right:5px;padding:6px}

View File

@@ -0,0 +1 @@
.export-grid.svelte-128ylb7{grid-template-columns:1fr 1fr;gap:40px;margin-top:20px;display:grid}.export-card.svelte-128ylb7{background:#f8f9fa;border:1px solid #dee2e6;border-radius:8px;margin:15px 0;padding:20px}.btn-group.svelte-128ylb7{gap:10px;display:flex}button.svelte-128ylb7{cursor:pointer;padding:8px 16px}button.small.svelte-128ylb7{padding:4px 8px;font-size:.9em}.session-export-row.svelte-128ylb7{border-bottom:1px solid #eee;justify-content:space-between;align-items:center;padding:8px 0;display:flex}select.svelte-128ylb7{width:100%;margin-bottom:10px;padding:8px}

View File

@@ -0,0 +1 @@
.selectors.svelte-1do7mxm{margin-bottom:20px}select.svelte-1do7mxm{margin-right:10px;padding:5px}.notes-container.svelte-1do7mxm{grid-template-columns:1fr 300px;gap:20px;display:grid}.note-editor.svelte-1do7mxm{background:#f8f9fa;border-radius:8px;padding:20px}textarea.svelte-1do7mxm{width:100%;height:100px;margin:10px 0}.primary.svelte-1do7mxm{color:#fff;background:#007bff;border:none;border-radius:4px;padding:8px 16px}.note-item.svelte-1do7mxm{border-bottom:1px solid #ddd;padding:5px 0;font-size:.9em}.note-item.svelte-1do7mxm p:where(.svelte-1do7mxm){margin:5px 0}

View File

@@ -0,0 +1 @@
.management-grid.svelte-2e9svb{grid-template-columns:200px 1fr;gap:20px;display:grid}.room-item.svelte-2e9svb{cursor:pointer;border:1px solid #eee;border-radius:4px;margin-bottom:5px;padding:10px}.room-item.selected.svelte-2e9svb{background:#e7f1ff;border-color:#007bff}.editor-header.svelte-2e9svb{justify-content:space-between;align-items:center;margin-bottom:10px;display:flex}.toolbar.svelte-2e9svb button:where(.svelte-2e9svb){margin-right:5px}.save-btn.svelte-2e9svb{color:#fff;background:#28a745;border:none;border-radius:4px;padding:5px 15px}.canvas-container.svelte-2e9svb{gap:20px;display:flex}.properties-panel.svelte-2e9svb{background:#f8f9fa;border-radius:8px;width:200px;padding:15px}.field.svelte-2e9svb{margin-bottom:10px}.field.svelte-2e9svb label:where(.svelte-2e9svb){color:#666;font-size:.8em;display:block}.field.svelte-2e9svb input:where(.svelte-2e9svb){width:100%;padding:4px}.delete-btn.svelte-2e9svb{color:red;width:100%;margin-top:10px}

View File

@@ -0,0 +1 @@
.room-canvas.svelte-1i40qao{-webkit-user-select:none;user-select:none;background:#fff;border:1px solid #ccc}.room-canvas.editable.svelte-1i40qao{cursor:crosshair}.element.svelte-1i40qao{cursor:pointer}.element.seat.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#fff;stroke:#007bff;stroke-width:2px}.element.seat.svelte-1i40qao text:where(.svelte-1i40qao){fill:#007bff;font-size:14px;font-weight:700}.element.seat.occupied.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#e7f1ff;stroke:#6c757d}.element.seat.occupied.svelte-1i40qao text:where(.svelte-1i40qao){fill:#6c757d}.element.seat.is-mine.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#28a745;stroke:#1e7e34}.element.seat.is-mine.svelte-1i40qao text:where(.svelte-1i40qao){fill:#fff}.element.selected.svelte-1i40qao rect:where(.svelte-1i40qao){stroke:#ffc107;stroke-width:3px}.student-name.svelte-1i40qao{fill:#333;font-size:10px}

View File

@@ -1 +0,0 @@
import{M as e}from"./BymsAeK4.js";e();

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,E as r,F as i,I as a,J as o,L as s,Q as c,R as l,S as u,T as d,V as f,Y as p,_ as m,f as h,g,h as _,i as v,j as y,u as b,v as x,w as S,y as C}from"./egdMPJ-g.js";import"./BMRk7WTg.js";var w=u(`<defs><pattern id="grid" patternUnits="userSpaceOnUse"><path fill="none" stroke="#eee" stroke-width="1"></path></pattern></defs><rect width="100%" height="100%" fill="url(#grid)"></rect>`,1),T=u(`<text text-anchor="middle" class="student-name svelte-1i40qao"> </text>`),E=u(`<rect rx="4" class="svelte-1i40qao"></rect><text text-anchor="middle" dominant-baseline="middle" class="svelte-1i40qao"> </text><!>`,1),D=u(`<rect fill="#e9ecef" stroke="#dee2e6" class="svelte-1i40qao"></rect>`),O=u(`<rect fill="#ffeeba" stroke="#ffe082" class="svelte-1i40qao"></rect><text text-anchor="middle" dominant-baseline="middle" style="font-size: 10px;" class="svelte-1i40qao">DOOR</text>`,1),k=u(`<g><!></g>`),A=u(`<svg width="800" height="600"><!><!></svg>`);function j(u,S){p(S,!0);let j=v(S,`elements`,31,()=>l([])),M=v(S,`editable`,3,!1),N=v(S,`selectedId`,3,null),P=v(S,`occupiedSeatIds`,19,()=>[]),F=v(S,`mySeatId`,3,null),I=v(S,`studentNames`,19,()=>({})),L=f(null),R=0,z=0;function B(e,n){if(!M()){S.onElementClick?.(n);return}t(L,n.id,!0),R=e.clientX-n.x*40,z=e.clientY-n.y*40}function V(e){if(!n(L)||!M())return;let t=j().findIndex(e=>e.id===n(L));if(t===-1)return;let r=Math.round((e.clientX-R)/10)*10/40,i=Math.round((e.clientY-z)/10)*10/40;j(j()[t]={...j()[t],x:r,y:i},!0)}function H(){n(L)&&M()&&S.onLayoutChange?.(j()),t(L,null)}var U=A();let W;var G=i(U),K=t=>{var n=w(),r=a(n),o=i(r);b(o,`width`,40),b(o,`height`,40),b(i(o),`d`,`M 40 0 L 0 0 0 40`),e(o),e(r),c(),C(t,n)};m(G,e=>{M()&&e(K)}),_(s(G),17,j,g,(t,r)=>{var o=k();let c;var l=i(o),u=t=>{var o=E(),c=a(o),l=s(c),u=i(l,!0);e(l);var d=s(l),f=t=>{var a=T(),o=i(a,!0);e(a),y(()=>{b(a,`x`,n(r).width*40/2),b(a,`y`,n(r).height*40+15),x(o,I()[n(r).id])}),C(t,a)};m(d,e=>{I()[n(r).id]&&e(f)}),y(()=>{b(c,`width`,n(r).width*40),b(c,`height`,n(r).height*40),b(l,`x`,n(r).width*40/2),b(l,`y`,n(r).height*40/2),x(u,n(r).label)}),C(t,o)},f=e=>{var t=D();y(()=>{b(t,`width`,n(r).width*40),b(t,`height`,n(r).height*40)}),C(e,t)},p=e=>{var t=O(),i=a(t),o=s(i);y(()=>{b(i,`width`,n(r).width*40),b(i,`height`,n(r).height*40),b(o,`x`,n(r).width*40/2),b(o,`y`,n(r).height*40/2)}),C(e,t)};m(l,e=>{n(r).type===`seat`?e(u):n(r).type===`table`?e(f,1):n(r).type===`door`&&e(p,2)}),e(o),y(e=>{b(o,`transform`,`translate(${n(r).x*40}, ${n(r).y*40})`),c=h(o,0,`element ${n(r).type??``}`,`svelte-1i40qao`,c,e)},[()=>({selected:N()===n(r).id,occupied:n(r).type===`seat`&&P().includes(n(r).id),"is-mine":n(r).id===F()})]),d(`mousedown`,o,e=>B(e,n(r))),C(t,o)}),e(U),y(()=>W=h(U,0,`room-canvas svelte-1i40qao`,null,W,{editable:M()})),d(`mousemove`,U,V),d(`mouseup`,U,H),r(`mouseleave`,U,H),C(u,U),o()}S([`mousemove`,`mouseup`,`mousedown`]);export{j as t};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{K as e}from"./egdMPJ-g.js";import"./ChnYctHm.js";var t=e(localStorage.getItem(`token`));t.subscribe(e=>{e?localStorage.setItem(`token`,e):localStorage.removeItem(`token`)});function n(){t.set(null)}export{t as n,n as t};

View File

@@ -0,0 +1 @@
import"./egdMPJ-g.js";

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{G as e}from"./egdMPJ-g.js";import"./ChnYctHm.js";import{n as t}from"./CS5Tuebd.js";var n=`/api`;async function r(r,i){let a=e(t),o=await fetch(n+r,{...i,headers:{"Content-Type":`application/json`,...a?{Authorization:`Bearer ${a}`}:{},...i?.headers}});if(o.status,!o.ok){let e=await o.json().catch(()=>({error:o.statusText}));throw Error(e.error||o.statusText)}return o.status===204?{}:o.json()}var i={auth:{login:(e,t)=>r(`/auth/login`,{method:`POST`,body:JSON.stringify({email:e,password:t})})},admin:{courses:{list:()=>r(`/admin/courses`),create:(e,t)=>r(`/admin/courses`,{method:`POST`,body:JSON.stringify({name:e,semester:t})}),listStudents:e=>r(`/admin/courses/${e}/students`),addStudent:(e,t)=>r(`/admin/courses/${e}/students`,{method:`POST`,body:JSON.stringify({name:t})}),importStudents:(r,i)=>{let a=new FormData;return a.append(`file`,i),fetch(`${n}/admin/courses/${r}/students/import`,{method:`POST`,headers:{Authorization:`Bearer ${e(t)}`},body:a}).then(e=>e.json())}},students:{delete:e=>r(`/admin/students/${e}`,{method:`DELETE`}),getAttendance:e=>r(`/admin/students/${e}/attendance`),getNotes:e=>r(`/admin/students/${e}/notes`)},rooms:{list:()=>r(`/admin/rooms`),create:(e,t)=>r(`/admin/rooms`,{method:`POST`,body:JSON.stringify({name:e,layout:t})}),get:e=>r(`/admin/rooms/${e}`),updateLayout:(e,t)=>r(`/admin/rooms/${e}/layout`,{method:`PUT`,body:JSON.stringify(t)})},sessions:{list:e=>r(`/admin/sessions?course_id=${e}`),create:(e,t,n)=>r(`/admin/sessions`,{method:`POST`,body:JSON.stringify({course_id:e,week_nr:t,date:n})}),getAttendance:e=>r(`/admin/sessions/${e}/attendance`)},slots:{create:(e,t,n,i,a)=>r(`/admin/slots`,{method:`POST`,body:JSON.stringify({session_id:e,tutor_id:t,start_time:n,end_time:i,room_id:a})}),updateStatus:(e,t)=>r(`/admin/slots/${e}/status`,{method:`PATCH`,body:JSON.stringify({status:t})}),delete:e=>r(`/admin/slots/${e}`,{method:`DELETE`}),addAttendance:(e,t)=>r(`/admin/slots/${e}/attendance`,{method:`POST`,body:JSON.stringify({student_id:t})}),deleteAttendance:(e,t)=>r(`/admin/slots/${e}/attendance/${t}`,{method:`DELETE`}),getNotes:e=>r(`/admin/slots/${e}/notes`),upsertNote:(e,t,n)=>r(`/admin/slots/${e}/notes/${t}`,{method:`PUT`,body:JSON.stringify({content:n})})},export:{sessionCsv:e=>`${n}/admin/export/session/${e}/csv`,sessionMd:e=>`${n}/admin/export/session/${e}/md`,courseCsv:e=>`${n}/admin/export/course/${e}/csv`,courseMd:e=>`${n}/admin/export/course/${e}/md`,backup:()=>`${n}/admin/backup`}},checkin:{getInfo:e=>r(`/api/checkin/${e}`),getStudents:e=>r(`/api/checkin/${e}/students`),post:(e,t,n)=>r(`/api/checkin`,{method:`POST`,body:JSON.stringify({code:e,student_id:t,seat_id:n})})}};export{i as t};

View File

@@ -0,0 +1 @@
import{Z as e}from"./egdMPJ-g.js";e();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import"./DKRuQnts.js";

View File

@@ -0,0 +1,2 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["_app/immutable/nodes/0.Ddm7H9s-.js","_app/immutable/chunks/egdMPJ-g.js","_app/immutable/chunks/BMRk7WTg.js","_app/immutable/chunks/Dt4wv1ei.js","_app/immutable/nodes/1.DFtas2MP.js","_app/immutable/chunks/DKRuQnts.js","_app/immutable/chunks/ChnYctHm.js","_app/immutable/nodes/2.BZoTn0Qw.js","_app/immutable/chunks/vL8MaPP-.js","_app/immutable/chunks/CS5Tuebd.js","_app/immutable/assets/2.BQQYIMLK.css","_app/immutable/nodes/3.CTDAi9vF.js","_app/immutable/assets/3.Dzrf4zX4.css","_app/immutable/nodes/4.DmI7a2Dc.js","_app/immutable/chunks/DNBIa2Bh.js","_app/immutable/assets/4.b2bZrlfC.css","_app/immutable/nodes/5.CFS15qnw.js","_app/immutable/assets/5.DDTZ5v3E.css","_app/immutable/nodes/6.yU_a9j7E.js","_app/immutable/assets/6.Bfx4fGBa.css","_app/immutable/nodes/7.CN50pfZX.js","_app/immutable/assets/7.DkoPrtit.css","_app/immutable/nodes/8.Bs7k9fxR.js","_app/immutable/chunks/BYEkGdSH.js","_app/immutable/assets/RoomCanvas.DJ9xbYNe.css","_app/immutable/assets/8.DigLoqRm.css","_app/immutable/nodes/9.wReU4Q8t.js","_app/immutable/assets/9.C7KB5jd4.css","_app/immutable/nodes/10.BLeYuhst.js","_app/immutable/assets/10.BhkUjvVr.css","_app/immutable/nodes/11.DB6yXGVc.js","_app/immutable/assets/11.LkBq3xGq.css","_app/immutable/nodes/12.5DAleB6K.js","_app/immutable/assets/12.BboNMIwd.css"])))=>i.map(i=>d[i]);
import{$ as e,B as t,C as n,D as r,F as i,H as a,I as o,J as s,L as c,M as l,N as u,V as d,Y as f,_ as p,b as m,i as h,j as g,k as _,n as v,p as y,r as b,s as x,v as S,x as C,y as w}from"../chunks/egdMPJ-g.js";import{t as T}from"../chunks/DXhpcOT6.js";import"../chunks/BMRk7WTg.js";var E={},D=C(`<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>`),O=C(`<!> <!>`,1);function k(b,C){f(C,!0);let T=h(C,`components`,23,()=>[]),E=h(C,`data_0`,3,null),k=h(C,`data_1`,3,null),A=h(C,`data_2`,3,null);u(()=>C.stores.page.set(C.page)),l(()=>{C.stores,C.page,C.constructors,T(),C.form,E(),k(),A(),C.stores.page.notify()});let j=d(!1),M=d(!1),N=d(null);v(()=>{let e=C.stores.page.subscribe(()=>{r(j)&&(t(M,!0),_().then(()=>{t(N,document.title||`untitled page`,!0)}))});return t(j,!0),e});let P=a(()=>C.constructors[2]);var F=O(),I=o(F),L=e=>{let t=a(()=>C.constructors[0]);var n=m();y(o(n),()=>r(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return C.form},get params(){return C.page.params},children:(e,t)=>{var n=m(),i=o(n),s=e=>{let t=a(()=>C.constructors[1]);var n=m();y(o(n),()=>r(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return C.form},get params(){return C.page.params},children:(e,t)=>{var n=m();y(o(n),()=>r(P),(e,t)=>{x(t(e,{get data(){return A()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),w(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),w(e,n)},c=e=>{let t=a(()=>C.constructors[1]);var n=m();y(o(n),()=>r(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),w(e,n)};p(i,e=>{C.constructors[2]?e(s):e(c,-1)}),w(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),w(e,n)},R=e=>{let t=a(()=>C.constructors[0]);var n=m();y(o(n),()=>r(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return C.form},get params(){return C.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),w(e,n)};p(I,e=>{C.constructors[1]?e(L):e(R,-1)});var z=c(I,2),B=t=>{var a=D(),o=i(a),s=e=>{var t=n();g(()=>S(t,r(N))),w(e,t)};p(o,e=>{r(M)&&e(s)}),e(a),w(t,a)};p(z,e=>{r(j)&&e(B)}),w(b,F),s()}var A=b(k),j=[()=>T(()=>import(`../nodes/0.Ddm7H9s-.js`),__vite__mapDeps([0,1,2,3])),()=>T(()=>import(`../nodes/1.DFtas2MP.js`),__vite__mapDeps([4,1,5,6,2])),()=>T(()=>import(`../nodes/2.BZoTn0Qw.js`),__vite__mapDeps([7,1,5,6,8,2,3,9,10])),()=>T(()=>import(`../nodes/3.CTDAi9vF.js`),__vite__mapDeps([11,1,5,6,8,2,3,9,12])),()=>T(()=>import(`../nodes/4.DmI7a2Dc.js`),__vite__mapDeps([13,1,2,14,6,9,15])),()=>T(()=>import(`../nodes/5.CFS15qnw.js`),__vite__mapDeps([16,1,2,14,6,9,17])),()=>T(()=>import(`../nodes/6.yU_a9j7E.js`),__vite__mapDeps([18,1,2,14,6,9,19])),()=>T(()=>import(`../nodes/7.CN50pfZX.js`),__vite__mapDeps([20,1,2,14,6,9,21])),()=>T(()=>import(`../nodes/8.Bs7k9fxR.js`),__vite__mapDeps([22,1,2,23,24,14,6,9,25])),()=>T(()=>import(`../nodes/9.wReU4Q8t.js`),__vite__mapDeps([26,1,2,23,24,14,6,9,27])),()=>T(()=>import(`../nodes/10.BLeYuhst.js`),__vite__mapDeps([28,1,2,14,6,9,29])),()=>T(()=>import(`../nodes/11.DB6yXGVc.js`),__vite__mapDeps([30,1,5,6,8,2,3,14,9,31])),()=>T(()=>import(`../nodes/12.5DAleB6K.js`),__vite__mapDeps([32,1,5,6,2,23,24,14,9,33]))],M=[],N={"/":[3],"/admin":[4,[2]],"/admin/attendance":[5,[2]],"/admin/courses":[6,[2]],"/admin/export":[7,[2]],"/admin/notes":[8,[2]],"/admin/rooms":[9,[2]],"/admin/sessions":[10,[2]],"/login":[11],"/s/[code]":[12]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t);export{R as decode,F as decoders,N as dictionary,I as encoders,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads};

View File

@@ -1,2 +0,0 @@
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["_app/immutable/nodes/0.BI2104Lw.js","_app/immutable/chunks/BymsAeK4.js","_app/immutable/chunks/DEDqjojZ.js","_app/immutable/chunks/BLiAG49H.js","_app/immutable/nodes/1.7VgG-JZk.js","_app/immutable/chunks/bq2dQ5MW.js","_app/immutable/nodes/2.DsEO-gDS.js"])))=>i.map(i=>d[i]);
import{A as e,C as t,E as n,P as r,S as i,T as a,a as o,b as s,c,d as l,f as u,g as d,i as f,k as p,l as m,m as h,n as g,o as _,p as v,r as y,u as b,v as x,w as S,x as C,y as w}from"../chunks/BymsAeK4.js";import{t as T}from"../chunks/smLyJ_zi.js";import"../chunks/DEDqjojZ.js";var E={},D=u(`<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>`),O=u(`<!> <!>`,1);function k(u,y){e(y,!0);let T=f(y,`components`,23,()=>[]),E=f(y,`data_0`,3,null),k=f(y,`data_1`,3,null);s(()=>y.stores.page.set(y.page)),w(()=>{y.stores,y.page,y.constructors,T(),y.form,E(),k(),y.stores.page.notify()});let A=a(!1),j=a(!1),M=a(null);g(()=>{let e=y.stores.page.subscribe(()=>{h(A)&&(S(j,!0),d().then(()=>{S(M,document.title||`untitled page`,!0)}))});return S(A,!0),e});let N=n(()=>y.constructors[1]);var P=O(),F=i(P),I=e=>{let t=n(()=>y.constructors[0]);var r=l();_(i(r),()=>h(t),(e,t)=>{o(t(e,{get data(){return E()},get form(){return y.form},get params(){return y.page.params},children:(e,t)=>{var n=l();_(i(n),()=>h(N),(e,t)=>{o(t(e,{get data(){return k()},get form(){return y.form},get params(){return y.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),b(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),b(e,r)},L=e=>{let t=n(()=>y.constructors[0]);var r=l();_(i(r),()=>h(t),(e,t)=>{o(t(e,{get data(){return E()},get form(){return y.form},get params(){return y.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),b(e,r)};c(F,e=>{y.constructors[1]?e(I):e(L,-1)});var R=t(F,2),z=e=>{var t=D(),n=C(t),i=e=>{var t=v();x(()=>m(t,h(M))),b(e,t)};c(n,e=>{h(j)&&e(i)}),r(t),b(e,t)};c(R,e=>{h(A)&&e(z)}),b(u,P),p()}var A=y(k),j=[()=>T(()=>import(`../nodes/0.BI2104Lw.js`),__vite__mapDeps([0,1,2,3])),()=>T(()=>import(`../nodes/1.7VgG-JZk.js`),__vite__mapDeps([4,1,5,2])),()=>T(()=>import(`../nodes/2.DsEO-gDS.js`),__vite__mapDeps([6,1,2,3]))],M=[],N={"/":[2]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t);export{R as decode,F as decoders,N as dictionary,I as encoders,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads};

View File

@@ -1 +0,0 @@
import{o as e,t}from"../chunks/bq2dQ5MW.js";export{e as load_css,t as start};

View File

@@ -0,0 +1 @@
import{n as e,s as t}from"../chunks/DKRuQnts.js";export{t as load_css,e as start};

View File

@@ -1 +0,0 @@
import{S as e,d as t,s as n,u as r}from"../chunks/BymsAeK4.js";import"../chunks/DEDqjojZ.js";import"../chunks/BLiAG49H.js";function i(i,a){var o=t();n(e(o),a,`default`,{},null),r(i,o)}export{i as component};

View File

@@ -0,0 +1 @@
import{I as e,b as t,m as n,y as r}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import"../chunks/Dt4wv1ei.js";function i(i,a){var o=t();n(e(o),a,`default`,{},null),r(i,o)}export{i as component};

View File

@@ -1 +0,0 @@
import{A as e,C as t,P as n,S as r,f as i,k as a,l as o,u as s,v as c,x as l}from"../chunks/BymsAeK4.js";import{i as u,n as d,r as f}from"../chunks/bq2dQ5MW.js";import"../chunks/DEDqjojZ.js";var p={get data(){return u.data},get error(){return u.error},get form(){return u.form},get params(){return u.params},get route(){return u.route},get state(){return u.state},get status(){return u.status},get url(){return u.url}};Object.defineProperty({get from(){return f.current?f.current.from:null},get to(){return f.current?f.current.to:null},get type(){return f.current?f.current.type:null},get willUnload(){return f.current?f.current.willUnload:null},get delta(){return f.current?f.current.delta:null},get complete(){return f.current?f.current.complete:null}},`current`,{get(){throw Error(`Replace navigating.current.<prop> with navigating.<prop>`)}}),d.updated.check;var m=p,h=i(`<h1> </h1> <p> </p>`,1);function g(i,u){e(u,!0);var d=h(),f=r(d),p=l(f,!0);n(f);var g=t(f,2),_=l(g,!0);n(g),c(()=>{o(p,m.status),o(_,m.error?.message)}),s(i,d),a()}export{g as component};

View File

@@ -0,0 +1 @@
import{$ as e,F as t,I as n,J as r,L as i,Y as a,j as o,v as s,x as c,y as l}from"../chunks/egdMPJ-g.js";import{a as u,i as d,r as f}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";var p={get data(){return u.data},get error(){return u.error},get form(){return u.form},get params(){return u.params},get route(){return u.route},get state(){return u.state},get status(){return u.status},get url(){return u.url}};Object.defineProperty({get from(){return d.current?d.current.from:null},get to(){return d.current?d.current.to:null},get type(){return d.current?d.current.type:null},get willUnload(){return d.current?d.current.willUnload:null},get delta(){return d.current?d.current.delta:null},get complete(){return d.current?d.current.complete:null}},`current`,{get(){throw Error(`Replace navigating.current.<prop> with navigating.<prop>`)}}),f.updated.check;var m=p,h=c(`<h1> </h1> <p> </p>`,1);function g(c,u){a(u,!0);var d=h(),f=n(d),p=t(f,!0);e(f);var g=i(f,2),_=t(g,!0);e(g),o(()=>{s(p,m.status),s(_,m.error?.message)}),l(c,d),r()}export{g as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,F as r,I as i,J as a,L as o,M as s,R as c,T as l,V as u,Y as d,_ as f,c as p,d as m,g as h,h as g,j as _,l as v,n as y,v as b,w as x,x as S,y as C}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as w}from"../chunks/DNBIa2Bh.js";var T=S(`<option> </option>`),E=S(`<div class="slot-item svelte-1x3d7ra"><span> </span> <button class="delete-btn svelte-1x3d7ra">×</button></div>`),D=S(`<div class="session-block svelte-1x3d7ra"><div class="session-header svelte-1x3d7ra"><strong> </strong> <button>+ Add Slot</button></div> <div class="slots-list svelte-1x3d7ra"></div></div>`),O=S(`<option> </option>`),k=S(`<div class="modal-overlay svelte-1x3d7ra"><div class="modal svelte-1x3d7ra"><h2>Add Slot to Session</h2> <div class="field svelte-1x3d7ra"><label class="svelte-1x3d7ra">Tutor ID (Mock: 1)</label> <input type="number" placeholder="Tutor ID" class="svelte-1x3d7ra"/></div> <div class="field svelte-1x3d7ra"><label class="svelte-1x3d7ra">Room (Optional)</label> <select class="svelte-1x3d7ra"><option>None</option><!></select></div> <div class="field svelte-1x3d7ra"><label class="svelte-1x3d7ra">Start Time</label> <input type="time" class="svelte-1x3d7ra"/></div> <div class="field svelte-1x3d7ra"><label class="svelte-1x3d7ra">End Time</label> <input type="time" class="svelte-1x3d7ra"/></div> <div class="modal-actions svelte-1x3d7ra"><button>Cancel</button> <button class="primary svelte-1x3d7ra">Create Slot</button></div></div></div>`),A=S(`<h1>Schedule Sessions & Slots</h1> <div class="management-grid"><div class="sessions-list"><div class="course-selector svelte-1x3d7ra"><label>Course:</label> <select></select></div> <div class="add-session svelte-1x3d7ra"><h3>Add Session</h3> <div class="form-row svelte-1x3d7ra"><input type="number" placeholder="Week" style="width: 60px"/> <input type="date"/> <button>Add</button></div></div> <div class="sessions-grid svelte-1x3d7ra"></div></div> <!></div>`,1);function j(x,S){d(S,!0);let j=u(c([])),M=u(null),N=u(c([])),P=u(c([])),F=u(1),I=u(c(new Date().toISOString().split(`T`)[0])),L=u(null),R=u(null),z=u(null),B=u(`09:00`),V=u(`11:00`);y(async()=>{t(j,await w.admin.courses.list(),!0),t(N,await w.admin.rooms.list(),!0),n(j).length>0&&t(M,n(j)[0].id,!0)}),s(()=>{n(M)&&H(n(M))});async function H(e){t(P,await w.admin.sessions.list(e),!0)}async function U(){if(n(M))try{await w.admin.sessions.create(n(M),n(F),n(I)),H(n(M))}catch(e){alert(e)}}async function ee(){if(!(!n(L)||!n(R)))try{await w.admin.slots.create(n(L),n(R),n(B),n(V),n(z)||void 0),n(M)&&H(n(M)),t(L,null)}catch(e){alert(e)}}async function te(e){if(confirm(`Are you sure?`))try{await w.admin.slots.delete(e),n(M)&&H(n(M))}catch(e){alert(e)}}var W=A(),G=o(i(W),2),K=r(G),q=r(K),J=o(r(q),2);g(J,21,()=>n(j),h,(t,i)=>{var a=T(),o=r(a,!0);e(a);var s={};_(()=>{b(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(J),e(q);var Y=o(q,2),X=o(r(Y),2),Z=r(X);v(Z);var Q=o(Z,2);v(Q);var ne=o(Q,2);e(X),e(Y);var $=o(Y,2);g($,21,()=>n(P),h,(i,a)=>{var s=D(),c=r(s),u=r(c),d=r(u);e(u);var f=o(u),p=o(f);e(c);var m=o(c,2);g(m,21,()=>n(a).slots||[],h,(t,i)=>{var a=E(),s=r(a),c=r(s);e(s);var u=o(s,2);e(a),_(()=>b(c,`${n(i).start_time??``}-${n(i).end_time??``}`)),l(`click`,u,()=>te(n(i).id)),C(t,a)}),e(m),e(s),_(()=>{b(d,`Week ${n(a).week_nr??``}`),b(f,` (${n(a).date??``}) `)}),l(`click`,p,()=>t(L,n(a).id,!0)),C(i,s)}),e($),e(K);var re=o(K,2),ie=i=>{var a=k(),s=r(a),c=o(r(s),2),u=o(r(c),2);v(u),e(c);var d=o(c,2),f=o(r(d),2),y=r(f);y.value=(y.__value=null,``),g(o(y),17,()=>n(N),h,(t,i)=>{var a=O(),o=r(a,!0);e(a);var s={};_(()=>{b(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(f),e(d);var x=o(d,2),S=o(r(x),2);v(S),e(x);var w=o(x,2),T=o(r(w),2);v(T),e(w);var E=o(w,2),D=r(E),A=o(D,2);e(E),e(s),e(a),p(u,()=>n(R),e=>t(R,e)),m(f,()=>n(z),e=>t(z,e)),p(S,()=>n(B),e=>t(B,e)),p(T,()=>n(V),e=>t(V,e)),l(`click`,D,()=>t(L,null)),l(`click`,A,ee),C(i,a)};f(re,e=>{n(L)&&e(ie)}),e(G),m(J,()=>n(M),e=>t(M,e)),p(Z,()=>n(F),e=>t(F,e)),p(Q,()=>n(I),e=>t(I,e)),l(`click`,ne,U),C(x,W),a()}x([`click`]);export{j as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,E as r,F as i,J as a,L as o,Y as s,_ as c,a as l,c as u,j as d,l as f,o as p,v as m,x as h,y as g,z as _}from"../chunks/egdMPJ-g.js";import{t as v}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";import"../chunks/Dt4wv1ei.js";import{n as y}from"../chunks/CS5Tuebd.js";import"../chunks/vL8MaPP-.js";import{t as b}from"../chunks/DNBIa2Bh.js";var x=h(`<p class="error svelte-1x05zx6"> </p>`),S=h(`<div class="login-container svelte-1x05zx6"><h1>Tutor Login</h1> <form><div class="field svelte-1x05zx6"><label for="email" class="svelte-1x05zx6">Email</label> <input id="email" type="email" required="" class="svelte-1x05zx6"/></div> <div class="field svelte-1x05zx6"><label for="password" class="svelte-1x05zx6">Password</label> <input id="password" type="password" required="" class="svelte-1x05zx6"/></div> <!> <button type="submit" class="svelte-1x05zx6"> </button></form></div>`);function C(h,C){s(C,!1);let w=_(``),T=_(``),E=_(``),D=_(!1);async function O(){t(D,!0),t(E,``);try{let e=await b.auth.login(n(w),n(T));y.set(e.token),v(`/admin`)}catch(e){t(E,e.message||`Invalid credentials`)}finally{t(D,!1)}}l();var k=S(),A=o(i(k),2),j=i(A),M=o(i(j),2);f(M),e(j);var N=o(j,2),P=o(i(N),2);f(P),e(N);var F=o(N,2),I=t=>{var r=x(),a=i(r,!0);e(r),d(()=>m(a,n(E))),g(t,r)};c(F,e=>{n(E)&&e(I)});var L=o(F,2),R=i(L,!0);e(L),e(A),e(k),d(()=>{L.disabled=n(D),m(R,n(D)?`Logging in...`:`Login`)}),u(M,()=>n(w),e=>t(w,e)),u(P,()=>n(T),e=>t(T,e)),r(`submit`,A,p(O)),g(h,k),a()}export{C as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,F as r,H as i,I as a,J as o,L as s,R as c,U as l,V as u,W as d,Y as f,_ as p,d as m,g as h,h as g,j as _,n as v,v as y,x as b,y as x}from"../chunks/egdMPJ-g.js";import{r as S}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";import{t as C}from"../chunks/DNBIa2Bh.js";import{t as w}from"../chunks/BYEkGdSH.js";var T=()=>{let e=S;return{page:{subscribe:e.page.subscribe},navigating:{subscribe:e.navigating.subscribe},updated:e.updated}},E={subscribe(e){return T().page.subscribe(e)}},D=b(`<p>Loading...</p>`),O=b(`<p class="error svelte-1gdz5lm"> </p>`),k=b(`<p class="warning svelte-1gdz5lm">Check-in is currently locked by the tutor.</p>`),A=b(`<option> </option>`),j=b(`<div class="identity-selector svelte-1gdz5lm"><label for="student">I am:</label> <select id="student" class="svelte-1gdz5lm"><option>Select your name...</option><!></select></div>`),M=b(`<p class="success svelte-1gdz5lm">You are checked in as <strong> </strong></p>`),N=b(`<h1> </h1> <!> <!> <div class="map-container svelte-1gdz5lm"><p>Select a seat to check in:</p> <!></div>`,1),P=b(`<div class="checkin-page svelte-1gdz5lm"><!></div>`);function F(b,S){f(S,!0);let T=()=>d(E,`$page`,F),[F,I]=l(),L=T().params.code,R=u(null),z=u(c([])),B=u(c([])),V=u(c([])),H=u(null),U=i(()=>n(B).find(e=>e.is_mine)),W=u(!0),G=u(``);v(async()=>{try{await K(),!n(U)&&n(R)?.status===`open`&&t(V,await C.checkin.getStudents(L),!0)}catch(e){t(G,e.message,!0)}finally{t(W,!1)}});async function K(){let e=await C.checkin.getInfo(L);t(R,e.slot,!0),t(z,e.layout||[],!0),t(B,e.attendances||[],!0)}async function q(e){if(!n(R)||n(R).status!==`open`||e.type!==`seat`||n(U)?.seat_id===e.id)return;let t=n(U)?.student_id||n(H);if(!t){alert(`Please select your name first`);return}try{await C.checkin.post(L,t,e.id),await K()}catch(e){alert(e.message)}}let J=i(()=>n(B).map(e=>e.seat_id).filter(e=>e!==null));var Y=P(),X=r(Y),Z=e=>{x(e,D())},Q=t=>{var i=O(),a=r(i,!0);e(i),_(()=>y(a,n(G))),x(t,i)},$=o=>{var c=N(),l=a(c),u=r(l);e(l);var d=s(l,2),f=e=>{x(e,k())};p(d,e=>{n(R).status===`locked`&&e(f)});var v=s(d,2),b=i=>{var a=j(),o=s(r(a),2),c=r(o);c.value=(c.__value=null,``),g(s(c),17,()=>n(V),h,(t,i)=>{var a=A(),o=r(a,!0);e(a);var s={};_(()=>{y(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),x(t,a)}),e(o),e(a),m(o,()=>n(H),e=>t(H,e)),x(i,a)},S=t=>{var i=M(),a=s(r(i)),o=r(a,!0);e(a),e(i),_(e=>y(o,e),[()=>n(V).find(e=>e.id===n(U).student_id)?.name||`Student`]),x(t,i)};p(v,e=>{!n(U)&&n(R).status===`open`?e(b):n(U)&&e(S,1)});var C=s(v,2),T=s(r(C),2);{let e=i(()=>n(U)?.seat_id);w(T,{get elements(){return n(z)},get occupiedSeatIds(){return n(J)},get mySeatId(){return n(e)},onElementClick:q})}e(C),_(()=>y(u,`Check-in: ${n(R).start_time??``} - ${n(R).end_time??``}`)),x(o,c)};p(X,e=>{n(W)?e(Z):n(G)?e(Q,1):n(R)&&e($,2)}),e(Y),x(b,Y),o(),I()}export{F as component};

View File

@@ -0,0 +1 @@
import{$ as e,E as t,F as n,I as r,J as i,L as a,U as o,W as s,Y as c,_ as l,a as u,b as d,m as f,n as p,x as m,y as h}from"../chunks/egdMPJ-g.js";import{t as g}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";import"../chunks/Dt4wv1ei.js";import{n as _,t as v}from"../chunks/CS5Tuebd.js";import"../chunks/vL8MaPP-.js";var y=m(`<nav class="svelte-1qg5d05"><div class="nav-content svelte-1qg5d05"><div class="links svelte-1qg5d05"><a href="/admin" class="svelte-1qg5d05">Dashboard</a> <a href="/admin/courses" class="svelte-1qg5d05">Courses</a> <a href="/admin/rooms" class="svelte-1qg5d05">Rooms</a> <a href="/admin/sessions" class="svelte-1qg5d05">Sessions</a> <a href="/admin/attendance" class="svelte-1qg5d05">Attendance</a> <a href="/admin/notes" class="svelte-1qg5d05">Notes</a> <a href="/admin/export" class="svelte-1qg5d05">Export</a></div> <button>Logout</button></div></nav> <main class="svelte-1qg5d05"><!></main>`,1);function b(m,b){c(b,!1);let x=()=>s(_,`$token`,S),[S,C]=o();p(()=>{x()||g(`/login`)});function w(){v(),g(`/login`)}u();var T=d(),E=r(T),D=i=>{var o=y(),s=r(o),c=n(s),l=a(n(c),2);e(c),e(s);var u=a(s,2);f(n(u),b,`default`,{},null),e(u),t(`click`,l,w),h(i,o)};l(E,e=>{x()&&e(D)}),h(m,T),i(),C()}export{b as component};

View File

@@ -1 +0,0 @@
import{N as e,f as t,u as n}from"../chunks/BymsAeK4.js";import"../chunks/DEDqjojZ.js";import"../chunks/BLiAG49H.js";var r=t(`<h1>Attendance Tool</h1> <a href="/login">Login</a>`,1);function i(t){var i=r();e(2),n(t,i)}export{i as component};

View File

@@ -0,0 +1 @@
import{J as e,U as t,W as n,Y as r,a as i,n as a,x as o,y as s}from"../chunks/egdMPJ-g.js";import{t as c}from"../chunks/DKRuQnts.js";import"../chunks/BMRk7WTg.js";import"../chunks/Dt4wv1ei.js";import{n as l}from"../chunks/CS5Tuebd.js";import"../chunks/vL8MaPP-.js";var u=o(`<div class="welcome svelte-1uha8ag"><h1 class="svelte-1uha8ag">FPTutor Attendance</h1> <p class="svelte-1uha8ag">Efficiently tracking attendance and student observations.</p> <div class="actions svelte-1uha8ag"><a href="/login" class="btn svelte-1uha8ag">Tutor Login</a></div> <div class="footer svelte-1uha8ag"><p class="svelte-1uha8ag">Students: Please use the link provided by your tutor during the session.</p></div></div>`);function d(o,d){r(d,!1);let f=()=>n(l,`$token`,p),[p,m]=t();a(()=>{f()&&c(`/admin`)}),i(),s(o,u()),e(),m()}export{d as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,F as r,I as i,J as a,L as o,M as s,R as c,T as l,V as u,Y as d,_ as f,b as p,d as m,f as h,g,h as _,j as v,n as y,v as b,w as x,x as S,y as C}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as w}from"../chunks/DNBIa2Bh.js";var T=S(`<option> </option>`),E=S(`<p>Loading sessions...</p>`),D=S(`<code class="checkin-code svelte-1jef3w8"> </code>`),O=S(`<button class="svelte-1jef3w8">Open</button>`),k=S(`<button class="svelte-1jef3w8">Copy Link</button> <button class="svelte-1jef3w8">Lock</button> <button class="svelte-1jef3w8">Close</button>`,1),A=S(`<button class="svelte-1jef3w8">Unlock</button> <button class="svelte-1jef3w8">Close</button>`,1),j=S(`<div class="slot-row svelte-1jef3w8"><div class="slot-info"><span> </span> <strong> </strong> <!></div> <div class="actions svelte-1jef3w8"><!></div></div>`),M=S(`<p>No slots scheduled.</p>`),N=S(`<div class="session-card svelte-1jef3w8"><h2> </h2> <div class="slots"><!></div></div>`),P=S(`<div class="sessions"></div>`),F=S(`<h1>Admin Dashboard</h1> <div class="course-selector svelte-1jef3w8"><label for="course">Select Course:</label> <select id="course"></select></div> <!>`,1);function I(x,S){d(S,!0);let I=u(c([])),L=u(null),R=u(c([])),z=u(!1);y(async()=>{t(z,!0);try{t(I,await w.admin.courses.list(),!0),n(I).length>0&&t(L,n(I)[0].id,!0)}catch(e){console.error(e)}finally{t(z,!1)}}),s(()=>{n(L)!==null&&B(n(L))});async function B(e){t(z,!0);try{t(R,await w.admin.sessions.list(e),!0)}catch(e){console.error(e)}finally{t(z,!1)}}async function V(e,t){try{await w.admin.slots.updateStatus(e,t),n(L)&&B(n(L))}catch(e){alert(e)}}function H(e){let t=`${window.location.origin}/s/${e}`;navigator.clipboard.writeText(t),alert(`Link copied to clipboard`)}var U=F(),W=o(i(U),2),G=o(r(W),2);_(G,21,()=>n(I),g,(t,i)=>{var a=T(),o=r(a);e(a);var s={};v(()=>{b(o,`${n(i).name??``} (${n(i).semester??``})`),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(G),e(W);var K=o(W,2),q=e=>{C(e,E())},J=t=>{var a=P();_(a,21,()=>n(R),g,(t,a)=>{var s=N(),c=r(s),u=r(c);e(c);var d=o(c,2),m=r(d),y=t=>{var s=p();_(i(s),17,()=>n(a).slots,g,(t,a)=>{var s=j(),c=r(s),u=r(c),d=r(u,!0);e(u);var p=o(u,2),m=r(p);e(p);var g=o(p,2),_=t=>{var i=D(),o=r(i,!0);e(i),v(()=>b(o,n(a).code)),C(t,i)};f(g,e=>{n(a).code&&e(_)}),e(c);var y=o(c,2),x=r(y),S=e=>{var t=O();l(`click`,t,()=>V(n(a).id,`open`)),C(e,t)},w=e=>{var t=k(),r=i(t),s=o(r,2),c=o(s,2);l(`click`,r,()=>H(n(a).code)),l(`click`,s,()=>V(n(a).id,`locked`)),l(`click`,c,()=>V(n(a).id,`closed`)),C(e,t)},T=e=>{var t=A(),r=i(t),s=o(r,2);l(`click`,r,()=>V(n(a).id,`open`)),l(`click`,s,()=>V(n(a).id,`closed`)),C(e,t)};f(x,e=>{n(a).status===`closed`?e(S):n(a).status===`open`?e(w,1):n(a).status===`locked`&&e(T,2)}),e(y),e(s),v(()=>{h(u,1,`status-badge ${n(a).status??``}`,`svelte-1jef3w8`),b(d,n(a).status),b(m,`${n(a).start_time??``} - ${n(a).end_time??``}`)}),C(t,s)}),C(t,s)},x=e=>{C(e,M())};f(m,e=>{n(a).slots&&n(a).slots.length>0?e(y):e(x,-1)}),e(d),e(s),v(()=>b(u,`Week ${n(a).week_nr??``} - ${n(a).date??``}`)),C(t,s)}),e(a),C(t,a)};f(K,e=>{n(z)&&n(R).length===0?e(q):e(J,-1)}),m(G,()=>n(L),e=>t(L,e)),C(x,U),a()}x([`click`]);export{I as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,F as r,H as i,I as a,J as o,L as s,M as c,R as l,T as u,V as d,Y as f,_ as p,d as m,f as h,g,h as _,j as v,n as y,v as b,w as x,x as S,y as C}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as w}from"../chunks/DNBIa2Bh.js";var T=S(`<option> </option>`),E=S(`<option> </option>`),D=S(`<select class="svelte-190s2eg"></select>`),O=S(`<th class="svelte-190s2eg"> </th>`),k=S(`<td> </td>`),A=S(`<tr><td class="svelte-190s2eg"> </td><!></tr>`),j=S(`<div class="matrix-container svelte-190s2eg"><table class="svelte-190s2eg"><thead><tr><th class="svelte-190s2eg">Student</th><!></tr></thead><tbody></tbody></table></div>`),M=S(`<p>Loading matrix...</p>`),N=S(`<h1>Attendance Matrix</h1> <div class="selectors svelte-190s2eg"><select class="svelte-190s2eg"></select> <!></div> <!>`,1);function P(x,S){f(S,!0);let P=d(l([])),F=d(null),I=d(l([])),L=d(null),R=d(null);y(async()=>{t(P,await w.admin.courses.list(),!0),n(P).length>0&&t(F,n(P)[0].id,!0)}),c(()=>{n(F)&&w.admin.sessions.list(n(F)).then(e=>{t(I,e,!0),n(I).length>0&&t(L,n(I)[0].id,!0)})}),c(()=>{n(L)&&w.admin.sessions.getAttendance(n(L)).then(e=>t(R,e,!0))});async function z(e,r){if(!n(R))return;let i=n(R).attendances.find(t=>t.slot_id===e&&t.student_id===r);try{i?await w.admin.slots.deleteAttendance(e,r):await w.admin.slots.addAttendance(e,r),t(R,await w.admin.sessions.getAttendance(n(L)),!0)}catch(e){alert(e)}}var B=N(),V=s(a(B),2),H=r(V);_(H,21,()=>n(P),g,(t,i)=>{var a=T(),o=r(a,!0);e(a);var s={};v(()=>{b(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(H);var U=s(H,2),W=i=>{var a=D();_(a,21,()=>n(I),g,(t,i)=>{var a=E(),o=r(a);e(a);var s={};v(()=>{b(o,`Week ${n(i).week_nr??``} (${n(i).date??``})`),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(a),m(a,()=>n(L),e=>t(L,e)),C(i,a)};p(U,e=>{n(I).length>0&&e(W)}),e(V);var G=s(V,2),K=t=>{var a=j(),o=r(a),c=r(o),l=r(c);_(s(r(l)),17,()=>n(R).slots,g,(t,i)=>{var a=O(),o=r(a,!0);e(a),v(()=>b(o,n(i).start_time)),C(t,a)}),e(l),e(c);var d=s(c);_(d,21,()=>n(R).students,g,(t,a)=>{var o=A(),c=r(o),l=r(c,!0);e(c),_(s(c),17,()=>n(R).slots,g,(t,o)=>{let s=i(()=>n(R).attendances.some(e=>e.slot_id===n(o).id&&e.student_id===n(a).id));var c=k();let l;var d=r(c,!0);e(c),v(()=>{l=h(c,1,`cell svelte-190s2eg`,null,l,{present:n(s)}),b(d,n(s)?``:``)}),u(`click`,c,()=>z(n(o).id,n(a).id)),C(t,c)}),e(o),v(()=>b(l,n(a).name)),C(t,o)}),e(d),e(o),e(a),C(t,a)},q=e=>{C(e,M())};p(G,e=>{n(R)?e(K):e(q,-1)}),m(H,()=>n(F),e=>t(F,e)),C(x,B),o()}x([`click`]);export{P as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,E as r,F as i,H as a,I as o,J as s,L as c,M as l,Q as u,R as d,T as f,V as p,Y as m,_ as h,c as g,f as _,g as v,h as y,j as b,l as x,n as S,s as C,v as w,w as T,x as E,y as D}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as O}from"../chunks/DNBIa2Bh.js";var k=E(`<div><strong> </strong> </div>`),A=E(`<tr><td class="svelte-nbog41"> </td><td class="svelte-nbog41"> </td><td class="svelte-nbog41"><button>Delete</button></td></tr>`),j=E(`<h2> </h2> <div class="student-actions svelte-nbog41"><form style="display: inline-block;"><input placeholder="Student Name" required="" class="svelte-nbog41"/> <button type="submit">Add Student</button></form> <div class="import-box svelte-nbog41"><span>Import CSV (name header):</span> <input type="file" accept=".csv" class="svelte-nbog41"/></div></div> <table class="svelte-nbog41"><thead><tr><th class="svelte-nbog41">ID</th><th class="svelte-nbog41">Name</th><th class="svelte-nbog41">Actions</th></tr></thead><tbody></tbody></table>`,1),M=E(`<p>Select a course to manage students.</p>`),N=E(`<h1>Courses & Students</h1> <div class="management-grid svelte-nbog41"><div class="courses-panel"><h2>Manage Courses</h2> <form><input placeholder="Course Name (e.g. FP)" required="" class="svelte-nbog41"/> <input placeholder="Semester (e.g. SS2026)" required="" class="svelte-nbog41"/> <button type="submit">Create Course</button></form> <div class="course-list"></div></div> <div class="students-panel"><!></div></div>`,1);function P(T,E){m(E,!0);let P=p(d([])),F=p(null),I=p(d([])),L=p(``),R=p(``),z=p(``);S(async()=>{await B()});async function B(){t(P,await O.admin.courses.list(),!0),n(P).length>0&&n(F)===null&&t(F,n(P)[0].id,!0)}l(()=>{n(F)!==null&&V(n(F))});async function V(e){t(I,await O.admin.courses.listStudents(e),!0)}async function H(){try{let e=await O.admin.courses.create(n(L),n(R));t(L,``),t(R,``),await B(),t(F,e.id,!0)}catch(e){alert(e)}}async function U(){if(n(F))try{await O.admin.courses.addStudent(n(F),n(z)),t(z,``),await V(n(F))}catch(e){alert(e)}}async function W(e){if(confirm(`Are you sure?`))try{await O.admin.students.delete(e),n(F)&&await V(n(F))}catch(e){alert(e)}}let G;async function ee(){if(!(!n(F)||!G.files?.[0]))try{await O.admin.courses.importStudents(n(F),G.files[0]),await V(n(F)),G.value=``}catch(e){alert(e)}}var K=N(),q=c(o(K),2),J=i(q),Y=c(i(J),2),X=i(Y);x(X);var Z=c(X,2);x(Z),u(2),e(Y);var Q=c(Y,2);y(Q,21,()=>n(P),v,(r,a)=>{var o=k();let s;var l=i(o),u=i(l,!0);e(l);var d=c(l);e(o),b(()=>{s=_(o,1,`course-item svelte-nbog41`,null,s,{selected:n(F)===n(a).id}),w(u,n(a).name),w(d,` (${n(a).semester??``})`)}),f(`click`,o,()=>t(F,n(a).id,!0)),D(r,o)}),e(Q),e(J);var $=c(J,2),te=i($),ne=s=>{let l=a(()=>n(P).find(e=>e.id===n(F)));var d=j(),p=o(d),m=i(p);e(p);var h=c(p,2),_=i(h),S=i(_);x(S),u(2),e(_);var T=c(_,2),E=c(i(T),2);C(E,e=>G=e,()=>G),e(T),e(h);var O=c(h,2),k=c(i(O));y(k,21,()=>n(I),v,(t,r)=>{var a=A(),o=i(a),s=i(o,!0);e(o);var l=c(o),u=i(l,!0);e(l);var d=c(l),p=i(d);e(d),e(a),b(()=>{w(s,n(r).id),w(u,n(r).name)}),f(`click`,p,()=>W(n(r).id)),D(t,a)}),e(k),e(O),b(()=>w(m,`Students in ${n(l)?.name??``}`)),r(`submit`,_,U),g(S,()=>n(z),e=>t(z,e)),f(`change`,E,ee),D(s,d)},re=e=>{D(e,M())};h(te,e=>{n(F)?e(ne):e(re,-1)}),e($),e(q),r(`submit`,Y,H),g(X,()=>n(L),e=>t(L,e)),g(Z,()=>n(R),e=>t(R,e)),D(T,K),s()}T([`click`,`change`]);export{P as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,F as r,I as i,J as a,L as o,M as s,R as c,T as l,V as u,Y as d,_ as f,d as p,g as m,h,j as g,n as _,v,w as y,x as b,y as x}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as S}from"../chunks/DNBIa2Bh.js";var C=b(`<option> </option>`),w=b(`<div class="session-export-row svelte-128ylb7"><span> </span> <div class="btn-group svelte-128ylb7"><button class="small svelte-128ylb7">CSV</button> <button class="small svelte-128ylb7">MD</button></div></div>`),T=b(`<div class="export-card svelte-128ylb7"><h3>Full Attendance Matrix</h3> <p>All weeks, all students, includes bonus point calculation.</p> <div class="btn-group svelte-128ylb7"><button class="svelte-128ylb7">CSV</button> <button class="svelte-128ylb7">Markdown</button></div></div> <h3>Weekly Exports</h3> <div class="sessions-list"></div>`,1),E=b(`<h1>Export Data</h1> <div class="export-grid svelte-128ylb7"><div class="export-section"><h2>Global</h2> <div class="export-card svelte-128ylb7"><h3>Full Database Backup</h3> <p>Download the latest SQLite database file.</p> <button class="svelte-128ylb7">Download .sqlite</button></div></div> <div class="export-section"><h2>Per Course</h2> <select class="svelte-128ylb7"></select> <!></div></div>`,1);function D(y,b){d(b,!0);let D=u(c([])),O=u(null),k=u(c([]));_(async()=>{t(D,await S.admin.courses.list(),!0),n(D).length>0&&t(O,n(D)[0].id,!0)}),s(()=>{n(O)&&S.admin.sessions.list(n(O)).then(e=>t(k,e,!0))});var A=E(),j=o(i(A),2),M=r(j),N=o(r(M),2),P=o(r(N),4);e(N),e(M);var F=o(M,2),I=o(r(F),2);h(I,21,()=>n(D),m,(t,i)=>{var a=C(),o=r(a,!0);e(a);var s={};g(()=>{v(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),x(t,a)}),e(I);var L=o(I,2),R=t=>{var a=T(),s=i(a),c=o(r(s),4),u=r(c),d=o(u,2);e(c),e(s);var f=o(s,4);h(f,21,()=>n(k),m,(t,i)=>{var a=w(),s=r(a),c=r(s);e(s);var u=o(s,2),d=r(u),f=o(d,2);e(u),e(a),g(()=>v(c,`Week ${n(i).week_nr??``} (${n(i).date??``})`)),l(`click`,d,()=>window.open(S.admin.export.sessionCsv(n(i).id),`_blank`)),l(`click`,f,()=>window.open(S.admin.export.sessionMd(n(i).id),`_blank`)),x(t,a)}),e(f),l(`click`,u,()=>window.open(S.admin.export.courseCsv(n(O)),`_blank`)),l(`click`,d,()=>window.open(S.admin.export.courseMd(n(O)),`_blank`)),x(t,a)};f(L,e=>{n(O)&&e(R)}),e(F),e(j),l(`click`,P,()=>window.open(S.admin.export.backup(),`_blank`)),p(I,()=>n(O),e=>t(O,e)),x(y,A),a()}y([`click`]);export{D as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,F as r,H as i,I as a,J as o,L as s,M as c,P as l,R as u,T as d,V as f,Y as p,_ as m,c as ee,d as h,g,h as _,j as v,n as y,v as b,w as x,x as S,y as C}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as w}from"../chunks/DNBIa2Bh.js";import{t as T}from"../chunks/BYEkGdSH.js";var E=S(`<option> </option>`),te=S(`<option> </option>`),ne=S(`<option> </option>`),D=S(`<textarea placeholder="Enter observations..." class="svelte-1do7mxm"></textarea> <button class="primary svelte-1do7mxm">Save Note</button>`,1),re=S(`<p>Select a seat occupied by a student to leave a note.</p>`),O=S(`<h3> </h3> <!> <button>Cancel</button>`,1),k=S(`<p>Click a seat on the map to add or view notes.</p>`),A=S(`<div class="note-item svelte-1do7mxm"><strong> </strong> <p class="svelte-1do7mxm"> </p></div>`),ie=S(`<h1>Seat Notes</h1> <div class="selectors svelte-1do7mxm"><select class="svelte-1do7mxm"></select> <select class="svelte-1do7mxm"></select> <select class="svelte-1do7mxm"></select></div> <div class="notes-container svelte-1do7mxm"><div class="map-view"><!></div> <div class="note-editor svelte-1do7mxm"><!> <div class="existing-notes"><h3>Recent Notes</h3> <!></div></div></div>`,1);function j(x,S){p(S,!0);let j=f(u([])),M=f(null),N=f(u([])),P=f(null),F=f(u([])),I=f(null),L=f(u([])),R=f(u([])),z=f(u([])),B=f(u([]));y(async()=>{t(j,await w.admin.courses.list(),!0),n(j).length>0&&t(M,n(j)[0].id,!0)}),c(()=>{n(M)&&(w.admin.sessions.list(n(M)).then(e=>{t(N,e,!0),n(N).length>0&&t(P,n(N)[0].id,!0)}),w.admin.courses.listStudents(n(M)).then(e=>t(z,e,!0)))}),c(()=>{n(P)&&(t(F,n(N).find(e=>e.id===n(P))?.slots||[],!0),n(F).length>0&&t(I,n(F)[0].id,!0))}),c(()=>{if(n(I)){let e=n(F).find(e=>e.id===n(I));e?.room_id?w.admin.rooms.get(e.room_id).then(e=>t(L,e.layout,!0)):t(L,[],!0),w.admin.slots.getNotes(n(I)).then(e=>t(R,e,!0)),w.admin.sessions.getAttendance(n(P)).then(e=>{t(B,e.attendances.filter(e=>e.slot_id===n(I)),!0)})}});let V=f(null),H=f(``);function ae(e){if(e.type!==`seat`)return;t(V,e.id,!0);let r=n(B).find(t=>t.seat_id===e.id)?.student_id;r?t(H,n(R).find(e=>e.student_id===r)?.content||``,!0):t(H,``)}async function oe(){if(!n(I)||!n(V))return;let e=n(B).find(e=>e.seat_id===n(V))?.student_id;if(!e){alert(`No student at this seat`);return}try{await w.admin.slots.upsertNote(n(I),e,n(H)),t(R,await w.admin.slots.getNotes(n(I)),!0),t(V,null)}catch(e){alert(e)}}let U=i(()=>{let e={};return n(B).forEach(t=>{if(t.seat_id){let r=n(z).find(e=>e.id===t.student_id);e[t.seat_id]=r?.name||`Unknown`}}),e}),se=i(()=>n(B).map(e=>e.seat_id).filter(e=>e!==null));var W=ie(),G=s(a(W),2),K=r(G);_(K,21,()=>n(j),g,(t,i)=>{var a=E(),o=r(a,!0);e(a);var s={};v(()=>{b(o,n(i).name),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(K);var q=s(K,2);_(q,21,()=>n(N),g,(t,i)=>{var a=te(),o=r(a);e(a);var s={};v(()=>{b(o,`Week ${n(i).week_nr??``}`),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(q);var J=s(q,2);_(J,21,()=>n(F),g,(t,i)=>{var a=ne(),o=r(a);e(a);var s={};v(()=>{b(o,`${n(i).start_time??``} - ${n(i).end_time??``}`),s!==(s=n(i).id)&&(a.value=(a.__value=n(i).id)??``)}),C(t,a)}),e(J),e(G);var Y=s(G,2),X=r(Y);T(r(X),{get elements(){return n(L)},get occupiedSeatIds(){return n(se)},get selectedId(){return n(V)},get studentNames(){return n(U)},onElementClick:ae}),e(X);var Z=s(X,2),Q=r(Z),ce=o=>{let c=i(()=>n(U)[n(V)]);var u=O(),f=a(u),p=r(f);e(f);var h=s(f,2),g=e=>{var r=D(),i=a(r);l(i);var o=s(i,2);ee(i,()=>n(H),e=>t(H,e)),d(`click`,o,oe),C(e,r)},_=e=>{C(e,re())};m(h,e=>{n(c)?e(g):e(_,-1)});var y=s(h,2);v(()=>b(p,`Note for ${(n(c)||`Empty Seat`)??``}`)),d(`click`,y,()=>t(V,null)),C(o,u)},le=e=>{C(e,k())};m(Q,e=>{n(V)?e(ce):e(le,-1)});var $=s(Q,2);_(s(r($),2),17,()=>n(R),g,(t,i)=>{var a=A(),o=r(a),c=r(o);e(o);var l=s(o,2),u=r(l,!0);e(l),e(a),v(e=>{b(c,`${e??``}:`),b(u,n(i).content)},[()=>n(z).find(e=>e.id===n(i).student_id)?.name]),C(t,a)}),e($),e(Z),e(Y),h(K,()=>n(M),e=>t(M,e)),h(q,()=>n(P),e=>t(P,e)),h(J,()=>n(I),e=>t(I,e)),C(x,W),o()}x([`click`]);export{j as component};

View File

@@ -0,0 +1 @@
import{$ as e,B as t,D as n,E as r,F as i,H as a,I as o,J as s,L as c,M as l,Q as u,R as d,T as f,V as p,Y as m,_ as h,c as g,f as _,g as v,h as y,j as b,l as x,n as S,v as C,w,x as T,y as E}from"../chunks/egdMPJ-g.js";import"../chunks/BMRk7WTg.js";import{t as D}from"../chunks/DNBIa2Bh.js";import{t as O}from"../chunks/BYEkGdSH.js";var k=T(`<div> </div>`),A=T(`<div class="field svelte-2e9svb"><label class="svelte-2e9svb">Label</label> <input class="svelte-2e9svb"/></div> <div class="field svelte-2e9svb"><label class="svelte-2e9svb">Width</label> <input type="number" step="0.5" class="svelte-2e9svb"/></div> <div class="field svelte-2e9svb"><label class="svelte-2e9svb">Height</label> <input type="number" step="0.5" class="svelte-2e9svb"/></div> <button class="delete-btn svelte-2e9svb">Delete Element</button>`,1),j=T(`<p>Select an element to edit properties.</p>`),M=T(`<div class="editor-header svelte-2e9svb"><h2> </h2> <div class="toolbar svelte-2e9svb"><button class="svelte-2e9svb">Add Seat</button> <button class="svelte-2e9svb">Add Table</button> <button class="svelte-2e9svb">Add Door</button> <button class="save-btn svelte-2e9svb">Save Layout</button></div></div> <div class="canvas-container svelte-2e9svb"><!> <div class="properties-panel svelte-2e9svb"><h3>Properties</h3> <!></div></div>`,1),N=T(`<p>Select a room to edit its layout.</p>`),P=T(`<h1>Room Layouts</h1> <div class="management-grid svelte-2e9svb"><div class="rooms-panel"><h2>Rooms</h2> <form><input placeholder="Room Name" required=""/> <button type="submit">Create</button></form> <div class="room-list"></div></div> <div class="editor-panel"><!></div></div>`,1);function F(w,T){m(T,!0);let F=p(d([])),I=p(null),L=p(null),R=p(``);S(async()=>{await z()});async function z(){t(F,await D.admin.rooms.list(),!0)}l(()=>{n(I)&&D.admin.rooms.get(n(I)).then(e=>t(L,e,!0))});async function B(){let e=[{id:`s1`,label:`1`,x:2,y:2,width:1,height:1,type:`seat`}];try{let r=await D.admin.rooms.create(n(R),e);t(R,``),await z(),t(I,r.id,!0)}catch(e){alert(e)}}async function V(){if(n(L))try{await D.admin.rooms.updateLayout(n(L).id,n(L).layout),alert(`Layout saved`)}catch(e){alert(e)}}function H(e){if(!n(L))return;let t={id:Math.random().toString(36).substr(2,9),label:e===`seat`?(n(L).layout.filter(e=>e.type===`seat`).length+1).toString():``,x:0,y:0,width:e===`table`?2:1,height:1,type:e};n(L).layout=[...n(L).layout,t]}let U=p(null),W=a(()=>n(L)?.layout.find(e=>e.id===n(U)));function G(){!n(L)||!n(U)||(n(L).layout=n(L).layout.filter(e=>e.id!==n(U)),t(U,null))}var K=P(),q=c(o(K),2),J=i(q),Y=c(i(J),2),X=i(Y);x(X),u(2),e(Y);var Z=c(Y,2);y(Z,21,()=>n(F),v,(r,a)=>{var o=k();let s;var c=i(o,!0);e(o),b(()=>{s=_(o,1,`room-item svelte-2e9svb`,null,s,{selected:n(I)===n(a).id}),C(c,n(a).name)}),f(`click`,o,()=>t(I,n(a).id,!0)),E(r,o)}),e(Z),e(J);var Q=c(J,2),$=i(Q),ee=r=>{var a=M(),s=o(a),l=i(s),u=i(l);e(l);var d=c(l,2),p=i(d),m=c(p,2),_=c(m,2),v=c(_,2);e(d),e(s);var y=c(s,2),S=i(y);O(S,{editable:!0,get selectedId(){return n(U)},onElementClick:e=>t(U,e.id,!0),get elements(){return n(L).layout},set elements(e){n(L).layout=e}});var w=c(S,2),T=c(i(w),2),D=t=>{var r=A(),a=o(r),s=c(i(a),2);x(s),e(a);var l=c(a,2),u=c(i(l),2);x(u),e(l);var d=c(l,2),p=c(i(d),2);x(p),e(d);var m=c(d,2);g(s,()=>n(W).label,e=>n(W).label=e),g(u,()=>n(W).width,e=>n(W).width=e),g(p,()=>n(W).height,e=>n(W).height=e),f(`click`,m,G),E(t,r)},k=e=>{E(e,j())};h(T,e=>{n(W)?e(D):e(k,-1)}),e(w),e(y),b(()=>C(u,`Editing: ${n(L).name??``}`)),f(`click`,p,()=>H(`seat`)),f(`click`,m,()=>H(`table`)),f(`click`,_,()=>H(`door`)),f(`click`,v,V),E(r,a)},te=e=>{E(e,N())};h($,e=>{n(L)?e(ee):e(te,-1)}),e(Q),e(q),r(`submit`,Y,B),g(X,()=>n(R),e=>t(R,e)),E(w,K),s()}w([`click`]);export{F as component};

View File

@@ -1 +1 @@
{"version":"1777346172513"}
{"version":"1777346369869"}

View File

@@ -9,20 +9,72 @@
"_internal.js"
]
},
"_RoomCanvas.BEv49FWI.css": {
"file": "_app/immutable/assets/RoomCanvas.BEv49FWI.css",
"src": "_RoomCanvas.BEv49FWI.css"
},
"_RoomCanvas.js": {
"file": "chunks/RoomCanvas.js",
"name": "RoomCanvas",
"imports": [
"_dev.js"
],
"css": [
"_app/immutable/assets/RoomCanvas.BEv49FWI.css"
]
},
"_api.js": {
"file": "chunks/api.js",
"name": "api",
"imports": [
"_dev.js",
"_index-server2.js",
"_auth.js"
]
},
"_auth.js": {
"file": "chunks/auth.js",
"name": "auth",
"imports": [
"_dev.js",
"_index-server2.js"
]
},
"_client.js": {
"file": "chunks/client.js",
"name": "client",
"imports": [
"_index-server.js",
"_environment.js",
"_internal.js",
"_exports.js",
"_shared.js",
"_dev.js",
"_index-server2.js"
]
},
"_dev.js": {
"file": "chunks/dev.js",
"name": "dev"
},
"_environment.js": {
"file": "chunks/environment.js",
"name": "environment",
"name": "environment"
},
"_exports.js": {
"file": "chunks/exports.js",
"name": "exports"
},
"_index-server.js": {
"file": "chunks/index-server.js",
"name": "index-server",
"imports": [
"_dev.js"
]
},
"_exports.js": {
"file": "chunks/exports.js",
"name": "exports",
"_index-server2.js": {
"file": "chunks/index-server2.js",
"name": "index-server",
"imports": [
"_dev.js"
]
@@ -31,15 +83,23 @@
"file": "chunks/internal.js",
"name": "internal",
"imports": [
"_index-server.js",
"_environment.js",
"_dev.js"
]
},
"_navigation.js": {
"file": "chunks/navigation.js",
"name": "navigation",
"imports": [
"_client.js"
]
},
"_shared.js": {
"file": "chunks/shared.js",
"name": "shared",
"imports": [
"_environment.js"
"_index-server.js"
]
},
"_utils.js": {
@@ -67,10 +127,8 @@
"src": "node_modules/@sveltejs/kit/src/runtime/components/svelte-5/error.svelte",
"isEntry": true,
"imports": [
"_environment.js",
"_internal.js",
"_exports.js",
"_shared.js",
"_index-server.js",
"_client.js",
"_dev.js"
]
},
@@ -85,7 +143,8 @@
"_utils.js",
"_exports.js",
"_shared.js",
"_dev.js"
"_dev.js",
"_index-server2.js"
]
},
"src/routes/+layout.svelte": {
@@ -103,7 +162,161 @@
"src": "src/routes/+page.svelte",
"isEntry": true,
"imports": [
"_dev.js"
"_index-server.js",
"_navigation.js",
"_client.js",
"_dev.js",
"_auth.js"
],
"css": [
"_app/immutable/assets/_page.Dzrf4zX4.css"
]
},
"src/routes/admin/+layout.svelte": {
"file": "entries/pages/admin/_layout.svelte.js",
"name": "entries/pages/admin/_layout.svelte",
"src": "src/routes/admin/+layout.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_navigation.js",
"_client.js",
"_dev.js",
"_auth.js"
],
"css": [
"_app/immutable/assets/_layout.BQQYIMLK.css"
]
},
"src/routes/admin/+page.svelte": {
"file": "entries/pages/admin/_page.svelte.js",
"name": "entries/pages/admin/_page.svelte",
"src": "src/routes/admin/+page.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_dev.js",
"_api.js"
],
"css": [
"_app/immutable/assets/_page.b2bZrlfC.css"
]
},
"src/routes/admin/attendance/+page.svelte": {
"file": "entries/pages/admin/attendance/_page.svelte.js",
"name": "entries/pages/admin/attendance/_page.svelte",
"src": "src/routes/admin/attendance/+page.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_dev.js",
"_api.js"
],
"css": [
"_app/immutable/assets/_page.DDTZ5v3E.css"
]
},
"src/routes/admin/courses/+page.svelte": {
"file": "entries/pages/admin/courses/_page.svelte.js",
"name": "entries/pages/admin/courses/_page.svelte",
"src": "src/routes/admin/courses/+page.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_dev.js",
"_api.js"
],
"css": [
"_app/immutable/assets/_page.Bfx4fGBa.css"
]
},
"src/routes/admin/export/+page.svelte": {
"file": "entries/pages/admin/export/_page.svelte.js",
"name": "entries/pages/admin/export/_page.svelte",
"src": "src/routes/admin/export/+page.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_dev.js",
"_api.js"
],
"css": [
"_app/immutable/assets/_page.DkoPrtit.css"
]
},
"src/routes/admin/notes/+page.svelte": {
"file": "entries/pages/admin/notes/_page.svelte.js",
"name": "entries/pages/admin/notes/_page.svelte",
"src": "src/routes/admin/notes/+page.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_dev.js",
"_RoomCanvas.js",
"_api.js"
],
"css": [
"_app/immutable/assets/_page.DigLoqRm.css"
]
},
"src/routes/admin/rooms/+page.svelte": {
"file": "entries/pages/admin/rooms/_page.svelte.js",
"name": "entries/pages/admin/rooms/_page.svelte",
"src": "src/routes/admin/rooms/+page.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_dev.js",
"_RoomCanvas.js",
"_api.js"
],
"css": [
"_app/immutable/assets/_page.C7KB5jd4.css"
]
},
"src/routes/admin/sessions/+page.svelte": {
"file": "entries/pages/admin/sessions/_page.svelte.js",
"name": "entries/pages/admin/sessions/_page.svelte",
"src": "src/routes/admin/sessions/+page.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_dev.js",
"_api.js"
],
"css": [
"_app/immutable/assets/_page.BhkUjvVr.css"
]
},
"src/routes/login/+page.svelte": {
"file": "entries/pages/login/_page.svelte.js",
"name": "entries/pages/login/_page.svelte",
"src": "src/routes/login/+page.svelte",
"isEntry": true,
"imports": [
"_navigation.js",
"_dev.js",
"_api.js",
"_auth.js"
],
"css": [
"_app/immutable/assets/_page.LkBq3xGq.css"
]
},
"src/routes/s/[code]/+page.svelte": {
"file": "entries/pages/s/_code_/_page.svelte.js",
"name": "entries/pages/s/_code_/_page.svelte",
"src": "src/routes/s/[code]/+page.svelte",
"isEntry": true,
"imports": [
"_index-server.js",
"_client.js",
"_dev.js",
"_RoomCanvas.js",
"_api.js"
],
"css": [
"_app/immutable/assets/_page.BboNMIwd.css"
]
}
}

View File

@@ -0,0 +1 @@
.room-canvas.svelte-1i40qao{user-select:none;background:#fff;border:1px solid #ccc}.room-canvas.editable.svelte-1i40qao{cursor:crosshair}.element.svelte-1i40qao{cursor:pointer}.element.seat.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#fff;stroke:#007bff;stroke-width:2px}.element.seat.svelte-1i40qao text:where(.svelte-1i40qao){fill:#007bff;font-size:14px;font-weight:700}.element.seat.occupied.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#e7f1ff;stroke:#6c757d}.element.seat.occupied.svelte-1i40qao text:where(.svelte-1i40qao){fill:#6c757d}.element.seat.is-mine.svelte-1i40qao rect:where(.svelte-1i40qao){fill:#28a745;stroke:#1e7e34}.element.seat.is-mine.svelte-1i40qao text:where(.svelte-1i40qao){fill:#fff}.element.selected.svelte-1i40qao rect:where(.svelte-1i40qao){stroke:#ffc107;stroke-width:3px}.student-name.svelte-1i40qao{fill:#333;font-size:10px}

View File

@@ -0,0 +1 @@
nav.svelte-1qg5d05{background:#f8f9fa;border-bottom:1px solid #dee2e6;padding:10px 20px}.nav-content.svelte-1qg5d05{justify-content:space-between;align-items:center;max-width:1200px;margin:0 auto;display:flex}.links.svelte-1qg5d05 a:where(.svelte-1qg5d05){color:#333;margin-right:20px;text-decoration:none}.links.svelte-1qg5d05 a:where(.svelte-1qg5d05):hover{color:#007bff}main.svelte-1qg5d05{max-width:1200px;margin:20px auto;padding:0 20px}

View File

@@ -0,0 +1 @@
.checkin-page.svelte-1gdz5lm{text-align:center;max-width:800px;margin:40px auto}.identity-selector.svelte-1gdz5lm{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:20px}select.svelte-1gdz5lm{padding:8px;font-size:1.1em}.error.svelte-1gdz5lm{color:red}.success.svelte-1gdz5lm{color:#28a745;font-size:1.2em}.warning.svelte-1gdz5lm{color:#856404;background:#fff3cd;border-radius:4px;padding:10px}.map-container.svelte-1gdz5lm{margin-top:30px}

View File

@@ -0,0 +1 @@
.management-grid.svelte-nbog41{grid-template-columns:300px 1fr;gap:30px;display:grid}.course-item.svelte-nbog41{cursor:pointer;border:1px solid #eee;border-radius:4px;margin-bottom:5px;padding:10px}.course-item.selected.svelte-nbog41{background:#e7f1ff;border-color:#007bff}.student-actions.svelte-nbog41{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:15px}.import-box.svelte-nbog41{margin-top:10px;font-size:.9em}table.svelte-nbog41{border-collapse:collapse;width:100%}th.svelte-nbog41,td.svelte-nbog41{text-align:left;border-bottom:1px solid #eee;padding:10px}input.svelte-nbog41{margin-right:5px;padding:6px}

View File

@@ -0,0 +1 @@
.course-selector.svelte-1x3d7ra{border-bottom:1px solid #eee;margin-bottom:20px;padding-bottom:20px}.add-session.svelte-1x3d7ra{background:#f8f9fa;border-radius:8px;margin-bottom:20px;padding:15px}.form-row.svelte-1x3d7ra{gap:10px;display:flex}.sessions-grid.svelte-1x3d7ra{grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:20px;display:grid}.session-block.svelte-1x3d7ra{border:1px solid #ddd;border-radius:8px;overflow:hidden}.session-header.svelte-1x3d7ra{background:#eee;justify-content:space-between;align-items:center;padding:10px;display:flex}.slots-list.svelte-1x3d7ra{padding:10px}.slot-item.svelte-1x3d7ra{border-bottom:1px solid #f0f0f0;justify-content:space-between;padding:5px 0;display:flex}.delete-btn.svelte-1x3d7ra{color:#dc3545;cursor:pointer;background:0 0;border:none;font-weight:700}.modal-overlay.svelte-1x3d7ra{background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal.svelte-1x3d7ra{background:#fff;border-radius:8px;width:400px;padding:30px}.field.svelte-1x3d7ra{margin-bottom:15px}.field.svelte-1x3d7ra label:where(.svelte-1x3d7ra){margin-bottom:5px;display:block}.field.svelte-1x3d7ra input:where(.svelte-1x3d7ra),.field.svelte-1x3d7ra select:where(.svelte-1x3d7ra){width:100%;padding:8px}.modal-actions.svelte-1x3d7ra{justify-content:flex-end;gap:10px;margin-top:20px;display:flex}.primary.svelte-1x3d7ra{color:#fff;background:#007bff;border:none;border-radius:4px;padding:8px 16px}

View File

@@ -0,0 +1 @@
.management-grid.svelte-2e9svb{grid-template-columns:200px 1fr;gap:20px;display:grid}.room-item.svelte-2e9svb{cursor:pointer;border:1px solid #eee;border-radius:4px;margin-bottom:5px;padding:10px}.room-item.selected.svelte-2e9svb{background:#e7f1ff;border-color:#007bff}.editor-header.svelte-2e9svb{justify-content:space-between;align-items:center;margin-bottom:10px;display:flex}.toolbar.svelte-2e9svb button:where(.svelte-2e9svb){margin-right:5px}.save-btn.svelte-2e9svb{color:#fff;background:#28a745;border:none;border-radius:4px;padding:5px 15px}.canvas-container.svelte-2e9svb{gap:20px;display:flex}.properties-panel.svelte-2e9svb{background:#f8f9fa;border-radius:8px;width:200px;padding:15px}.field.svelte-2e9svb{margin-bottom:10px}.field.svelte-2e9svb label:where(.svelte-2e9svb){color:#666;font-size:.8em;display:block}.field.svelte-2e9svb input:where(.svelte-2e9svb){width:100%;padding:4px}.delete-btn.svelte-2e9svb{color:red;width:100%;margin-top:10px}

View File

@@ -0,0 +1 @@
.selectors.svelte-190s2eg{margin-bottom:20px}select.svelte-190s2eg{margin-right:10px;padding:5px}.matrix-container.svelte-190s2eg{overflow-x:auto}table.svelte-190s2eg{border-collapse:collapse;background:#fff;width:100%}th.svelte-190s2eg,td.svelte-190s2eg{text-align:center;border:1px solid #ddd;padding:10px}th.svelte-190s2eg{background:#f8f9fa}.cell.svelte-190s2eg{cursor:pointer;width:60px;height:40px}.cell.svelte-190s2eg:hover{background:#f0f0f0}.cell.present.svelte-190s2eg{color:#155724;background:#d4edda;font-weight:700}

View File

@@ -0,0 +1 @@
.selectors.svelte-1do7mxm{margin-bottom:20px}select.svelte-1do7mxm{margin-right:10px;padding:5px}.notes-container.svelte-1do7mxm{grid-template-columns:1fr 300px;gap:20px;display:grid}.note-editor.svelte-1do7mxm{background:#f8f9fa;border-radius:8px;padding:20px}textarea.svelte-1do7mxm{width:100%;height:100px;margin:10px 0}.primary.svelte-1do7mxm{color:#fff;background:#007bff;border:none;border-radius:4px;padding:8px 16px}.note-item.svelte-1do7mxm{border-bottom:1px solid #ddd;padding:5px 0;font-size:.9em}.note-item.svelte-1do7mxm p:where(.svelte-1do7mxm){margin:5px 0}

View File

@@ -0,0 +1 @@
.export-grid.svelte-128ylb7{grid-template-columns:1fr 1fr;gap:40px;margin-top:20px;display:grid}.export-card.svelte-128ylb7{background:#f8f9fa;border:1px solid #dee2e6;border-radius:8px;margin:15px 0;padding:20px}.btn-group.svelte-128ylb7{gap:10px;display:flex}button.svelte-128ylb7{cursor:pointer;padding:8px 16px}button.small.svelte-128ylb7{padding:4px 8px;font-size:.9em}.session-export-row.svelte-128ylb7{border-bottom:1px solid #eee;justify-content:space-between;align-items:center;padding:8px 0;display:flex}select.svelte-128ylb7{width:100%;margin-bottom:10px;padding:8px}

View File

@@ -0,0 +1 @@
.welcome.svelte-1uha8ag{text-align:center;background:#f8f9fa;border-radius:12px;max-width:600px;margin:100px auto;padding:40px}h1.svelte-1uha8ag{color:#333;margin-bottom:10px;font-size:2.5em}p.svelte-1uha8ag{color:#666;font-size:1.2em}.actions.svelte-1uha8ag{margin-top:40px}.btn.svelte-1uha8ag{color:#fff;background:#007bff;border-radius:6px;padding:12px 30px;font-weight:700;text-decoration:none}.footer.svelte-1uha8ag{color:#888;margin-top:60px;font-size:.9em}

View File

@@ -0,0 +1 @@
.login-container.svelte-1x05zx6{border:1px solid #ccc;border-radius:8px;max-width:400px;margin:100px auto;padding:20px}.field.svelte-1x05zx6{margin-bottom:15px}label.svelte-1x05zx6{margin-bottom:5px;display:block}input.svelte-1x05zx6{box-sizing:border-box;width:100%;padding:8px}.error.svelte-1x05zx6{color:red;margin-bottom:15px}button.svelte-1x05zx6{color:#fff;cursor:pointer;background:#007bff;border:none;border-radius:4px;width:100%;padding:10px}button.svelte-1x05zx6:disabled{background:#ccc}

View File

@@ -0,0 +1 @@
.course-selector.svelte-1jef3w8{margin-bottom:20px}.session-card.svelte-1jef3w8{border:1px solid #ddd;border-radius:8px;margin-bottom:15px;padding:15px}.slot-row.svelte-1jef3w8{border-top:1px solid #eee;justify-content:space-between;align-items:center;padding:10px 0;display:flex}.status-badge.svelte-1jef3w8{text-transform:uppercase;border-radius:12px;margin-right:10px;padding:2px 8px;font-size:.8em}.status-badge.closed.svelte-1jef3w8{color:#fff;background:#6c757d}.status-badge.open.svelte-1jef3w8{color:#fff;background:#28a745}.status-badge.locked.svelte-1jef3w8{color:#000;background:#ffc107}.checkin-code.svelte-1jef3w8{background:#f0f0f0;border-radius:4px;margin-left:10px;padding:2px 5px}.actions.svelte-1jef3w8 button:where(.svelte-1jef3w8){margin-left:5px}

View File

@@ -0,0 +1,43 @@
import { H as escape_html, V as attr, a as ensure_array_like, l as stringify, n as attr_class, r as bind_props } from "./dev.js";
//#region src/lib/RoomCanvas.svelte
function RoomCanvas($$renderer, $$props) {
$$renderer.component(($$renderer) => {
let { elements = [], editable = false, onElementClick, onLayoutChange, selectedId = null, occupiedSeatIds = [], mySeatId = null, studentNames = {} } = $$props;
const GRID_SIZE = 40;
$$renderer.push(`<svg width="800" height="600"${attr_class("room-canvas svelte-1i40qao", void 0, { "editable": editable })}>`);
if (editable) {
$$renderer.push("<!--[0-->");
$$renderer.push(`<defs><pattern id="grid"${attr("width", GRID_SIZE)}${attr("height", GRID_SIZE)} patternUnits="userSpaceOnUse"><path${attr("d", `M ${stringify(GRID_SIZE)} 0 L 0 0 0 ${stringify(GRID_SIZE)}`)} fill="none" stroke="#eee" stroke-width="1"></path></pattern></defs><rect width="100%" height="100%" fill="url(#grid)"></rect>`);
} else $$renderer.push("<!--[-1-->");
$$renderer.push(`<!--]--><!--[-->`);
const each_array = ensure_array_like(elements);
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
let el = each_array[$$index];
$$renderer.push(`<g${attr("transform", `translate(${stringify(el.x * GRID_SIZE)}, ${stringify(el.y * GRID_SIZE)})`)}${attr_class(`element ${stringify(el.type)}`, "svelte-1i40qao", {
"selected": selectedId === el.id,
"occupied": el.type === "seat" && occupiedSeatIds.includes(el.id),
"is-mine": el.id === mySeatId
})}>`);
if (el.type === "seat") {
$$renderer.push("<!--[0-->");
$$renderer.push(`<rect${attr("width", el.width * GRID_SIZE)}${attr("height", el.height * GRID_SIZE)} rx="4" class="svelte-1i40qao"></rect><text${attr("x", el.width * GRID_SIZE / 2)}${attr("y", el.height * GRID_SIZE / 2)} text-anchor="middle" dominant-baseline="middle" class="svelte-1i40qao">${escape_html(el.label)}</text>`);
if (studentNames[el.id]) {
$$renderer.push("<!--[0-->");
$$renderer.push(`<text${attr("x", el.width * GRID_SIZE / 2)}${attr("y", el.height * GRID_SIZE + 15)} text-anchor="middle" class="student-name svelte-1i40qao">${escape_html(studentNames[el.id])}</text>`);
} else $$renderer.push("<!--[-1-->");
$$renderer.push(`<!--]-->`);
} else if (el.type === "table") {
$$renderer.push("<!--[1-->");
$$renderer.push(`<rect${attr("width", el.width * GRID_SIZE)}${attr("height", el.height * GRID_SIZE)} fill="#e9ecef" stroke="#dee2e6" class="svelte-1i40qao"></rect>`);
} else if (el.type === "door") {
$$renderer.push("<!--[2-->");
$$renderer.push(`<rect${attr("width", el.width * GRID_SIZE)}${attr("height", el.height * GRID_SIZE)} fill="#ffeeba" stroke="#ffe082" class="svelte-1i40qao"></rect><text${attr("x", el.width * GRID_SIZE / 2)}${attr("y", el.height * GRID_SIZE / 2)} text-anchor="middle" dominant-baseline="middle" style="font-size: 10px;" class="svelte-1i40qao">DOOR</text>`);
} else $$renderer.push("<!--[-1-->");
$$renderer.push(`<!--]--></g>`);
}
$$renderer.push(`<!--]--></svg>`);
bind_props($$props, { elements });
});
}
//#endregion
export { RoomCanvas as t };

View File

@@ -0,0 +1,138 @@
import { D as get } from "./dev.js";
import "./index-server2.js";
import { t as token } from "./auth.js";
//#region src/lib/api.ts
var BASE = "/api";
async function request(path, init) {
const $token = get(token);
const res = await fetch(BASE + path, {
...init,
headers: {
"Content-Type": "application/json",
...$token ? { Authorization: `Bearer ${$token}` } : {},
...init?.headers
}
});
if (res.status === 401 && false);
if (!res.ok) {
const error = await res.json().catch(() => ({ error: res.statusText }));
throw new Error(error.error || res.statusText);
}
if (res.status === 204) return {};
return res.json();
}
var api = {
auth: { login: (email, password) => request("/auth/login", {
method: "POST",
body: JSON.stringify({
email,
password
})
}) },
admin: {
courses: {
list: () => request("/admin/courses"),
create: (name, semester) => request("/admin/courses", {
method: "POST",
body: JSON.stringify({
name,
semester
})
}),
listStudents: (course_id) => request(`/admin/courses/${course_id}/students`),
addStudent: (course_id, name) => request(`/admin/courses/${course_id}/students`, {
method: "POST",
body: JSON.stringify({ name })
}),
importStudents: (course_id, file) => {
const formData = new FormData();
formData.append("file", file);
return fetch(`${BASE}/admin/courses/${course_id}/students/import`, {
method: "POST",
headers: { "Authorization": `Bearer ${get(token)}` },
body: formData
}).then((res) => res.json());
}
},
students: {
delete: (id) => request(`/admin/students/${id}`, { method: "DELETE" }),
getAttendance: (id) => request(`/admin/students/${id}/attendance`),
getNotes: (id) => request(`/admin/students/${id}/notes`)
},
rooms: {
list: () => request("/admin/rooms"),
create: (name, layout) => request("/admin/rooms", {
method: "POST",
body: JSON.stringify({
name,
layout
})
}),
get: (id) => request(`/admin/rooms/${id}`),
updateLayout: (id, layout) => request(`/admin/rooms/${id}/layout`, {
method: "PUT",
body: JSON.stringify(layout)
})
},
sessions: {
list: (course_id) => request(`/admin/sessions?course_id=${course_id}`),
create: (course_id, week_nr, date) => request("/admin/sessions", {
method: "POST",
body: JSON.stringify({
course_id,
week_nr,
date
})
}),
getAttendance: (id) => request(`/admin/sessions/${id}/attendance`)
},
slots: {
create: (session_id, tutor_id, start_time, end_time, room_id) => request("/admin/slots", {
method: "POST",
body: JSON.stringify({
session_id,
tutor_id,
start_time,
end_time,
room_id
})
}),
updateStatus: (id, status) => request(`/admin/slots/${id}/status`, {
method: "PATCH",
body: JSON.stringify({ status })
}),
delete: (id) => request(`/admin/slots/${id}`, { method: "DELETE" }),
addAttendance: (id, student_id) => request(`/admin/slots/${id}/attendance`, {
method: "POST",
body: JSON.stringify({ student_id })
}),
deleteAttendance: (slot_id, student_id) => request(`/admin/slots/${slot_id}/attendance/${student_id}`, { method: "DELETE" }),
getNotes: (id) => request(`/admin/slots/${id}/notes`),
upsertNote: (slot_id, student_id, content) => request(`/admin/slots/${slot_id}/notes/${student_id}`, {
method: "PUT",
body: JSON.stringify({ content })
})
},
export: {
sessionCsv: (id) => `${BASE}/admin/export/session/${id}/csv`,
sessionMd: (id) => `${BASE}/admin/export/session/${id}/md`,
courseCsv: (id) => `${BASE}/admin/export/course/${id}/csv`,
courseMd: (id) => `${BASE}/admin/export/course/${id}/md`,
backup: () => `${BASE}/admin/backup`
}
},
checkin: {
getInfo: (code) => request(`/api/checkin/${code}`),
getStudents: (code) => request(`/api/checkin/${code}/students`),
post: (code, student_id, seat_id) => request("/api/checkin", {
method: "POST",
body: JSON.stringify({
code,
student_id,
seat_id
})
})
}
};
//#endregion
export { api as t };

View File

@@ -0,0 +1,6 @@
import { k as writable } from "./dev.js";
import "./index-server2.js";
//#region src/lib/auth.ts
var token = writable(null);
//#endregion
export { token as t };

File diff suppressed because it is too large Load Diff

View File

@@ -950,6 +950,18 @@ function writable(value, start = noop) {
subscribe
};
}
/**
* Get the current value from a store by subscribing and immediately unsubscribing.
*
* @template T
* @param {Readable<T>} store
* @returns {T}
*/
function get$1(store) {
let value;
subscribe_to_store(store, (_) => value = _)();
return value;
}
//#endregion
//#region node_modules/svelte/src/internal/client/reactivity/store.js
/**
@@ -3099,6 +3111,25 @@ function untrack(fn) {
}
}
//#endregion
//#region node_modules/svelte/src/store/utils.js
/** @import { Readable } from './public' */
/**
* @template T
* @param {Readable<T> | null | undefined} store
* @param {(value: T) => void} run
* @param {(value: T) => void} [invalidate]
* @returns {() => void}
*/
function subscribe_to_store(store, run, invalidate) {
if (store == null) {
run(void 0);
if (invalidate) invalidate(void 0);
return noop;
}
const unsub = untrack(() => store.subscribe(run, invalidate));
return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;
}
//#endregion
//#region node_modules/svelte/src/utils.js
/**
* Attributes that are boolean, i.e. they are present or not present.
@@ -3209,6 +3240,49 @@ function attributes(attrs, css_hash, classes, styles, flags = 0) {
return attr_str;
}
/**
* @param {unknown} value
* @returns {string}
*/
function stringify(value) {
return typeof value === "string" ? value : value == null ? "" : value + "";
}
/**
* @param {any} value
* @param {string | undefined} [hash]
* @param {Record<string, boolean>} [directives]
*/
function attr_class(value, hash, directives) {
var result = to_class(value, hash, directives);
return result ? ` class="${escape_html(result, true)}"` : "";
}
/**
* @template V
* @param {Record<string, [any, any, any]>} store_values
* @param {string} store_name
* @param {Store<V> | null | undefined} store
* @returns {V}
*/
function store_get(store_values, store_name, store) {
if (store_name in store_values && store_values[store_name][0] === store) return store_values[store_name][2];
store_values[store_name]?.[1]();
store_values[store_name] = [
store,
null,
void 0
];
const unsub = subscribe_to_store(
store,
/** @param {any} v */
(v) => store_values[store_name][2] = v
);
store_values[store_name][1] = unsub;
return store_values[store_name][2];
}
/** @param {Record<string, [any, any, any]>} store_values */
function unsubscribe_stores(store_values) {
for (const store_name of Object.keys(store_values)) store_values[store_name][1]();
}
/**
* @param {Renderer} renderer
* @param {Record<string, any>} $$props
* @param {string} name
@@ -3223,6 +3297,24 @@ function slot(renderer, $$props, name, slot_props, fallback_fn) {
else fallback_fn?.();
}
/**
* Legacy mode: If the prop has a fallback and is bound in the
* parent component, propagate the fallback value upwards.
* @param {Record<string, unknown>} props_parent
* @param {Record<string, unknown>} props_now
*/
function bind_props(props_parent, props_now) {
for (const key of Object.keys(props_now)) {
const initial_value = props_parent[key];
const value = props_now[key];
if (initial_value === void 0 && value !== void 0 && Object.getOwnPropertyDescriptor(props_parent, key)?.set) props_parent[key] = value;
}
}
/** @param {any} array_like_or_iterator */
function ensure_array_like(array_like_or_iterator) {
if (array_like_or_iterator) return array_like_or_iterator.length !== void 0 ? array_like_or_iterator : Array.from(array_like_or_iterator);
return [];
}
/**
* @template V
* @param {() => V} get_value
*/
@@ -3960,4 +4052,4 @@ function get_user_code_location() {
return get_stack().filter((line) => line.trim().startsWith("at ")).map((line) => line.replace(/\((.*):\d+:\d+\)$/, (_, file) => `(${file})`)).join("\n");
}
//#endregion
export { lifecycle_function_unavailable as $, hydration_mismatch as A, STATE_SYMBOL as B, component_context as C, hydrating as D, hydrate_node as E, HYDRATION_ERROR as F, createContext as G, define_property as H, get_render_context as I, hasContext as J, getAllContexts as K, async_mode_flag as L, state_proxy_unmount as M, hydration_failed as N, set_hydrate_node as O, escape_html as P, hydratable_serialization_failed as Q, getAbortSignal as R, writable as S, push as T, noop as U, array_from as V, run as W, ssr_context as X, setContext as Y, hydratable_clobbering as Z, mutable_source as _, is_passive_event as a, flushSync as b, get as c, component_root as d, experimental_async_required as et, clear_text_content as f, init_operations as g, get_next_sibling as h, slot as i, lifecycle_double_unmount as j, set_hydrating as k, set_active_effect as l, get_first_child as m, derived as n, active_effect as o, create_text as p, getContext as q, render as r, active_reaction as s, get_user_code_location as t, set_active_reaction as u, set as v, pop as w, readable as x, boundary as y, LEGACY_PROPS as z };
export { createContext as $, component_context as A, hydration_failed as B, mutable_source as C, get$1 as D, flushSync as E, set_hydrate_node as F, async_mode_flag as G, escape_html as H, set_hydrating as I, STATE_SYMBOL as J, getAbortSignal as K, hydration_mismatch as L, push as M, hydrate_node as N, readable as O, hydrating as P, run as Q, lifecycle_double_unmount as R, init_operations as S, boundary as T, HYDRATION_ERROR as U, attr as V, get_render_context as W, define_property as X, array_from as Y, noop as Z, component_root as _, ensure_array_like as a, hydratable_clobbering as at, get_first_child as b, store_get as c, experimental_async_required as ct, is_passive_event as d, getAllContexts as et, active_effect as f, set_active_reaction as g, set_active_effect as h, derived as i, ssr_context as it, pop as j, writable as k, stringify as l, get as m, attr_class as n, hasContext as nt, render as o, hydratable_serialization_failed as ot, active_reaction as p, LEGACY_PROPS as q, bind_props as r, setContext as rt, slot as s, lifecycle_function_unavailable as st, get_user_code_location as t, getContext as tt, unsubscribe_stores as u, clear_text_content as v, set as w, get_next_sibling as x, create_text as y, state_proxy_unmount as z };

View File

@@ -1,17 +1,3 @@
import { $ as lifecycle_function_unavailable, G as createContext, I as get_render_context, J as hasContext, K as getAllContexts, L as async_mode_flag, Q as hydratable_serialization_failed, R as getAbortSignal, U as noop, W as run, X as ssr_context, Y as setContext, et as experimental_async_required, q as getContext } from "./dev.js";
import * as devalue from "devalue";
//#region \0rolldown/runtime.js
var __defProp = Object.defineProperty;
var __exportAll = (all, no_symbols) => {
let target = {};
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
return target;
};
//#endregion
//#region node_modules/@sveltejs/kit/src/runtime/app/paths/internal/server.js
var base = "";
var assets = base;
@@ -50,142 +36,12 @@ function set_public_env(environment) {
public_env = environment;
}
//#endregion
//#region node_modules/svelte/src/internal/server/hydratable.js
/** @import { HydratableLookupEntry } from '#server' */
/**
* @template T
* @param {string} key
* @param {() => T} fn
* @returns {T}
*/
function hydratable(key, fn) {
if (!async_mode_flag) experimental_async_required("hydratable");
const { hydratable } = get_render_context();
let entry = hydratable.lookup.get(key);
if (entry !== void 0) return entry.value;
const value = fn();
entry = encode(key, value, hydratable.unresolved_promises);
hydratable.lookup.set(key, entry);
return value;
}
/**
* @param {string} key
* @param {any} value
* @param {Map<Promise<any>, string>} [unresolved]
*/
function encode(key, value, unresolved) {
/** @type {HydratableLookupEntry} */
const entry = {
value,
serialized: ""
};
let uid = 1;
entry.serialized = devalue.uneval(entry.value, (value, uneval) => {
if (is_promise(value)) {
const placeholder = `"${uid++}"`;
const p = value.then((v) => {
entry.serialized = entry.serialized.replace(placeholder, `r(${uneval(v)})`);
}).catch((devalue_error) => hydratable_serialization_failed(key, serialization_stack(entry.stack, devalue_error?.stack)));
unresolved?.set(p, key);
p.catch(() => {}).finally(() => unresolved?.delete(p));
(entry.promises ??= []).push(p);
return placeholder;
}
});
return entry;
}
/**
* @param {any} value
* @returns {value is Promise<any>}
*/
function is_promise(value) {
return Object.prototype.toString.call(value) === "[object Promise]";
}
/**
* @param {string | undefined} root_stack
* @param {string | undefined} uneval_stack
*/
function serialization_stack(root_stack, uneval_stack) {
let out = "";
if (root_stack) out += root_stack + "\n";
if (uneval_stack) out += "Caused by:\n" + uneval_stack + "\n";
return out || "<missing stack trace>";
}
//#endregion
//#region node_modules/svelte/src/internal/server/blocks/snippet.js
/** @import { Snippet } from 'svelte' */
/** @import { Renderer } from '../renderer' */
/** @import { Getters } from '#shared' */
/**
* Create a snippet programmatically
* @template {unknown[]} Params
* @param {(...params: Getters<Params>) => {
* render: () => string
* setup?: (element: Element) => void | (() => void)
* }} fn
* @returns {Snippet<Params>}
*/
function createRawSnippet(fn) {
return (renderer, ...args) => {
var getters = args.map((value) => () => value);
renderer.push(fn(...getters).render().trim());
};
}
//#endregion
//#region node_modules/svelte/src/index-server.js
/** @import { SSRContext } from '#server' */
/** @import { Renderer } from './internal/server/renderer.js' */
var index_server_exports = /* @__PURE__ */ __exportAll({
afterUpdate: () => noop,
beforeUpdate: () => noop,
createContext: () => createContext,
createEventDispatcher: () => createEventDispatcher,
createRawSnippet: () => createRawSnippet,
flushSync: () => noop,
fork: () => fork,
getAbortSignal: () => getAbortSignal,
getAllContexts: () => getAllContexts,
getContext: () => getContext,
hasContext: () => hasContext,
hydratable: () => hydratable,
hydrate: () => hydrate,
mount: () => mount,
onDestroy: () => onDestroy,
onMount: () => noop,
setContext: () => setContext,
settled: () => settled,
tick: () => tick,
unmount: () => unmount,
untrack: () => run
});
/** @param {() => void} fn */
function onDestroy(fn) {
/** @type {Renderer} */ ssr_context.r.on_destroy(fn);
}
function createEventDispatcher() {
return noop;
}
function mount() {
lifecycle_function_unavailable("mount");
}
function hydrate() {
lifecycle_function_unavailable("hydrate");
}
function unmount() {
lifecycle_function_unavailable("unmount");
}
function fork() {
lifecycle_function_unavailable("fork");
}
async function tick() {}
async function settled() {}
//#endregion
//#region \0virtual:__sveltekit/environment
var version = "1777346172513";
var version = "1777346369869";
var prerendering = false;
function set_building() {}
function set_prerendering() {
prerendering = true;
}
//#endregion
export { set_assets as _, index_server_exports as a, fix_stack_trace as c, set_public_env as d, app_dir as f, reset as g, override as h, version as i, public_env as l, base as m, set_building as n, tick as o, assets as p, set_prerendering as r, hydratable as s, prerendering as t, set_private_env as u };
export { fix_stack_trace as a, set_public_env as c, base as d, override as f, version as i, app_dir as l, set_assets as m, set_building as n, public_env as o, reset as p, set_prerendering as r, set_private_env as s, prerendering as t, assets as u };

View File

@@ -1,4 +1,3 @@
import "./dev.js";
//#region node_modules/@sveltejs/kit/src/utils/array.js
/**
* Removes nullish values from an array.
@@ -367,4 +366,4 @@ var validate_layout_server_exports = validator(valid_layout_server_exports);
var validate_page_server_exports = validator(valid_page_server_exports);
var validate_server_exports = validator(valid_server_exports);
//#endregion
export { has_data_suffix as _, validate_server_exports as a, strip_resolution_suffix as b, SCHEME as c, make_trackable as d, normalize_path as f, add_resolution_suffix as g, add_data_suffix as h, validate_page_server_exports as i, decode_pathname as l, noop_span as m, validate_layout_server_exports as n, find_route as o, resolve as p, validate_page_exports as r, hash as s, validate_layout_exports as t, disable_search as u, has_resolution_suffix as v, compact as x, strip_data_suffix as y };
export { compact as S, add_resolution_suffix as _, validate_server_exports as a, strip_data_suffix as b, SCHEME as c, disable_search as d, make_trackable as f, add_data_suffix as g, noop_span as h, validate_page_server_exports as i, decode_params as l, resolve as m, validate_layout_server_exports as n, find_route as o, normalize_path as p, validate_page_exports as r, hash as s, validate_layout_exports as t, decode_pathname as u, has_data_suffix as v, strip_resolution_suffix as x, has_resolution_suffix as y };

View File

@@ -0,0 +1,145 @@
import { $ as createContext, G as async_mode_flag, K as getAbortSignal, Q as run, W as get_render_context, Z as noop, ct as experimental_async_required, et as getAllContexts, it as ssr_context, nt as hasContext, ot as hydratable_serialization_failed, rt as setContext, st as lifecycle_function_unavailable, tt as getContext } from "./dev.js";
import * as devalue from "devalue";
//#region \0rolldown/runtime.js
var __defProp = Object.defineProperty;
var __exportAll = (all, no_symbols) => {
let target = {};
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
return target;
};
//#endregion
//#region node_modules/svelte/src/internal/server/hydratable.js
/** @import { HydratableLookupEntry } from '#server' */
/**
* @template T
* @param {string} key
* @param {() => T} fn
* @returns {T}
*/
function hydratable(key, fn) {
if (!async_mode_flag) experimental_async_required("hydratable");
const { hydratable } = get_render_context();
let entry = hydratable.lookup.get(key);
if (entry !== void 0) return entry.value;
const value = fn();
entry = encode(key, value, hydratable.unresolved_promises);
hydratable.lookup.set(key, entry);
return value;
}
/**
* @param {string} key
* @param {any} value
* @param {Map<Promise<any>, string>} [unresolved]
*/
function encode(key, value, unresolved) {
/** @type {HydratableLookupEntry} */
const entry = {
value,
serialized: ""
};
let uid = 1;
entry.serialized = devalue.uneval(entry.value, (value, uneval) => {
if (is_promise(value)) {
const placeholder = `"${uid++}"`;
const p = value.then((v) => {
entry.serialized = entry.serialized.replace(placeholder, `r(${uneval(v)})`);
}).catch((devalue_error) => hydratable_serialization_failed(key, serialization_stack(entry.stack, devalue_error?.stack)));
unresolved?.set(p, key);
p.catch(() => {}).finally(() => unresolved?.delete(p));
(entry.promises ??= []).push(p);
return placeholder;
}
});
return entry;
}
/**
* @param {any} value
* @returns {value is Promise<any>}
*/
function is_promise(value) {
return Object.prototype.toString.call(value) === "[object Promise]";
}
/**
* @param {string | undefined} root_stack
* @param {string | undefined} uneval_stack
*/
function serialization_stack(root_stack, uneval_stack) {
let out = "";
if (root_stack) out += root_stack + "\n";
if (uneval_stack) out += "Caused by:\n" + uneval_stack + "\n";
return out || "<missing stack trace>";
}
//#endregion
//#region node_modules/svelte/src/internal/server/blocks/snippet.js
/** @import { Snippet } from 'svelte' */
/** @import { Renderer } from '../renderer' */
/** @import { Getters } from '#shared' */
/**
* Create a snippet programmatically
* @template {unknown[]} Params
* @param {(...params: Getters<Params>) => {
* render: () => string
* setup?: (element: Element) => void | (() => void)
* }} fn
* @returns {Snippet<Params>}
*/
function createRawSnippet(fn) {
return (renderer, ...args) => {
var getters = args.map((value) => () => value);
renderer.push(fn(...getters).render().trim());
};
}
//#endregion
//#region node_modules/svelte/src/index-server.js
/** @import { SSRContext } from '#server' */
/** @import { Renderer } from './internal/server/renderer.js' */
var index_server_exports = /* @__PURE__ */ __exportAll({
afterUpdate: () => noop,
beforeUpdate: () => noop,
createContext: () => createContext,
createEventDispatcher: () => createEventDispatcher,
createRawSnippet: () => createRawSnippet,
flushSync: () => noop,
fork: () => fork,
getAbortSignal: () => getAbortSignal,
getAllContexts: () => getAllContexts,
getContext: () => getContext,
hasContext: () => hasContext,
hydratable: () => hydratable,
hydrate: () => hydrate,
mount: () => mount,
onDestroy: () => onDestroy,
onMount: () => noop,
setContext: () => setContext,
settled: () => settled,
tick: () => tick,
unmount: () => unmount,
untrack: () => run
});
/** @param {() => void} fn */
function onDestroy(fn) {
/** @type {Renderer} */ ssr_context.r.on_destroy(fn);
}
function createEventDispatcher() {
return noop;
}
function mount() {
lifecycle_function_unavailable("mount");
}
function hydrate() {
lifecycle_function_unavailable("hydrate");
}
function unmount() {
lifecycle_function_unavailable("unmount");
}
function fork() {
lifecycle_function_unavailable("fork");
}
async function tick() {}
async function settled() {}
//#endregion
export { hydratable as i, settled as n, tick as r, index_server_exports as t };

View File

@@ -0,0 +1,2 @@
import "./dev.js";
export {};

View File

@@ -1,5 +1,6 @@
import "./index-server.js";
import "./environment.js";
import { A as hydration_mismatch, C as component_context, D as hydrating, E as hydrate_node, F as HYDRATION_ERROR, H as define_property, L as async_mode_flag, N as hydration_failed, O as set_hydrate_node, T as push, V as array_from, Y as setContext, _ as mutable_source, a as is_passive_event, b as flushSync, c as get, d as component_root, f as clear_text_content, g as init_operations, h as get_next_sibling, k as set_hydrating, l as set_active_effect, m as get_first_child, n as derived, o as active_effect, p as create_text, r as render, s as active_reaction, u as set_active_reaction, v as set, w as pop, y as boundary, z as LEGACY_PROPS } from "./dev.js";
import { A as component_context, B as hydration_failed, C as mutable_source, E as flushSync, F as set_hydrate_node, G as async_mode_flag, I as set_hydrating, L as hydration_mismatch, M as push, N as hydrate_node, P as hydrating, S as init_operations, T as boundary, U as HYDRATION_ERROR, X as define_property, Y as array_from, _ as component_root, b as get_first_child, d as is_passive_event, f as active_effect, g as set_active_reaction, h as set_active_effect, i as derived, j as pop, m as get, o as render, p as active_reaction, q as LEGACY_PROPS, rt as setContext, v as clear_text_content, w as set, x as get_next_sibling, y as create_text } from "./dev.js";
//#region \0virtual:__sveltekit/server
var read_implementation = null;
function set_read_implementation(fn) {
@@ -477,10 +478,10 @@ value: (onfulfilled, onrejected) => {
//#region .svelte-kit/generated/root.svelte
function Root($$renderer, $$props) {
$$renderer.component(($$renderer) => {
let { stores, page, constructors, components = [], form, data_0 = null, data_1 = null } = $$props;
let { stores, page, constructors, components = [], form, data_0 = null, data_1 = null, data_2 = null } = $$props;
setContext("__svelte__", stores);
stores.page.set(page);
const Pyramid_1 = derived(() => constructors[1]);
const Pyramid_2 = derived(() => constructors[2]);
if (constructors[1]) {
$$renderer.push("<!--[0-->");
const Pyramid_0 = constructors[0];
@@ -491,18 +492,53 @@ function Root($$renderer, $$props) {
form,
params: page.params,
children: ($$renderer) => {
if (Pyramid_1()) {
$$renderer.push("<!--[-->");
Pyramid_1()($$renderer, {
data: data_1,
form,
params: page.params
});
$$renderer.push("<!--]-->");
if (constructors[2]) {
$$renderer.push("<!--[0-->");
const Pyramid_1 = constructors[1];
if (Pyramid_1) {
$$renderer.push("<!--[-->");
Pyramid_1($$renderer, {
data: data_1,
form,
params: page.params,
children: ($$renderer) => {
if (Pyramid_2()) {
$$renderer.push("<!--[-->");
Pyramid_2()($$renderer, {
data: data_2,
form,
params: page.params
});
$$renderer.push("<!--]-->");
} else {
$$renderer.push("<!--[!-->");
$$renderer.push("<!--]-->");
}
},
$$slots: { default: true }
});
$$renderer.push("<!--]-->");
} else {
$$renderer.push("<!--[!-->");
$$renderer.push("<!--]-->");
}
} else {
$$renderer.push("<!--[!-->");
$$renderer.push("<!--]-->");
$$renderer.push("<!--[-1-->");
const Pyramid_1 = constructors[1];
if (Pyramid_1) {
$$renderer.push("<!--[-->");
Pyramid_1($$renderer, {
data: data_1,
form,
params: page.params
});
$$renderer.push("<!--]-->");
} else {
$$renderer.push("<!--[!-->");
$$renderer.push("<!--]-->");
}
}
$$renderer.push(`<!--]-->`);
},
$$slots: { default: true }
});
@@ -564,7 +600,7 @@ var options = {
app: ({ head, body, assets, nonce, env }) => "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"" + assets + "/favicon.png\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n " + head + "\n </head>\n <body data-sveltekit-preload-data=\"hover\">\n <div style=\"display: contents\">" + body + "</div>\n </body>\n</html>\n",
error: ({ status, message }) => "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>" + message + "</title>\n\n <style>\n body {\n --bg: white;\n --fg: #222;\n --divider: #ccc;\n background: var(--bg);\n color: var(--fg);\n font-family:\n system-ui,\n -apple-system,\n BlinkMacSystemFont,\n 'Segoe UI',\n Roboto,\n Oxygen,\n Ubuntu,\n Cantarell,\n 'Open Sans',\n 'Helvetica Neue',\n sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100vh;\n margin: 0;\n }\n\n .error {\n display: flex;\n align-items: center;\n max-width: 32rem;\n margin: 0 1rem;\n }\n\n .status {\n font-weight: 200;\n font-size: 3rem;\n line-height: 1;\n position: relative;\n top: -0.05rem;\n }\n\n .message {\n border-left: 1px solid var(--divider);\n padding: 0 0 0 1rem;\n margin: 0 0 0 1rem;\n min-height: 2.5rem;\n display: flex;\n align-items: center;\n }\n\n .message h1 {\n font-weight: 400;\n font-size: 1em;\n margin: 0;\n }\n\n @media (prefers-color-scheme: dark) {\n body {\n --bg: #222;\n --fg: #ddd;\n --divider: #666;\n }\n }\n </style>\n </head>\n <body>\n <div class=\"error\">\n <span class=\"status\">" + status + "</span>\n <div class=\"message\">\n <h1>" + message + "</h1>\n </div>\n </div>\n </body>\n</html>\n"
},
version_hash: "4xp95d"
version_hash: "eq7x7d"
};
async function get_hooks() {
let handle;

View File

@@ -0,0 +1,2 @@
import "./client.js";
export {};

View File

@@ -1,4 +1,4 @@
import { s as hydratable } from "./environment.js";
import { i as hydratable } from "./index-server.js";
import { HttpError, SvelteKitError } from "@sveltejs/kit/internal";
import * as devalue from "devalue";
//#region node_modules/@sveltejs/kit/src/utils/functions.js
@@ -293,4 +293,4 @@ function unfriendly_hydratable(key, fn) {
return hydratable(key, fn);
}
//#endregion
export { text_decoder as _, split_remote_key as a, once as b, unfriendly_hydratable as c, coalesce_to_error as d, get_message as f, get_relative_path as g, base64_encode as h, parse_remote_arg as i, validate_depends as l, normalize_error as m, TRAILING_SLASH_PARAM as n, stringify as o, get_status as p, create_remote_key as r, stringify_remote_arg as s, INVALIDATED_PARAM as t, validate_load_response as u, text_encoder as v, noop as y };
export { get_relative_path as _, split_remote_key as a, noop as b, unfriendly_hydratable as c, coalesce_to_error as d, get_message as f, base64_encode as g, base64_decode as h, parse_remote_arg as i, validate_depends as l, normalize_error as m, TRAILING_SLASH_PARAM as n, stringify as o, get_status as p, create_remote_key as r, stringify_remote_arg as s, INVALIDATED_PARAM as t, validate_load_response as u, text_decoder as v, once as x, text_encoder as y };

View File

@@ -1,5 +1,5 @@
import { d as coalesce_to_error, f as get_message, p as get_status, v as text_decoder } from "./shared.js";
import "./environment.js";
import { _ as text_decoder, d as coalesce_to_error, f as get_message, p as get_status } from "./shared.js";
import { json, text } from "@sveltejs/kit";
import { HttpError, SvelteKitError } from "@sveltejs/kit/internal";
import { with_request_store } from "@sveltejs/kit/internal/server";

Some files were not shown because too many files have changed in this diff Show More