Skip to content

Latest commit

Β 

History

History
535 lines (416 loc) Β· 10.7 KB

File metadata and controls

535 lines (416 loc) Β· 10.7 KB

Implementation Guide

🎯 Overview

This guide covers the complete implementation of the Minimal DAO landing page, from initial setup to production deployment.


πŸ“‹ Phase 1: Initial Setup (Day 1)

1. Repository Setup

# Clone the repository
git clone https://github.com/MinimalTechSolutions/app.git
cd app

# Install dependencies
npm install

# Create environment file
cp .env.example .env.local

2. Configure Environment Variables

Edit .env.local:

NEXT_PUBLIC_SITE_URL=http://localhost:3000
NEXT_PUBLIC_CONTACT_EMAIL=byteminimal@gmail.com

3. Asset Preparation

Place all required images in /public/images/:

public/images/
β”œβ”€β”€ logo/
β”‚   β”œβ”€β”€ minimal-wide-logo-trans.png (main logo)
β”‚   └── minimal-icon.png (favicon source)
β”œβ”€β”€ hero/
β”‚   └── minimal-wallpaper00.png (hero background)
β”œβ”€β”€ services/
β”‚   β”œβ”€β”€ minimal-mobile-dev.png
β”‚   β”œβ”€β”€ minimal-web-dev.png
β”‚   └── minimal-iot-dev.png
└── og-image.png (1200x630 for social sharing)

4. Generate Favicons

Use favicon.io or RealFaviconGenerator:

public/
β”œβ”€β”€ favicon.ico
β”œβ”€β”€ favicon-16x16.png
β”œβ”€β”€ favicon-32x32.png
└── apple-touch-icon.png

5. First Run

npm run dev

Visit http://localhost:3000 to see your site!


🎨 Phase 2: Customization (Day 2-3)

1. Brand Colors

Edit src/app/globals.css:

:root {
  /* Update these values to match your brand */
  --color-background: #FFFFFF;
  --color-foreground: #000000;
  --color-accent: #000000;
}

2. Typography

Update fonts in src/app/layout.tsx:

// Replace with your preferred fonts
import { YourDisplayFont, YourBodyFont } from 'next/font/google'

const displayFont = YourDisplayFont({
  subsets: ['latin'],
  variable: '--font-display',
})

3. Content Updates

Homepage Hero

Edit src/components/sections/Hero.tsx:

  • Update heading text
  • Modify subheading
  • Change CTA button text and links

Pricing

Edit src/components/sections/PricingCards.tsx:

  • Update pricing tiers
  • Modify features lists
  • Change prices and CTAs

Services

Edit src/components/sections/Services.tsx:

  • Update service titles and descriptions
  • Replace service images
  • Modify service icons

4. Navigation

Edit src/lib/constants.ts:

export const NAVIGATION_LINKS = [
  { name: 'Your Link', href: '/your-route' },
  // Add/remove as needed
]

5. Contact Information

Update src/lib/constants.ts:

export const CONTACT_INFO = {
  email: 'your-email@example.com',
  address: {
    street: 'Your Street',
    city: 'Your City',
    // ...
  },
}

πŸ”§ Phase 3: Feature Implementation (Day 4-5)

1. Add New Pages

Create a new page at src/app/your-page/page.tsx:

import { Metadata } from 'next'

export const metadata: Metadata = {
  title: 'Your Page Title',
  description: 'Your page description',
}

export default function YourPage() {
  return (
    <div className="container-custom py-20">
      <h1>Your Page Content</h1>
    </div>
  )
}

2. Create Reusable Components

Example Button component at src/components/ui/Button.tsx:

import { ButtonHTMLAttributes } from 'react'
import { cn } from '@/lib/utils'

interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
  variant?: 'primary' | 'secondary'
  size?: 'sm' | 'md' | 'lg'
}

export function Button({
  variant = 'primary',
  size = 'md',
  className,
  children,
  ...props
}: ButtonProps) {
  return (
    <button
      className={cn(
        'font-medium transition-all duration-300',
        variant === 'primary' && 'btn-primary',
        variant === 'secondary' && 'btn-secondary',
        className
      )}
      {...props}
    >
      {children}
    </button>
  )
}

3. Add Animations

Create scroll-reveal animation:

// src/components/animations/ScrollReveal.tsx
'use client'

import { useEffect, useRef, useState } from 'react'

export function ScrollReveal({ children, className = '' }) {
  const [isVisible, setIsVisible] = useState(false)
  const ref = useRef<HTMLDivElement>(null)

  useEffect(() => {
    const observer = new IntersectionObserver(
      ([entry]) => {
        if (entry.isIntersecting) {
          setIsVisible(true)
          observer.disconnect()
        }
      },
      { threshold: 0.1 }
    )

    if (ref.current) observer.observe(ref.current)
    return () => observer.disconnect()
  }, [])

  return (
    <div
      ref={ref}
      className={`transition-all duration-1000 ${
        isVisible
          ? 'opacity-100 translate-y-0'
          : 'opacity-0 translate-y-10'
      } ${className}`}
    >
      {children}
    </div>
  )
}

