diff --git a/.open-next 2/worker 10.js b/.open-next 2/worker 10.js new file mode 100644 index 0000000..0e5a82a --- /dev/null +++ b/.open-next 2/worker 10.js @@ -0,0 +1,50 @@ +//@ts-expect-error: Will be resolved by wrangler build +import { handleImageRequest } from "./cloudflare/images.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { maybeGetSkewProtectionResponse } from "./cloudflare/skew-protection.js"; +// @ts-expect-error: Will be resolved by wrangler build +import { handler as middlewareHandler } from "./middleware/handler.mjs"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOQueueHandler } from "./.build/durable-objects/queue.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOShardedTagCache } from "./.build/durable-objects/sharded-tag-cache.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { BucketCachePurge } from "./.build/durable-objects/bucket-cache-purge.js"; +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + const response = maybeGetSkewProtectionResponse(request); + if (response) { + return response; + } + const url = new URL(request.url); + // Serve images in development. + // Note: "/cdn-cgi/image/..." requests do not reach production workers. + if (url.pathname.startsWith("/cdn-cgi/image/")) { + const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); + if (m === null) { + return new Response("Not Found!", { status: 404 }); + } + const imageUrl = m.groups.url; + return imageUrl.match(/^https?:\/\//) + ? fetch(imageUrl, { cf: { cacheEverything: true } }) + : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + } + // Fallback for the Next default image loader. + if (url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}`) { + return await handleImageRequest(url, request.headers, env); + } + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, env, ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + // @ts-expect-error: resolved by wrangler build + const { handler } = await import("./server-functions/default/handler.mjs"); + return handler(reqOrResp, env, ctx, request.signal); + }); + }, +}; diff --git a/.open-next 2/worker 11.js b/.open-next 2/worker 11.js new file mode 100644 index 0000000..0e5a82a --- /dev/null +++ b/.open-next 2/worker 11.js @@ -0,0 +1,50 @@ +//@ts-expect-error: Will be resolved by wrangler build +import { handleImageRequest } from "./cloudflare/images.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { maybeGetSkewProtectionResponse } from "./cloudflare/skew-protection.js"; +// @ts-expect-error: Will be resolved by wrangler build +import { handler as middlewareHandler } from "./middleware/handler.mjs"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOQueueHandler } from "./.build/durable-objects/queue.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOShardedTagCache } from "./.build/durable-objects/sharded-tag-cache.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { BucketCachePurge } from "./.build/durable-objects/bucket-cache-purge.js"; +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + const response = maybeGetSkewProtectionResponse(request); + if (response) { + return response; + } + const url = new URL(request.url); + // Serve images in development. + // Note: "/cdn-cgi/image/..." requests do not reach production workers. + if (url.pathname.startsWith("/cdn-cgi/image/")) { + const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); + if (m === null) { + return new Response("Not Found!", { status: 404 }); + } + const imageUrl = m.groups.url; + return imageUrl.match(/^https?:\/\//) + ? fetch(imageUrl, { cf: { cacheEverything: true } }) + : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + } + // Fallback for the Next default image loader. + if (url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}`) { + return await handleImageRequest(url, request.headers, env); + } + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, env, ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + // @ts-expect-error: resolved by wrangler build + const { handler } = await import("./server-functions/default/handler.mjs"); + return handler(reqOrResp, env, ctx, request.signal); + }); + }, +}; diff --git a/.open-next 2/worker 12.js b/.open-next 2/worker 12.js new file mode 100644 index 0000000..0e5a82a --- /dev/null +++ b/.open-next 2/worker 12.js @@ -0,0 +1,50 @@ +//@ts-expect-error: Will be resolved by wrangler build +import { handleImageRequest } from "./cloudflare/images.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { maybeGetSkewProtectionResponse } from "./cloudflare/skew-protection.js"; +// @ts-expect-error: Will be resolved by wrangler build +import { handler as middlewareHandler } from "./middleware/handler.mjs"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOQueueHandler } from "./.build/durable-objects/queue.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOShardedTagCache } from "./.build/durable-objects/sharded-tag-cache.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { BucketCachePurge } from "./.build/durable-objects/bucket-cache-purge.js"; +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + const response = maybeGetSkewProtectionResponse(request); + if (response) { + return response; + } + const url = new URL(request.url); + // Serve images in development. + // Note: "/cdn-cgi/image/..." requests do not reach production workers. + if (url.pathname.startsWith("/cdn-cgi/image/")) { + const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); + if (m === null) { + return new Response("Not Found!", { status: 404 }); + } + const imageUrl = m.groups.url; + return imageUrl.match(/^https?:\/\//) + ? fetch(imageUrl, { cf: { cacheEverything: true } }) + : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + } + // Fallback for the Next default image loader. + if (url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}`) { + return await handleImageRequest(url, request.headers, env); + } + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, env, ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + // @ts-expect-error: resolved by wrangler build + const { handler } = await import("./server-functions/default/handler.mjs"); + return handler(reqOrResp, env, ctx, request.signal); + }); + }, +}; diff --git a/.open-next 2/worker 13.js b/.open-next 2/worker 13.js new file mode 100644 index 0000000..0e5a82a --- /dev/null +++ b/.open-next 2/worker 13.js @@ -0,0 +1,50 @@ +//@ts-expect-error: Will be resolved by wrangler build +import { handleImageRequest } from "./cloudflare/images.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { maybeGetSkewProtectionResponse } from "./cloudflare/skew-protection.js"; +// @ts-expect-error: Will be resolved by wrangler build +import { handler as middlewareHandler } from "./middleware/handler.mjs"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOQueueHandler } from "./.build/durable-objects/queue.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOShardedTagCache } from "./.build/durable-objects/sharded-tag-cache.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { BucketCachePurge } from "./.build/durable-objects/bucket-cache-purge.js"; +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + const response = maybeGetSkewProtectionResponse(request); + if (response) { + return response; + } + const url = new URL(request.url); + // Serve images in development. + // Note: "/cdn-cgi/image/..." requests do not reach production workers. + if (url.pathname.startsWith("/cdn-cgi/image/")) { + const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); + if (m === null) { + return new Response("Not Found!", { status: 404 }); + } + const imageUrl = m.groups.url; + return imageUrl.match(/^https?:\/\//) + ? fetch(imageUrl, { cf: { cacheEverything: true } }) + : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + } + // Fallback for the Next default image loader. + if (url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}`) { + return await handleImageRequest(url, request.headers, env); + } + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, env, ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + // @ts-expect-error: resolved by wrangler build + const { handler } = await import("./server-functions/default/handler.mjs"); + return handler(reqOrResp, env, ctx, request.signal); + }); + }, +}; diff --git a/.open-next 2/worker 14.js b/.open-next 2/worker 14.js new file mode 100644 index 0000000..0e5a82a --- /dev/null +++ b/.open-next 2/worker 14.js @@ -0,0 +1,50 @@ +//@ts-expect-error: Will be resolved by wrangler build +import { handleImageRequest } from "./cloudflare/images.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { maybeGetSkewProtectionResponse } from "./cloudflare/skew-protection.js"; +// @ts-expect-error: Will be resolved by wrangler build +import { handler as middlewareHandler } from "./middleware/handler.mjs"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOQueueHandler } from "./.build/durable-objects/queue.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOShardedTagCache } from "./.build/durable-objects/sharded-tag-cache.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { BucketCachePurge } from "./.build/durable-objects/bucket-cache-purge.js"; +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + const response = maybeGetSkewProtectionResponse(request); + if (response) { + return response; + } + const url = new URL(request.url); + // Serve images in development. + // Note: "/cdn-cgi/image/..." requests do not reach production workers. + if (url.pathname.startsWith("/cdn-cgi/image/")) { + const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); + if (m === null) { + return new Response("Not Found!", { status: 404 }); + } + const imageUrl = m.groups.url; + return imageUrl.match(/^https?:\/\//) + ? fetch(imageUrl, { cf: { cacheEverything: true } }) + : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + } + // Fallback for the Next default image loader. + if (url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}`) { + return await handleImageRequest(url, request.headers, env); + } + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, env, ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + // @ts-expect-error: resolved by wrangler build + const { handler } = await import("./server-functions/default/handler.mjs"); + return handler(reqOrResp, env, ctx, request.signal); + }); + }, +}; diff --git a/.open-next 2/worker 15.js b/.open-next 2/worker 15.js new file mode 100644 index 0000000..0e5a82a --- /dev/null +++ b/.open-next 2/worker 15.js @@ -0,0 +1,50 @@ +//@ts-expect-error: Will be resolved by wrangler build +import { handleImageRequest } from "./cloudflare/images.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { maybeGetSkewProtectionResponse } from "./cloudflare/skew-protection.js"; +// @ts-expect-error: Will be resolved by wrangler build +import { handler as middlewareHandler } from "./middleware/handler.mjs"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOQueueHandler } from "./.build/durable-objects/queue.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOShardedTagCache } from "./.build/durable-objects/sharded-tag-cache.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { BucketCachePurge } from "./.build/durable-objects/bucket-cache-purge.js"; +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + const response = maybeGetSkewProtectionResponse(request); + if (response) { + return response; + } + const url = new URL(request.url); + // Serve images in development. + // Note: "/cdn-cgi/image/..." requests do not reach production workers. + if (url.pathname.startsWith("/cdn-cgi/image/")) { + const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); + if (m === null) { + return new Response("Not Found!", { status: 404 }); + } + const imageUrl = m.groups.url; + return imageUrl.match(/^https?:\/\//) + ? fetch(imageUrl, { cf: { cacheEverything: true } }) + : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + } + // Fallback for the Next default image loader. + if (url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}`) { + return await handleImageRequest(url, request.headers, env); + } + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, env, ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + // @ts-expect-error: resolved by wrangler build + const { handler } = await import("./server-functions/default/handler.mjs"); + return handler(reqOrResp, env, ctx, request.signal); + }); + }, +}; diff --git a/.open-next 2/worker 4.js b/.open-next 2/worker 4.js new file mode 100644 index 0000000..0e5a82a --- /dev/null +++ b/.open-next 2/worker 4.js @@ -0,0 +1,50 @@ +//@ts-expect-error: Will be resolved by wrangler build +import { handleImageRequest } from "./cloudflare/images.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { maybeGetSkewProtectionResponse } from "./cloudflare/skew-protection.js"; +// @ts-expect-error: Will be resolved by wrangler build +import { handler as middlewareHandler } from "./middleware/handler.mjs"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOQueueHandler } from "./.build/durable-objects/queue.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOShardedTagCache } from "./.build/durable-objects/sharded-tag-cache.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { BucketCachePurge } from "./.build/durable-objects/bucket-cache-purge.js"; +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + const response = maybeGetSkewProtectionResponse(request); + if (response) { + return response; + } + const url = new URL(request.url); + // Serve images in development. + // Note: "/cdn-cgi/image/..." requests do not reach production workers. + if (url.pathname.startsWith("/cdn-cgi/image/")) { + const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); + if (m === null) { + return new Response("Not Found!", { status: 404 }); + } + const imageUrl = m.groups.url; + return imageUrl.match(/^https?:\/\//) + ? fetch(imageUrl, { cf: { cacheEverything: true } }) + : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + } + // Fallback for the Next default image loader. + if (url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}`) { + return await handleImageRequest(url, request.headers, env); + } + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, env, ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + // @ts-expect-error: resolved by wrangler build + const { handler } = await import("./server-functions/default/handler.mjs"); + return handler(reqOrResp, env, ctx, request.signal); + }); + }, +}; diff --git a/.open-next 2/worker 5.js b/.open-next 2/worker 5.js new file mode 100644 index 0000000..0e5a82a --- /dev/null +++ b/.open-next 2/worker 5.js @@ -0,0 +1,50 @@ +//@ts-expect-error: Will be resolved by wrangler build +import { handleImageRequest } from "./cloudflare/images.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { runWithCloudflareRequestContext } from "./cloudflare/init.js"; +//@ts-expect-error: Will be resolved by wrangler build +import { maybeGetSkewProtectionResponse } from "./cloudflare/skew-protection.js"; +// @ts-expect-error: Will be resolved by wrangler build +import { handler as middlewareHandler } from "./middleware/handler.mjs"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOQueueHandler } from "./.build/durable-objects/queue.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { DOShardedTagCache } from "./.build/durable-objects/sharded-tag-cache.js"; +//@ts-expect-error: Will be resolved by wrangler build +export { BucketCachePurge } from "./.build/durable-objects/bucket-cache-purge.js"; +export default { + async fetch(request, env, ctx) { + return runWithCloudflareRequestContext(request, env, ctx, async () => { + const response = maybeGetSkewProtectionResponse(request); + if (response) { + return response; + } + const url = new URL(request.url); + // Serve images in development. + // Note: "/cdn-cgi/image/..." requests do not reach production workers. + if (url.pathname.startsWith("/cdn-cgi/image/")) { + const m = url.pathname.match(/\/cdn-cgi\/image\/.+?\/(?.+)$/); + if (m === null) { + return new Response("Not Found!", { status: 404 }); + } + const imageUrl = m.groups.url; + return imageUrl.match(/^https?:\/\//) + ? fetch(imageUrl, { cf: { cacheEverything: true } }) + : env.ASSETS?.fetch(new URL(`/${imageUrl}`, url)); + } + // Fallback for the Next default image loader. + if (url.pathname === + `${globalThis.__NEXT_BASE_PATH__}/_next/image${globalThis.__TRAILING_SLASH__ ? "/" : ""}`) { + return await handleImageRequest(url, request.headers, env); + } + // - `Request`s are handled by the Next server + const reqOrResp = await middlewareHandler(request, env, ctx); + if (reqOrResp instanceof Response) { + return reqOrResp; + } + // @ts-expect-error: resolved by wrangler build + const { handler } = await import("./server-functions/default/handler.mjs"); + return handler(reqOrResp, env, ctx, request.signal); + }); + }, +}; diff --git a/src/app/globals.css b/src/app/globals.css index 57a0eeb..4944c14 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -629,6 +629,7 @@ opacity: 0.7; filter: blur(5px); } + /* Swipe ecosystem for mobile placards */ @media (max-width: 640px) { .swipe-container { @@ -651,7 +652,7 @@ } .swipe-item { - flex: 0 0 calc(100vw - 3rem); + flex: 0 0 88vw; scroll-snap-align: center; } -} +} \ No newline at end of file diff --git a/src/components/Dashboard.tsx b/src/components/Dashboard.tsx index 86fbfca..48a9d8c 100644 --- a/src/components/Dashboard.tsx +++ b/src/components/Dashboard.tsx @@ -237,54 +237,51 @@ export function Dashboard({ user }: DashboardProps) { {/* Dashboard Sections */}
- {/* SECTION: Daily Snapshot (Horizontal Swipe on Mobile) */} -
-
-

