Salin dan Bagikan
Integrasi Tailwind CSS dengan Hugo: Setup dan Konfigurasi Lengkap - Panduan lengkap integrasi Tailwind CSS dengan Hugo. Pelajari setup, konfigurasi PostCSS, dan …

Integrasi Tailwind CSS dengan Hugo: Setup dan Konfigurasi Lengkap

Integrasi Tailwind CSS dengan Hugo: Setup dan Konfigurasi Lengkap

Tailwind CSS adalah utility-first CSS framework yang sangat populer di kalangan developer modern. Integrasi Tailwind CSS dengan Hugo memungkinkan Anda membangun website yang beautiful dan responsive dengan efisiensi pengembangan yang tinggi. Dalam panduan ini, kita akan membahas secara komprehensif cara mengintegrasikan Tailwind CSS dengan Hugo, mulai dari setup dasar hingga konfigurasi advanced untuk workflow pengembangan yang optimal.

Kombinasi Hugo dan Tailwind CSS adalah pilihan yang powerful karena Hugo menyediakan static site generation yang cepat dengan sistem templating yang powerful, sementara Tailwind CSS menawarkan pendekatan utility-first yang sangat fleksibel untuk styling. Hugo Extended (versi dengan dukungan Sass) diperlukan untuk processing Tailwind CSS karena memerlukan PostCSS dan Autoprefixer.

Persiapan dan Instalasi

Sebelum memulai integrasi, pastikan Anda telah menginstal Hugo Extended dan Node.js di sistem Anda. Hugo Extended diperlukan karena ia mendukung asset pipeline yang diperlukan untuk memproses Tailwind CSS.

Memeriksa Versi Hugo

hugo version

Pastikan output menunjukkan “extended”. Jika tidak, Anda perlu menginstal Hugo Extended sesuai dengan sistem operasi Anda yang telah dibahas di artikel sebelumnya.

Inisialisasi Proyek Node.js

Jika Anda belum memiliki package.json di proyek Hugo, inisialisasikan:

npm init -y

Ini akan membuat file package.json yang diperlukan untuk mengelola dependencies Tailwind CSS.

Instalasi Tailwind CSS dan Dependencies

Instal Tailwind CSS, PostCSS, dan Autoprefixer sebagai dev dependencies:

npm install -D tailwindcss@latest postcss@latest autoprefixer@latest

Atau menggunakan Yarn:

yarn add -D tailwindcss@latest postcss@latest autoprefixer@latest

Konfigurasi Tailwind CSS

Buat file konfigurasi Tailwind CSS dengan menjalankan:

npx tailwindcss init -p

Perintah ini akan membuat dua file: tailwind.config.js dan postcss.config.js.

Konfigurasi tailwind.config.js

Edit tailwind.config.js untuk menyesuaikan dengan proyek Hugo Anda:

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    './hugo.toml',
    './hugo_*.toml',
    './layouts/**/*.html',
    './content/**/*.md',
    './content/**/*.html',
    './static/**/*.html',
  ],
  darkMode: 'class',
  theme: {
    extend: {
      colors: {
        primary: {
          50: '#f0f9ff',
          100: '#e0f2fe',
          200: '#bae6fd',
          300: '#7dd3fc',
          400: '#38bdf8',
          500: '#0ea5e9',
          600: '#0284c7',
          700: '#0369a1',
          800: '#075985',
          900: '#0c4a6e',
          950: '#082f49',
        },
        secondary: {
          50: '#f8fafc',
          100: '#f1f5f9',
          200: '#e2e8f0',
          300: '#cbd5e1',
          400: '#94a3b8',
          500: '#64748b',
          600: '#475569',
          700: '#334155',
          800: '#1e293b',
          900: '#0f172a',
          950: '#020617',
        },
      },
      fontFamily: {
        sans: ['Inter', 'system-ui', 'sans-serif'],
        serif: ['Merriweather', 'Georgia', 'serif'],
        mono: ['JetBrains Mono', 'monospace'],
      },
      typography: (theme) => ({
        DEFAULT: {
          css: {
            color: theme('colors.gray.700'),
            a: {
              color: theme('colors.primary.600'),
              '&:hover': {
                color: theme('colors.primary.700'),
              },
            },
          },
        },
      }),
    },
  },
  plugins: [
    require('@tailwindcss/typography'),
    require('@tailwindcss/forms'),
    require('@tailwindcss/aspect-ratio'),
  ],
}

