Rerouted (retagged, needs approval). The tag now points at a different commit than when this version was published. The Lamdera package server serves a copy recovered from https://github.com/lenards/elm-ui-patternfly.
What we checked: Tag 1.4.0 is still on github.com/lenards/elm-ui-patternfly; its commit 3e5350f9e0b9 is from 2026-03-24 18:11 UTC, after the version was published (2022-04-24 23:05 UTC); elm.json differs from package.elm-lang.org's; the exposed modules do not match docs.json; the zip's SHA-1 is not the published one and nothing else confirms its contents.
We could not verify this copy against what was published, so the Lamdera compiler asks before using it (y/n). Without a terminal, as in CI, it stops with an error unless approved:
lamdera make --auto-approve-package-rerouting approves rerouted versions for that run,LAMDERA_AUTO_APPROVE_PACKAGE_REROUTING=1 does the same for every run in that environment,LAMDERA_CACHE=off skips the Lamdera package server altogether: packages come from package.elm-lang.org and GitHub only, as with elm, and a rerouted version then fails to download.Details · package.elm-lang.org's zip: https://github.com/lenards/elm-ui-patternfly/zipball/1.4.0/
An elm-ui implementation of the PatternFly 6 design system.
66 components · Elm 0.19.1 · Builder pattern · No CSS required
Live Demo — Browse all 66 components interactively.
elm-ui-patternfly brings PatternFly 6's component library to Elm applications built with elm-ui. Every component follows the same builder pattern — construct a base value, pipe modifiers through it, and call toMarkup to get an Element msg. No HTML, no CSS, no class names.
elm install lenards/elm-ui-patternflyEvery component follows the same pattern:
import PF6.Button as Button
import PF6.Badge as Badge
-- Construct → modify → render
Button.primary { label = "Save", onPress = Just Saved }
|> Button.withLargeSize
|> Button.withIcon myIcon
|> Button.toMarkup
Badge.badge 7
|> Badge.withOverflowAt 99
|> Badge.toMarkupAll components produce Element msg values compatible with any elm-ui layout.
PF6.Tokens is the foundation of the component library — all colors, spacing, radii, and font sizes come from it. You can use tokens directly in your own layouts for visual consistency:
import PF6.Tokens as Tokens
Element.el
[ Element.padding Tokens.spacerMd
, Bg.color Tokens.colorBackgroundDefault
, Font.color Tokens.colorText
, Border.rounded Tokens.radiusMd
]
contentKey token groups: color*, spacer*, fontSize*, radius*, fontWeight*.
| Component | Module | Description |
|---|---|---|
| Button | PF6.Button | 7 variants (primary, secondary, tertiary, danger, warning, link, plain), 3 sizes, icon support |
| Badge | PF6.Badge | Numeric count badge with overflow cap and unread variant |
| Label | PF6.Label | 8 color variants, outline, compact, closable, icon support |
| Avatar | PF6.Avatar | User avatar image, 3 sizes, optional border |
| Icon | PF6.Icon | Semantic icon wrapper with status colors and 4 sizes |
| Title | PF6.Title | Heading levels H1–H6 with PF6 sizing |
| Divider | PF6.Divider | Horizontal rule with inset variants |
| Component | Module | Description |
|---|---|---|
| Alert | PF6.Alert | Inline alerts — default, success, danger, warning, info; optional close |
| Banner | PF6.Banner | Full-width site banners with optional link |
| Spinner | PF6.Spinner | Animated loading indicator, 4 sizes |
| Skeleton | PF6.Skeleton | Loading placeholder — text lines, circle, and square variants |
| EmptyState | PF6.EmptyState | Empty state with icon, title, body, and actions |
| Progress | PF6.Progress | Progress bar with status colors and size variants |
| HelperText | PF6.HelperText | Form field helper text — default, error, warning, success, indeterminate |
| Component | Module | Description |
|---|---|---|
| TextInput | PF6.TextInput | Text field with label, placeholder, validation states, disabled |
| Checkbox | PF6.Checkbox | Checkbox with label and optional description |
| Radio | PF6.Radio | Radio button with label and optional description |
| Switch | PF6.Switch | Toggle switch with on/off labels |
| NumberInput | PF6.NumberInput | Numeric input with increment/decrement, min/max/step, unit suffix |
| SearchInput | PF6.SearchInput | Search field with clear, submit, and typeahead hints |
| Select | PF6.Select | Single-select dropdown with option groups |
| Form | PF6.Form | Form layout with labeled groups, required markers, and helper text |
| Component | Module | Description |
|---|---|---|
| Breadcrumb | PF6.Breadcrumb | Breadcrumb trail with linked and current-page items |
| Tabs | PF6.Tabs | Tab navigation — default, box, vertical, and filled variants |
| Pagination | PF6.Pagination | Page navigation with item count and compact variant |
| Component | Module | Description |
|---|---|---|
| Card | PF6.Card | Content card with title, footer, flat, compact, and selectable variants |
| Page | PF6.Page | Page shell with masthead, sidebar, and main content area |
| Drawer | PF6.Drawer | Sliding panel — right, left, or bottom; inline or overlay mode |
| Component | Module | Description |
|---|---|---|
| Modal | PF6.Modal | Full-viewport modal dialog with title, body, footer, and size variants |
| Tooltip | PF6.Tooltip | Hover tooltip — top, bottom, left, right positioning |
| Popover | PF6.Popover | Click-triggered overlay with title, body, footer, and close button |
| Dropdown | PF6.Dropdown | Action dropdown with dividers, headers, and position control |
| Accordion | PF6.Accordion | Expandable content sections with bordered and large-display variants |
| ExpandableSection | PF6.ExpandableSection | Single toggle-show/hide content block |
| Component | Module | Description |
|---|---|---|
| CodeBlock | PF6.CodeBlock | Read-only code display with expandable variant |
| ClipboardCopy | PF6.ClipboardCopy | Copy-to-clipboard with inline and block variants |
| List | PF6.List | Bulleted, ordered, plain, and inline list variants |
| DescriptionList | PF6.DescriptionList | Term/value pairs — vertical and horizontal layouts |
| ActionList | PF6.ActionList | Spaced group of action buttons |
| Component | Module | Description |
|---|---|---|
| Table | PF6.Table | Data table with sortable columns, striped rows, compact, and bordered variants |
| DataList | PF6.DataList | Flexible list with checkable rows and expandable content |
| Toolbar | PF6.Toolbar | Filter/sort toolbar with item groups, separator, and item count |
| Component | Module | Description |
|---|---|---|
| NotificationDrawer | PF6.NotificationDrawer | Slide-out notification panel with variant icons and read/unread state |
| JumpLinks | PF6.JumpLinks | In-page anchor navigation with subsections and optional label |
| Navigation | PF6.Navigation | Vertical/horizontal application navigation |
The examples/pf6-guide/ directory contains a full interactive TEA application that demonstrates all 66 components with live state. A live version is deployed automatically to lenards.github.io/elm-ui-patternfly on every push to main.
cd examples/pf6-guide
npm install # install dev tools (first time only)
npm run build # compile Elm → main.js
npm run serve # serve on http://localhost:8001Or if you just want to compile and open directly without a server:
cd examples/pf6-guide
elm make src/Main.elm --output=main.js
open index.htmlNote:
elm reactorwill show a blank page because it doesn't pre-compilemain.js. Usenpm run serveor openindex.htmlafter runningelm make.
The guide is organized into 9 sections matching the component groups above. Every component is shown with multiple variants and real interactive state (forms you can type in, modals you can open, accordions you can expand, etc.).
To run the Playwright tests:
cd examples/pf6-guide
npm testThe test suite compiles the app automatically before running.
Issues and pull requests are welcome. If you find a bug, have a component request, or want to suggest an improvement, please open an issue.