Skip to main content

A comprehensive library of production-ready `StreamField` components and UI elements designed for Wagtail CMS.

Project description

wagtail-tw-blocks

CI CD PyPI - Version PyPI - Python Version PyPI - License

Overview

wagtail-tw-blocks is a comprehensive library of production-ready StreamField components and UI elements designed for Wagtail CMS. Built on the foundation of Tailwind CSS and daisyUI, this package enables developers to rapidly deploy modern, accessible, and highly customizable layouts without the overhead of building foundational UI components from scratch.


Core Features

  • Design-First Architecture: Leverages Tailwind CSS and daisyUI for clean, responsive, and professional aesthetics.
  • Thematic Flexibility: Full support for all daisyUI themes, allowing for effortless brand alignment.
  • Extensibility: Architected for easy subclassing and template overriding to meet specific project requirements.

Installation

1. Install via Pip

pip install wagtail-tw-blocks

2. Configure Django Settings

Add wagtail_blocks to your INSTALLED_APPS. Ensure it is placed after your core Wagtail configuration to ensure proper template loading.

# settings.py

INSTALLED_APPS = [
    # ...
    "wagtail_blocks",
    # ...
]

Available blocks & components

Blocks

  • Accordion (Collapse): Interactive, collapsible sections ideal for FAQs and structured data.

    Accordion Demo

  • Alert: Visual indicators for status updates, warnings, or informational highlights.

    Alert Demo

  • Carousel: A responsive content and image slider with intuitive navigation.

    Carousel Demo

  • Code: Syntax-highlighted code blocks with integrated "copy-to-clipboard" functionality. (Note: Requires highlight.js and clipboard.js).

    Code Demo

  • Document: Displays document info inside a card with download button.

    Document Demo

  • Diff: Side-by-side visual comparison tools for images.

    Diff Demo

  • Hover Gallery: An immersive image gallery featuring sophisticated hover interactions.

    Gallery Demo

  • Tabs: Efficient organization of content into navigable tabbed interfaces.

    Tabs Demo

Implementation Example

To integrate these blocks into your page models, import the block library into your models.py:

from wagtail_blocks import blocks
from wagtail.fields import StreamField
from wagtail.models import Page

class Article(Page):
    content = StreamField([
        ("accordion", blocks.AccordionBlock()),
        ("alert", blocks.AlertBlock()),
        ("carousel", blocks.CarouselBlock()),
        ("code", blocks.CodeBlock()),
    ])

    content_panels = Page.content_panels + [
        FieldPanel("content"),
    ]

To ensure full functionality (specifically for the Code Block), include the following assets in your base template:

<link rel="stylesheet" href="{% static 'wagtail_blocks/css/styles.css' %}" />
<link
  rel="stylesheet"
  href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css"
/>

<script src="https://unpkg.com/lucide@latest"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.11/clipboard.min.js"></script>

<script>
  // Initialization
  lucide.createIcons();
  hljs.highlightAll();
  new ClipboardJS(".btn-copy");
</script>

Extending

You can easily extend or customize the provided blocks by sub-classing them. For example, to create a custom alert block with additional styles:

from wagtail_blocks.blocks import AlertBlock

class CustomAlertBlock(AlertBlock):
    class Meta:
        icon = "warning"
        label = "Custom Alert"
        template = "path/to/your/custom_alert_template.html"

Components

Beyond StreamField blocks, this package includes reusable template components to enhance global site functionality.

Breadcrumbs

Automatic breadcrumb generation following the Wagtail page hierarchy.

  • Context: a Wagtail page.

  • Usage:

    {% extends 'app/base.html' %}
    
    <!---->
    {% block content %}
    <section class="container-prose">
      {% include 'wagtail/components/breadcrumbs.html' %}
    
      <h1>{{ page.title }}</h1>
    </section>
    {% endblock %}
    
  • Demo:

    Breadcrumbs demo

Forms

