diff --git a/apps/calendar/apps/web/src/routes/offline/+page.ts b/apps/calendar/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/calendar/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/chat/apps/web/Dockerfile b/apps/chat/apps/web/Dockerfile index e9396a50e..7b6358aa3 100644 --- a/apps/chat/apps/web/Dockerfile +++ b/apps/chat/apps/web/Dockerfile @@ -42,6 +42,7 @@ COPY packages/shared-error-tracking ./packages/shared-error-tracking COPY packages/shared-vite-config ./packages/shared-vite-config COPY packages/shared-api-client ./packages/shared-api-client COPY packages/shared-stores ./packages/shared-stores +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy chat packages COPY apps/chat/packages ./apps/chat/packages diff --git a/apps/chat/apps/web/src/routes/offline/+page.ts b/apps/chat/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/chat/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/citycorners/apps/web/src/routes/offline/+page.ts b/apps/citycorners/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/citycorners/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/clock/apps/web/Dockerfile b/apps/clock/apps/web/Dockerfile index f50c8c60e..50590255d 100644 --- a/apps/clock/apps/web/Dockerfile +++ b/apps/clock/apps/web/Dockerfile @@ -42,6 +42,7 @@ COPY packages/shared-error-tracking ./packages/shared-error-tracking COPY packages/shared-vite-config ./packages/shared-vite-config COPY packages/shared-api-client ./packages/shared-api-client COPY packages/shared-stores ./packages/shared-stores +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy clock packages and web COPY apps/clock/packages ./apps/clock/packages diff --git a/apps/clock/apps/web/src/routes/offline/+page.ts b/apps/clock/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/clock/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/contacts/apps/web/src/routes/offline/+page.ts b/apps/contacts/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/contacts/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/context/apps/web/src/routes/offline/+page.ts b/apps/context/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/context/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/manacore/apps/web/src/lib/components/dashboard/WidgetContainer.svelte b/apps/manacore/apps/web/src/lib/components/dashboard/WidgetContainer.svelte index fe04ec211..5c41c172b 100644 --- a/apps/manacore/apps/web/src/lib/components/dashboard/WidgetContainer.svelte +++ b/apps/manacore/apps/web/src/lib/components/dashboard/WidgetContainer.svelte @@ -78,72 +78,72 @@ - - {#if dashboardStore.isEditing} + + {#if dashboardStore.isEditing} +
+
- -
- - - - - - - - - {meta?.icon} {$_(widget.title)} -
+ + + + + + + + + {meta?.icon} {$_(widget.title)} +
- -
- {#each sizes as size} - - {/each} -
- - -
+ +
+ {#each sizes as size} -
+ {/each}
- {/if} - -
- {#if WidgetComponent} - - {:else} -

Unknown widget type: {widget.type}

- {/if} + +
+ +
- + {/if} + + +
+ {#if WidgetComponent} + + {:else} +

Unknown widget type: {widget.type}

+ {/if} +
+ diff --git a/apps/manacore/apps/web/src/routes/offline/+page.ts b/apps/manacore/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/manacore/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/manadeck/apps/web/src/routes/offline/+page.ts b/apps/manadeck/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/manadeck/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/matrix/apps/web/src/routes/offline/+page.ts b/apps/matrix/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/matrix/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/mukke/apps/web/Dockerfile b/apps/mukke/apps/web/Dockerfile index 163576488..75d877599 100644 --- a/apps/mukke/apps/web/Dockerfile +++ b/apps/mukke/apps/web/Dockerfile @@ -43,6 +43,7 @@ COPY packages/shared-ui ./packages/shared-ui COPY packages/shared-utils ./packages/shared-utils COPY packages/shared-error-tracking ./packages/shared-error-tracking COPY packages/shared-vite-config ./packages/shared-vite-config +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy mukke shared package COPY apps/mukke/packages ./apps/mukke/packages diff --git a/apps/mukke/apps/web/src/routes/offline/+page.ts b/apps/mukke/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/mukke/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/nutriphi/apps/web/src/routes/offline/+page.ts b/apps/nutriphi/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/nutriphi/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/photos/apps/web/Dockerfile b/apps/photos/apps/web/Dockerfile index 53db85675..4a5816064 100644 --- a/apps/photos/apps/web/Dockerfile +++ b/apps/photos/apps/web/Dockerfile @@ -49,6 +49,7 @@ COPY packages/shared-error-tracking ./packages/shared-error-tracking COPY packages/shared-vite-config ./packages/shared-vite-config COPY packages/shared-api-client ./packages/shared-api-client COPY packages/shared-stores ./packages/shared-stores +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy photos shared package COPY apps/photos/packages/shared ./apps/photos/packages/shared diff --git a/apps/photos/apps/web/src/routes/offline/+page.ts b/apps/photos/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/photos/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/picture/apps/web/Dockerfile b/apps/picture/apps/web/Dockerfile index 12433a3ca..7d1d76b35 100644 --- a/apps/picture/apps/web/Dockerfile +++ b/apps/picture/apps/web/Dockerfile @@ -48,6 +48,7 @@ COPY packages/shared-vite-config ./packages/shared-vite-config COPY packages/shared-api-client ./packages/shared-api-client COPY packages/shared-stores ./packages/shared-stores COPY packages/shared-pwa ./packages/shared-pwa +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy picture packages COPY apps/picture/packages/shared ./apps/picture/packages/shared diff --git a/apps/picture/apps/web/src/routes/offline/+page.ts b/apps/picture/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/picture/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/planta/apps/web/src/routes/offline/+page.ts b/apps/planta/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/planta/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/presi/apps/web/Dockerfile b/apps/presi/apps/web/Dockerfile index acc85630c..6e7a1c907 100644 --- a/apps/presi/apps/web/Dockerfile +++ b/apps/presi/apps/web/Dockerfile @@ -42,6 +42,7 @@ COPY packages/shared-profile-ui ./packages/shared-profile-ui COPY packages/shared-ui ./packages/shared-ui COPY packages/shared-error-tracking ./packages/shared-error-tracking COPY packages/shared-utils ./packages/shared-utils +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy presi web COPY apps/presi/apps/web ./apps/presi/apps/web diff --git a/apps/presi/apps/web/src/routes/offline/+page.ts b/apps/presi/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/presi/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/questions/apps/web/src/routes/offline/+page.ts b/apps/questions/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/questions/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/skilltree/apps/backend/src/achievement/achievement.service.ts b/apps/skilltree/apps/backend/src/achievement/achievement.service.ts index 3e9f4836a..09e5b5e7c 100644 --- a/apps/skilltree/apps/backend/src/achievement/achievement.service.ts +++ b/apps/skilltree/apps/backend/src/achievement/achievement.service.ts @@ -94,9 +94,7 @@ export class AchievementService implements OnModuleInit { } async getStats(userId: string): Promise<{ total: number; unlocked: number }> { - const [totalResult] = await this.db - .select({ count: sql`count(*)` }) - .from(achievements); + const [totalResult] = await this.db.select({ count: sql`count(*)` }).from(achievements); const [unlockedResult] = await this.db .select({ count: sql`count(*)` }) @@ -113,7 +111,10 @@ export class AchievementService implements OnModuleInit { * Check all achievements for a user and unlock any newly earned ones. * Called after XP gain, skill creation, activity logging, etc. */ - async checkAndUnlock(userId: string, context?: { activityXp?: number }): Promise { + async checkAndUnlock( + userId: string, + context?: { activityXp?: number } + ): Promise { const allAchievements = await this.db.select().from(achievements); const unlocked = await this.db .select() diff --git a/apps/skilltree/apps/backend/src/skill/skill.service.ts b/apps/skilltree/apps/backend/src/skill/skill.service.ts index fb19e1404..17df2ee85 100644 --- a/apps/skilltree/apps/backend/src/skill/skill.service.ts +++ b/apps/skilltree/apps/backend/src/skill/skill.service.ts @@ -22,11 +22,15 @@ function calculateLevel(xp: number): number { export class SkillService { constructor( @Inject(DATABASE_TOKEN) private db: Database, - private readonly achievementService: AchievementService, + private readonly achievementService: AchievementService ) {} async findAll(userId: string): Promise { - return this.db.select().from(skills).where(eq(skills.userId, userId)).orderBy(desc(skills.totalXp)); + return this.db + .select() + .from(skills) + .where(eq(skills.userId, userId)) + .orderBy(desc(skills.totalXp)); } async findByBranch(userId: string, branch: string): Promise { @@ -109,7 +113,12 @@ export class SkillService { id: string, userId: string, dto: AddXpDto - ): Promise<{ skill: Skill; leveledUp: boolean; newLevel: number; newAchievements: AchievementUnlockResult[] }> { + ): Promise<{ + skill: Skill; + leveledUp: boolean; + newLevel: number; + newAchievements: AchievementUnlockResult[]; + }> { const skill = await this.findByIdOrThrow(id, userId); const newTotalXp = skill.totalXp + dto.xp; diff --git a/apps/skilltree/apps/web/Dockerfile b/apps/skilltree/apps/web/Dockerfile index 6f710fe54..2e642dbe7 100644 --- a/apps/skilltree/apps/web/Dockerfile +++ b/apps/skilltree/apps/web/Dockerfile @@ -33,6 +33,7 @@ COPY packages/shared-utils ./packages/shared-utils COPY packages/shared-error-tracking ./packages/shared-error-tracking COPY packages/shared-vite-config ./packages/shared-vite-config COPY packages/shared-api-client ./packages/shared-api-client +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy skilltree web COPY apps/skilltree/apps/web ./apps/skilltree/apps/web diff --git a/apps/skilltree/apps/web/src/lib/components/AchievementCard.svelte b/apps/skilltree/apps/web/src/lib/components/AchievementCard.svelte index 7260b1044..5c0130824 100644 --- a/apps/skilltree/apps/web/src/lib/components/AchievementCard.svelte +++ b/apps/skilltree/apps/web/src/lib/components/AchievementCard.svelte @@ -74,7 +74,11 @@
- + +{achievement.xpReward} XP diff --git a/apps/skilltree/apps/web/src/lib/components/AchievementCelebration.svelte b/apps/skilltree/apps/web/src/lib/components/AchievementCelebration.svelte index f1a631729..449be8768 100644 --- a/apps/skilltree/apps/web/src/lib/components/AchievementCelebration.svelte +++ b/apps/skilltree/apps/web/src/lib/components/AchievementCelebration.svelte @@ -59,7 +59,9 @@
-

Achievement freigeschaltet!

+

+ Achievement freigeschaltet! +

{result.achievement.name}

diff --git a/apps/skilltree/apps/web/src/lib/components/StatsOverview.svelte b/apps/skilltree/apps/web/src/lib/components/StatsOverview.svelte index 4cb30b72c..e9ac35d87 100644 --- a/apps/skilltree/apps/web/src/lib/components/StatsOverview.svelte +++ b/apps/skilltree/apps/web/src/lib/components/StatsOverview.svelte @@ -66,7 +66,10 @@
- +
@@ -74,7 +77,9 @@

Achievements

- {achievementStore.stats().unlocked}/{achievementStore.stats().total} + {achievementStore.stats().unlocked}/{achievementStore.stats().total}

diff --git a/apps/skilltree/apps/web/src/lib/services/storage.ts b/apps/skilltree/apps/web/src/lib/services/storage.ts index aed738d03..0864a8308 100644 --- a/apps/skilltree/apps/web/src/lib/services/storage.ts +++ b/apps/skilltree/apps/web/src/lib/services/storage.ts @@ -257,7 +257,9 @@ export async function saveAchievement(achievement: AchievementWithStatus): Promi await db.put('achievements', achievement); } -export async function saveAllAchievements(achievementsList: AchievementWithStatus[]): Promise { +export async function saveAllAchievements( + achievementsList: AchievementWithStatus[] +): Promise { const db = await getDB(); const tx = db.transaction('achievements', 'readwrite'); await tx.objectStore('achievements').clear(); diff --git a/apps/skilltree/apps/web/src/lib/stores/achievements.svelte.ts b/apps/skilltree/apps/web/src/lib/stores/achievements.svelte.ts index 2ba2611e1..b59ec086e 100644 --- a/apps/skilltree/apps/web/src/lib/stores/achievements.svelte.ts +++ b/apps/skilltree/apps/web/src/lib/stores/achievements.svelte.ts @@ -199,22 +199,14 @@ async function checkLocal(context: { unlockedAt: new Date().toISOString(), progress: condition.threshold, }; - achievements = [ - ...achievements.slice(0, i), - unlocked, - ...achievements.slice(i + 1), - ]; + achievements = [...achievements.slice(0, i), unlocked, ...achievements.slice(i + 1)]; await storage.saveAchievement(unlocked); newlyUnlocked.push({ achievement: a, xpReward: a.xpReward }); } else { // Update progress const updated = { ...a, progress: Math.min(current, condition.threshold) }; if (updated.progress !== a.progress) { - achievements = [ - ...achievements.slice(0, i), - updated, - ...achievements.slice(i + 1), - ]; + achievements = [...achievements.slice(0, i), updated, ...achievements.slice(i + 1)]; await storage.saveAchievement(updated); } } diff --git a/apps/skilltree/apps/web/src/routes/+page.svelte b/apps/skilltree/apps/web/src/routes/+page.svelte index 8a372fbe5..3107e489f 100644 --- a/apps/skilltree/apps/web/src/routes/+page.svelte +++ b/apps/skilltree/apps/web/src/routes/+page.svelte @@ -159,7 +159,9 @@ > {#if achievementStore.stats().unlocked > 0} - + {achievementStore.stats().unlocked} {/if} @@ -359,8 +361,5 @@ {/if} {#if showAchievementCelebration && currentAchievementUnlock} - + {/if} diff --git a/apps/skilltree/apps/web/src/routes/achievements/+page.svelte b/apps/skilltree/apps/web/src/routes/achievements/+page.svelte index bf5127b50..ad2fcd2f7 100644 --- a/apps/skilltree/apps/web/src/routes/achievements/+page.svelte +++ b/apps/skilltree/apps/web/src/routes/achievements/+page.svelte @@ -3,11 +3,7 @@ import { ACHIEVEMENT_CATEGORY_INFO, RARITY_INFO } from '$lib/types'; import type { AchievementCategory } from '$lib/types'; import AchievementCard from '$lib/components/AchievementCard.svelte'; - import { - ArrowLeft, - Trophy, - Star, - } from '@manacore/shared-icons'; + import { ArrowLeft, Trophy, Star } from '@manacore/shared-icons'; let selectedCategory = $state('all'); let showOnlyUnlocked = $state(false); @@ -23,7 +19,10 @@ return list.sort((a, b) => a.sortOrder - b.sortOrder); }); - const categoryEntries = Object.entries(ACHIEVEMENT_CATEGORY_INFO) as [AchievementCategory, { name: string; icon: string }][]; + const categoryEntries = Object.entries(ACHIEVEMENT_CATEGORY_INFO) as [ + AchievementCategory, + { name: string; icon: string }, + ][];
@@ -60,7 +59,9 @@

Fortschritt

- {achievementStore.completionPercentage()}% + {achievementStore.completionPercentage()}%
{#each Object.entries(RARITY_INFO) as [rarity, info]} - {@const count = achievementStore.achievements.filter((a) => a.rarity === rarity && a.unlocked).length} + {@const count = achievementStore.achievements.filter( + (a) => a.rarity === rarity && a.unlocked + ).length} {@const total = achievementStore.achievements.filter((a) => a.rarity === rarity).length} diff --git a/apps/skilltree/apps/web/src/routes/offline/+page.ts b/apps/skilltree/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/skilltree/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/storage/apps/web/Dockerfile b/apps/storage/apps/web/Dockerfile index 846807489..6cb1bd099 100644 --- a/apps/storage/apps/web/Dockerfile +++ b/apps/storage/apps/web/Dockerfile @@ -47,6 +47,7 @@ COPY packages/shared-utils ./packages/shared-utils COPY packages/shared-error-tracking ./packages/shared-error-tracking COPY packages/shared-vite-config ./packages/shared-vite-config COPY packages/shared-pwa ./packages/shared-pwa +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy storage web COPY apps/storage/apps/web ./apps/storage/apps/web diff --git a/apps/storage/apps/web/src/routes/offline/+page.ts b/apps/storage/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/storage/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/todo/apps/web/scripts/generate-icons.mjs b/apps/todo/apps/web/scripts/generate-icons.mjs new file mode 100644 index 000000000..f6e874607 --- /dev/null +++ b/apps/todo/apps/web/scripts/generate-icons.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env node +import { readFileSync } from 'fs'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const staticDir = join(__dirname, '..', 'static'); + +const sizes = [ + { name: 'favicon.png', size: 32 }, + { name: 'pwa-192x192.png', size: 192 }, + { name: 'pwa-512x512.png', size: 512 }, + { name: 'apple-touch-icon.png', size: 180 }, +]; + +async function generateIcons() { + try { + const sharp = (await import('sharp')).default; + const svgPath = join(staticDir, 'icons', 'icon.svg'); + const svgBuffer = readFileSync(svgPath); + + for (const { name, size } of sizes) { + const outputPath = join(staticDir, name); + await sharp(svgBuffer).resize(size, size).png().toFile(outputPath); + console.log(`Generated: ${name} (${size}x${size})`); + } + console.log('\nAll icons generated!'); + } catch (error) { + console.error('Error:', error); + process.exit(1); + } +} + +generateIcons(); diff --git a/apps/todo/apps/web/src/app.html b/apps/todo/apps/web/src/app.html index 95ab7a7bb..5e9c14d07 100644 --- a/apps/todo/apps/web/src/app.html +++ b/apps/todo/apps/web/src/app.html @@ -4,16 +4,21 @@ - - - - - + + + + + + - + + + + + Todo %sveltekit.head% diff --git a/apps/todo/apps/web/src/routes/offline/+page.ts b/apps/todo/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/todo/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/apps/todo/apps/web/static/apple-touch-icon.png b/apps/todo/apps/web/static/apple-touch-icon.png new file mode 100644 index 000000000..4083d2310 Binary files /dev/null and b/apps/todo/apps/web/static/apple-touch-icon.png differ diff --git a/apps/todo/apps/web/static/favicon.png b/apps/todo/apps/web/static/favicon.png index e69de29bb..86bc6ad29 100644 Binary files a/apps/todo/apps/web/static/favicon.png and b/apps/todo/apps/web/static/favicon.png differ diff --git a/apps/todo/apps/web/static/pwa-192x192.png b/apps/todo/apps/web/static/pwa-192x192.png new file mode 100644 index 000000000..c7c7e5dae Binary files /dev/null and b/apps/todo/apps/web/static/pwa-192x192.png differ diff --git a/apps/todo/apps/web/static/pwa-512x512.png b/apps/todo/apps/web/static/pwa-512x512.png new file mode 100644 index 000000000..dadf1fe18 Binary files /dev/null and b/apps/todo/apps/web/static/pwa-512x512.png differ diff --git a/apps/zitare/apps/web/Dockerfile b/apps/zitare/apps/web/Dockerfile index 18a0ef407..d101981e4 100644 --- a/apps/zitare/apps/web/Dockerfile +++ b/apps/zitare/apps/web/Dockerfile @@ -43,6 +43,7 @@ COPY packages/shared-ui ./packages/shared-ui COPY packages/shared-utils ./packages/shared-utils COPY packages/shared-error-tracking ./packages/shared-error-tracking COPY packages/shared-vite-config ./packages/shared-vite-config +COPY packages/shared-app-onboarding ./packages/shared-app-onboarding # Copy zitare content package COPY apps/zitare/packages/content ./apps/zitare/packages/content diff --git a/apps/zitare/apps/web/src/routes/offline/+page.ts b/apps/zitare/apps/web/src/routes/offline/+page.ts new file mode 100644 index 000000000..189f71e2e --- /dev/null +++ b/apps/zitare/apps/web/src/routes/offline/+page.ts @@ -0,0 +1 @@ +export const prerender = true;