Daily Snapshot

-
-
-
-
+ {/* SECTION: Mobile Swipe Ecosystem */} +
+ + {/* SLIDE 1: Daily Stats (Nicotine & Weed) */} +
+
+

Daily Stats

+
+
+ +
-
-
- + {/* SLIDE 2: Calendar & Inspiration */} +
+
+

Calendar

-
+ { + const updatedPrefs = { ...preferences, religion }; + setPreferences(updatedPrefs); + await savePreferencesAsync(updatedPrefs); + }} + preferences={preferences} + onPreferencesUpdate={async (updatedPrefs) => { + await savePreferencesAsync(updatedPrefs); + setPreferences(updatedPrefs); + }} + /> +
+ + {/* SLIDE 3: Mood & Savings */} +
+
+

Mood & Savings

+
+
-
-
- { - const updatedPrefs = { ...preferences, religion }; - setPreferences(updatedPrefs); - await savePreferencesAsync(updatedPrefs); - }} - preferences={preferences} - onPreferencesUpdate={async (updatedPrefs) => { - await savePreferencesAsync(updatedPrefs); - setPreferences(updatedPrefs); - }} - /> -
-
-
- - {/* SECTION: Your Journey */} -
-
-

Your Journey

-
- -
-
-
+
+ + {/* SLIDE 4: Journey & Plan */} +
+
+

