Documentation

Frontend

Overview

The framework uses Tailwind CSS for styling with server-side HTML rendering and optional JavaScript enhancements.

Tailwind CSS Setup

Installation

npm install

CSS Compilation

# Development with watch
npx tailwindcss -i input.css -o ./assets/css/output.css --watch

# Production build
npx tailwindcss -i input.css -o ./assets/css/output.css --minify

Basic HTML Structure

Template Layout

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{.title}}</title>
    <link href="/assets/css/output.css" rel="stylesheet">
</head>
<body class="bg-gray-50">
    <div class="min-h-screen">
        {{template "navbar.html"}}
        
        <main class="container mx-auto px-4 py-8">
            {{.content}}
        </main>
    </div>
</body>
</html>

Component Styling

<!-- Cards -->
<div class="bg-white rounded-lg shadow-md p-6">
    <h2 class="text-xl font-semibold mb-4">{{.title}}</h2>
    <p class="text-gray-600">{{.content}}</p>
</div>

<!-- Buttons -->
<button class="bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded transition-colors">
    Save Changes
</button>

<!-- Forms -->
<input class="block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500" 
       type="text" name="name">

JavaScript Integration

Basic Interactivity

<script>
function confirmDelete(name) {
    return confirm(`Delete ${name}?`);
}
</script>

<button onclick="return confirmDelete('{{.garden.Name}}')" 
        class="text-red-600 hover:text-red-800">
    Delete
</button>

HTMX for Dynamic Content

<div hx-get="/gardens/{{.Id}}/plants" 
     hx-trigger="click"
     hx-target="#plant-list">
    Load Plants
</div>
<div id="plant-list"></div>

Responsive Design

Mobile-First Approach

<!-- Responsive grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
    {{range .items}}
    <div class="bg-white rounded-lg p-4">
        {{.content}}
    </div>
    {{end}}
</div>

<!-- Responsive navigation -->
<nav class="hidden md:block">
    <!-- Desktop menu -->
</nav>
<div class="md:hidden">
    <!-- Mobile menu -->
</div>