+
diff --git a/app/download/page.tsx b/app/download/page.tsx
index 1b73dd0..89afa96 100644
--- a/app/download/page.tsx
+++ b/app/download/page.tsx
@@ -76,19 +76,16 @@ export default function DownloadPage() {
{/* This should be disabled for now. */}
-
+
- {/* Download from App Store */}
- Coming Soon on App Store!
+ Coming Soon on App Store
- {/*
- Direct Download (.ipa) */}
- Coming Soon!
+ Coming Soon
@@ -117,19 +114,19 @@ export default function DownloadPage() {
diff --git a/app/faq/faq-client.tsx b/app/faq/faq-client.tsx
new file mode 100644
index 0000000..e3f8ee9
--- /dev/null
+++ b/app/faq/faq-client.tsx
@@ -0,0 +1,209 @@
+"use client";
+
+import { useState } from "react";
+import PageLayout from "@/components/layout/PageLayout";
+import Link from "next/link";
+import { ChevronDown, Search } from "lucide-react";
+import type { LandingPageData } from "@/lib/sanity";
+
+const DEFAULT_FAQ_CATEGORIES = [
+ {
+ name: "Getting Started",
+ faqs: [
+ {
+ question: "What hardware do I need to get started with MASH?",
+ answer: "You will need a compatible microcontroller (Raspberry Pi recommended), environmental sensors for temperature, humidity, and CO2, relay boards for equipment control, and the necessary power supply. We provide a detailed hardware list in our documentation with recommended components and where to purchase them."
+ },
+ {
+ question: "Is MASH suitable for beginners?",
+ answer: "Yes! MASH is designed to be user-friendly for both beginners and experienced cultivators. Our comprehensive documentation and tutorials will guide you through the setup process step by step. The mobile app provides an intuitive interface for monitoring and control."
+ },
+ {
+ question: "How long does it take to set up the system?",
+ answer: "A basic setup typically takes 2-4 hours for hardware assembly and software configuration. More complex setups with multiple chambers may take longer. Our getting started guide walks you through each step to ensure a smooth setup process."
+ },
+ ]
+ },
+ {
+ name: "Mobile App",
+ faqs: [
+ {
+ question: "Is the mobile app available for both iOS and Android?",
+ answer: "Yes, the MASH mobile application is available for both iOS and Android devices. You can download it from the App Store, Google Play Store, or directly from our website for sideloading."
+ },
+ {
+ question: "Can I use the app when I don't have internet?",
+ answer: "Yes, the MASH app includes an offline mode that allows you to view cached data and recent readings even without an internet connection. However, real-time monitoring and control features require an active connection to your MASH system."
+ },
+ {
+ question: "How do I receive alerts on my phone?",
+ answer: "The MASH app supports push notifications for critical events. You can configure which alerts you want to receive in the app settings, including temperature thresholds, humidity levels, and system status changes."
+ },
+ ]
+ },
+ {
+ name: "Features",
+ faqs: [
+ {
+ question: "Can I manage multiple growing chambers?",
+ answer: "Absolutely! MASH supports multiple chambers with independent climate zones. You can monitor and control each chamber separately with custom settings for different mushroom species. The dashboard provides an overview of all chambers at once."
+ },
+ {
+ question: "What sensors are supported?",
+ answer: "MASH supports a wide range of sensors including DHT22/AM2302 for temperature and humidity, MH-Z19 for CO2 levels, BH1750 for light intensity, and soil moisture sensors for substrate monitoring. Custom sensor integration is possible through our API."
+ },
+ {
+ question: "Can I create custom growing recipes?",
+ answer: "Yes, MASH allows you to create, save, and apply custom growing recipes for different mushroom species. Each recipe can specify target temperature, humidity, CO2 levels, and light cycles for different growth phases."
+ },
+ ]
+ },
+ {
+ name: "Data & Security",
+ faqs: [
+ {
+ question: "Is my data secure?",
+ answer: "Yes, all data is encrypted in transit using TLS and at rest. We use industry-standard security practices and offer both cloud and local storage options for complete control over your data. You can also export your data at any time."
+ },
+ {
+ question: "How long is historical data stored?",
+ answer: "By default, MASH stores up to 2 years of historical data in the cloud. Local storage limits depend on your hardware configuration. You can export data in CSV or JSON formats for long-term archival."
+ },
+ {
+ question: "Can I export my data?",
+ answer: "Yes, you can export your data in multiple formats including CSV, JSON, and Excel. The export feature allows you to select specific date ranges and data types for analysis in external tools."
+ },
+ ]
+ },
+ {
+ name: "Support",
+ faqs: [
+ {
+ question: "What kind of support do you offer?",
+ answer: "We offer email support, comprehensive documentation, video tutorials, and an active community forum on Facebook. Premium support packages with faster response times are available for commercial operations."
+ },
+ {
+ question: "How do I report a bug or request a feature?",
+ answer: "You can report bugs or request features through our GitHub repository, community forum, or by emailing our support team directly. We actively review all feedback and incorporate community suggestions into our development roadmap."
+ },
+ {
+ question: "Is there a warranty for the hardware?",
+ answer: "Hardware components should be purchased from their respective manufacturers, who provide their own warranties. For MASH-specific hardware kits (when available), we offer a 1-year warranty covering manufacturing defects."
+ },
+ ]
+ },
+];
+
+function FAQItem({ question, answer }: { question: string; answer: string }) {
+ const [isOpen, setIsOpen] = useState(false);
+
+ return (
+
+
+ {isOpen && (
+
+ {answer}
+
+ )}
+
+ );
+}
+
+export default function FAQPageClient({ data }: { data?: LandingPageData | null }) {
+ const [searchQuery, setSearchQuery] = useState("");
+
+ const faqCategories = data?.faqCategories ?? DEFAULT_FAQ_CATEGORIES;
+ const title = data?.faqTitle ?? "Frequently Asked Questions";
+ const subtitle = data?.faqSubtitle ?? "Find answers to common questions about MASH";
+ const ctaTitle = data?.faqCtaTitle ?? "Still Have Questions?";
+ const ctaDescription = data?.faqCtaDescription ?? "Can't find the answer you're looking for? Our support team is here to help.";
+
+ const filteredCategories = faqCategories.map(category => ({
+ ...category,
+ faqs: category.faqs.filter(
+ faq =>
+ faq.question.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ faq.answer.toLowerCase().includes(searchQuery.toLowerCase())
+ )
+ })).filter(category => category.faqs.length > 0);
+
+ return (
+
+
+
+
+
+ {title}
+
+
+ {subtitle}
+
+
+ {/* Search */}
+
+
+ setSearchQuery(e.target.value)}
+ className="w-full pl-12 pr-4 py-3 rounded-full border-default bg-background text-primary focus:ring-2 focus:ring-green focus:border-transparent"
+ />
+
+
+
+
+
+
+
+ {filteredCategories.length === 0 ? (
+
+
+ No FAQs found matching your search.
+
+
+ ) : (
+ filteredCategories.map((category) => (
+
+
+ {category.name}
+
+
+ {category.faqs.map((faq, index) => (
+
+ ))}
+
+
+ ))
+ )}
+
+ {/* CTA */}
+
+
{ctaTitle}
+
+ {ctaDescription}
+
+
+ Contact Support
+
+
+
+
+
+ );
+}
diff --git a/app/faq/page.tsx b/app/faq/page.tsx
index 7073c18..00a5bae 100644
--- a/app/faq/page.tsx
+++ b/app/faq/page.tsx
@@ -1,202 +1,19 @@
-"use client";
-
-import { useState } from "react";
-import PageLayout from "@/components/layout/PageLayout";
-import Link from "next/link";
-import { ChevronDown, Search } from "lucide-react";
-
-const faqCategories = [
- {
- name: "Getting Started",
- faqs: [
- {
- question: "What hardware do I need to get started with MASH?",
- answer: "You will need a compatible microcontroller (Raspberry Pi recommended), environmental sensors for temperature, humidity, and CO2, relay boards for equipment control, and the necessary power supply. We provide a detailed hardware list in our documentation with recommended components and where to purchase them."
- },
- {
- question: "Is MASH suitable for beginners?",
- answer: "Yes! MASH is designed to be user-friendly for both beginners and experienced cultivators. Our comprehensive documentation and tutorials will guide you through the setup process step by step. The mobile app provides an intuitive interface for monitoring and control."
- },
- {
- question: "How long does it take to set up the system?",
- answer: "A basic setup typically takes 2-4 hours for hardware assembly and software configuration. More complex setups with multiple chambers may take longer. Our getting started guide walks you through each step to ensure a smooth setup process."
- },
- ]
- },
- {
- name: "Mobile App",
- faqs: [
- {
- question: "Is the mobile app available for both iOS and Android?",
- answer: "Yes, the MASH mobile application is available for both iOS and Android devices. You can download it from the App Store, Google Play Store, or directly from our website for sideloading."
- },
- {
- question: "Can I use the app when I don't have internet?",
- answer: "Yes, the MASH app includes an offline mode that allows you to view cached data and recent readings even without an internet connection. However, real-time monitoring and control features require an active connection to your MASH system."
- },
- {
- question: "How do I receive alerts on my phone?",
- answer: "The MASH app supports push notifications for critical events. You can configure which alerts you want to receive in the app settings, including temperature thresholds, humidity levels, and system status changes."
- },
- ]
- },
- {
- name: "Features",
- faqs: [
- {
- question: "Can I manage multiple growing chambers?",
- answer: "Absolutely! MASH supports multiple chambers with independent climate zones. You can monitor and control each chamber separately with custom settings for different mushroom species. The dashboard provides an overview of all chambers at once."
- },
- {
- question: "What sensors are supported?",
- answer: "MASH supports a wide range of sensors including DHT22/AM2302 for temperature and humidity, MH-Z19 for CO2 levels, BH1750 for light intensity, and soil moisture sensors for substrate monitoring. Custom sensor integration is possible through our API."
- },
- {
- question: "Can I create custom growing recipes?",
- answer: "Yes, MASH allows you to create, save, and apply custom growing recipes for different mushroom species. Each recipe can specify target temperature, humidity, CO2 levels, and light cycles for different growth phases."
- },
- ]
- },
- {
- name: "Data & Security",
- faqs: [
- {
- question: "Is my data secure?",
- answer: "Yes, all data is encrypted in transit using TLS and at rest. We use industry-standard security practices and offer both cloud and local storage options for complete control over your data. You can also export your data at any time."
- },
- {
- question: "How long is historical data stored?",
- answer: "By default, MASH stores up to 2 years of historical data in the cloud. Local storage limits depend on your hardware configuration. You can export data in CSV or JSON formats for long-term archival."
- },
- {
- question: "Can I export my data?",
- answer: "Yes, you can export your data in multiple formats including CSV, JSON, and Excel. The export feature allows you to select specific date ranges and data types for analysis in external tools."
- },
- ]
- },
- {
- name: "Support",
- faqs: [
- {
- question: "What kind of support do you offer?",
- answer: "We offer email support, comprehensive documentation, video tutorials, and an active community forum on Facebook. Premium support packages with faster response times are available for commercial operations."
- },
- {
- question: "How do I report a bug or request a feature?",
- answer: "You can report bugs or request features through our GitHub repository, community forum, or by emailing our support team directly. We actively review all feedback and incorporate community suggestions into our development roadmap."
- },
- {
- question: "Is there a warranty for the hardware?",
- answer: "Hardware components should be purchased from their respective manufacturers, who provide their own warranties. For MASH-specific hardware kits (when available), we offer a 1-year warranty covering manufacturing defects."
- },
- ]
- },
-];
-
-function FAQItem({ question, answer }: { question: string; answer: string }) {
- const [isOpen, setIsOpen] = useState(false);
-
- return (
-
-
- {isOpen && (
-
- {answer}
-
- )}
-
- );
-}
-
-export default function FAQPage() {
- const [searchQuery, setSearchQuery] = useState("");
-
- const filteredCategories = faqCategories.map(category => ({
- ...category,
- faqs: category.faqs.filter(
- faq =>
- faq.question.toLowerCase().includes(searchQuery.toLowerCase()) ||
- faq.answer.toLowerCase().includes(searchQuery.toLowerCase())
- )
- })).filter(category => category.faqs.length > 0);
-
- return (
-
-
-
-
-
- Frequently Asked Questions
-
-
- Find answers to common questions about MASH
-
-
- {/* Search */}
-
-
- setSearchQuery(e.target.value)}
- className="w-full pl-12 pr-4 py-3 rounded-full border-default bg-background text-primary focus:ring-2 focus:ring-green focus:border-transparent"
- />
-
-
-
-
-
-
-
- {filteredCategories.length === 0 ? (
-
-
- No FAQs found matching your search.
-
-
- ) : (
- filteredCategories.map((category) => (
-
-
- {category.name}
-
-
- {category.faqs.map((faq, index) => (
-
- ))}
-
-
- ))
- )}
-
- {/* CTA */}
-
-
Still Have Questions?
-
- Can't find the answer you're looking for? Our support team is here to help.
-
-
- Contact Support
-
-
-
-
-
- );
+import type { Metadata } from "next";
+import { getLandingPageData } from "@/lib/sanity";
+import FAQPageClient from "./faq-client";
+
+export const metadata: Metadata = {
+ title: "FAQ - MASH",
+ description: "Frequently asked questions about the MASH mushroom cultivation automation system",
+};
+
+export default async function FAQPage() {
+ let data = null;
+ try {
+ data = await getLandingPageData();
+ } catch {
+ // Sanity fetch failed - FAQPageClient will use hardcoded defaults
+ }
+
+ return
;
}
diff --git a/app/globals.css b/app/globals.css
index 5577e1d..1cb6040 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1,5 +1,9 @@
@import "tailwindcss";
+@source not "../**/*.md";
+@source not "../studio/**";
+@source not "../coverage/**";
+
@theme {
/* Map custom properties to Tailwind classes */
--color-background: rgb(var(--color-background));
@@ -36,40 +40,40 @@
/* Background Colors */
--color-background: 255 255 255; /* white */
- --color-background-alt: 249 250 251; /* gray-50 */
+ --color-background-alt: 248 250 252; /* slate-50 */
--color-background-card: 255 255 255; /* white */
- --color-background-section: 249 250 251; /* gray-50 */
- --color-background-component: 243 244 246; /* gray-100 */
+ --color-background-section: 248 250 252; /* slate-50 */
+ --color-background-component: 241 245 249; /* slate-100 */
/* Component-specific backgrounds */
--color-background-hero-start: 240 253 244; /* green-50 */
- --color-background-hero-end: 220 252 231; /* green-100 */
+ --color-background-hero-end: 236 253 245; /* green-50 lighter */
--color-background-features: 255 255 255; /* white */
- --color-background-demo: 249 250 251; /* gray-50 */
+ --color-background-demo: 248 250 252; /* slate-50 */
--color-background-scope-start: 240 253 244; /* green-50 */
- --color-background-scope-end: 220 252 231; /* green-100 */
+ --color-background-scope-end: 236 253 245; /* green-50 lighter */
--color-background-documentation: 255 255 255; /* white */
--color-background-download-start: 22 163 74; /* green-600 */
--color-background-download-end: 22 101 52; /* green-800 */
--color-background-support: 255 255 255; /* white */
--color-background-navigation: 255 255 255; /* white */
- --color-background-footer: 17 24 39; /* gray-900 */
+ --color-background-footer: 15 23 42; /* slate-900 */
/* Surface Colors */
--color-surface: 255 255 255; /* white */
- --color-surface-hover: 249 250 251; /* gray-50 */
+ --color-surface-hover: 248 250 252; /* slate-50 */
--color-surface-elevated: 255 255 255; /* white */
/* Text Colors */
- --color-text-primary: 17 24 39; /* gray-900 */
- --color-text-secondary: 75 85 99; /* gray-600 */
- --color-text-tertiary: 156 163 175; /* gray-400 */
+ --color-text-primary: 15 23 42; /* slate-900 */
+ --color-text-secondary: 71 85 105; /* slate-600 */
+ --color-text-tertiary: 148 163 184; /* slate-400 */
--color-text-inverse: 255 255 255; /* white */
--color-text-green: 22 163 74; /* green-600 */
/* Border Colors */
- --color-border: 229 231 235; /* gray-200 */
- --color-border-hover: 209 213 219; /* gray-300 */
+ --color-border: 226 232 240; /* slate-200 */
+ --color-border-hover: 203 213 225; /* slate-300 */
--color-border-focus: 22 163 74; /* green-600 */
/* Accent Colors */
@@ -109,41 +113,41 @@
--color-primary-900: 220 252 231; /* green-100 */
/* Background Colors */
- --color-background: 17 24 39; /* gray-900 */
- --color-background-alt: 31 41 55; /* gray-800 */
- --color-background-card: 31 41 55; /* gray-800 */
- --color-background-section: 31 41 55; /* gray-800 */
- --color-background-component: 55 65 81; /* gray-700 */
+ --color-background: 15 23 42; /* slate-900 */
+ --color-background-alt: 30 41 59; /* slate-800 */
+ --color-background-card: 30 41 59; /* slate-800 */
+ --color-background-section: 30 41 59; /* slate-800 */
+ --color-background-component: 51 65 85; /* slate-700 */
/* Component-specific backgrounds */
- --color-background-hero-start: 17 24 39; /* gray-900 */
- --color-background-hero-end: 31 41 55; /* gray-800 */
- --color-background-features: 17 24 39; /* gray-900 */
- --color-background-demo: 31 41 55; /* gray-800 */
- --color-background-scope-start: 31 41 55; /* gray-800 */
- --color-background-scope-end: 17 24 39; /* gray-900 */
- --color-background-documentation: 17 24 39; /* gray-900 */
+ --color-background-hero-start: 15 23 42; /* slate-900 */
+ --color-background-hero-end: 30 41 59; /* slate-800 */
+ --color-background-features: 15 23 42; /* slate-900 */
+ --color-background-demo: 30 41 59; /* slate-800 */
+ --color-background-scope-start: 30 41 59; /* slate-800 */
+ --color-background-scope-end: 15 23 42; /* slate-900 */
+ --color-background-documentation: 15 23 42; /* slate-900 */
--color-background-download-start: 22 163 74; /* green-600 */
--color-background-download-end: 22 101 52; /* green-800 */
- --color-background-support: 17 24 39; /* gray-900 */
- --color-background-navigation: 17 24 39; /* gray-900 */
- --color-background-footer: 3 7 18; /* gray-950 */
+ --color-background-support: 15 23 42; /* slate-900 */
+ --color-background-navigation: 15 23 42; /* slate-900 */
+ --color-background-footer: 2 6 23; /* slate-950 */
/* Surface Colors */
- --color-surface: 31 41 55; /* gray-800 */
- --color-surface-hover: 55 65 81; /* gray-700 */
- --color-surface-elevated: 55 65 81; /* gray-700 */
+ --color-surface: 30 41 59; /* slate-800 */
+ --color-surface-hover: 51 65 85; /* slate-700 */
+ --color-surface-elevated: 51 65 85; /* slate-700 */
/* Text Colors */
- --color-text-primary: 255 255 255; /* white */
- --color-text-secondary: 209 213 219; /* gray-300 */
- --color-text-tertiary: 156 163 175; /* gray-400 */
- --color-text-inverse: 17 24 39; /* gray-900 */
+ --color-text-primary: 248 250 252; /* slate-50 */
+ --color-text-secondary: 203 213 225; /* slate-300 */
+ --color-text-tertiary: 148 163 184; /* slate-400 */
+ --color-text-inverse: 15 23 42; /* slate-900 */
--color-text-green: 34 197 94; /* green-500 */
/* Border Colors */
- --color-border: 55 65 81; /* gray-700 */
- --color-border-hover: 75 85 99; /* gray-600 */
+ --color-border: 51 65 85; /* slate-700 */
+ --color-border-hover: 71 85 105; /* slate-600 */
--color-border-focus: 34 197 94; /* green-500 */
/* Accent Colors */
@@ -306,5 +310,22 @@ html {
}
section {
- scroll-margin-top: 4rem;
+ scroll-margin-top: 5rem;
+}
+
+/* 3D perspective for parallax containers */
+.perspective-1000 {
+ perspective: 1000px;
+}
+
+/* GPU-accelerated transforms for smooth parallax */
+.will-change-transform {
+ will-change: transform;
+}
+
+/* Smooth scroll snap sections (optional, for mobile) */
+@media (prefers-reduced-motion: no-preference) {
+ .parallax-container {
+ will-change: transform, opacity;
+ }
}
diff --git a/app/layout.tsx b/app/layout.tsx
index 96693b3..61203f4 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,17 +1,27 @@
import type { Metadata } from "next";
import "./globals.css";
import { ThemeProvider } from "next-themes";
+import { SmoothScrollProvider } from "@/components/providers/smooth-scroll-provider";
+import FloatingNav from "@/components/FloatingNav";
+import { getLandingPageDataCached } from "@/lib/sanity";
export const metadata: Metadata = {
title: "MASH - Mushroom Automation System Hub",
description: "Professional mushroom cultivation automation platform with advanced monitoring, climate control, and mobile app integration.",
};
-export default function RootLayout({
+export default async function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
+ let landingData = null;
+ try {
+ landingData = await getLandingPageDataCached();
+ } catch {
+ // Fallback: FloatingNav renders with defaults when data is unavailable
+ }
+
return (
@@ -21,7 +31,10 @@ export default function RootLayout({
enableSystem={true}
disableTransitionOnChange
>
- {children}
+
+
+ {children}
+
diff --git a/app/license/page.tsx b/app/license/page.tsx
index 4ab68e7..43fa449 100644
--- a/app/license/page.tsx
+++ b/app/license/page.tsx
@@ -133,7 +133,7 @@ SOFTWARE.`}
{/* Source Code */}
-