/, /collections with live filters and sticky facet sidebar, /journal, /origins, /tasting-notes, /about)load payloads; Orders still uses static demoOrders until an API/loader exists@sveltejs/kit, svelte, vite, typescripttailwindcss, @tailwindcss/forms, @tailwindcss/typography, bits-ui, tailwind-variants, clsxdrizzle-orm, drizzle-kit, postgres, better-auth, zodeslint, prettier, vitest, playwright, storybook, mdsvex, @inlang/paraglide-js.env.example to .envDATABASE_URLORIGIN, BETTER_AUTH_URLBETTER_AUTH_SECRET, optional BETTER_AUTH_CUSTOMER_SECRETSUPERSTORE_ALLOWED_EMAILS, SUPERSTORE_ALLOW_ANY_AUTHENTICATED_USERSUPERSTORE_UPLOAD_DIR, SUPERSTORE_MAX_UPLOAD_MBsvelte.config.jsvite.config.tsdrizzle.config.tsnetlify.toml.nvmrcsrc/routes/collections/+page.svelte: collections grid; category tabs, sort, search-aware list; sidebar filters (country checkboxes with facet counts, max-price range slider with visible track, age buckets, availability); lg:sticky sidebar with internal scroll; filtered pipeline combines category/region/search with client filters; URL ?country= syncs into sidebar selection when presentsrc/lib/data/mms-site-nav.ts: mmsNavCollectionCountries, mmsBuildCollectionsUrl, mmsParseCollectionCategory / Country / Region for collections query params and navsrc/lib/data/mms-collection-products.ts: MmsCollectionProduct type and seed/static catalog entries used by collections and cardssrc/routes/about/+page.svelte: route entry for the new About pagesrc/lib/components/about/MmsAboutPage.svelte: full About experience migrated from provided HTMLsrc/lib/components/site/MmsSiteCursor.svelte: global custom cursor component mounted for all app pages (pointer-aware, interaction-scale states)src/lib/components/site/MmsSiteFooter.svelte: footer links; About MMS now routes to /aboutsrc/lib/components/site/MmsSiteHeader.svelte: shared public header/navigation, mega-menus, mini-cart trigger, site search (via MmsSiteSearchField), and account hover menu (icons + links; sign-out posts to /account?/signOut)src/lib/components/site/MmsSiteSearchField.svelte: collections search form with suggestion panel (combobox UX, clear control, outside-click / Escape dismiss, links to PDP and filtered /collections?q=)src/lib/data/mms-catalog-search.ts: MmsCatalogSearchItem payload shape and mmsCatalogSearchHaystack() for client-side matchingsrc/lib/components/account/MmsCustomerDashboard.svelte: customer dashboard panels; honors ?section=overview|orders|wishlist for deep links from the headersrc/routes/+layout.svelte: shared root layout mounting cross-page UX elements (favicon sync, toasts/modals, site cursor)src/lib/paraglide-resolved-href.ts: route/base helpers used by localized/internal link resolutionsrc/routes/+layout.server.ts: shared storefront/customer layout data; loads catalogHeroImages, catalogStockQtys, and catalogSearchItems (published DB rows or seed fallback, same source rule as /collections)src/app.d.ts: extends App.PageData with optional catalogSearchItems for header autocompletesrc/lib/server/db/schema.ts: app data model (catalog, journal, uploads, tasks, customer-related tables)src/lib/components/superstore/SuperstoreFilterBar.svelte: shared admin filter row wrapper (layout/styling) for Superstore tablessrc/routes/superstore/products/+page.svelte: product catalogue table; filters — search (name/SKU), category, stock band (in / low / out), published vs draft; filtered stock-bar scalesrc/routes/superstore/customers/+page.svelte: customer list; filters — search (name/email), status (active/pending), locationsrc/routes/superstore/inventory/+page.svelte: stock levels table; filters — search (name/SKU), category, stock status (KPI strip stays global)src/routes/superstore/journal/+page.svelte: journal posts table; filters — search (title/author/category text), category, status (active/pending/out)src/routes/superstore/orders/+page.svelte: demo orders table (demoOrders from mms-admin-demo-data.ts); filters — search (order id, customer, product, total, date text), order status (pending/active/out), date bucket; KPI strip stays static DEMO_KPISexport function resolvedLocalizedHref(path: Pathname): string
export function resolvedPath(path: string): string
function sectionHref(hash: string): string
export function mmsNavCollectionCountries(): string[]
export function mmsCatalogSearchHaystack(p: MmsCatalogSearchItem): string
// src/routes/+layout.server.ts (conceptual)
catalogSearchItems: MmsCatalogSearchItem[]
Customer account URL contract
GET /account?section=overview — dashboard overview panel.GET /account?section=orders — orders panel.GET /account?section=wishlist — wishlist panel.section leaves the current panel unchanged when navigating inside the account area.npm installnpm run devdocker compose up -dnpm run db:pushnpm run db:seed:catalognpm run db:seed:journalnpm run checknpm run lintnpm run test@sveltejs/adapter-netlify (svelte.config.js)netlify.toml with command = "npm run build" and publish = "build"22 (.nvmrc and NODE_VERSION in netlify.toml)DATABASE_URLORIGIN and/or BETTER_AUTH_URL (must match deployed HTTPS origin)BETTER_AUTH_SECRETBETTER_AUTH_CUSTOMER_SECRET (or fallback to BETTER_AUTH_SECRET)SUPERSTORE_ALLOWED_EMAILSSUPERSTORE_ALLOW_ANY_AUTHENTICATED_USER (false for production)SUPERSTORE_UPLOAD_DIR, SUPERSTORE_MAX_UPLOAD_MBMmsSiteHeader / MmsSiteFooter layout patterns.MmsSiteSearchField + page.data.catalogSearchItems):catalogHeroImagePublicPath(heroImageUploadId) when present./collections with q and, when the current route is collections, preserves cat, country, and region query params.src/routes/collections/+page.svelte):productsForCountryCounts narrows by category tab, URL region, and q search; filtered further applies sidebar state (selected countries, priceSlider max vs fixed min, age bucket checkboxes, availability radio: all / in stock / limited+rare badges).productsForCountryCounts; mmsNavCollectionCountries() defines order and allowlist; all countries checked means “no country filter.”self-start on the aside at large breakpoints; reveal animation classes live on an inner wrapper so position: sticky is not broken by translate transforms; page root uses overflow-x-clip instead of overflow-x-hidden so sticky works.range input for a clear “slider” affordance.src/lib/components/site/MmsSiteHeader.svelte):group/account hover/focus-within reveals a dropdown with Sign in (/account/login), Sign up (/account/signup), and inline SVG icons per row./account?section=overview, orders, wishlist; Sign out uses method="post" + use:enhance to resolve('/account') + '?/signOut' (same server action as the dashboard).src/lib/components/account/MmsCustomerDashboard.svelte): a client $effect reads page.url.searchParams.get('section') and sets the active sidebar panel when section is overview, orders, or wishlist, so header links land on the correct tab without separate routes.src/routes/about/+page.sveltesrc/lib/components/about/MmsAboutPage.sveltesrc/lib/components/site/MmsSiteCursor.sveltesrc/routes/+layout.svelte so cursor behavior is consistent across all pages.About MMS now links to resolve('/about') instead of in-page home anchor navigation.src/lib/paraglide-resolved-href.ts is outside generated Paraglide output and should be used for stable imports (resolvedLocalizedHref, resolvedPath).src/routes/superstore/* are protected by staff auth and allowlist rules.json, csv, xlsx)+page.server.ts loads; filtering is $state + $derived in the route components. Empty filter results show an in-table or inline message. Filter options such as category lists are derived from the loaded rows (no extra API). Inventory summary tiles (total SKUs, out of stock, low stock) intentionally reflect the full catalogue, not the filtered subset. Orders (/superstore/orders) filters the in-memory demoOrders array; top KPIs remain the static DEMO_KPIS demo values until real order data is wired.src/hooks.server.ts: request lifecycle middleware (auth/i18n/session context)+layout.server.ts and route load functions: data hydration boundariesactions and +server.ts: write operations and API responses/collections (+layout.server.ts); only published products appear when the database has rows.load (or, for Orders, rows from static demo data); they do not alter server queries or staff ACL./about) and no longer relies on home-page section anchors for footer navigation.