Skip to main content
+
+
+
+ 👁 Demo mode — changes are not saved and AI features are disabled.
+
+
+
+
+
+
+ {{ toast.message.value }}
+
+
@@ -17,13 +30,17 @@ import { RouterView, useRoute } from 'vue-router'
import { useMotion } from './composables/useMotion'
import { useHackerMode, useKonamiCode } from './composables/useEasterEgg'
import { useTheme } from './composables/useTheme'
+import { useToast } from './composables/useToast'
import AppNav from './components/AppNav.vue'
+import { useAppConfigStore } from './stores/appConfig'
import { useDigestStore } from './stores/digest'
const motion = useMotion()
const route = useRoute()
const { toggle, restore } = useHackerMode()
const { initTheme } = useTheme()
+const toast = useToast()
+const config = useAppConfigStore()
const digestStore = useDigestStore()
const isWizard = computed(() => route.path.startsWith('/setup'))
@@ -110,4 +127,51 @@ body {
margin-left: 0;
padding-bottom: 0;
}
+
+/* Demo mode banner — sticky top bar */
+.demo-banner {
+ position: sticky;
+ top: 0;
+ z-index: 200;
+ background: var(--color-warning);
+ color: #1a1a1a; /* forced dark — warning bg is always light enough */
+ text-align: center;
+ font-size: 0.85rem;
+ font-weight: 600;
+ padding: 6px var(--space-4, 16px);
+ letter-spacing: 0.01em;
+}
+
+/* Global toast — bottom-center, above tab bar */
+.global-toast {
+ position: fixed;
+ bottom: calc(72px + env(safe-area-inset-bottom));
+ left: 50%;
+ transform: translateX(-50%);
+ background: var(--color-surface-raised, #2a3650);
+ color: var(--color-text, #eaeff8);
+ padding: 10px 20px;
+ border-radius: var(--radius-md, 8px);
+ font-size: 0.9rem;
+ font-weight: 500;
+ box-shadow: 0 4px 16px rgba(0,0,0,0.25);
+ white-space: nowrap;
+ z-index: 9000;
+ pointer-events: none;
+}
+
+.global-toast-enter-active, .global-toast-leave-active {
+ transition: opacity 220ms ease, transform 220ms ease;
+}
+.global-toast-enter-from, .global-toast-leave-to {
+ opacity: 0;
+ transform: translateX(-50%) translateY(8px);
+}
+
+@media (min-width: 1024px) {
+ .global-toast {
+ bottom: calc(24px + env(safe-area-inset-bottom));
+ left: calc(50% + var(--sidebar-width, 220px) / 2);
+ }
+}
diff --git a/web/src/components/ApplyWorkspace.vue b/web/src/components/ApplyWorkspace.vue
index a8e3a8e..6560b6a 100644
--- a/web/src/components/ApplyWorkspace.vue
+++ b/web/src/components/ApplyWorkspace.vue
@@ -283,9 +283,12 @@