Accessible, daisyUI-styled wrappers for standard Django forms.

  • Context: A Django form.

  • Options:

    • method: Form method attribute (Defaults to post).
    • csrf: A boolean that indicates whether to include Django {% csrf_token %} in the form (Defaults to True).
  • Usage:

    {% extends 'app/base.html' %}
    
    <!---->
    {% block content %}
    <section class="container-prose">
      <h1>New User</h1>
    
      {% include 'wagtail/components/form.html' %}
    
      <!-- Pass the options using `with` keyword: -->
      {% include 'wagtail/components/form.html' with method="get" csrf=False %}
    </section>
    {% endblock %}
    
  • Demo:

    Forms demo

Language switch

Seamless integration with Django/Wagtail i18n for multi-lingual sites.

  • Context: LANGUAGES from django.template.context_processors.i18n or a Wagtail page.

  • Usage:

    {% extends 'app/base.html' %}{% load static %}
    
    <!---->
    {% block content %}
    <header class="absolute inset-x-0 top-0 z-10 backdrop-blur-3xl">
      <nav class="navbar p-4">
        <ul class="navbar-start gap-4">
          <li
            class="tooltip tooltip-bottom tooltip-primary"
            data-tip="Your Brand"
          >
            <h1>
              <a href="https://your.domain.com">
                <img
                  alt="Your Brand"
                  class="lg:size-8 2xl:size-10"
                  src="{% static 'path/to/logo.png' %}"
                />
              </a>
            </h1>
          </li>
        </ul>
    
        <ul class="navbar-end gap-4">
          {% include 'wagtail/components/languages.html' %}
        </ul>
      </nav>
    </header>
    {% endblock %}
    
  • Demo:

    Languages demo

Theme switch

Switch between daisyUI themes with a single click.

  • Usage:

    {% extends 'app/base.html' %}{% load static %}
    
    <!---->
    {% block content %}
    <header class="absolute inset-x-0 top-0 z-10 backdrop-blur-3xl">
      <nav class="navbar p-4">
        <ul class="navbar-start gap-4">
          <li
            class="tooltip tooltip-bottom tooltip-primary"
            data-tip="Your Brand"
          >
            <h1>
              <a href="https://your.domain.com">
                <img
                  alt="Your Brand"
                  class="lg:size-8 2xl:size-10"
                  src="{% static 'path/to/logo.png' %}"
                />
              </a>
            </h1>
          </li>
        </ul>
    
        <ul class="navbar-end gap-4">
          {% include 'wagtail/components/themes.html' %}
        </ul>
      </nav>
    </header>
    {% endblock %}
    
  • Demo:

    Themes demo

Messages

Integrated support for the Django messages framework.

  • Context: messages from django.contrib.messages.context_processors.messages.

  • Usage:

    {% extends 'app/base.html' %}
    
    <!---->
    {% block content %}
    <section class="container-prose">
      {% include 'wagtail/components/messages.html' %}
    
      <h1>Messages</h1>
    
      ...
    </section>
    {% endblock %}
    
  • Demo:

    Messages demo

Pagination

Professional pagination controls for ListView and QuerySets.

  • Context:

    • paginator: Django paginator instance.
    • page_obj: Page instance.
    • is_paginated: Boolean that indicates whether the content is paginated or not.
    • object_list: Paginated QuerySet.
  • Usage:

    {% extends 'app/base.html' %}
    
    <!---->
    {% block content %}
    <section class="container-prose">
      <h1>Items</h1>
    
      <ol>
        {% for item in object_list %}
        <li>{{ item }}</li>
        {% endfor %}
      </ol>
    
      {% include 'wagtail/components/pagination.html' %}
    </section>
    {% endblock %}
    
  • Demo:

    Pagination demo

Prev/Next

Smart pagination between sibling pages, with recursive fallback to parent pages.

  • Context: A Wagtail page.

  • Usage:

    {% extends 'app/base.html' %}
    
    <!---->
    {% block content %}
    <section class="container-prose">
      <h1>{{ page.title }}</h1>
    
      {% include 'wagtail/components/prev_next.html' %}
    </section>
    {% endblock %}
    
  • Demo:

    Prev/Next demo