Konfigurasi postcss.config.js

File postcss.config.js yang dihasilkan:

module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
  },
}

Membuat File CSS Tailwind

Buat file CSS utama yang mengimpor Tailwind directives:

/* assets/css/main.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
  html {
    scroll-behavior: smooth;
  }
  
  body {
    @apply antialiased text-gray-900 bg-white;
  }
  
  h1, h2, h3, h4, h5, h6 {
    @apply font-bold tracking-tight;
  }
}

@layer components {
  .btn {
    @apply inline-flex items-center justify-center px-4 py-2 
           font-medium rounded-lg transition-colors duration-200
           focus:outline-none focus:ring-2 focus:ring-offset-2;
  }
  
  .btn-primary {
    @apply btn bg-primary-600 text-white hover:bg-primary-700 
           focus:ring-primary-500;
  }
  
  .btn-secondary {
    @apply btn bg-secondary-200 text-secondary-800 hover:bg-secondary-300
           focus:ring-secondary-400;
  }
  
  .card {
    @apply bg-white rounded-xl shadow-md overflow-hidden 
           transition-shadow duration-200 hover:shadow-lg;
  }
  
  .input {
    @apply w-full px-4 py-2 border border-gray-300 rounded-lg
           focus:outline-none focus:ring-2 focus:ring-primary-500 
           focus:border-transparent transition-colors;
  }
}

@layer utilities {
  .text-balance {
    text-wrap: balance;
  }
  
  .gradient-text {
    @apply bg-clip-text text-transparent bg-gradient-to-r 
           from-primary-600 to-secondary-600;
  }
}

Menghubungkan CSS dengan Hugo

Hugo menggunakan assets pipeline untuk memproses CSS. Ada beberapa cara untuk menghubungkan Tailwind CSS dengan Hugo.

Buat layout partial untuk CSS:

{{/* layouts/partials/css.html */}}
{{- $style := resources.Get "css/main.css" | resources.PostCSS | minify | fingerprint -}}
<link rel="stylesheet" href="{{ $style.RelPermalink }}" integrity="{{ $style.Data.Integrity }}">

Tambahkan di head template:

{{/* layouts/_default/baseof.html */}}
<!DOCTYPE html>
<html lang="{{ .Site.LanguageCode }}">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ .Title }} | {{ .Site.Title }}</title>
    {{ partial "css.html" . }}
</head>
<body>
    {{ block "main" . }}{{ end }}
</body>
</html>

Metode 2: Menggunakan Hugo Modules

Alternatif lain adalah menggunakan Hugo modules untuk Tailwind:

# hugo.toml
[module]
  [module.hugoVersion]
    extended = true
    min = "0.110.0"
  [[module.imports]]
    path = "github.com/onepointcollab/one_planet"

Development Workflow

Untuk development, gunakan Hugo server dengan live reload:

hugo server

Saat development, Tailwind akan watch file Anda dan otomatis rebuild saat ada perubahan. Untuk development yang lebih cepat, Anda juga bisa menggunakan npm scripts:

{
  "scripts": {
    "dev": "concurrently \"hugo server\" \"npm run watch:css\"",
    "build": "hugo --minify && npm run build:css",
    "build:css": "tailwindcss -i ./assets/css/main.css -o ./static/css/main.css --minify",
    "watch:css": "tailwindcss -i ./assets/css/main.css -o ./static/css/main.css --watch"
  },
  "devDependencies": {
    "autoprefixer": "^10.4.17",
    "concurrently": "^8.2.2",
    "postcss": "^8.4.35",
    "tailwindcss": "^3.4.1"
  }
}

Tailwind CSS dengan Hugo Shortcodes

Tailwind CSS sangat powerful ketika dikombinasikan dengan Hugo shortcodes untuk membuat komponen reusable:

{{/* layouts/shortcodes/button.html */}}
{{- $type := .Get "type" | default "primary" -}}
{{- $href := .Get "href" | default "#" -}}
{{- $size := .Get "size" | default "md" -}}
<a href="{{ $href }}" 
   class="btn btn-{{ $type }} btn-{{ $size }}
          {{- if eq $size "sm" }} text-sm px-3 py-1.5
          {{- else if eq $size "lg" }} text-lg px-6 py-3
          {{- else }} text-base px-4 py-2{{- end }}">
    {{ .Inner }}
</a>
{{/* layouts/shortcodes/card.html */}}
{{- $class := .Get "class" | default "" -}}
<div class="card {{ $class }}">
    {{- with .Get "image" -}}
        <img src="{{ . }}" alt="" class="w-full h-48 object-cover">
    {{- end -}}
    <div class="p-6">
        {{- with .Get "title" -}}
            <h3 class="text-xl font-bold mb-2">{{ . }}</h3>
        {{- end -}}
        <div class="prose">
            {{ .Inner | .Page.RenderString }}
        </div>
    </div>
</div>

Responsive Design dengan Tailwind

Tailwind CSS menyediakan breakpoint utilities yang powerful untuk responsive design:

<nav class="flex flex-col md:flex-row md:items-center md:justify-between p-4">
    <div class="flex items-center">
        <img src="/logo.svg" alt="Logo" class="h-8 w-8 md:h-10 md:w-10">
        <span class="ml-2 text-lg md:text-xl font-bold">My Site</span>
    </div>
    
    <div class="mt-4 md:mt-0 flex flex-col md:flex-row gap-4">
        <a href="/" class="text-sm md:text-base hover:text-primary-600">Beranda</a>
        <a href="/about" class="text-sm md:text-base hover:text-primary-600">Tentang</a>
        <a href="/contact" class="text-sm md:text-base hover:text-primary-600">Kontak</a>
    </div>
</nav>

Dark Mode dengan Tailwind dan Hugo

Implementasi dark mode dengan Tailwind dan Hugo:

{{/* layouts/partials/theme-toggle.html */}}
<script>
  if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
    document.documentElement.classList.add('dark');
  } else {
    document.documentElement.classList.remove('dark');
  }
</script>

<button id="theme-toggle" class="p-2 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-700">
    <svg id="sun-icon" class="w-5 h-5 hidden dark:block" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path>
    </svg>
    <svg id="moon-icon" class="w-5 h-5 block dark:hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path>
    </svg>
</button>

<script>
document.getElementById('theme-toggle').addEventListener('click', () => {
    if (document.documentElement.classList.contains('dark')) {
        document.documentElement.classList.remove('dark');
        localStorage.theme = 'light';
    } else {
        document.documentElement.classList.add('dark');
        localStorage.theme = 'dark';
    }
});
</script>

Production Build

Untuk production build dengan Tailwind CSS, Hugo akan memproses CSS melalui pipeline:

hugo --minify

Pastikan PostCSS dan Tailwind terinstal dengan benar dan path content di tailwind.config.js mencakup semua file yang menggunakan Tailwind classes.

Troubleshooting Common Issues

Beberapa masalah umum yang mungkin dihadapi beserta solusinya perlu diperhatikan. Jika Tailwind classes tidak berfungsi, pastikan file CSS di-import dengan benar di template dan path di content sudah ditambahkan di tailwind.config.js. Jika ada error “PostCSS not found”, instal PostCSS sebagai dependency dengan npm install -D postcss. Jika Hugo Extended tidak terinstal, reinstall Hugo dengan versi extended yang mendukung asset pipeline.

Kesimpulan

Integrasi Tailwind CSS dengan Hugo memberikan workflow pengembangan yang powerful dan efisien. Dengan setup yang benar, Anda dapat membangun website yang beautiful, responsive, dan performant. Kombinasi Hugo untuk static site generation dan Tailwind CSS untuk styling adalah pilihan yang sangat direkomendasikan untuk proyek web modern.

Artikel Terkait

Link Postingan : https://www.tirinfo.com/integrasi-tailwind-css-hugo/

Hendra WIjaya
Tirinfo
6 minutes.
3 February 2026