πŸ“§ Phase 4: Forms & Interactions (Day 6)

Contact Form Implementation

// src/components/ContactForm.tsx
'use client'

import { useState } from 'react'

export function ContactForm() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    message: '',
  })
  const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle')

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault()
    setStatus('loading')

    try {
      // Implement your form submission logic
      const response = await fetch('/api/contact', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(formData),
      })

      if (response.ok) {
        setStatus('success')
        setFormData({ name: '', email: '', message: '' })
      } else {
        setStatus('error')
      }
    } catch (error) {
      setStatus('error')
    }
  }

  return (
    <form onSubmit={handleSubmit} className="space-y-6">
      <div>
        <label htmlFor="name" className="block text-sm font-medium mb-2">
          Name
        </label>
        <input
          type="text"
          id="name"
          value={formData.name}
          onChange={(e) => setFormData({ ...formData, name: e.target.value })}
          required
          className="w-full px-4 py-3 border border-minimal-gray-300 focus:border-minimal-black focus:ring-2 focus:ring-minimal-black focus:ring-offset-2 transition-all"
        />
      </div>

      <div>
        <label htmlFor="email" className="block text-sm font-medium mb-2">
          Email
        </label>
        <input
          type="email"
          id="email"
          value={formData.email}
          onChange={(e) => setFormData({ ...formData, email: e.target.value })}
          required
          className="w-full px-4 py-3 border border-minimal-gray-300 focus:border-minimal-black focus:ring-2 focus:ring-minimal-black focus:ring-offset-2 transition-all"
        />
      </div>

      <div>
        <label htmlFor="message" className="block text-sm font-medium mb-2">
          Message
        </label>
        <textarea
          id="message"
          rows={5}
          value={formData.message}
          onChange={(e) => setFormData({ ...formData, message: e.target.value })}
          required
          className="w-full px-4 py-3 border border-minimal-gray-300 focus:border-minimal-black focus:ring-2 focus:ring-minimal-black focus:ring-offset-2 transition-all"
        />
      </div>

      <button
        type="submit"
        disabled={status === 'loading'}
        className="btn-primary w-full disabled:opacity-50"
      >
        {status === 'loading' ? 'Sending...' : 'Send Message'}
      </button>

      {status === 'success' && (
        <p className="text-green-600">Message sent successfully!</p>
      )}
      {status === 'error' && (
        <p className="text-red-600">Failed to send message. Please try again.</p>
      )}
    </form>
  )
}

πŸ§ͺ Phase 5: Testing (Day 7)

1. Manual Testing Checklist

  • All pages load without errors
  • Navigation works correctly
  • All links go to correct destinations
  • Images load and are properly sized
  • Forms submit successfully
  • Mobile responsive on all screen sizes
  • Animations play smoothly
  • No console errors

2. Browser Testing

Test on:

  • Chrome (latest)
  • Firefox (latest)
  • Safari (latest)
  • Edge (latest)
  • Mobile Safari (iOS)
  • Chrome Mobile (Android)

3. Performance Testing

Run Lighthouse audit:

npm run build
npm start
# Open DevTools > Lighthouse > Run Audit

Target scores:

  • Performance: 95+
  • Accessibility: 100
  • Best Practices: 100
  • SEO: 100

4. Accessibility Testing

Use tools:

  • WAVE Extension
  • axe DevTools
  • Keyboard navigation test
  • Screen reader test

πŸš€ Phase 6: Deployment (Day 8)

1. Pre-Deployment Checklist

  • All content finalized
  • Images optimized
  • Environment variables set
  • Meta tags configured
  • Analytics set up
  • Error tracking configured
  • Performance targets met

2. Deploy to Vercel

# Install Vercel CLI
npm i -g vercel

# Deploy
vercel

# Production deployment
vercel --prod

3. Post-Deployment

  • Test live site
  • Submit sitemap to Google
  • Monitor analytics
  • Check error logs
  • Test from different locations

πŸ“Š Phase 7: Monitoring & Optimization (Ongoing)

1. Set Up Monitoring

  • Vercel Analytics
  • Google Search Console
  • Error tracking (Sentry)
  • Uptime monitoring

2. Regular Tasks

Weekly:

  • Check analytics
  • Review errors
  • Monitor performance

Monthly:

  • Update dependencies
  • Content updates
  • SEO optimization

Quarterly:

  • Major feature updates
  • Design improvements
  • Security audit

πŸ†˜ Troubleshooting

Common Issues

Images Not Loading

// Ensure images are in public directory
// Use proper path: /images/your-image.png
<Image src="/images/your-image.png" ... />

Build Errors

# Clear cache and rebuild
rm -rf .next
npm run build

TypeScript Errors

# Run type check
npm run type-check

# Fix common issues in tsconfig.json

Styling Not Applied

# Restart dev server
# Check Tailwind config
# Verify class names

πŸ“š Resources

Documentation

Design Inspiration

Tools


🀝 Getting Help

  • Documentation Issues: Check this guide and README.md
  • Technical Problems: Create GitHub issue
  • General Questions: Email byteminimal@gmail.com
  • Community: Join our discussions

Happy Building! πŸŽ‰