Tree

Recursive, tree-like navigation structures for documentation or complex sitemaps.

  • Context: A Wagtail page.

  • Usage:

    {% extends 'app/base.html' %}
    
    <!---->
    {% block content %}
    <div class="drawer lg:drawer-open">
      <input id="drawer" type="checkbox" class="drawer-toggle" />
    
      <section class="drawer-content">
        <main class="container-prose">
          <h1>{{ page.title }}</h1>
    
          <label
            for="drawer"
            aria-label="open drawer"
            class="btn btn-sm btn-primary lg:btn-md 2xl:btn-lg"
          >
            <i data-lucide="menu" class="size-4 lg:size-6"></i>
            Menu
          </label>
    
          ...
        </main>
      </section>
    
      <section class="drawer-side z-50">
        <label
          for="drawer"
          aria-label="close drawer"
          class="drawer-overlay"
        ></label>
    
        <div
          class="relative flex size-full flex-col overflow-hidden lg:min-w-sm lg:max-w-sm 2xl:min-w-md 2xl:max-w-md"
        >
          <header
            class="absolute inset-x-0 top-0 z-10 p-4 backdrop-blur-3xl lg:p-6"
          >
            <div class="flex items-center justify-between gap-4">
              <h1>Docs</h1>
    
              <div
                class="tooltip tooltip-left rtl:tooltip-right lg:hidden"
                data-tip="Close"
              >
                <label
                  for="sidebar"
                  aria-label="close sidebar"
                  class="btn btn-sm btn-square btn-ghost lg:btn-md 2xl:btn-lg"
                >
                  <i data-lucide="x" class="size-4 lg:size-6"></i>
                  <span class="sr-only">Close</span>
                </label>
              </div>
            </div>
          </header>
    
          <div class="max-h-dvh overflow-y-auto py-16 lg:py-20">
            <ul class="menu menu-sm w-full grow lg:menu-md 2xl:menu-lg">
              {% include 'wagtail/components/tree.html' %}
            </ul>
          </div>
        </div>
      </section>
    </div>
    {% endblock %}
    
  • Demo:

    Tree demo


Contributing

We value community involvement. If you wish to contribute, please review our CONTRIBUTING.md for coding standards and setup procedures. For significant architectural changes, please open an issue first to discuss your proposed implementation.

Technical Support

License

This project is open-source software licensed under the MIT License. See the LICENSE file for further details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wagtail_tw_blocks-1.1.3.tar.gz (59.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wagtail_tw_blocks-1.1.3-py3-none-any.whl (72.5 kB view details)

Uploaded Python 3

File details

Details for the file wagtail_tw_blocks-1.1.3.tar.gz.

File metadata

  • Download URL: wagtail_tw_blocks-1.1.3.tar.gz
  • Upload date:
  • Size: 59.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.1 CPython/3.12.3 Linux/6.17.0-1013-azure

File hashes

Hashes for wagtail_tw_blocks-1.1.3.tar.gz
Algorithm Hash digest
SHA256 da4bcd5766a116c05fa2d0541a99fcd954557e3953cc1ccabed1004b2842ee1a
MD5 2e07edf49be50174d047accefdc72a62
BLAKE2b-256 eb8c5e395a9cf279fd6128bfe52cd9ee17f3017bb46bd7580737bb14e84321f8

See more details on using hashes here.

File details

Details for the file wagtail_tw_blocks-1.1.3-py3-none-any.whl.

File metadata

  • Download URL: wagtail_tw_blocks-1.1.3-py3-none-any.whl
  • Upload date:
  • Size: 72.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.1 CPython/3.12.3 Linux/6.17.0-1013-azure

File hashes

Hashes for wagtail_tw_blocks-1.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 4d5e951ec495195dac86e3af79a3936859513abaeb0dea8c38710a044d8f4006
MD5 22063b21ceff1e7af7a029214af0d291
BLAKE2b-256 ee16a67d58e0f2385f2b8b0addbc5a75fb05640f7f25f37a2b649b9a3145812a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page