A hybrid component and utility framework for Jekyll · v1.4.0
Thicket is an accessible, Jekyll-native UI framework pairing reusable Liquid components with token-based utility classes, an earthy palette, and editorial typography. It is built with:
- Jekyll + Liquid
- SCSS + CSS Custom Properties
- Vanilla JavaScript (ES modules)
- HTML5 semantic markup
Use the included design tokens and components as a starting point for SaaS, portfolio, blog, and documentation sites, then make the system your own.
- Thicket's own woodland palette, editorial type, and seed-inspired mark
- Design token system for rebranding without rewriting components
- Dark Mode (light / dark / system) with localStorage persistence
- Accessible components (WCAG 2.2 AA principles)
- SEO metadata through
jekyll-seo-tagplus site-level Organization structured data - Opt-in button ripple (
ripple=true) and warm card glare (glare=true) - Optional card border beam (
border_beam=true) for featured surfaces - Mobile-first responsive design
- Minimal dependencies
- Progressive enhancement
- Component API via Liquid includes
- Token-based utility classes for responsive layouts and one-off styling
- Jekyll-aware CSS purge CLI, searchable combobox, and rich customizable select popup
- Self-hosted documentation ready
- Ready for GitHub Pages & Cloudflare Pages
Thicket combines reusable Liquid components with u-* utility classes. Use components for consistent interface patterns and utilities for page-specific layout or styling; both use the same theme tokens and support dark mode.
<div class="u-grid u-grid-cols-1 u-md-grid-cols-2 u-gap-4 u-lg-gap-8">
<section class="u-p-6 u-bg-surface u-text-default">
<h2 class="u-font-display u-text-2xl">Utility-first, Thicket-style</h2>
</section>
</div>Utilities are documented in Layout Primitives. They are compiled as part of the framework stylesheet and do not require a separate JavaScript or CSS build step.
- Ruby >= 3.0
- Bundler
- Jekyll 4.3+
Install the framework in any frontend project:
npm install thicket-uiImport the compiled stylesheet and optional JavaScript entrypoint from your app:
import "thicket-ui/css";
import "thicket-ui/js";The package also includes the SCSS source at thicket-ui/scss and Liquid component templates under _includes/components/. The CSS is built automatically when the package is packed or published.
To generate a smaller stylesheet for a Jekyll site, run the CLI from the site root:
npx thicket purge --output assets/css/thicket.purged.cssBy default it scans HTML, Markdown, Liquid, and JavaScript source files while excluding generated _site, dependencies, and vendor files. It keeps dynamic component and layout classes. Add a thicket.config.json to customize scanning and safelist classes:
{
"content": ["_includes/**/*.html", "_layouts/**/*.html", "docs/**/*.{md,html}", "assets/js/**/*.js"],
"output": "assets/css/thicket.purged.css",
"safelist": ["^u-dynamic-"]
}git clone https://github.com/daffadevhosting/jekyll-component-framework.git
cd jekyll-component-framework
bundle installbundle exec jekyll serveOpen http://localhost:4000.
bundle exec jekyll build
# or strict mode
bundle exec jekyll build --strictOutput is generated in _site/.
jekyll-component-framework/
├── _config.yml
├── Gemfile
├── _data/ # Site data & navigation
├── _includes/
│ ├── components/ # Reusable UI components
│ ├── sections/ # Marketing sections
│ └── partials/
├── _layouts/
├── assets/
│ ├── css/main.scss # Entry point
│ ├── scss/ # Design system
│ │ ├── _tokens.scss
│ │ ├── _mixins.scss
│ │ ├── _reset.scss
│ │ ├── _base.scss
│ │ ├── _typography.scss
│ │ ├── _utilities.scss
│ │ ├── _animations.scss
│ │ └── components/
│ └── js/
│ ├── main.js
│ └── components/
├── docs/
├── examples/
└── pages/
{% include components/button.html
label="Get Started"
href="/pricing/"
variant="primary"
size="lg"
icon="arrow-right"
icon_position="right"
%}{% include components/card.html
title="Feature"
body="Description here"
elevated=true
%}{% include components/alert.html
variant="success"
title="Saved"
message="Your settings have been updated."
%}Override CSS variables:
:root {
--color-primary: #ff4d00;
--radius-md: 0.5rem;
}Or set data-theme="dark" / data-theme="light" on <html>.
Theme preference is stored in localStorage under key theme.
Supported modes:
lightdarksystem(followsprefers-color-scheme)
Toggle is included in the navbar. Flash of incorrect theme is prevented via an inline script in <head>.
- Create
_includes/components/my-component.html - Create
assets/scss/components/_my-component.scss - Import the SCSS in
assets/css/main.scss - Add JavaScript (if needed) under
assets/js/components/ - Document it under
docs/components/
Follow the existing BEM-inspired naming (c-component, c-component--variant).
- Push to a repository
- Enable GitHub Pages (branch:
gh-pagesor use GitHub Actions) - Set
urlandbaseurlin_config.yml
- Connect the repository
- Build command:
bundle exec jekyll build - Output directory:
_site
MIT License — see LICENSE.
Thicket UI 1.4.0 adds a Jekyll-aware CSS purge CLI, expanded interaction utilities, and an accessible searchable combobox. It also includes site-level Organization structured data alongside jekyll-seo-tag, with reusable components for buttons, cards, alerts, navigation, dialogs, and form controls.
- new button ripple effect, card glare, and border beam features
More components, documentation pages, and example templates will be added iteratively.
