mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-22 15:26:41 +02:00
feat(workbench): ?app=<appId> deep-links into the active scene
After consolidating Settings into a workbench app, links from the command menu, pill-nav, AI-tier dropdown, onboarding CTAs, and the sub-route back-buttons had nowhere specific to go — they pointed at `/` and dumped users at their home scene with no way to auto-open the settings app. - Home (+page.svelte) reads ?app=<id> on mount. If the id is a registered workbench app and not already in the active scene, addApp() it. Then scroll the carousel to that page. Strip the query out of history.replaceState so refresh doesn't re-open. - Update all settings redirects (command menu, onboarding, AI-settings dropdown, settings/sync + settings/my-data back-links and breadcrumbs) to `/?app=settings`. Unlocks: future deep-links to any app (profile, themes, spiral, credits, …) without needing a standalone route. `?app=X§ion=Y` is the natural next step — left for when an app needs it. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a08e45ca16
commit
4f76d3926e
6 changed files with 26 additions and 10 deletions
|
|
@ -184,7 +184,7 @@ export function useAiTierItems() {
|
||||||
id: 'ai-settings',
|
id: 'ai-settings',
|
||||||
label: 'KI-Einstellungen',
|
label: 'KI-Einstellungen',
|
||||||
icon: 'settings',
|
icon: 'settings',
|
||||||
onClick: () => goto('/'),
|
onClick: () => goto('/?app=settings'),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a
|
<a
|
||||||
href="/"
|
href="/?app=settings"
|
||||||
class="p-4 rounded-xl bg-card border hover:border-primary/50 hover:shadow-md transition-all group"
|
class="p-4 rounded-xl bg-card border hover:border-primary/50 hover:shadow-md transition-all group"
|
||||||
>
|
>
|
||||||
<div class="flex items-center gap-3">
|
<div class="flex items-center gap-3">
|
||||||
|
|
|
||||||
|
|
@ -746,7 +746,7 @@
|
||||||
id: 'settings',
|
id: 'settings',
|
||||||
label: 'Einstellungen',
|
label: 'Einstellungen',
|
||||||
category: 'Navigation',
|
category: 'Navigation',
|
||||||
onExecute: () => goto('/'),
|
onExecute: () => goto('/?app=settings'),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@
|
||||||
import { ContextMenu, type ContextMenuItem } from '@mana/shared-ui';
|
import { ContextMenu, type ContextMenuItem } from '@mana/shared-ui';
|
||||||
import { Pencil, Copy, Trash, Image, Sparkle } from '@mana/shared-icons';
|
import { Pencil, Copy, Trash, Image, Sparkle } from '@mana/shared-icons';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
|
import { page } from '$app/stores';
|
||||||
|
import { tick } from 'svelte';
|
||||||
import { _, locale } from 'svelte-i18n';
|
import { _, locale } from 'svelte-i18n';
|
||||||
import { buildContextMenuItems, createWorkbenchContextMenu } from '$lib/context-menu';
|
import { buildContextMenuItems, createWorkbenchContextMenu } from '$lib/context-menu';
|
||||||
import type { WorkbenchScene } from '$lib/types/workbench-scenes';
|
import type { WorkbenchScene } from '$lib/types/workbench-scenes';
|
||||||
|
|
@ -61,8 +63,24 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
// ── Scene store wiring ──────────────────────────────────
|
// ── Scene store wiring ──────────────────────────────────
|
||||||
onMount(() => {
|
onMount(async () => {
|
||||||
workbenchScenesStore.initialize();
|
await workbenchScenesStore.initialize();
|
||||||
|
// Deep-link: `/?app=settings` (or any registered appId) opens the
|
||||||
|
// app in the active scene (or focuses it if already open) and
|
||||||
|
// scrolls it into view. Used by command menu, pill-nav settings
|
||||||
|
// link, onboarding CTAs, sync-status banner — anywhere we used
|
||||||
|
// to navigate to `/settings` before the route was removed.
|
||||||
|
const target = $page.url.searchParams.get('app');
|
||||||
|
if (target && getApp(target)) {
|
||||||
|
const already = workbenchScenesStore.openApps.find((a) => a.appId === target);
|
||||||
|
if (!already) await workbenchScenesStore.addApp(target);
|
||||||
|
await tick();
|
||||||
|
scrollToPage(target);
|
||||||
|
// Clean the query out of the URL so refresh doesn't re-trigger.
|
||||||
|
const clean = new URL($page.url);
|
||||||
|
clean.searchParams.delete('app');
|
||||||
|
history.replaceState({}, '', clean);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
onDestroy(() => {
|
onDestroy(() => {
|
||||||
workbenchScenesStore.dispose();
|
workbenchScenesStore.dispose();
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,7 @@
|
||||||
<div class="flex items-center justify-between gap-4">
|
<div class="flex items-center justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<Breadcrumbs
|
<Breadcrumbs
|
||||||
items={[{ label: 'Home', href: '/' }, { label: 'Meine Daten' }]}
|
items={[{ label: 'Einstellungen', href: '/?app=settings' }, { label: 'Meine Daten' }]}
|
||||||
/>
|
/>
|
||||||
<h1 class="text-2xl font-bold">Meine Daten</h1>
|
<h1 class="text-2xl font-bold">Meine Daten</h1>
|
||||||
<p class="text-muted-foreground">
|
<p class="text-muted-foreground">
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<PageHeader title="Cloud Sync" backHref="/" sticky size="lg" />
|
<PageHeader title="Cloud Sync" backHref="/?app=settings" sticky size="lg" />
|
||||||
|
|
||||||
{#if syncBilling.loading}
|
{#if syncBilling.loading}
|
||||||
<div class="flex items-center justify-center py-12">
|
<div class="flex items-center justify-center py-12">
|
||||||
|
|
@ -268,9 +268,7 @@
|
||||||
|
|
||||||
<!-- Back link -->
|
<!-- Back link -->
|
||||||
<div class="mt-6">
|
<div class="mt-6">
|
||||||
<a href="/" class="text-sm text-primary hover:underline">
|
<a href="/?app=settings" class="text-sm text-primary hover:underline"> ← Zurück </a>
|
||||||
← Zurück
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue