diff --git a/.svelte-kit/generated/client/app.js b/.svelte-kit/generated/client/app.js
index 388e12c1..ae6c9a8e 100644
--- a/.svelte-kit/generated/client/app.js
+++ b/.svelte-kit/generated/client/app.js
@@ -5,15 +5,18 @@ export const nodes = [
() => import('./nodes/1'),
() => import('./nodes/2'),
() => import('./nodes/3'),
- () => import('./nodes/4')
+ () => import('./nodes/4'),
+ () => import('./nodes/5'),
+ () => import('./nodes/6')
];
export const server_loads = [0];
export const dictionary = {
- "/": [2],
- "/login": [~4],
- "/logout": [~3]
+ "/": [3],
+ "/login": [~6],
+ "/logout": [~4],
+ "/[site]": [~5,[2]]
};
export const hooks = {
diff --git a/.svelte-kit/generated/client/nodes/2.js b/.svelte-kit/generated/client/nodes/2.js
index 1cb4f855..f46b371c 100644
--- a/.svelte-kit/generated/client/nodes/2.js
+++ b/.svelte-kit/generated/client/nodes/2.js
@@ -1 +1 @@
-export { default as component } from "../../../../src/routes/+page.svelte";
\ No newline at end of file
+export { default as component } from "../../../../src/routes/[site]/+layout.svelte";
\ No newline at end of file
diff --git a/.svelte-kit/generated/client/nodes/3.js b/.svelte-kit/generated/client/nodes/3.js
index 2a513383..1cb4f855 100644
--- a/.svelte-kit/generated/client/nodes/3.js
+++ b/.svelte-kit/generated/client/nodes/3.js
@@ -1 +1 @@
-export { default as component } from "../../../../src/routes/logout/+page.svelte";
\ No newline at end of file
+export { default as component } from "../../../../src/routes/+page.svelte";
\ No newline at end of file
diff --git a/.svelte-kit/generated/client/nodes/4.js b/.svelte-kit/generated/client/nodes/4.js
index f2b26cd1..2a513383 100644
--- a/.svelte-kit/generated/client/nodes/4.js
+++ b/.svelte-kit/generated/client/nodes/4.js
@@ -1 +1 @@
-export { default as component } from "../../../../src/routes/login/+page.svelte";
\ No newline at end of file
+export { default as component } from "../../../../src/routes/logout/+page.svelte";
\ No newline at end of file
diff --git a/.svelte-kit/generated/client/nodes/5.js b/.svelte-kit/generated/client/nodes/5.js
new file mode 100644
index 00000000..0f681549
--- /dev/null
+++ b/.svelte-kit/generated/client/nodes/5.js
@@ -0,0 +1 @@
+export { default as component } from "../../../../src/routes/[site]/+page.svelte";
\ No newline at end of file
diff --git a/.svelte-kit/generated/client/nodes/6.js b/.svelte-kit/generated/client/nodes/6.js
new file mode 100644
index 00000000..f2b26cd1
--- /dev/null
+++ b/.svelte-kit/generated/client/nodes/6.js
@@ -0,0 +1 @@
+export { default as component } from "../../../../src/routes/login/+page.svelte";
\ No newline at end of file
diff --git a/.svelte-kit/generated/root.svelte b/.svelte-kit/generated/root.svelte
index 07951838..1c16fc86 100644
--- a/.svelte-kit/generated/root.svelte
+++ b/.svelte-kit/generated/root.svelte
@@ -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])
{#if constructors[1]}
{@const Pyramid_0 = constructors[0]}
-
-
+ {#if constructors[2]}
+ {@const Pyramid_1 = constructors[1]}
+
+
+
+
+
+
+ {:else}
+ {@const Pyramid_1 = constructors[1]}
+
+
+
+ {/if}
{:else}
diff --git a/.svelte-kit/generated/server/internal.js b/.svelte-kit/generated/server/internal.js
index 031b38e3..36036e79 100644
--- a/.svelte-kit/generated/server/internal.js
+++ b/.svelte-kit/generated/server/internal.js
@@ -24,7 +24,7 @@ export const options = {
app: ({ head, body, assets, nonce, env }) => "\n\n
\n \n \n \n " + head + "\n \n \n " + body + "
\n \n\n",
error: ({ status, message }) => "\n\n\t\n\t\t\n\t\t" + message + "\n\n\t\t\n\t\n\t\n\t\t\n\t\t\t
" + status + "\n\t\t\t
\n\t\t\t\t
" + message + "
\n\t\t\t\n\t\t
\n\t\n\n"
},
- version_hash: "k1vc61"
+ version_hash: "1jm6xni"
};
export async function get_hooks() {
diff --git a/.svelte-kit/non-ambient.d.ts b/.svelte-kit/non-ambient.d.ts
index d56ff625..7f6a1cb6 100644
--- a/.svelte-kit/non-ambient.d.ts
+++ b/.svelte-kit/non-ambient.d.ts
@@ -27,18 +27,19 @@ export {};
declare module "$app/types" {
export interface AppTypes {
- RouteId(): "/" | "/api" | "/api/darkmode" | "/login" | "/logout";
+ RouteId(): "/" | "/api" | "/api/darkmode" | "/login" | "/logout" | "/[site]";
RouteParams(): {
-
+ "/[site]": { site: string }
};
LayoutParams(): {
- "/": Record;
+ "/": { site?: string };
"/api": Record;
"/api/darkmode": Record;
"/login": Record;
- "/logout": Record
+ "/logout": Record;
+ "/[site]": { site: string }
};
- Pathname(): "/" | "/api/darkmode" | "/login" | "/logout";
+ Pathname(): "/" | "/api/darkmode" | "/login" | "/logout" | `/${string}` & {};
ResolvedPathname(): `${"" | `/${string}`}${ReturnType}`;
Asset(): string & {};
}
diff --git a/.svelte-kit/types/route_meta_data.json b/.svelte-kit/types/route_meta_data.json
index 71a3acc7..43dfcff7 100644
--- a/.svelte-kit/types/route_meta_data.json
+++ b/.svelte-kit/types/route_meta_data.json
@@ -13,5 +13,10 @@
"/logout": [
"src/routes/logout/+page.server.ts",
"src/routes/+layout.server.ts"
+ ],
+ "/[site]": [
+ "src/routes/[site]/+page.server.ts",
+ "src/routes/+layout.server.ts",
+ "src/routes/+layout.server.ts"
]
}
\ No newline at end of file
diff --git a/.svelte-kit/types/src/routes/$types.d.ts b/.svelte-kit/types/src/routes/$types.d.ts
index 51b87c19..88171839 100644
--- a/.svelte-kit/types/src/routes/$types.d.ts
+++ b/.svelte-kit/types/src/routes/$types.d.ts
@@ -12,8 +12,8 @@ type EnsureDefined = T extends null | undefined ? {} : T;
type OptionalUnion, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude]?: never } & U : never;
export type Snapshot = Kit.Snapshot;
type PageParentData = EnsureDefined;
-type LayoutRouteId = RouteId | "/" | "/logout" | "/login" | null
-type LayoutParams = RouteParams & { }
+type LayoutRouteId = RouteId | "/" | "/logout" | "/[site]" | "/login" | null
+type LayoutParams = RouteParams & { site?: string }
type LayoutServerParentData = EnsureDefined<{}>;
type LayoutParentData = EnsureDefined<{}>;
diff --git a/.svelte-kit/types/src/routes/[site]/$types.d.ts b/.svelte-kit/types/src/routes/[site]/$types.d.ts
new file mode 100644
index 00000000..b2cc3e6d
--- /dev/null
+++ b/.svelte-kit/types/src/routes/[site]/$types.d.ts
@@ -0,0 +1,32 @@
+import type * as Kit from '@sveltejs/kit';
+
+type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never;
+// @ts-ignore
+type MatcherParam = M extends (param : string) => param is infer U ? U extends string ? U : string : string;
+type RouteParams = { site: string };
+type RouteId = '/[site]';
+type MaybeWithVoid = {} extends T ? T | void : T;
+export type RequiredKeys = { [K in keyof T]-?: {} extends { [P in K]: T[K] } ? never : K; }[keyof T];
+type OutputDataShape = MaybeWithVoid> & Partial> & Record>
+type EnsureDefined = T extends null | undefined ? {} : T;
+type OptionalUnion, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude]?: never } & U : never;
+export type Snapshot = Kit.Snapshot;
+type PageServerParentData = Omit, keyof LayoutServerData> & EnsureDefined;
+type PageParentData = Omit, keyof LayoutData> & EnsureDefined;
+type LayoutRouteId = RouteId | "/[site]"
+type LayoutParams = RouteParams & { site?: string }
+type LayoutParentData = EnsureDefined;
+
+export type EntryGenerator = () => Promise> | Array;
+export type PageServerLoad = OutputDataShape> = Kit.ServerLoad;
+export type PageServerLoadEvent = Parameters[0];
+export type ActionData = unknown;
+export type PageServerData = Expand>>>>>;
+export type PageData = Expand & EnsureDefined>;
+export type Action | void = Record | void> = Kit.Action
+export type Actions | void = Record | void> = Kit.Actions
+export type PageProps = { params: RouteParams; data: PageData; form: ActionData }
+export type LayoutServerData = null;
+export type LayoutData = Expand;
+export type LayoutProps = { params: LayoutParams; data: LayoutData; children: import("svelte").Snippet }
+export type RequestEvent = Kit.RequestEvent;
\ No newline at end of file
diff --git a/src/lib/sites.ts b/src/lib/sites.ts
new file mode 100644
index 00000000..abbb7d87
--- /dev/null
+++ b/src/lib/sites.ts
@@ -0,0 +1,26 @@
+/**
+ * Config for each linked site: route slug → URL and optional per-site options.
+ * Add site-specific options here (e.g. title, sandbox, allow) as needed.
+ */
+export const sites = {
+ prism: {
+ url: 'https://prism.ccllc.pro',
+ title: 'Prism'
+ },
+ tasgrid: {
+ url: 'https://tasgrid.ccllc.pro',
+ title: 'TasGrid'
+ },
+ stackq: {
+ url: 'https://stackq.ccllc.pro',
+ title: 'Stackq'
+ },
+ hrm: {
+ url: 'https://hrm.ccllc.pro',
+ title: 'HRM'
+ }
+} as const;
+
+export type SiteSlug = keyof typeof sites;
+
+export const siteSlugs = Object.keys(sites) as SiteSlug[];
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 1d824773..beaf145a 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,6 +1,7 @@
@@ -17,18 +18,12 @@
Base
{/if}
diff --git a/src/routes/HomeWithDialog.svelte b/src/routes/HomeWithDialog.svelte
index e33f7e4a..d3dea964 100644
--- a/src/routes/HomeWithDialog.svelte
+++ b/src/routes/HomeWithDialog.svelte
@@ -1,5 +1,6 @@
+
+
+ {@render children?.()}
+
diff --git a/src/routes/[site]/+page.server.ts b/src/routes/[site]/+page.server.ts
new file mode 100644
index 00000000..12f93d7b
--- /dev/null
+++ b/src/routes/[site]/+page.server.ts
@@ -0,0 +1,17 @@
+import { sites, type SiteSlug } from '$lib/sites';
+import { error } from '@sveltejs/kit';
+
+export function load({ params }) {
+ const slug = params.site?.toLowerCase() as SiteSlug | undefined;
+ const site = slug && slug in sites ? sites[slug as SiteSlug] : null;
+
+ if (!site) {
+ throw error(404, `Unknown site: ${params.site}`);
+ }
+
+ return {
+ slug: slug as SiteSlug,
+ url: site.url,
+ title: site.title
+ };
+}
diff --git a/src/routes/[site]/+page.svelte b/src/routes/[site]/+page.svelte
new file mode 100644
index 00000000..bf6e0856
--- /dev/null
+++ b/src/routes/[site]/+page.svelte
@@ -0,0 +1,32 @@
+
+
+
+ {data.title} — Base
+
+
+
+
+
+
diff --git a/src/routes/layout.css b/src/routes/layout.css
index 05a58839..c357a726 100644
--- a/src/routes/layout.css
+++ b/src/routes/layout.css
@@ -142,6 +142,18 @@
min-height: 36px;
}
}
+ /* [site] iframe route: break out of shell and fill viewport */
+ .site-fullscreen {
+ position: fixed;
+ inset: 0;
+ width: 100vw;
+ height: 100dvh;
+ min-height: 100dvh;
+ z-index: 40;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ }
}
/* Use on icon-only links for 44px touch target */