Your Journey

+
+
-
-
-
-
-
+ +
)} - + - {preferences && ( - setShowUsagePrompt(false)} - onSubmit={handleUsageSubmit} - userId={user.id} - /> - )} + { + preferences && ( + setShowUsagePrompt(false)} + onSubmit={handleUsageSubmit} + userId={user.id} + /> + ) + } - {showCelebration && newBadge && ( - - )} - + { + showCelebration && newBadge && ( + + ) + } + ); } diff --git a/src/components/SideMenu.tsx b/src/components/SideMenu.tsx index aac59a3..4e64b7e 100644 --- a/src/components/SideMenu.tsx +++ b/src/components/SideMenu.tsx @@ -12,10 +12,12 @@ import { Heart, Calendar } from 'lucide-react'; +import React from 'react'; import { useRouter } from 'next/navigation'; import { cn } from '@/lib/utils'; import { useTheme } from '@/lib/theme-context'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; +import { createPortal } from 'react-dom'; interface SideMenuProps { isOpen: boolean; @@ -50,18 +52,27 @@ export function SideMenu({ isOpen, onClose, user, userName }: SideMenuProps) { .join('') .toUpperCase() || user.email[0].toUpperCase(); - return ( + // Use Portal to render outside of header stacking context + const [mounted, setMounted] = React.useState(false); + + React.useEffect(() => { + setMounted(true); + }, []); + + if (!mounted) return null; + + return createPortal(
{/* Backdrop */}
{/* Menu Content */}
{ + // Link to Dashboard Health Section + onClose(); + const el = document.getElementById('journey-section'); + if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); + else alert("View your Health Status on the Dashboard Journey section!"); + }} color="blue" /> { + onClose(); + // Link to Calendar section + const el = document.getElementById('calendar-section'); + if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); + else alert("View your History on the Dashboard Calendar!"); + }} color="amber" />
@@ -144,7 +167,10 @@ export function SideMenu({ isOpen, onClose, user, userName }: SideMenuProps) { { + onClose(); + alert("Please use the Notification Bell in the header for settings."); + }} />
- + , + document.body ); } diff --git a/src/components/UserHeader.tsx b/src/components/UserHeader.tsx index a3d18b9..1228ba6 100644 --- a/src/components/UserHeader.tsx +++ b/src/components/UserHeader.tsx @@ -33,6 +33,7 @@ import { Cigarette, Leaf, LogOut, Home, ChevronDown, Sun, Moon, Bell, BellOff, B import { useTheme } from '@/lib/theme-context'; import { InstallAppButton } from './InstallAppButton'; import { cn } from '@/lib/utils'; +import { SideMenu } from './SideMenu'; interface UserHeaderProps { user: User; @@ -121,8 +122,6 @@ function HourlyTimePicker({ value, onChange }: HourlyTimePickerProps) { ); } -import { SideMenu } from './SideMenu'; - export function UserHeader({ user, preferences }: UserHeaderProps) { const [userName, setUserName] = useState(null); const [reminderSettings, setReminderSettings] = useState({ enabled: false, reminderTime: '09:00', frequency: 'daily' }); @@ -220,10 +219,10 @@ export function UserHeader({ user, preferences }: UserHeaderProps) { backdropFilter: 'blur(12px)', borderBottom: theme === 'light' ? '1px solid rgba(0,0,0,0.05)' : '1px solid rgba(255,255,255,0.05)' }}> - {/* Cloudy/Foggy effect overlay */} -
-
-
+ {/* Cloudy/Foggy effect overlay - removed mix-blend-overlay for visibility */} +
+
+
@@ -231,15 +230,19 @@ export function UserHeader({ user, preferences }: UserHeaderProps) {