ui

package
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 8, 2026 License: MIT Imports: 28 Imported by: 0

Documentation

Overview

Package ui is the framework's opinionated component layer on top of core-ui.

The split:

core-ui/        — unstyled building blocks (elements, widget, runtime)
framework/ui/   — semantic components that consume framework/ui/theme

Components in this package express *product intent* — PageHeader, FormField, EmptyState, StatusBadge — rather than HTML primitives. Every visual decision routes through framework/ui/theme so a single token swap re-skins the whole app.

Consumers import this package directly:

import "github.com/DonaldMurillo/gofastr/framework/ui"
import "github.com/DonaldMurillo/gofastr/framework/ui/theme"

page := ui.PageHeader(ui.PageHeaderConfig{
    Title:    "Customers",
    Subtitle: "1,283 active",
    Actions:  ui.Button(ui.ButtonConfig{Label: "Delete all", Variant: ui.ButtonDanger}),
})

If a piece of work maps 1:1 to an HTML element or ARIA pattern, it belongs in core-ui. If it composes primitives to express intent, it belongs here.

Component inventory (alphabetical):

AnchoredRail    — sticky in-page nav rail with scrollspy wiring
Avatar          — circular image/initials avatar (sm/md/lg/xl)
Button          — primary/secondary/danger/ghost variants
Callout         — inline info/warning/danger/info/neutral block
Card            — labelled <section> with header/body/footer
Checkbox        — labelled checkbox with FieldErrors wiring
CodeBlock       — styled <pre><code> sample block
DataTable       — sortable/paginated table (island-friendly)
Divider         — <hr> for plain horizontal; role="separator" otherwise
EmptyState      — title/description/action block for no-data screens
FactBox         — labelled tile (label-first OR value-first KPI)
FileUpload      — drag-drop file picker over <input type="file">
Form            — opinionated <form> wrapper with submit + errors
FormField       — labelled input with required + help + error states
FormSection     — grouped fields with heading + description
HeroSplit       — two-column hero (copy + media) with mobile collapse
LinkButton      — anchor styled as Button — for CTAs that navigate
Menu            — <details>-driven dropdown menu (keyboard + ARIA)
Notification    — toast-styled inline notification (variant + dismiss)
OptimizedImage  — responsive <picture> with srcset + lazy + Width/Height
PageHeader      — top-of-page header with title/eyebrow/subtitle/actions
PipelineImage   — multi-format <picture> consuming framework/image
                  VariantSet output (typed sources + LQIP/BlurHash)
Radio           — labelled radio with FieldErrors wiring
Responsive      — viewport-swap pair (desktop / mobile variant)
Section         — labelled content section with heading + description
Sidebar         — responsive primary navigation (inline/drawer)
SiteFooter      — multi-column footer grid + bottom strip
SiteHeader      — top bar with brand + nav + actions + mobile drawer
Spinner         — inline role="status" loading indicator
StatCard        — metric tile with label/value/trend
StatusBadge     — small status pill (success/warning/danger/info/neutral)
StepRail        — sticky numbered nav for multi-step pages
Switch          — iOS-style toggle (Checkbox variant)
Tag             — interactive pill (filter link or × dismiss)
Themed          — wraps a subtree in a registered theme override
Tooltip         — CSS-only hover/focus reveal

Layout primitives (Stack, Cluster, Grid, Center, Spacer, Box) share one ui-layout stylesheet — see layout.go.

Package ui provides high-level UI components for the GoFastr framework.

The form input components (PasswordInput, SearchInput, InputGroup) are defined in their own files: passwordinput.go, searchinput.go, inputgroup.go. This file was a consolidated version that has been superseded.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AddToast

func AddToast(w http.ResponseWriter, t ToastTrigger)

AddToast appends a toast trigger to the X-Gofastr-Toast response header. The runtime fires the toast on the client when the matching data-fui-rpc fetch resolves with 2xx.

Multiple AddToast calls accumulate into a single header whose value is a JSON array — robust against fetch's header-value coalescing across browsers. Apps that need to surface several toasts from one handler just call AddToast multiple times.

Apps can call this from any HTTP handler that's reached via data-fui-rpc; the toast travels back on the response that the runtime is already waiting for, with no extra request.

func AddToastError

func AddToastError(w http.ResponseWriter, title, body string)

func AddToastSuccess

func AddToastSuccess(w http.ResponseWriter, title, body string, ttlMs int)

AddToastSuccess / AddToastError / AddToastWarning are sugar for the common cases. ttlMs of 0 means persistent (caller must dismiss).

func AddToastWarning

func AddToastWarning(w http.ResponseWriter, title, body string, ttlMs int)

func AnchoredRail

func AnchoredRail(cfg AnchoredRailConfig) render.HTML

AnchoredRail returns the rail HTML. When ObserveSelector is set, the rail is wrapped with scrollspy so the runtime tracks active state.

The default CSS class is "ui-anchored-rail" — re-style with a Class override and a scoped block in the host's stylesheet.

func AnimatedCounter

func AnimatedCounter(cfg AnimatedCounterConfig) render.HTML

AnimatedCounter renders a number that ticks from From to To on first appearance.

func AspectRatioComponent

func AspectRatioComponent(cfg AspectRatioConfig, child render.HTML) render.HTML

AspectRatio wraps a single child in a container with the given aspect ratio. The child is absolutely positioned to fill the box.

Use for responsive images, video embeds, placeholder skeletons with known proportions, or any content whose intrinsic size is unknown at SSR time.

func Avatar

func Avatar(cfg AvatarConfig) render.HTML

Avatar renders a circular avatar with an image fallback to text initials when no image source is provided.

func AvatarGroup

func AvatarGroup(cfg AvatarGroupConfig) render.HTML

AvatarGroup renders an overlapping stack of avatars. When len(Avatars) > Max, only the first Max render and a trailing "+N" pill announces the remainder via aria-label.

func BackToTop

func BackToTop(cfg BackToTopConfig) render.HTML

BackToTop renders a smooth-scroll "back to top" button that appears after the user scrolls past the configured threshold.

The button is hidden on initial render (aria-hidden until visible). A small runtime module uses an IntersectionObserver on a sentinel to toggle visibility. No scroll-event listener is needed.

Usage:

ui.BackToTop(ui.BackToTopConfig{})
ui.BackToTop(ui.BackToTopConfig{ThresholdPx: 800})
ui.BackToTop(ui.BackToTopConfig{
    Position: ui.BackToTopBottomLeft,
    Size:     ui.BackToTopLG,
    Variant:  ui.BackToTopGhost,
    Icon:     render.Raw(`<svg>...</svg>`),
})
func Banner(cfg BannerConfig) render.HTML

Banner renders a persistent page-status strip.

SR semantics: BannerWarn/Danger emit role="alert" so an injected banner is announced; BannerInfo/Success use role="status" so the announcement is polite (doesn't interrupt screen-reader reading).

func BarChart

func BarChart(cfg BarChartConfig) render.HTML

BarChart renders a categorical bar chart.

func BaseCSS deprecated

func BaseCSS() string

BaseCSS used to return framework/ui's residual helpers (.ui-visually-hidden and a few others). That responsibility moved into the uihost's auto-emitted app.css floor — every app gets the helpers without opting in, and any component that needs more CSS owns it via a registry.Style handle.

BaseCSS now returns "" and is kept only so apps that still pass ui.BaseCSS() to uihost.WithCustomCSS keep compiling. Drop the call when convenient; it's a no-op.

Deprecated: not needed; included for back-compat. Will be removed in a future minor release.

func Box

func Box(cfg BoxConfig, children ...render.HTML) render.HTML

Box is a wrapper that applies token-scaled padding and optional surface chrome. Use as the visible shell of any "content card" that doesn't need the full Card primitive's header/body/footer slots.

func Button

func Button(cfg ButtonConfig) render.HTML

Button renders a semantic button with a typed variant. Variant maps to .ui-button--<variant> in the registered ui-button CSS; the framework's styled component handles the visual rules.

Authors never reach for raw class strings — pick a variant. Unknown variants panic at render time so typos surface immediately rather than silently rendering an unstyled button.

func Callout

func Callout(cfg CalloutConfig, body ...render.HTML) render.HTML

Callout renders a persistent info/warning/error block. Distinct from Toast / Notification (ephemeral) — Callouts live inline with content.

Composition: html.Aside (which auto-applies role=complementary and requires an aria-label, here derived from Title or variant). Falls through to a plain <div> with the appropriate role when no Title is set, so the variant-driven role takes precedence over a generic "complementary" landmark.

func Card

func Card(cfg CardConfig, body ...render.HTML) render.HTML

Card renders a labelled content card with optional header, footer, and interactive (linked) shell.

Composition:

  • With Heading: <section aria-labelledby="…"> → <h3> + <p> + body + footer
  • With Header: the caller's Header HTML replaces the auto-block
  • With Href: the whole shell becomes a focusable <a>, with the internal landmark still present for screen readers
func Carousel(cfg CarouselConfig) render.HTML

Carousel renders the slider.

func Center

func Center(cfg CenterConfig, children ...render.HTML) render.HTML

Center centers its children both horizontally and vertically.

func Checkbox

func Checkbox(cfg ToggleConfig) render.HTML

Checkbox renders a single labelled checkbox. Pair with FormField when you need section-level grouping; use the standalone Checkbox for inline toggles ("Remember me", "Send copy to admin").

func CheckboxGroup

func CheckboxGroup(cfg CheckboxGroupConfig) render.HTML

CheckboxGroup renders a <fieldset> of checkboxes with a shared name, group-level legend, and optional help/error text.

func Cluster

func Cluster(cfg ClusterConfig, children ...render.HTML) render.HTML

Cluster renders children in a horizontal row that wraps onto multiple lines when narrow. Good for tag lists, action rows, breadcrumb trails.

func CodeBlock

func CodeBlock(cfg CodeBlockConfig) render.HTML

CodeBlock renders a styled code sample. In its simplest form (Code only) it is a bare, horizontally-scrollable <pre>. Set Filename / ShowCopy / LineNumbers (or pass Lines) to get the framed variant: a chrome header with the filename, an optional copy button, and an optional line-number gutter.

The wrapper element carries data-fui-comp="ui-code-block" so the runtime auto-loads the scoped stylesheet on first appearance.

func Collapsible

func Collapsible(cfg CollapsibleConfig, body ...render.HTML) render.HTML

Collapsible renders a <details> element with a clickable summary. The data-fui-disclosure attribute wires up keyboard accessibility via the runtime (Escape to close, aria-expanded mirroring).

The body is wrapped in a fui-collapsible__content div so CSS can target the expandable region independently of the summary.

func ColorPicker

func ColorPicker(cfg ColorPickerConfig) render.HTML

ColorPicker renders a styled native color input with a label.

func CommandPalette

func CommandPalette(cfg CommandPaletteConfig) (render.HTML, *widget.Builder)

CommandPalette returns the trigger button and a Modal preset for the palette. Mount the preset once at startup; render the trigger in your global chrome (Sidebar, top nav, etc).

func ConditionalField

func ConditionalField(cfg ConditionalFieldConfig) render.HTML

ConditionalField renders a container that is hidden by default and shown via runtime JS when the watched field matches WhenValue.

The component renders with `hidden` and `aria-hidden="true"` so it starts invisible. The runtime module listens for change/input events on the ancestor form and toggles visibility.

func ConditionalFieldVisible

func ConditionalFieldVisible(cfg ConditionalFieldConfig) render.HTML

ConditionalFieldVisible renders a ConditionalField that is initially visible (no hidden attribute). Use this when the server knows the watched field already matches (e.g. re-rendering after a POST with validation errors where the trigger field was already selected).

func ConfirmAction

func ConfirmAction(cfg ConfirmActionConfig) (render.HTML, *widget.Builder)

ConfirmAction returns the trigger button and a *widget.Builder for the alertdialog. The caller mounts the preset once at startup; the trigger renders inline anywhere on the page.

func Container

func Container(cfg ContainerConfig, children ...render.HTML) render.HTML

Container renders a max-width wrapper.

func CopyButton

func CopyButton(cfg CopyButtonConfig) render.HTML

CopyButton renders the button.

func Counter

func Counter(cfg CounterConfig) render.HTML

Counter renders a counter with + and − buttons that mutate a signal locally in the browser. No server round-trip.

The counter displays a `<span data-fui-signal="name">0</span>` that the runtime updates when the signal changes.

func DataTable

func DataTable(cfg DataTableConfig) render.HTML

DataTable renders the table.

func DiffViewer

func DiffViewer(cfg DiffViewerConfig) render.HTML

DiffViewer renders a unified-diff body as a styled view.

func Divider

func Divider(cfg DividerConfig) render.HTML

Divider renders a semantic separator. Plain horizontal dividers use the native <hr> element; vertical or labelled dividers use a role="separator" div so the orientation / label gets announced.

func DocLayout

func DocLayout(cfg DocLayoutConfig, body ...render.HTML) render.HTML

DocLayout assembles the doc page skeleton around the article body.

func DocPrevNext

func DocPrevNext(p DocPager) render.HTML

DocPrevNext renders the prev/next pager. The previous card is always shown (callers point it at an index fallback); the next card is omitted when NextHref is empty.

func EmptyState

func EmptyState(cfg EmptyStateConfig) render.HTML

EmptyState renders a centered title + description + optional CTA for blank lists or zero-data screens.

Composition: html.Heading (h3) + html.Paragraph + a div for the action slot.

func FactBox

func FactBox(cfg FactBoxConfig) render.HTML

FactBox renders one labelled tile. Pair with a CSS grid to lay out multiple — the framework does not provide a grid wrapper, so consumers pick their own column template.

func FileDropzone

func FileDropzone(cfg FileDropzoneConfig) render.HTML

FileDropzone renders a hero file-drop surface.

func FileUpload

func FileUpload(cfg FileUploadConfig) render.HTML

FileUpload renders a drag-drop file picker.

Markup shape:

<label class="ui-fileupload" for="…">
  <span class="ui-fileupload__label">…</span>
  <div class="ui-fileupload__zone" data-fui-fileupload>
    <input type="file" …>
    <p class="ui-fileupload__prompt">Drop files or click to browse</p>
    <p class="ui-fileupload__filename"></p>  ← runtime updates after change
  </div>
  <p class="ui-fileupload__help">…</p>
</label>

func FilterChipBar

func FilterChipBar(cfg FilterChipBarConfig) render.HTML

FilterChipBar renders the toolbar.

func Form

func Form(cfg FormConfig, fields ...render.HTML) render.HTML

Form renders a complete <form> with optional error summary above the fields and a submit button below.

Pass FormFieldFor(errors, ...) inside as fields so the per-field error wiring is automatic.

func FormField

func FormField(cfg FormFieldConfig) render.HTML

FormField renders a labelled form field with optional help and error text. Wire the input ID to cfg.For for label association.

func FormFieldFor

func FormFieldFor(errs FieldErrors, name string, cfg FormFieldConfig) render.HTML

FormFieldFor is a convenience wrapper that pre-fills FormFieldConfig.Error from a FieldErrors map. Use it inside Form() so error round-tripping is one line per field.

func FormRepeater

func FormRepeater(cfg FormRepeaterConfig) render.HTML

FormRepeater renders a dynamic list of repeating field groups with add/remove controls.

Server-driven: clicking "Add" submits name="<Name>_add" value="1", and clicking "Remove" submits name="<Name>_remove" value="<index>". The server processes these and re-renders with the updated Items.

func FormSection

func FormSection(cfg FormSectionConfig, fields ...render.HTML) render.HTML

FormSection wraps a group of FormFields with a shared heading.

Composition: html.FieldSet + a heading-driven legend when a heading is provided; otherwise a plain <div> container so screen readers don't announce an empty group label.

func Gallery(cfg GalleryConfig) render.HTML

Gallery renders the thumbnail surface.

func GlobalSearch

func GlobalSearch(cfg GlobalSearchConfig) render.HTML

GlobalSearch renders the search bar.

func Grid

func Grid(cfg GridConfig, children ...render.HTML) render.HTML

Grid renders children in an auto-fitting CSS grid. The default replacement for hand-rolled `grid-template-columns` declarations.

Min is passed through `--ui-grid-min` (a CSS custom property the component declares on the root), so no inline `style="…"` is emitted — strict-CSP clean.

func HeroSplit

func HeroSplit(cfg HeroSplitConfig) render.HTML

HeroSplit renders a two-column hero. The wrapper is a <section>; callers pass the content for each column as HTML.

func Icon

func Icon(name string, cfg IconConfig) render.HTML

Icon renders the registered icon with the given name. Returns empty markup for unknown names — callers can guard with IconRegistered().

func IconRegistered

func IconRegistered(name string) bool

IconRegistered reports whether an icon with the given name is in the registry.

func InputGroup

func InputGroup(cfg InputGroupConfig) render.HTML

InputGroup renders an input with optional prepend and append addons. The prepend/append addons share borders with the input for a merged appearance.

func JSONViewer

func JSONViewer(cfg JSONViewerConfig) render.HTML

JSONViewer renders a collapsible tree view of any Go value.

func Lightbox(cfg LightboxConfig) *widget.Builder

Lightbox returns a *widget.Builder for the zoom-overlay modal. Mount once at app startup; trigger from anywhere via data-fui-open.

func LineChart

func LineChart(cfg LineChartConfig) render.HTML

LineChart renders a multi-series line chart.

func Link(cfg LinkConfig) render.HTML

Link renders an anchor with a typed variant. The component owns its CSS — the .ui-link class works without any app-level overrides.

Defaults to LinkInline. Picking LinkAction gives the link a 44×44 minimum tap area so it can stand next to a Button in a row action without violating WCAG 2.5.5.

func LinkButton

func LinkButton(cfg LinkButtonConfig) render.HTML

LinkButton renders a button-styled anchor. Same variant/size grammar as Button — the visual styling is shared via the registered ui-button CSS (class-based, not tag-scoped). The difference is semantic: <a> for navigation, <button> for actions. Screen readers, "open in new tab", and SPA push-state nav all rely on the right tag choice.

func Markdown

func Markdown(cfg MarkdownConfig) render.HTML

Markdown renders the given Markdown source as themed HTML.

func Menu(cfg MenuConfig) render.HTML

Menu renders a dropdown. The trigger toggles the panel; the panel is a `role=menu` list with `role=menuitem` rows. Built on the runtime's `data-fui-disclosure` machinery (Esc closes, SPA nav closes, aria-expanded mirroring), augmented with arrow / type-ahead keyboard navigation that the runtime applies to any `[role=menu]` inside an open disclosure.

func MountSidebar

func MountSidebar(r WidgetMounter, cfg SidebarConfig, pages ...string) widget.Definition

MountSidebar registers BOTH the sidebar drawer widget (for < md viewports) AND mounts it on r. Returns the widget definition. Call once per app at startup. The same SidebarConfig is passed to `Sidebar(cfg)` when rendering screens so the two views stay in sync.

Generic signature: `r` is anything widget.Mount accepts (the gofastr router). We use a tiny adapter type so this package doesn't need to import the router directly.

func NetworkRetryBanner

func NetworkRetryBanner(cfg NetworkRetryBannerConfig) render.HTML

NetworkRetryBanner renders the (initially hidden) banner.

func Notification

func Notification(cfg NotificationConfig) render.HTML

Notification renders the toast row.

func NotificationBell

func NotificationBell(cfg NotificationBellConfig) (render.HTML, *widget.Builder)

NotificationBell returns the bell-button trigger HTML and a *widget.Builder for the paired Popover. Mount the popover once:

trigger, pop := ui.NotificationBell(ui.NotificationBellConfig{...})
widget.Mount(r, pop.Build())

Then render `trigger` in the page header / sidebar / wherever.

func NumberInput

func NumberInput(cfg NumberInputConfig) render.HTML

NumberInput renders a number field with explicit +/- buttons.

func OptimisticAction

func OptimisticAction(cfg OptimisticActionConfig) render.HTML

OptimisticAction renders the button. The runtime listens for clicks via the data-fui-comp marker.

func OptimizedImage

func OptimizedImage(cfg OptimizedImageConfig) render.HTML

OptimizedImage renders a responsive, lazy-loaded image with width/height reservations to eliminate Cumulative Layout Shift.

Anti-CLS rule: callers MUST provide Width and Height (intrinsic pixel dimensions of Src). Omitting either panics — the framework will not silently emit a layout-shifting image.

func PageHeader(cfg PageHeaderConfig) render.HTML

PageHeader renders a top-of-page header with title, optional subtitle and eyebrow label, and an action slot.

Composition: html.Header (semantic <header role="banner">) + html.Heading (h1) + html.Paragraph for eyebrow/subtitle.

func PasswordInput

func PasswordInput(cfg PasswordInputConfig) render.HTML

PasswordInput renders a password field with a show/hide toggle button.

func PieChart

func PieChart(cfg PieChartConfig) render.HTML

PieChart renders a pie or donut chart.

func PipelineImage

func PipelineImage(cfg PipelineImageConfig) render.HTML

PipelineImage renders <picture> with one <source> per MIME type, plus a CLS-safe <img> fallback and an optional placeholder. Built to consume framework/image.VariantSet output directly: take the VariantResult.Variants slice, map each entry to a PipelineSource, pass the BlurHash or Placeholder as the placeholder field.

Shares the ui-image visual surface with OptimizedImage; the distinction is multi-Type srcset support, intended for output of the framework's image pipeline where the same source has been encoded as both modern (WebP) and legacy (JPEG/PNG) variants.

func PollingIndicator

func PollingIndicator(cfg PollingIndicatorConfig) render.HTML

PollingIndicator renders the small pulsing-dot + label combination. Uses role="status" + aria-live="polite" so the label text is announced when it changes (e.g. swapping "Live" for "Paused").

func ProgressSteps

func ProgressSteps(cfg ProgressStepsConfig) render.HTML

ProgressSteps renders a step indicator.

func Radio

func Radio(cfg ToggleConfig) render.HTML

Radio renders a single radio. Share Name across multiple Radios to form a group; pass distinct Value strings.

func RadioGroup

func RadioGroup(cfg RadioGroupConfig) render.HTML

RadioGroup renders a <fieldset> of radio buttons with a shared name, group-level legend, and optional help/error text.

func RangeSlider

func RangeSlider(cfg RangeSliderConfig) render.HTML

RangeSlider renders a dual-thumb range input.

func RatingInput

func RatingInput(cfg RatingConfig) render.HTML

RatingInput renders a star/heart rating bound to a hidden radio group. Submits as Name=<1..Max> on the surrounding form.

func RegisterIcon

func RegisterIcon(name, body string)

RegisterIcon adds a named icon to the registry. The body should be inner SVG markup (paths, lines, circles, etc.) without the outer <svg> wrapper. Re-registering the same name replaces the existing body. Safe for concurrent use.

func Repeater

func Repeater(cfg RepeaterConfig) render.HTML

Repeater renders a dynamic list of form fields with add/remove controls.

func Responsive

func Responsive(cfg ResponsiveConfig, desktop, mobile render.HTML) render.HTML

Responsive emits both variants wrapped in viewport-toggled divs.

func SearchInput

func SearchInput(cfg SearchInputConfig) render.HTML

SearchInput renders a search field with icon prefix and clear button.

func Section

func Section(cfg SectionConfig, body ...render.HTML) render.HTML

Section renders a content section with consistent spacing and an optional heading + description.

Composition: a labelled <section> via html.Section. When a Heading is provided, an h2 + aria-labelledby wires up the accessibility name; otherwise a generic aria-label is required. Without a heading or label this would silently produce an inaccessible region — Section panics in that case to push callers toward the right shape.

func SegmentedControl

func SegmentedControl(cfg SegmentedControlConfig) render.HTML

SegmentedControl renders the radiogroup with a sliding indicator.

func Select

func Select(cfg SelectConfig) render.HTML

Select renders a labelled native <select> dropdown.

func ShortcutHint

func ShortcutHint(cfg ShortcutHintConfig) render.HTML

ShortcutHint renders the visual chord chips.

func Sidebar(cfg SidebarConfig) component.Component

Sidebar renders the inline nav column + the hamburger trigger that opens the < md drawer. The drawer widget itself is mounted by the caller via MountSidebarDrawer (once per app, at startup).

Pair with core-ui/app/layout.Layout.WithSidebar to slot it into the canonical chrome. Inline use is also fine — the component is self-contained.

func SidebarBody

func SidebarBody(cfg SidebarConfig) render.HTML

SidebarBody renders the navigation content only — no <aside> shell, no hamburger. Use it as the Slot content of a preset.Drawer widget that mirrors the sidebar at narrow viewports.

func SignalToggle

func SignalToggle(cfg SignalToggleConfig) render.HTML

SignalToggle renders a <button role="switch"> that toggles a boolean signal on click. The signal binding is fully client-side:

  • data-fui-signal-toggle flips the signal on click
  • data-fui-signal + attr mode keeps aria-checked in sync
  • a nested label span shows the signal value via data-fui-signal

The button carries data-fui-comp="fui-toggle" for scoped CSS auto-loading.

func SiteFooter(cfg SiteFooterConfig) render.HTML

SiteFooter renders a multi-column footer. The wrapper is a <div> (not <footer>) because the framework Layout already wraps component output in <footer role="contentinfo">.

func SiteHeader(cfg SiteHeaderConfig) render.HTML

SiteHeader renders a marketing/docs top bar. The wrapper is a <div> (not <header>) because the framework Layout already wraps component output in <header role="banner">. Doubling up would emit nested headers.

func SkeletonAvatar

func SkeletonAvatar(cfg SkeletonAvatarConfig) render.HTML

SkeletonAvatar renders an avatar-with-text loading placeholder: a circle on the left with two stacked text lines on the right. The second line is dropped when HideSubline is true.

func SkeletonCard

func SkeletonCard(cfg SkeletonCardConfig) render.HTML

SkeletonCard renders a card-shaped loading placeholder: a title line, a body line-stack, and an optional footer line.

func SkeletonRow

func SkeletonRow(cfg SkeletonRowConfig) render.HTML

SkeletonRow renders a list-row loading placeholder: a label line on the left, a value line on the right, and an optional trailing chevron square. Pairs with list/menu rows that drill into details.

func SkipLink(cfg SkipLinkConfig) render.HTML

SkipLink renders a WCAG 2.4.1 skip-navigation link.

func Slider

func Slider(cfg SliderConfig) render.HTML

Slider renders a labelled range input.

func Spacer

func Spacer() render.HTML

Spacer renders an empty flexible element that grows to fill available space. Use inside a Stack or Cluster to push a sibling (e.g. an action button) to the far edge. Aria-hidden because it's purely visual.

func Sparkline

func Sparkline(cfg SparklineConfig) render.HTML

Sparkline renders a tiny inline trend chart.

func Spinner

func Spinner(cfg SpinnerConfig) render.HTML

Spinner renders a loading indicator.

Pair with data-fui-rpc lifecycle to surface pending state on island-side updates: the runtime adds `aria-busy="true"` to the containing form / button while the RPC is in flight, so a CSS rule can switch a sibling Spinner from `visibility:hidden` to visible without any per-component wiring.

func Stack

func Stack(cfg StackConfig, children ...render.HTML) render.HTML

Stack renders children in a vertical column with consistent gap. The default replacement for hand-rolled `<div style="display:flex; flex-direction:column;gap:…">` patterns.

func StatCard

func StatCard(cfg StatCardConfig) render.HTML

StatCard renders a metric card — label, value, optional trend pill.

func StatusBadge

func StatusBadge(cfg StatusBadgeConfig) render.HTML

StatusBadge renders a small inline pill conveying state.

func StatusPill

func StatusPill(cfg StatusPillConfig) render.HTML

StatusPill renders a presentational status kicker.

func StepRail

func StepRail(cfg StepRailConfig) render.HTML

StepRail renders the sticky numbered nav. The wrapper is an <aside> with role=complementary and an aria-label derived from Title (or a generic fallback) — the rail is a navigation landmark for AT users reading along.

func StepWizard

func StepWizard(cfg StepWizardConfig) render.HTML

StepWizard renders a multi-step form with a progress indicator bar.

Server-driven: each step is a full form submission. The server reads the "wizard_action" field (value "next" or "back") to determine direction and re-renders with the updated CurrentStep.

func Sticky

func Sticky(cfg StickyConfig, children ...render.HTML) render.HTML

Sticky wraps children in a position:sticky container.

func Switch

func Switch(cfg ToggleConfig) render.HTML

Switch renders a checkbox styled as an iOS-style toggle switch. Same form-submission semantics as Checkbox — submits Value (or "on") when checked, omits when unchecked.

func TableOfContents

func TableOfContents(cfg TOCConfig) render.HTML

TableOfContents renders a TOC nav that the runtime fills in.

func Tabs

func Tabs(cfg TabsConfig) render.HTML

Tabs renders a signal-driven tab strip. Clicking a tab sets the signal; the runtime mirrors it to data-active on the wrapper, and CSS lights up both the matching button and panel — so the highlight moves with the selection.

Panics if SignalName is empty, Tabs is empty, or there are more than tabsMaxPanels tabs.

func Tag

func Tag(cfg TagConfig) render.HTML

Tag renders a small pill — optionally linked (filter chip), optionally removable (dismiss button). Pure server-rendered; dismiss is wired through standard `data-fui-rpc` semantics so the application picks the response side-effect.

func TagInput

func TagInput(cfg TagInputConfig) render.HTML

TagInput renders a free-form tag input bound to a chip strip.

func TerminalBlock

func TerminalBlock(cfg TerminalBlockConfig, lines ...render.HTML) render.HTML

TerminalBlock renders a CLI mock. Body lines are rendered verbatim in a pre-wrapped mono body — embed "\n" to break lines.

func TerminalOK

func TerminalOK(s string) render.HTML

TerminalOK wraps a line of success output ("→ installed …").

func TerminalOut

func TerminalOut(s string) render.HTML

TerminalOut wraps a line of dim, secondary output (echoed commands, noise).

func TextArea

func TextArea(cfg TextAreaConfig) render.HTML

TextArea renders a labelled multi-line text input.

func ThemeToggle

func ThemeToggle(cfg ThemeToggleConfig) render.HTML

ThemeToggle renders a dark/light color scheme toggle button.

On click, the button cycles through dark → light → auto and writes the choice to localStorage. The colorscheme.js bootstrap script picks up the change and swaps data-color-scheme on <html> so all theme tokens update immediately.

func Themed

func Themed(ref style.ThemeRef, children ...render.HTML) render.HTML

Themed wraps children in a <div class="fui-theme-<hash>"> so the CSS variable cascade applies a section-level theme override to every descendant. Components inside Themed read var(--color-…) as usual — the browser dereferences them against the override block, not the canonical :root.

Use it for dark sections, branded callouts, multi-tenant re-skinning of one subtree without touching surrounding chrome.

var Dark = style.RegisterThemeOverride(darkTheme)

ui.Themed(Dark,
    ui.Section(ui.SectionConfig{Heading: "Settings"},
        ui.Button(ui.ButtonConfig{Label: "Save", Variant: ui.ButtonPrimary}),
    ),
)

The override class block lives in /__gofastr/app.css; registering the same theme twice (same content) returns the same handle, so the CSS only ships once.

func TimePicker

func TimePicker(cfg TimePickerConfig) render.HTML

TimePicker renders a styled native time input with a label.

func Timeline

func Timeline(cfg TimelineConfig) render.HTML

Timeline renders an ordered list of events on a vertical rail.

func ToastSlot

func ToastSlot(name string) component.Component

ToastSlot exposes a fresh empty-stack slot Component for callers composing a preset.ToastStack(name, ToastSlot(name)) manually. preset.ToastStack uses it internally; this is exported so a host can build its own custom layout while sharing the runtime contract.

func ToastStackSignal

func ToastStackSignal(name string) widget.SignalSource

ToastStackSignal returns a SignalSource that emits the empty stack container. Wired into preset.ToastStack automatically; exported for hosts composing their own widget.

func Toolbar

func Toolbar(cfg ToolbarConfig) render.HTML

Toolbar renders a horizontal action strip with role=toolbar.

func Tooltip

func Tooltip(cfg TooltipConfig, trigger render.HTML) render.HTML

Tooltip wraps the given trigger HTML and appends a hidden tooltip pop. The trigger is unwrapped — Tooltip only adds a containing span + the pop element, so inline buttons and links stay inline.

Use on icon-only buttons, truncated labels, or anywhere extra context is useful without occupying layout space.

func ValidationSummary

func ValidationSummary(cfg ValidationSummaryConfig) render.HTML

ValidationSummary renders an inline summary of form validation errors as a danger callout with anchor links to each field. Output ordering is deterministic: FieldOrder first if provided, then any leftover field names alphabetically.

Types

type Align

type Align string

Align is a cross-axis alignment value.

const (
	AlignStart    Align = "start"
	AlignCenter   Align = "center"
	AlignEnd      Align = "end"
	AlignBaseline Align = "baseline"
	AlignStretch  Align = "stretch"
)

type AnchoredRailConfig

type AnchoredRailConfig struct {
	// Label is the visible heading above the rail (e.g. "Categories",
	// "By intent", "The path"). Required — also doubles as the
	// aria-label on the underlying <aside>.
	Label string

	// Items in display order. Required.
	Items []RailItem

	// ObserveSelector is the CSS selector for the container the
	// scrollspy runtime watches for in-view sections. Typically the
	// id of a wrapper around the sections (e.g. "#docs-sections"). If
	// empty, scrollspy is skipped and the rail is purely static — the
	// runtime then can't track active state.
	ObserveSelector string

	// TargetSelector overrides the default ".ui-section[id]" — set it
	// when the sections aren't ui.Section calls.
	TargetSelector string

	// Class is appended to the <aside>'s class list.
	Class string

	// ID optionally tags the <aside>.
	ID string
}

AnchoredRailConfig configures the rail.

type AnimatedCounterConfig

type AnimatedCounterConfig struct {
	// To is the target value (required).
	To int
	// From is the starting value during animation. Default 0.
	From int
	// DurationMs is the animation length. Default 1200.
	DurationMs int
	// Prefix / Suffix are static strings on either side (e.g.
	// Prefix="$", Suffix="+", Suffix=" users").
	Prefix string
	Suffix string
	// ID / Class / Attrs are passed through.
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

AnimatedCounterConfig configures an AnimatedCounter.

type AspectRatio

type AspectRatio string

AspectRatio selects a CSS aspect-ratio bucket.

const (
	AspectRatio1_1  AspectRatio = "1-1"
	AspectRatio4_3  AspectRatio = "4-3"
	AspectRatio16_9 AspectRatio = "16-9"
	AspectRatio21_9 AspectRatio = "21-9"
	AspectRatio3_4  AspectRatio = "3-4"
	AspectRatio3_2  AspectRatio = "3-2"
	AspectRatio2_3  AspectRatio = "2-3"
	AspectRatioAuto AspectRatio = "auto"
)

type AspectRatioConfig

type AspectRatioConfig struct {
	// Ratio is the aspect-ratio bucket (required). Use one of the
	// AspectRatio* constants.
	Ratio AspectRatio

	// Class adds extra CSS classes.
	Class string

	// ID sets the element id.
	ID string
}

AspectRatioConfig configures an aspect-ratio wrapper.

type AvatarConfig

type AvatarConfig struct {
	// Name is required; used for alt text and to derive initials when
	// no image source is set.
	Name  string
	Src   string     // optional image URL; falls back to initials when empty
	Size  AvatarSize // sm | "" (default md) | lg | xl
	ID    string
	Class string
}

AvatarConfig configures an avatar.

type AvatarGroupConfig

type AvatarGroupConfig struct {
	// Avatars is the source list — at least one. Order matters: the
	// first element renders on top.
	Avatars []AvatarConfig

	// Max caps how many avatars render before the "+N" indicator
	// replaces the remainder. Default 5.
	Max int

	// Size propagates to each child Avatar unless the child has its
	// own Size set explicitly. Default AvatarMd.
	Size AvatarSize

	// Label is the aria-label on the group element. Default "Avatars".
	Label string

	// ShowNames wraps each Avatar in a Tooltip so hover / keyboard
	// focus reveals the avatar's Name. Useful for team-roster stacks
	// where the SR-only initials aren't enough for sighted users.
	ShowNames bool

	ID    string
	Class string
}

AvatarGroupConfig configures an avatar group / stack.

type AvatarSize

type AvatarSize string

AvatarSize is one of a small set of pre-defined avatar sizes. Sizes are CSS classes — no inline styles — so a strict CSP that blocks `style="…"` attributes still works.

const (
	AvatarSm AvatarSize = "sm" // ~1.5rem
	AvatarMd AvatarSize = ""   // default ~2.5rem
	AvatarLg AvatarSize = "lg" // ~3rem
	AvatarXl AvatarSize = "xl" // ~4rem
)

type BackToTopConfig

type BackToTopConfig struct {
	// Position selects which corner the button anchors to.
	// Defaults to BackToTopBottomRight when empty.
	Position BackToTopPosition

	// Icon overrides the button content. Pass any render.HTML
	// (SVG markup, text, an icon component, etc).
	// Defaults to a chevron-up arrow SVG.
	Icon render.HTML

	// ThresholdPx is the scroll distance in pixels before the
	// button becomes visible. Defaults to 400 when 0.
	ThresholdPx int

	// Smooth controls scroll-to-top behavior.
	// Defaults to smooth scrolling (BackToTopSmooth).
	// Set to BackToTopInstant for no animation.
	Smooth BackToTopScrollBehavior

	// Size controls the button diameter.
	// Defaults to BackToTopMD (2.75rem).
	Size BackToTopSize

	// Variant controls the color scheme.
	// Defaults to BackToTopPrimary (solid primary color).
	Variant BackToTopVariant

	// Offset controls the distance from the viewport edge.
	// Defaults to BackToTopOffsetMD.
	Offset BackToTopOffset

	// Label overrides the aria-label. Defaults to "Back to top".
	Label string

	// ScrollTarget overrides the scroll-to selector.
	// Defaults to scrolling to y=0. Set to a CSS selector
	// (e.g. "#main-content") to scroll a specific element
	// into view instead.
	ScrollTarget string

	// ID is an optional id for the root element.
	ID string

	// Class is an optional extra CSS class.
	Class string
}

BackToTopConfig configures the back-to-top button.

type BackToTopOffset

type BackToTopOffset string

BackToTopOffset presets for distance from the viewport edge.

const (
	BackToTopOffsetNone BackToTopOffset = "none"
	BackToTopOffsetSM   BackToTopOffset = "sm"
	BackToTopOffsetMD   BackToTopOffset = "" // default
	BackToTopOffsetLG   BackToTopOffset = "lg"
	BackToTopOffsetXL   BackToTopOffset = "xl"
)

type BackToTopPosition

type BackToTopPosition string

BackToTopPosition selects which corner the button anchors to.

const (
	BackToTopBottomRight BackToTopPosition = "br"
	BackToTopBottomLeft  BackToTopPosition = "bl"
	BackToTopTopRight    BackToTopPosition = "tr"
	BackToTopTopLeft     BackToTopPosition = "tl"
)

type BackToTopScrollBehavior

type BackToTopScrollBehavior string

BackToTopScrollBehavior controls the scroll animation.

const (
	BackToTopSmooth  BackToTopScrollBehavior = "" // default
	BackToTopInstant BackToTopScrollBehavior = "instant"
)

type BackToTopSize

type BackToTopSize string

BackToTopSize controls the button diameter.

const (
	BackToTopSM BackToTopSize = "sm"
	BackToTopMD BackToTopSize = "" // default (2.75rem)
	BackToTopLG BackToTopSize = "lg"
)

type BackToTopVariant

type BackToTopVariant string

BackToTopVariant selects the color variant.

const (
	BackToTopPrimary   BackToTopVariant = ""          // default — solid primary
	BackToTopSecondary BackToTopVariant = "secondary" // outlined, subtle
	BackToTopGhost     BackToTopVariant = "ghost"     // transparent bg, only visible on hover
)

type BannerConfig

type BannerConfig struct {
	// Title is the bold lead-in (required).
	Title string
	// Body is the supporting text (optional).
	Body string
	// Variant picks color + role. Defaults to BannerInfo.
	Variant BannerVariant
	// Dismissible adds an X button. When DismissID is set the runtime
	// records the dismissal in localStorage so the same banner doesn't
	// re-appear on the next page load. (Server-side persistence is up
	// to the app — Banner doesn't ship its own RPC.)
	Dismissible bool
	DismissID   string
	// Action is an optional inline call-to-action (a Link or Button
	// rendered to the right of the body).
	Action render.HTML
	// ID / Class / Attrs are passed through to the outer element.
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

BannerConfig configures a Banner.

type BannerVariant

type BannerVariant string

BannerVariant picks the color / icon family.

const (
	BannerInfo    BannerVariant = ""
	BannerSuccess BannerVariant = "success"
	BannerWarn    BannerVariant = "warn"
	BannerDanger  BannerVariant = "danger"
)

type BarChartBar

type BarChartBar struct {
	// Label is the x-axis category label + AT <title>.
	Label string
	// Value is the bar height (≥0).
	Value float64
	// Color overrides the default theme primary. Optional CSS color
	// or one of: "primary", "info", "success", "warning", "danger".
	Color string
}

BarChartBar is one bar.

type BarChartConfig

type BarChartConfig struct {
	// Bars are the entries (≥1).
	Bars []BarChartBar
	// Width / Height in CSS pixels. Default 320×180.
	Width  int
	Height int
	// ShowAxis renders thin x/y axis lines + min/max value labels on
	// the left. Default off (compact mode).
	ShowAxis bool
	// ShowLabels renders the bar labels under the chart. Default on.
	ShowLabels bool
	// LabelledBy is the id of an element naming the chart for AT.
	LabelledBy string
	ID         string
	Class      string
}

BarChartConfig configures a BarChart.

type BoxConfig

type BoxConfig struct {
	Pad      BoxPad // padding (none | sm | md | lg | xl)
	Surface  bool   // when true, applies the surface background + border-radius
	Outlined bool   // when true, applies a 1px border (pairs well with Surface=false)
	ID       string
	Class    string
}

BoxConfig configures a Box wrapper.

type BoxPad

type BoxPad string

BoxPad selects a named padding value. "" is no padding.

const (
	BoxPadNone BoxPad = ""
	BoxPadSM   BoxPad = "sm"
	BoxPadMD   BoxPad = "md"
	BoxPadLG   BoxPad = "lg"
	BoxPadXL   BoxPad = "xl"
)

type ButtonConfig

type ButtonConfig struct {
	Label      string        // required visible text + aria-label
	Variant    ButtonVariant // defaults to ButtonPrimary
	Size       ButtonSize    // defaults to ButtonSizeDefault
	Type       string        // "button" (default) | "submit" | "reset"
	ExtraAttrs html.Attrs
	ID         string
	Class      string
}

ButtonConfig configures a button.

type ButtonSize

type ButtonSize string

ButtonSize is the rendered button size. Default sits on a 44px touch-target floor (WCAG 2.5.5). ButtonSizeSmall opts out of the floor for row-action contexts where the parent row already provides the tap area (table rows, dense toolbars). ButtonSizeLarge bumps padding + font-size for hero CTAs.

const (
	ButtonSizeDefault ButtonSize = ""
	ButtonSizeSmall   ButtonSize = "small"
	ButtonSizeLarge   ButtonSize = "large"
)

type ButtonVariant

type ButtonVariant string

ButtonVariant is the semantic variant of a Button. String-typed for ergonomic Go enums + readable serialization.

const (
	ButtonPrimary   ButtonVariant = "primary"
	ButtonSecondary ButtonVariant = "secondary"
	ButtonDanger    ButtonVariant = "danger"
	ButtonGhost     ButtonVariant = "ghost"
)

type CalloutConfig

type CalloutConfig struct {
	Title   string
	Variant StatusVariant // info | success | warning | danger | neutral
	ID      string
	Class   string
}

CalloutConfig configures a persistent informational block.

type CardConfig

type CardConfig struct {
	// Heading is the optional top-of-card title. When set, a labelled
	// <section> wraps the card so screen readers pick up the heading
	// as the region name.
	Heading string

	// Description is optional supporting text rendered beneath the
	// heading.
	Description string

	// Header overrides the auto-rendered Heading/Description block.
	// Use when the header needs more than a title — e.g. a row with an
	// avatar and trailing actions.
	Header render.HTML

	// Footer renders below the body, separated by a hairline border.
	// Common usage: button row, last-updated timestamp, status pill.
	Footer render.HTML

	// Interactive flips the surface to a focusable, hover-able link
	// shell. When set, the card renders as an <a> wrapping a <section>
	// so the entire surface activates on click.
	Href string

	Variant CardVariant
	ID      string
	Class   string
}

CardConfig configures a card.

type CardVariant

type CardVariant string

CardVariant selects the chrome treatment.

const (
	// CardElevated is the default — surface + shadow + radius.
	CardElevated CardVariant = ""
	// CardOutlined draws a 1px border instead of a shadow.
	CardOutlined CardVariant = "outlined"
	// CardFlat drops both the border and the shadow.
	CardFlat CardVariant = "flat"
)

type CarouselConfig

type CarouselConfig struct {
	// Slides are the entries (≥1).
	Slides []CarouselSlide
	// Label is the accessible label for the carousel region (required,
	// becomes role=region + aria-label).
	Label string
	// ShowDots renders pagination dots under the slides (default on).
	// Set to false explicitly via NoDots if you want to hide them.
	NoDots bool
	// ShowArrows renders Prev/Next buttons (default on). Set NoArrows
	// to hide them.
	NoArrows bool
	// AutoRotateMs, when > 0, auto-advances every N ms. Paused on
	// hover, focus, and when prefers-reduced-motion is true.
	AutoRotateMs int
	// Loop, when true, makes Next-on-last wrap to first (and vice
	// versa). Default false — Prev/Next disable at the ends.
	Loop bool
	// VisiblePerView (default 1) shows N slides side-by-side; snap
	// still steps one slide at a time.
	VisiblePerView int
	// VirtualScroll, when true, server-renders only the first
	// VirtualWindow slides as visible content; the remaining slides
	// emit as same-width placeholder divs paired with a JSON manifest
	// of the deferred HTML. The runtime hydrates each placeholder via
	// IntersectionObserver as it scrolls into the viewport (plus a
	// one-window read-ahead buffer). Use for image-heavy archive views
	// (>50 slides) where rendering every slide upfront is wasteful.
	//
	// Once hydrated, slides stay hydrated for the lifetime of the
	// page — browsers manage the image cache on their own and
	// re-hydrating on scroll-back would feel laggier than the original
	// problem.
	VirtualScroll bool
	// VirtualWindow is the initial render window when VirtualScroll
	// is enabled. Default 5. Slides 0..VirtualWindow-1 ship hydrated;
	// the rest are placeholders.
	VirtualWindow int
	// VirtualPlaceholderHeight is an optional CSS length applied to
	// each unhydrated placeholder slide. Required when slides have
	// no intrinsic flex height (e.g. raw <img> with no fixed aspect)
	// — otherwise placeholders collapse to 0 and IntersectionObserver
	// fires every placeholder at once. Image-only carousels typically
	// pick "240px" or whatever matches the typical slide aspect.
	VirtualPlaceholderHeight string
	ID                       string
	Class                    string
	ExtraAttrs               html.Attrs
}

CarouselConfig configures a Carousel.

type CarouselSlide

type CarouselSlide struct {
	// Content is the slide body (required) — caller decides the shape.
	// For an image-only carousel pass an <img>; for richer slides pass
	// a Card or any composition.
	Content render.HTML
	// Label is the slide's accessible label (announced when focused
	// via Tab nav within the carousel). Defaults to "Slide N of M".
	Label string
}

CarouselSlide is one entry.

type CenterConfig

type CenterConfig struct {
	// MinHeight maps to a class — "viewport" (100vh), "screen" (100dvh
	// where supported), or "" (auto). Used for empty-state landing /
	// onboarding panels.
	MinHeight string
	ID        string
	Class     string
}

CenterConfig configures a centered region.

type CheckboxGroupConfig

type CheckboxGroupConfig struct {
	// Name is the shared form-field name for all checkboxes (required).
	Name string
	// Legend is the group label rendered as <legend> (required).
	Legend string
	// Options is the list of checkbox options (required, at least one).
	Options []CheckboxGroupOption
	// Help renders supporting text under the group.
	Help string
	// Error overrides Help with an error message.
	Error string
	// Required marks the group as required.
	Required bool
	ID       string
	Class    string
}

CheckboxGroupConfig configures a group of checkboxes.

type CheckboxGroupOption

type CheckboxGroupOption struct {
	Value    string
	Label    string
	Checked  bool
	Disabled bool
}

CheckboxGroupOption describes one checkbox in a CheckboxGroup.

type ClusterConfig

type ClusterConfig struct {
	Gap     Gap
	Align   Align
	Justify Justify
	Wrap    bool // when true (default), children wrap onto multiple lines
	ID      string
	Class   string
}

ClusterConfig configures a horizontal cluster.

type CodeBlockConfig

type CodeBlockConfig struct {
	Code     string // raw source to render; escaped. Ignored when Lines is set.
	Language string // optional, used for aria-label only
	// Lines carries pre-rendered (e.g. syntax-highlighted) logical source
	// lines. When non-empty it takes precedence over Code; each entry is
	// wrapped as one line so LineNumbers can number it. Callers own the
	// per-token markup — pass already-escaped, trusted HTML.
	Lines []render.HTML
	// Filename, when set, renders a chrome header (status dot + filename)
	// above the body and switches the wrapper to a framed container.
	Filename string
	// ShowCopy adds a copy-to-clipboard button (the framework CopyButton)
	// in the header, targeting this block's own body. Forces a header even
	// when Filename is empty.
	ShowCopy bool
	// LineNumbers renders a left gutter numbering each line.
	LineNumbers bool
	ID          string
	Class       string
}

CodeBlockConfig configures a styled code-sample block.

type CollapsibleConfig

type CollapsibleConfig struct {
	Summary string // required — the always-visible header
	Open    bool   // optional — start expanded (default: collapsed)
	Class   string // optional — additional CSS classes
	ID      string // optional — element id
}

CollapsibleConfig configures an expand/collapse section. Uses the native <details> element with data-fui-disclosure for keyboard support (Escape to close, aria-expanded mirroring).

type ColorPickerConfig

type ColorPickerConfig struct {
	// Name is the form field name for the color input (required).
	Name string
	// Label is the accessible label (required).
	Label string
	// Value is the initial color (hex, e.g. "#4F46E5"). Defaults to
	// the browser's native default (black) when empty.
	Value string
	// Disabled disables the input.
	Disabled bool
	ID       string
	Class    string
}

ColorPickerConfig configures a ColorPicker.

type Column

type Column struct {
	// Key is the column identifier used for sort state and matching
	// against Row.Cells. Required.
	Key string

	// Header is the visible column header text. Required.
	Header string

	// Sortable enables a clickable sort link in the header.
	Sortable bool

	// Align is "start" (default), "center", or "end".
	Align string
}

Column describes one DataTable column.

type CommandPaletteConfig

type CommandPaletteConfig struct {
	// Name uniquely identifies the modal widget. Default
	// "command-palette".
	Name string

	// RPCPath is the search endpoint. The handler receives the
	// query string and returns `<li role="option">…</li>` fragments
	// to swap into the listbox. Required.
	RPCPath string

	// Placeholder is the input placeholder. Default
	// "Type a command or search…".
	Placeholder string

	// Shortcut is the chord that opens the palette. Default "Meta+K"
	// (Cmd+K on Mac, Ctrl+K elsewhere — the runtime treats either as
	// Mod when matching).
	Shortcut string

	// DebounceMs is the search debounce window. Default 150 (snappier
	// than a generic combobox since results render eagerly).
	DebounceMs int

	// TriggerLabel is the SR-only trigger button text — what AT
	// users hear if they tab to it. Default "Open command palette".
	TriggerLabel string

	// EmptyHTML is the listbox HTML at first paint. Empty (default)
	// renders a placeholder hint.
	EmptyHTML string
}

CommandPaletteConfig configures the command palette.

type ConditionalFieldConfig

type ConditionalFieldConfig struct {
	// WhenName is the form field name to watch. Required.
	WhenName string

	// WhenValue is the value that triggers showing the children.
	// For checkboxes/radios, this matches the value attribute. Required.
	WhenValue string

	// Children is the content to show when the condition is met.
	Children []render.HTML

	Class string
}

ConditionalFieldConfig configures a field conditionally shown based on another field's value.

func (ConditionalFieldConfig) EvaluateInitialState

func (cfg ConditionalFieldConfig) EvaluateInitialState(currentValue string) bool

EvaluateInitialState returns true if the component should be visible based on the provided current value of the watched field. This is a helper for server-side rendering when the form already has a value that should pre-show the conditional content.

type ConfirmActionConfig

type ConfirmActionConfig struct {
	// Name uniquely identifies the modal widget. Required.
	// Usually qualified per row, e.g. "delete-user-42".
	Name string

	// TriggerLabel is the visible text on the destructive button.
	// Required.
	TriggerLabel string

	// TriggerVariant maps to one of the framework button variants.
	// Defaults to "danger". The trigger always renders as
	// .ui-btn--<TriggerVariant>.
	TriggerVariant string

	// Title is the alertdialog title (h2). Required.
	Title string

	// Body is the alertdialog body paragraph. Required — the body
	// gives the user the information they need to confirm safely.
	Body string

	// ConfirmLabel defaults to "Confirm".
	ConfirmLabel string

	// CancelLabel defaults to "Cancel".
	CancelLabel string

	// RPCPath is the endpoint the Confirm button posts to. Required.
	RPCPath string

	// RPCMethod defaults to "POST".
	RPCMethod string

	// AutofocusConfirm flips the initial focus from Cancel (the
	// default, safer choice for destructive flows where accidental
	// Enter must not fire the action) to Confirm. Set to true for
	// non-destructive confirmations ("Apply changes?", "Continue?").
	AutofocusConfirm bool
}

ConfirmActionConfig configures the confirmation flow.

type ContainerConfig

type ContainerConfig struct {
	// Width picks the max-inline-size. Defaults to ContainerDefault.
	Width ContainerWidth
	// As lets the caller pick a non-<div> tag (e.g. "section", "main").
	// Defaults to "div".
	As         string
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

ContainerConfig configures a Container.

type ContainerWidth

type ContainerWidth string

ContainerWidth picks the max-inline-size cap.

const (
	// ContainerNarrow caps at ~640px — long-form prose, marketing.
	ContainerNarrow ContainerWidth = "narrow"
	// ContainerDefault caps at ~1080px — most pages.
	ContainerDefault ContainerWidth = ""
	// ContainerWide caps at ~1280px — dashboards.
	ContainerWide ContainerWidth = "wide"
	// ContainerFull removes the cap; padding still applies.
	ContainerFull ContainerWidth = "full"
)

type CopyButtonConfig

type CopyButtonConfig struct {
	// Target is a CSS selector that identifies the element whose
	// textContent will be copied. Required.
	Target string

	// Label is the visible button text before copying. Default "Copy".
	Label string

	// CopiedLabel is the visible text shown briefly after success.
	// Default "Copied".
	CopiedLabel string

	// IconOnly hides the visible label but keeps the SR-only label
	// (via AriaLabel or default). Use when the button is icon-only.
	IconOnly bool

	// AriaLabel overrides the screen-reader name. When IconOnly is
	// true and AriaLabel is empty, defaults to "Copy to clipboard".
	AriaLabel string

	// AnnounceText is the message written into the role=status span
	// on copy success. Default "Copied".
	AnnounceText string

	// ToastOnCopy, when true, fires a toast on copy success. The toast
	// is dispatched via window.__gofastr.toast({...}) so it stacks in
	// the page's existing ToastStack (or auto-created one) — no extra
	// wiring required. Use ToastTitle / ToastBody / ToastVariant to
	// configure the message; sensible defaults if left blank.
	ToastOnCopy bool

	// ToastTitle is the toast title when ToastOnCopy=true. Default "Copied".
	ToastTitle string

	// ToastBody is the toast body when ToastOnCopy=true. Default empty.
	ToastBody string

	// ToastVariant maps to the toast's variant — "success" (default),
	// "info", "warning", "danger".
	ToastVariant string

	// ToastTTLms is the toast auto-dismiss timeout in milliseconds.
	// Default 3000.
	ToastTTLms int

	ID    string
	Class string
}

CopyButtonConfig configures the copy button.

type CounterConfig

type CounterConfig struct {
	// SignalName is the signal that holds the count value. Required
	// unless Slice is set.
	SignalName string

	// Slice, when set, supplies both the signal name and the initial
	// value from one typed source (and auto-seeds it). Takes precedence
	// over SignalName.
	Slice *store.Slice[int]

	// Step is the increment/decrement size. Defaults to 1.
	Step int

	// Class is an optional extra CSS class on the wrapper.
	Class string
}

CounterConfig configures a client-side counter with increment/decrement buttons. The counter is purely local — no RPC calls. It uses the signal system for state.

type DataTableConfig

type DataTableConfig struct {
	// Columns is the column definitions. Required.
	Columns []Column

	// Rows is the rendered rows for the current page.
	Rows []Row

	// Caption is an accessible table caption (optional).
	Caption string

	// SortBy is the active sort column's Key (optional).
	SortBy string

	// SortDir is the active sort direction (asc/desc).
	SortDir SortDir

	// SortHrefPattern is a Sprintf pattern with two %s placeholders
	// for column key and direction, e.g. "?sort=%s&dir=%s". Required
	// if any column is Sortable.
	SortHrefPattern string

	// Pagination is an optional pagination.Config. When set, the
	// pagination nav renders below the table.
	Pagination *pagination.Config

	// Empty is the EmptyState shown when len(Rows) == 0. If zero,
	// a default empty state is rendered.
	Empty EmptyStateConfig

	// IslandSignal turns this DataTable into an island. When non-empty,
	// sort headers render as `data-fui-rpc` buttons that fire RPCs at
	// IslandEndpoint instead of plain `<a href>` links. The Pagination
	// config inherits the same island settings automatically (so a single
	// IslandSignal+IslandEndpoint pair drives both sort and page).
	//
	// The signal-bound wrapper is the caller's responsibility — wrap
	// the DataTable's rendered HTML in:
	//   <div data-fui-signal="<IslandSignal>" data-fui-signal-mode="html">
	//     {DataTable(...)}
	//   </div>
	IslandSignal string

	// IslandEndpoint is the URL the sort/page RPCs target. Sort links
	// hit "<endpoint>?sort=…&dir=…&p=…"; pagination links hit
	// "<endpoint>?sort=…&dir=…&p=N". The handler is expected to return
	// the full new DataTable HTML.
	IslandEndpoint string

	// Responsive selects how the table behaves when its container is
	// narrow. Default keeps horizontal scroll; ResponsiveCards collapses
	// rows into labeled cards via container queries.
	Responsive ResponsiveMode

	ID    string
	Class string
}

DataTableConfig configures a DataTable.

type DiffMode

type DiffMode string

DiffMode picks the layout.

const (
	DiffUnified DiffMode = ""
	DiffSplit   DiffMode = "split"
)

type DiffViewerConfig

type DiffViewerConfig struct {
	// Patch is the raw unified-diff body (required). Lines prefixed
	// "+" are additions, "-" are removals, " " (space) are context,
	// "@@" lines are hunk headers, "---" / "+++" headers are
	// rendered as a filename row.
	Patch string
	// Mode picks unified (default) or split layout.
	Mode DiffMode
	// LeftLabel / RightLabel show above split columns (defaults
	// "Old" / "New").
	LeftLabel  string
	RightLabel string
	ID         string
	Class      string
}

DiffViewerConfig configures a DiffViewer.

type DividerConfig

type DividerConfig struct {
	// Label optionally renders a centered inline label. Common
	// usage: "OR" between two auth options, "Pinned" above the rest
	// of a list. When set, the divider switches from a plain <hr>
	// to a labelled <div role="separator">.
	Label string

	// Orientation selects horizontal (default) or vertical.
	Orientation DividerOrientation

	ID    string
	Class string
}

DividerConfig configures a divider.

type DividerOrientation

type DividerOrientation string

DividerOrientation selects horizontal vs. vertical line.

const (
	DividerHorizontal DividerOrientation = "" // default
	DividerVertical   DividerOrientation = "vertical"
)

type DocCrumb

type DocCrumb struct {
	Label string
	Href  string
}

DocCrumb is one breadcrumb. An empty Href marks the current (last) crumb, rendered as plain text rather than a link.

type DocLayoutConfig

type DocLayoutConfig struct {
	// Nav is the left rail (use DocNav). Empty → single-column narrow doc.
	Nav render.HTML
	// Crumbs renders a breadcrumb trail above the article body.
	Crumbs []DocCrumb
	// CrumbsLabel overrides the breadcrumb nav's aria-label ("Breadcrumb").
	CrumbsLabel string
	// Toc is the optional right rail (in-page table of contents).
	Toc render.HTML
	// Pager, when set, renders a prev/next footer after the body.
	Pager *DocPager
	Class string
	ID    string
}

DocLayoutConfig configures a DocLayout.

type DocPager

type DocPager struct {
	PrevHref, PrevLabel string
	NextHref, NextLabel string
}

DocPager configures the prev/next footer. Empty Next* fields omit the next card (e.g. on the last page).

type EmptyStateConfig

type EmptyStateConfig struct {
	Title       string      // required
	Description string      // optional supporting text
	Action      render.HTML // optional CTA (e.g. a button or link)
	ID          string
	Class       string
}

EmptyStateConfig configures an empty-state surface.

type FactBoxConfig

type FactBoxConfig struct {
	Label string // required short label
	Value string // visible value; mutually exclusive with ValueHTML
	// ValueHTML lets the value contain inline markup (code, links).
	// If non-empty, takes precedence over Value.
	ValueHTML render.HTML
	// Style picks the visual hierarchy. Default FactStyleLabelFirst.
	Style FactStyle
	// FullWidth, when true, marks the box to span the full grid row
	// (the consuming grid still controls the column template).
	FullWidth bool
	ID        string
	Class     string
}

FactBoxConfig configures one labelled fact.

type FactStyle

type FactStyle string

FactStyle picks the visual hierarchy of a FactBox.

const (
	// FactStyleLabelFirst renders the label on top (small, uppercase)
	// and the value below (body-size). Default.
	FactStyleLabelFirst FactStyle = ""
	// FactStyleValueFirst renders the value on top (large display
	// type) and the label below (small, uppercase). Use for KPI-style
	// stat bands.
	FactStyleValueFirst FactStyle = "value-first"
)

type FieldErrors

type FieldErrors map[string]string

FieldErrors maps form field names to user-visible error messages. It is the same shape returned by [framework.ValidationRegistry.Validate] so server-side validation results round-trip directly into FormField.

Example flow:

errors := registry.Validate(ctx, formData)  // framework.ValidationRegistry
page := ui.Form(ui.FormConfig{
    Action: "/customers",
    Errors: errors,
},
    ui.FormFieldFor(errors, "email", ...),
    ui.FormFieldFor(errors, "name",  ...),
)

type FileDropzoneConfig

type FileDropzoneConfig struct {
	// Name is the form-field name (required).
	Name string
	// Label is the accessible label (required, used as the input's
	// aria-label and the visible heading inside the dropzone).
	Label string
	// Prompt overrides the default "Drop files here or click to
	// browse" call-to-action text.
	Prompt string
	// Accept is the MIME-type filter (e.g. "image/*", ".csv").
	Accept string
	// Multiple allows selecting multiple files.
	Multiple bool
	// Required marks the input required.
	Required bool
	// Disabled disables interaction.
	Disabled bool
	// ShowPreview opts into a thumbnail strip rendered below the
	// dropzone after change. Only works for image MIME types — the
	// runtime FileReader-reads each file and emits <img>.
	ShowPreview bool
	// MaxSizeMB is announced in the help text. Server is still
	// authoritative.
	MaxSizeMB int
	// Help renders supporting text under the dropzone.
	Help string
	// Error overrides Help and switches to error state.
	Error string
	ID    string
	Class string
}

FileDropzoneConfig configures a FileDropzone.

type FileUploadConfig

type FileUploadConfig struct {
	// Name is the form-field name. Required.
	Name string

	// Label is the visible label. Required.
	Label string

	// ID is the input element's id. Defaults to Name.
	ID string

	// Accept is the MIME-type filter passed to the native input.
	// Example: "image/*", ".pdf,.docx"
	Accept string

	// Multiple allows selecting multiple files.
	Multiple bool

	// Required marks the field as required in form submission.
	Required bool

	// Disabled disables interaction.
	Disabled bool

	// MaxSizeMB, when > 0, is announced in the help text so users
	// understand the constraint. The native input doesn't enforce
	// it; server-side validation must.
	MaxSizeMB int

	// Help renders supporting text under the drop zone.
	Help string

	// Error overrides Help and switches the field to error state.
	Error string

	Class string
}

FileUploadConfig configures a file upload.

type FilterChip

type FilterChip struct {
	// Label is the visible chip text. Required.
	Label string

	// DismissPath is the POST endpoint that removes this filter on
	// click of the × button. Required.
	DismissPath string

	// DismissBody is an optional static JSON body sent with the
	// dismiss request (data-fui-rpc-body). When empty, the server
	// is expected to deduce the filter from DismissPath alone.
	DismissBody string

	// Variant maps to StatusVariant — defaults to neutral. Use to
	// surface filter kind (info chips for tags, success for "active"
	// status filters, etc).
	Variant StatusVariant
}

FilterChip is one active filter.

type FilterChipBarConfig

type FilterChipBarConfig struct {
	// Filters is the active filter set. Empty renders an empty
	// (but valid) toolbar.
	Filters []FilterChip

	// ClearAllPath, when non-empty, renders a trailing "Clear all"
	// button that POSTs here.
	ClearAllPath string

	// ClearAllLabel overrides the trailing button's text.
	// Default "Clear all".
	ClearAllLabel string

	// Label is the aria-label on the toolbar.
	// Default "Active filters".
	Label string

	// RPCSignal, when set, is broadcast on every chip dismiss AND
	// on Clear all — so the bar swaps itself with the server's
	// re-rendered HTML.
	RPCSignal string

	// SignalName, when set, is also placed on the wrapper as
	// data-fui-signal so the runtime can swap the entire bar from
	// the RPC response. Pair with data-fui-signal-mode="html" on
	// the parent container.
	SignalName string

	ID    string
	Class string
}

FilterChipBarConfig configures the bar.

type FormConfig

type FormConfig struct {
	// Action is the form's action URL. Required.
	Action string

	// Method is "POST" (default) or "GET".
	Method string

	// Errors is an optional set of field-level errors. They are
	// applied to FormFieldFor() calls so re-rendering after a failed
	// submit re-applies error styling automatically.
	Errors FieldErrors

	// Summary is an optional Callout displayed above the fields when
	// the form has errors. If empty and Errors is non-empty, a default
	// "Please fix the highlighted fields and try again." is rendered.
	Summary string

	// SubmitLabel is the visible submit button label. Defaults to "Save".
	SubmitLabel string

	// HideSubmit omits the submit button entirely when true.
	// Use when the caller renders its own submit button.
	HideSubmit bool

	// Ctx, when non-nil, lets Form auto-stamp the hidden CSRF input
	// (the framework's "_csrf" field) on unsafe-method submits. It
	// reads middleware.TokenFromContext(Ctx) — i.e. the token the CSRF
	// middleware stashes on every request — so callers do not have to
	// remember `render.HTML(csrfInput(ctx))` as the first child of
	// every form. Nil-safe: a form rendered without Ctx omits the
	// hidden input (matches pre-v3 behavior so existing tests and
	// non-CSRF flows like Method:"GET" stay correct).
	Ctx context.Context

	ID    string
	Class string
}

FormConfig wraps a server-rendered <form>.

type FormFieldConfig

type FormFieldConfig struct {
	Label    string // required → <label>
	For      string // required → <label for=…> matches the input ID
	Help     string // optional helper text under the field
	Error    string // optional error message; non-empty switches to error styling
	Required bool   // adds a visible "required" hint and aria-required
	Input    render.HTML
	Class    string
}

FormFieldConfig configures a single form field row.

type FormRepeaterConfig

type FormRepeaterConfig struct {
	// Name is the repeater group name (used as prefix for field
	// indexing). Required.
	Name string

	// Items is the current list of rendered item groups.
	// Each item is a slice of render.HTML representing one row's fields.
	Items [][]render.HTML

	// MinItems prevents removal below this count. Default 0.
	MinItems int

	// MaxItems prevents addition above this count. Default 0 = unlimited.
	MaxItems int

	// AddLabel is the "Add" button text. Default "Add item".
	AddLabel string

	// RemoveLabel is the "Remove" button text. Default "Remove".
	RemoveLabel string

	Class string
}

FormRepeaterConfig configures a dynamic repeating field group.

type FormSectionConfig

type FormSectionConfig struct {
	Heading     string // optional
	Description string // optional
	Class       string
}

FormSectionConfig groups related fields under a heading + description.

type GalleryCaptionMode

type GalleryCaptionMode string

GalleryCaptionMode picks where captions render.

const (
	GalleryCaptionBelow   GalleryCaptionMode = ""        // <figcaption> under each thumb
	GalleryCaptionOverlay GalleryCaptionMode = "overlay" // gradient + text over the bottom of each thumb on hover/focus
	GalleryCaptionOff     GalleryCaptionMode = "off"     // no caption
)

type GalleryConfig

type GalleryConfig struct {
	// Variant picks the surface layout.
	Variant GalleryVariant
	// Items are the entries (≥1).
	Items []GalleryItem
	// Label is the accessible label for the gallery list. Defaults
	// to "Image gallery".
	Label string
	// Columns (Grid mode) — the number of columns. Default 3.
	// Masonry mode: uses this as the column count too.
	Columns int
	// Gap between thumbs. Default GapMD.
	Gap Gap
	// Lightbox, when non-empty, is the Name of a paired
	// framework/ui.Lightbox. Each item becomes a trigger for that
	// lightbox via data-fui-open + data-fui-deeplink.
	Lightbox string
	// HrefFn, when set, returns a per-item destination URL. Ignored
	// when Lightbox is set.
	HrefFn func(i int, it GalleryItem) string
	// CaptionMode controls caption rendering. Default Below.
	CaptionMode GalleryCaptionMode
	// ID / Class / Attrs pass through to the wrapper.
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

GalleryConfig configures a Gallery.

type GalleryItem

type GalleryItem struct {
	// Src is the full-resolution image URL (required).
	Src string
	// Thumb is the thumbnail URL. Defaults to Src.
	Thumb string
	// Alt is the accessible image description (required — empty Alt
	// is rejected at render time to surface omissions).
	Alt string
	// Caption is optional descriptive text shown per CaptionMode.
	Caption string
	// Width / Height for the thumbnail (CLS-safe). Default 200×150.
	Width  int
	Height int
}

GalleryItem is one entry.

type GalleryVariant

type GalleryVariant string

GalleryVariant picks the surface layout.

const (
	GalleryGrid    GalleryVariant = ""
	GalleryStrip   GalleryVariant = "strip"
	GalleryMasonry GalleryVariant = "masonry"
)

type Gap

type Gap string

Gap is a named spacing token. Maps to var(--spacing-*).

const (
	GapNone Gap = "none"
	GapXS   Gap = "xs"
	GapSM   Gap = "sm"
	GapMD   Gap = "" // default
	GapLG   Gap = "lg"
	GapXL   Gap = "xl"
	Gap2XL  Gap = "2xl"
)

type GlobalSearchConfig

type GlobalSearchConfig struct {
	// ID is the input element id (the runtime listbox uses
	// <ID>-listbox). Required, page-unique.
	ID string
	// Name is the form-submit name on the input. Required.
	Name string
	// Label is the visible label text (required, used as <label for=…>).
	Label string
	// RPCPath is the search endpoint. Required. POSTed with the
	// query in `<Name>=<value>`.
	RPCPath string
	// SignalName is the rpc-signal value used to swap the listbox
	// HTML after each search response. Required.
	SignalName string
	// Placeholder for the input. Default "Search…".
	Placeholder string
	// Shortcut, when set, opts the input into runtime focus-on-key:
	// `data-fui-shortcut-focus="<chord>"` (default "/"). Pass an
	// explicit empty string to disable.
	Shortcut string
	// ShowHint renders a small "Press <chord>" hint chip on the right
	// of the input. Default true when Shortcut is set.
	ShowHint *bool
	// DebounceMs is the input debounce window (passed to combobox).
	// Default 200.
	DebounceMs int
	// Sticky toggles position: sticky on the wrapper. Default true.
	Sticky bool
	Class  string
}

GlobalSearchConfig configures a GlobalSearch.

type GridConfig

type GridConfig struct {
	// Min is the minimum column width (e.g. "20rem"). The grid uses
	// `repeat(auto-fit, minmax(<Min>, 1fr))` so columns wrap at the
	// breakpoint implied by the minimum. Defaults to "16rem".
	Min   string
	Gap   Gap
	ID    string
	Class string
}

GridConfig configures a CSS grid.

type HeaderInfo

type HeaderInfo struct {
	Name   string
	Width  int
	Height int
	MIME   string
}

HeaderInfo is the subset of framework/image.VariantHeader that PipelineSourcesFromHeaders consumes. Decoupling from the concrete VariantHeader type lets framework/ui avoid an upward dependency on framework/image. Callers using framework/image can adapt their []VariantHeader with a one-line loop or by writing a typed adapter helper in their own code.

Note: Format from VariantHeader is intentionally omitted — MIME is the discriminator the <source type="..."> attribute actually needs, and a parallel `Format string` field would drift in type vs VariantHeader.Format (image.Format enum).

type HeroSplitConfig

type HeroSplitConfig struct {
	// Copy is the left column body (title, lede, CTAs).
	Copy render.HTML
	// Media is the right column body (code, image, stats).
	Media render.HTML
	// Ratio picks the column split. Defaults to HeroSplitEqual.
	Ratio HeroSplitRatio
	// AriaLabel labels the <section> for screen readers (the hero is
	// almost always the page-opening landmark). Required unless an
	// h1 inside Copy provides the accessible name.
	AriaLabel string
	// Class is appended to the ui-hero-split wrapper.
	Class string
}

HeroSplitConfig configures a HeroSplit. Copy and Media are both slots — the framework does not assume their contents. Pair with ui.Container if you want a max-width wrapper around the hero.

type HeroSplitRatio

type HeroSplitRatio string

HeroSplitRatio picks the column ratio. The three values cover the shapes that actually show up — pages that want something else should write a one-off and not abuse the enum.

const (
	// HeroSplitEqual is 1:1 — balanced two-column hero.
	HeroSplitEqual HeroSplitRatio = ""
	// HeroSplitCopyWide gives the copy column more room (1.4:1).
	// Use when the right slot is a compact stat band or icon grid.
	HeroSplitCopyWide HeroSplitRatio = "copy"
	// HeroSplitMediaWide gives the media column more room (1:1.2).
	// Use when the right slot is a code block, screenshot, or video.
	HeroSplitMediaWide HeroSplitRatio = "media"
)

type IconConfig

type IconConfig struct {
	// Size sets the rendered width/height. Accepts any CSS length
	// (e.g. "20", "1.25rem"). Default: "20".
	Size string

	// AriaLabel makes the icon meaningful to assistive tech. When set,
	// the SVG renders with role="img" and aria-label="<AriaLabel>";
	// without it, the icon is aria-hidden="true" (decorative).
	AriaLabel string

	ID    string
	Class string
}

IconConfig configures an icon render.

type ImageAspect

type ImageAspect string

ImageAspect selects a CSS aspect-ratio class. Predefined buckets avoid inline styles (CSP-clean).

const (
	ImageAspectAuto   ImageAspect = ""
	ImageAspectSquare ImageAspect = "1-1"
	ImageAspect4x3    ImageAspect = "4-3"
	ImageAspect16x9   ImageAspect = "16-9"
	ImageAspect21x9   ImageAspect = "21-9"
	ImageAspect3x4    ImageAspect = "3-4"
)

type ImageFit

type ImageFit string

ImageFit selects the object-fit treatment.

const (
	ImageFitCover   ImageFit = "" // default
	ImageFitContain ImageFit = "contain"
	ImageFitFill    ImageFit = "fill"
)

type ImageSource

type ImageSource struct {
	URL   string // image URL — required
	Width int    // intrinsic pixel width — required (becomes "<url> <width>w")
}

ImageSource represents a single entry in an image's responsive source set.

type InputGroupConfig

type InputGroupConfig struct {
	// Prepend is optional content rendered before the input (text, icon, etc.).
	Prepend render.HTML
	// Input is the actual input element (required).
	Input render.HTML
	// Append is optional content rendered after the input.
	Append render.HTML
	// Class adds extra CSS classes to the wrapper.
	Class string
}

InputGroupConfig configures an InputGroup.

type JSONViewerConfig

type JSONViewerConfig struct {
	// Value is the data to render (required).
	Value any
	// OpenDepth is the recursion depth that renders open by default.
	// 0 means just the root is open; -1 means everything is open.
	OpenDepth int
	// MaxStringLen truncates long strings with "…". 0 = no limit.
	MaxStringLen int
	ID           string
	Class        string
}

JSONViewerConfig configures a JSONViewer.

type Justify

type Justify string

Justify is a main-axis alignment value.

const (
	JustifyStart   Justify = "start"
	JustifyCenter  Justify = "center"
	JustifyEnd     Justify = "end"
	JustifyBetween Justify = "between"
	JustifyAround  Justify = "around"
)

type LightboxConfig

type LightboxConfig struct {
	// Name is the unique widget name (required) used as the
	// preset.Modal name. Page-unique. Any element with
	// data-fui-open="<this Name>" opens the overlay.
	Name string
	// Label is the accessible name for the open modal. Defaults to
	// "Image viewer".
	Label string
	// NavArrows renders Prev/Next buttons inside the modal AND wires
	// ArrowLeft/Right keyboard nav over siblings sharing the same
	// data-fui-lightbox-group attribute.
	NavArrows bool
	// ShowCaption adds a <figcaption> bound to the "caption" signal.
	// Triggers pass caption=<text> in their data-fui-deeplink.
	ShowCaption bool
	// AllowDownload renders a visible "Download" anchor inside the
	// modal whose href is bound to the current src signal.
	AllowDownload bool
	// Pages, when non-empty, scopes the modal mount to those routes.
	Pages []string
}

LightboxConfig configures a Lightbox.

type LineChartConfig

type LineChartConfig struct {
	// Series are the lines (≥1, each with ≥2 Values).
	Series []LineSeries
	// Labels are optional x-axis tick labels. When non-empty, must
	// match the length of the longest series.
	Labels []string
	// Width / Height in CSS pixels. Default 360×200.
	Width  int
	Height int
	// ShowLegend renders a small legend strip below the chart.
	ShowLegend bool
	// LabelledBy is the id of an element naming the chart for AT.
	LabelledBy string
	ID         string
	Class      string
}

LineChartConfig configures a LineChart.

type LineSeries

type LineSeries struct {
	// Name is the legend label (required).
	Name string
	// Values are the y-values in order.
	Values []float64
	// Color overrides the default palette pick. Optional palette key
	// or raw CSS color.
	Color string
	// Area, when true, fills under the line.
	Area bool
}

LineSeries is one series.

type LinkButtonConfig

type LinkButtonConfig struct {
	Label   string        // required visible text
	Href    string        // required navigation target
	Variant ButtonVariant // defaults to ButtonPrimary
	Size    ButtonSize    // defaults to ButtonSizeDefault
	// External, when true, opens the link in a new tab with
	// rel="noopener noreferrer". Use for off-site links (docs to
	// GitHub, pkg.go.dev, etc.). The runtime's SPA-nav interceptor
	// naturally skips http(s):// hrefs (they're not "internal"), so
	// External does not also need to "suppress SPA nav" — the
	// underlying SPA router already does the right thing.
	External   bool
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

LinkButtonConfig configures a button-styled <a> link. Use this when the affordance navigates (changes URL) — CTAs like "Get started", "Read the docs". For in-page actions that don't change URL, use Button instead.

type LinkConfig

type LinkConfig struct {
	Href       string // required
	Text       string // required visible text
	Variant    LinkVariant
	Class      string
	ID         string
	ExtraAttrs html.Attrs
}

LinkConfig configures a Link.

type LinkVariant

type LinkVariant string

LinkVariant chooses the visual treatment of a Link.

const (
	// LinkInline is a normal in-flow text link — primary-colored, hover
	// underline, no min-height. Use this for links in prose.
	LinkInline LinkVariant = ""
	// LinkAction is a row-action / list-item link — 44×44 tap target
	// (WCAG 2.5.5) and inline-flex centering. Use this when the link
	// sits in a table row, list, or toolbar alongside Button siblings.
	LinkAction LinkVariant = "action"
	// LinkMuted is a subdued text-muted link — for "see all", "view
	// details" affordances that should not compete with primary CTAs.
	LinkMuted LinkVariant = "muted"
)

type MarkdownConfig

type MarkdownConfig struct {
	// Source is the raw markdown text (required).
	Source string
	// Compact tightens spacing — useful for inline previews where
	// hero-page paragraph rhythm would feel wrong.
	Compact    bool
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

MarkdownConfig configures a Markdown renderer.

type MenuConfig struct {
	// ID becomes the dropdown's stable identifier. Used to pair the
	// trigger with the panel for aria-controls + analytics. Optional
	// — auto-generated when empty.
	ID string

	// Label is the trigger's visible text. Mutually exclusive with
	// TriggerHTML.
	Label string

	// TriggerHTML overrides Label with custom inline HTML. Use for
	// avatar buttons, icon-only triggers, etc.
	TriggerHTML render.HTML

	// Items is the menu's contents. Required (empty menus panic at
	// render time — they signal a bug, not a runtime state).
	Items []MenuItem

	// Position anchors the panel relative to the trigger.
	Position MenuPosition

	// TriggerClass / PanelClass append to the rendered element class
	// lists (rare).
	TriggerClass string
	PanelClass   string
}

MenuConfig describes a dropdown menu — a trigger that, when activated, reveals a list of MenuItems with proper roles, keyboard navigation, and theming.

type MenuItem struct {
	// Label is the item's visible text. Required unless Separator.
	Label string

	// Href turns the item into an <a> link. Mutually exclusive with
	// custom action attrs; if both are supplied, Href wins.
	Href string

	// RPC + RPCMethod wire the item to a server-side handler via
	// data-fui-rpc / data-fui-rpc-method. Use for "Delete this row"
	// menu items.
	RPC, RPCMethod string

	// Icon is rendered to the left of Label. Inline HTML; caller
	// supplies an <svg>, character, or render.Text("⚙").
	Icon render.HTML

	// Variant tints destructive items (red) — purely a visual hint;
	// the actual confirm step belongs on the RPC via data-fui-confirm.
	Danger bool

	// Disabled greys the item out and removes it from keyboard
	// navigation.
	Disabled bool

	// Separator renders a horizontal divider instead of an item.
	// Label and other fields are ignored when true.
	Separator bool

	// Class appends to the rendered item's class list (rare; mainly
	// for testing or one-off hooks).
	Class string

	// Attrs sprinkles extra attributes onto the rendered element.
	ExtraAttrs map[string]string
}

MenuItem is one row in a Menu — either an actionable item (Label required, Href / OnClickAttr / RPC etc. as supplied) or a separator. The framework owns the role attributes; callers only describe semantics.

type MenuPosition string

MenuPosition controls which corner of the trigger the menu panel anchors to. Defaults to MenuBottomStart (panel hangs below the trigger, aligned to its inline-start edge).

const (
	MenuBottomStart MenuPosition = "bottom-start"
	MenuBottomEnd   MenuPosition = "bottom-end"
	MenuTopStart    MenuPosition = "top-start"
	MenuTopEnd      MenuPosition = "top-end"
)

type NetworkRetryBannerConfig

type NetworkRetryBannerConfig struct {
	// HealthEndpoint is the URL the Retry button pings to test
	// connectivity. Must return 2xx when the server is healthy.
	// Required.
	HealthEndpoint string

	// FailureThreshold is the number of consecutive RPC failures that
	// trip the banner. Default 3. Zero disables the failure-count
	// trigger (banner only shows on explicit reportFailure threshold
	// hits never reached).
	FailureThreshold int

	// SSESilenceMs triggers the banner if no SSE event arrives for
	// this many milliseconds. Default 0 (disabled — opt-in until the
	// SSE module exposes lastEventAt).
	SSESilenceMs int

	// Title is the banner heading. Default "Connection lost".
	Title string

	// Description is the body text. Default explains the recovery
	// action.
	Description string

	// RetryLabel is the retry button text. Default "Retry now".
	RetryLabel string

	ID    string
	Class string
}

NetworkRetryBannerConfig configures the banner.

type NotificationBellConfig

type NotificationBellConfig struct {
	// Name is the unique widget name (required) used for the paired
	// preset.Popover. Keep page-unique.
	Name string
	// Label is the accessible label on the bell button (required,
	// e.g. "Notifications").
	Label string
	// UnreadCount renders as a badge on the bell. Hidden when 0
	// (unless SignalUnread is set — then the badge always renders
	// and the signal drives its visibility / text).
	UnreadCount int
	// Items are the entries rendered inside the popover. ≥1 recommended;
	// 0 renders the EmptyText placeholder.
	Items []NotificationItem
	// EmptyText is shown when Items is empty. Default
	// "No new notifications".
	EmptyText string
	// SignalUnread, when non-empty, binds the badge text to that
	// signal name so live updates can swap the count without a page
	// reload. The badge always renders when this is set (signal value
	// "" hides it via the empty-state CSS rule).
	SignalUnread string
	// SignalList, when non-empty, binds the popover list HTML to that
	// signal so live updates can swap the list. Items above seed the
	// SSR initial render.
	SignalList string
	// Pages, when non-empty, scopes the popover mount to those routes.
	Pages      []string
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

NotificationBellConfig configures a NotificationBell.

type NotificationConfig

type NotificationConfig struct {
	// Title is the prominent first line. Required.
	Title string

	// Body is optional supporting text below the title.
	Body string

	// Variant colors the leading icon and accent rail. Defaults to Info.
	Variant StatusVariant

	// DismissHref optionally adds a × link with this href. Pair with a
	// server-side handler that removes the notification from session
	// state. Empty omits the dismiss control.
	DismissHref string

	// DismissLabel overrides the dismiss link's accessible label.
	// Defaults to "Dismiss notification".
	DismissLabel string

	// Position pins the notification to a screen corner via fixed
	// positioning. Defaults to NotificationInline (in document flow).
	Position NotificationPosition

	ID    string
	Class string
}

Notification is the styled content for an ephemeral toast. Drop it inside a core-ui/widget/preset.Toast surface (or any container) to render a status pill with optional icon, title, body, and a dismiss link.

Notification is intentionally stateless — auto-dismiss timing is the host's responsibility. The dismiss link can target a URL that the server uses to remove the notification from session state, then a signal-driven re-render swaps it out.

type NotificationItem

type NotificationItem struct {
	// Title is the headline (required, e.g. "Build #4821 failed").
	Title string
	// Body is optional supporting text.
	Body string
	// Time is an optional right-aligned timestamp string ("2m ago").
	Time string
	// Href, when set, makes the entire row a link.
	Href string
	// Unread marks the row with a left-edge primary stripe.
	Unread bool
}

NotificationItem is one entry in the bell dropdown.

type NotificationPosition

type NotificationPosition string

NotificationPosition controls where a Notification renders.

const (
	// NotificationInline (default) renders in document flow. Hosts
	// position a stack themselves.
	NotificationInline NotificationPosition = ""

	NotificationTopRight    NotificationPosition = "top-right"
	NotificationTopLeft     NotificationPosition = "top-left"
	NotificationBottomRight NotificationPosition = "bottom-right"
	NotificationBottomLeft  NotificationPosition = "bottom-left"
)

type NumberInputConfig

type NumberInputConfig struct {
	// Name is the form-field name (required).
	Name string
	// Label is the accessible label (required, used as <label for=…>).
	Label string
	// Min / Max bound the value. When both 0, no client-side bound is
	// applied (server is still authoritative).
	Min int
	Max int
	// Step is the +/- button granularity. Default 1.
	Step int
	// Value is the initial value.
	Value int
	// Disabled disables interaction.
	Disabled bool
	// Required marks the field required.
	Required bool
	// Help renders supporting text under the field.
	Help string
	// Error overrides Help with an error message.
	Error      string
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

NumberInputConfig configures a NumberInput.

type OptimisticActionConfig

type OptimisticActionConfig struct {
	// Endpoint is the URL the click fires against. Required.
	Endpoint string

	// Method is "POST" (default), "DELETE", "PATCH", or "PUT".
	Method string

	// IdleLabel is the button text in the rest state. Required.
	IdleLabel string

	// SuccessLabel is shown immediately on click (the optimistic
	// flip). Required.
	SuccessLabel string

	// IdleIcon optionally renders alongside IdleLabel.
	IdleIcon render.HTML

	// SuccessIcon optionally renders alongside SuccessLabel — common
	// usage: a small check or filled-heart SVG.
	SuccessIcon render.HTML

	// Variant maps to the standard Button variant ("primary"/""
	// default, "secondary", "danger", "ghost").
	Variant ButtonVariant

	// Size maps to the standard Button size ("" default, "small",
	// "large").
	Size ButtonSize

	ID    string
	Class string
}

OptimisticActionConfig configures an OptimisticAction button.

type OptimizedImageConfig

type OptimizedImageConfig struct {
	Src string // fallback / single-resolution URL (required)
	Alt string // alt text — required for non-decorative images

	// Width and Height are the intrinsic pixel dimensions of the
	// fallback Src. Setting them is mandatory to reserve layout space
	// and avoid Cumulative Layout Shift on first paint.
	Width  int
	Height int

	// Sources, when set, render alongside Src in a <picture> via
	// srcset="<url> <width>w, …". The browser picks the best size for
	// the viewport.
	Sources []ImageSource

	// Sizes is the CSS sizes attribute for the responsive source set.
	// Defaults to "100vw" when Sources is non-empty.
	Sizes string

	// Eager flips loading="lazy" → loading="eager". Use for
	// above-the-fold hero images.
	Eager bool

	// HighPriority sets fetchpriority="high" (above-the-fold critical
	// imagery). Mutually exclusive with Eager=false; setting both
	// keeps both behaviors.
	HighPriority bool

	// Fit selects the object-fit treatment (default cover).
	Fit ImageFit

	// Aspect locks the aspect ratio via a CSS class (CSP-clean —
	// no inline style). Setting Width + Height already establishes
	// the intrinsic ratio; Aspect is for forced ratios distinct from
	// the source.
	Aspect ImageAspect

	// Rounded toggles a token-driven border-radius treatment.
	Rounded bool

	// Placeholder, when non-empty, renders a low-fidelity background
	// (typically a 1x1 base64-encoded pixel) that shows under the
	// image while loading.
	Placeholder string

	ID    string
	Class string
}

OptimizedImageConfig configures a responsive, lazy-loaded image.

type PageHeaderConfig

type PageHeaderConfig struct {
	Title    string      // required
	Subtitle string      // optional supporting text below the title
	Eyebrow  string      // optional small label above the title (e.g. "Customers")
	Actions  render.HTML // optional trailing action slot (button row, link)
	Class    string
	ID       string
}

PageHeaderConfig configures a page-top header.

type PasswordInputConfig

type PasswordInputConfig struct {
	// Name is the form-field name (required).
	Name string
	// ID is the input element's id (required).
	ID string
	// Placeholder renders the native placeholder.
	Placeholder string
	// Required marks the field required.
	Required bool
	// Autocomplete sets the autocomplete attribute (e.g. "current-password", "new-password").
	Autocomplete string
	// Error overrides with an error message + aria-invalid.
	Error string
	// Class adds extra CSS classes to the wrapper.
	Class string
	// Attrs lets callers attach additional attributes.
	ExtraAttrs map[string]string
}

PasswordInputConfig configures a PasswordInput.

type PieChartConfig

type PieChartConfig struct {
	// Slices are the entries (≥1 with non-zero Value).
	Slices []PieSlice
	// Size is the SVG square side in CSS pixels. Default 160.
	Size int
	// InnerRadius (0–1, fraction of outer radius) cuts the center
	// out, turning it into a donut. Default 0 (pie).
	InnerRadius float64
	// CenterLabel renders a label in the middle of the donut hole.
	// Ignored when InnerRadius=0.
	CenterLabel string
	// CenterSubtext renders smaller text under the CenterLabel.
	CenterSubtext string
	// LabelledBy is the id of an element naming the chart for AT.
	// Without it the chart is aria-hidden.
	LabelledBy string
	ID         string
	Class      string
}

PieChartConfig configures a PieChart.

type PieSlice

type PieSlice struct {
	// Label is the accessible label for the slice (required when
	// LabelledBy is set on the chart — used as <title> for AT).
	Label string
	// Value is the slice value (≥0). Slices with Value=0 are skipped.
	Value float64
	// Color overrides the default palette pick. Optional CSS color
	// or one of: "primary", "info", "success", "warning", "danger".
	Color string
}

PieSlice is one slice of the pie.

type PipelineImageConfig

type PipelineImageConfig struct {
	// Fallback is the <img>'s src — required, used by browsers that
	// can't pick from Sources. Typically a mid-size JPEG / PNG.
	Fallback string

	// Alt — required for non-decorative images.
	Alt string

	// Width and Height are the intrinsic dimensions of Fallback.
	// Setting them is mandatory to avoid CLS.
	Width, Height int

	// Sources is the typed responsive set; one <source> element is
	// emitted per distinct Type, grouping every PipelineSource with
	// that type into a single srcset.
	//
	// Groups are emitted in the order their Type first appears, so
	// putting the modern format (WebP) before the legacy one makes
	// older browsers fall through to the Fallback <img>.
	Sources []PipelineSource

	// Sizes is the CSS sizes attribute. Default "100vw".
	Sizes string

	// Placeholder accepts either a data: URL (LQIP) or a BlurHash
	// string. The component sets data-placeholder for data: URLs and
	// data-blurhash for anything else. Consumers wire those attributes
	// to a CSS background or a JS hydrator as they see fit.
	Placeholder string

	Eager        bool
	HighPriority bool
	Fit          ImageFit
	Aspect       ImageAspect
	Rounded      bool

	ID, Class string
}

PipelineImageConfig configures a multi-format <picture> with an optional placeholder (LQIP data URL or BlurHash string).

type PipelineSource

type PipelineSource struct {
	URL   string // image URL — required
	Width int    // intrinsic pixel width — required
	Type  string // MIME type — required (e.g. "image/webp", "image/jpeg")
}

PipelineSource is one entry in a typed responsive source set, typically produced by framework/image.VariantSet.

func PipelineSourcesFromHeaders

func PipelineSourcesFromHeaders(headers []HeaderInfo, urlFor func(name string) string) []PipelineSource

PipelineSourcesFromHeaders bridges framework/image's variant pipeline to a typed PipelineSource slice. Given a URL function that maps a variant's Name to its public URL (e.g. through a storage backend), build the slice that goes into PipelineImageConfig.Sources without re-deriving MIME or width from filenames.

Empty headers are skipped (Width==0 or URL=="").

type PollingIndicatorConfig

type PollingIndicatorConfig struct {
	// Label is the text rendered next to the pulsing dot.
	// Defaults to "Live".
	Label string
	// Paused freezes the pulse animation and dims the dot — use when
	// the upstream polling has been paused or completed.
	Paused bool
	ID     string
	Class  string
}

PollingIndicatorConfig configures a PollingIndicator.

type ProgressStep

type ProgressStep struct {
	// Label is the step name (required, e.g. "Account").
	Label string
	// Hint is the optional supporting line below the label.
	Hint string
	// Status picks the visual state. Defaults to ProgressStepUpcoming.
	Status ProgressStepStatus
	// Href, when set on a complete step, makes the step a link the
	// user can click to navigate back. Upcoming steps ignore Href.
	Href string
}

ProgressStep is one entry in the indicator.

type ProgressStepStatus

type ProgressStepStatus string

ProgressStepStatus is the rendered state of a single step.

const (
	ProgressStepUpcoming ProgressStepStatus = "" // default
	ProgressStepCurrent  ProgressStepStatus = "current"
	ProgressStepComplete ProgressStepStatus = "complete"
)

type ProgressStepsConfig

type ProgressStepsConfig struct {
	// Steps are the entries in order. Required (≥1).
	Steps []ProgressStep
	// Orientation defaults to horizontal.
	Orientation ProgressStepsOrientation
	// Label is the optional aria-label for the wrapping nav. Defaults
	// to "Progress".
	Label      string
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

ProgressStepsConfig configures a step indicator.

type ProgressStepsOrientation

type ProgressStepsOrientation string

ProgressStepsOrientation chooses horizontal (default) or vertical layout.

const (
	ProgressStepsHorizontal ProgressStepsOrientation = ""
	ProgressStepsVertical   ProgressStepsOrientation = "vertical"
)

type RadioGroupConfig

type RadioGroupConfig struct {
	// Name is the shared form-field name for all radios (required).
	Name string
	// Legend is the group label rendered as <legend> (required).
	Legend string
	// Options is the list of radio options (required, at least one).
	Options []RadioGroupOption
	// Help renders supporting text under the group.
	Help string
	// Error overrides Help with an error message.
	Error string
	// Required marks the group as required.
	Required bool
	ID       string
	Class    string
}

RadioGroupConfig configures a group of radio buttons.

type RadioGroupOption

type RadioGroupOption struct {
	Value    string
	Label    string
	Checked  bool
	Disabled bool
}

RadioGroupOption describes one radio button in a RadioGroup.

type RailItem

type RailItem struct {
	Anchor  string // required, e.g. "modeling" → href="#modeling"
	Text    string // required, link label
	Eyebrow string // optional leading chip
	Count   int    // optional trailing chip (0 = hidden)
}

RailItem is one entry in the rail.

Anchor is required (the fragment without the leading #). Text is the visible link label. Eyebrow is the leading mono chip (e.g. "01" / "01 / overview"); empty hides the chip column. Count is the trailing numeric chip (e.g. doc count per section); 0 hides the column.

type RangeSliderConfig

type RangeSliderConfig struct {
	// Name is the form-field base name (required). Two inputs ship —
	// Name+"-min" and Name+"-max".
	Name string
	// Label is the accessible group name (required, used as the
	// fieldset legend / radiogroup aria-label).
	Label string
	// Min / Max bound the range. Defaults: 0 / 100.
	Min int
	Max int
	// Step is the step granularity. Default 1.
	Step int
	// ValueLow / ValueHigh are the initial low and high values.
	// Defaults: Min / Max.
	ValueLow  int
	ValueHigh int
	// ShowValue renders a live "lo – hi" text alongside the label.
	ShowValue bool
	// Disabled disables both thumbs.
	Disabled   bool
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

RangeSliderConfig configures a RangeSlider.

type RatingConfig

type RatingConfig struct {
	// Name is the form-field name (required).
	Name string
	// Label is the accessible label (required, used as fieldset
	// legend / radiogroup aria-label).
	Label string
	// Max is the rating ceiling (1..N). Defaults to 5.
	Max int
	// Value is the initial selection (0..Max). 0 = no rating chosen.
	Value int
	// Shape picks one of the bundled glyphs (star/heart/thumb/fire/
	// diamond/circle/square). Ignored when Icon is set.
	Shape RatingShape
	// Icon is a caller-supplied monochrome SVG (or any render.HTML)
	// used in place of the bundled Shape glyph. The fill / stroke
	// inside should use currentColor so the selected-state highlight
	// works. Cloned into every star.
	Icon render.HTML
	// Size picks the icon glyph size. Default=24px, Small=16px,
	// Large=32px. Tap target stays at the WCAG floor regardless.
	Size RatingSize
	// Gap picks the visual spacing between stars. Default keeps the
	// AAA 44×44 tap target per star (glyphs ~22px apart). Tight
	// shrinks the inline tap zone to glyph+8px so adjacent glyphs
	// nearly touch (~8px gap) — relaxes AAA to AA (24px floor) for
	// dense inline ratings. Loose / Wide widen the gap without
	// touching the tap zone. Independent of Size.
	Gap RatingGap
	// Disabled disables all radios.
	Disabled bool
	ID       string
	Class    string
}

RatingConfig configures a RatingInput.

type RatingGap

type RatingGap string

RatingGap controls the visual gap between stars, independent of Size. Useful for compact (tight) inline ratings vs. roomy (loose / wide) detail-page ratings.

const (
	RatingGapDefault RatingGap = ""      // 2px
	RatingGapTight   RatingGap = "tight" // 0
	RatingGapLoose   RatingGap = "loose" // 8px
	RatingGapWide    RatingGap = "wide"  // 16px
)

type RatingShape

type RatingShape string

RatingShape picks one of the bundled glyphs. For a custom glyph, set RatingConfig.Icon instead — Icon overrides Shape.

const (
	RatingShapeStar    RatingShape = ""
	RatingShapeHeart   RatingShape = "heart"
	RatingShapeThumb   RatingShape = "thumb"
	RatingShapeFire    RatingShape = "fire"
	RatingShapeDiamond RatingShape = "diamond"
	RatingShapeCircle  RatingShape = "circle"
	RatingShapeSquare  RatingShape = "square"
)

type RatingSize

type RatingSize string

RatingSize controls the painted glyph size. The tap target stays at the --spacing-touch-target floor (44px WCAG 2.5.5) regardless; only the SVG glyph inside shrinks or grows.

const (
	RatingSizeDefault RatingSize = ""
	RatingSizeSmall   RatingSize = "small"
	RatingSizeLarge   RatingSize = "large"
)

type RepeaterConfig

type RepeaterConfig struct {
	Name        string
	Label       string
	ID          string
	MinItems    int
	MaxItems    int
	AddLabel    string
	RemoveLabel string
	Template    func(index int) render.HTML
	Items       []render.HTML
	RPCPath     string
}

RepeaterConfig configures a dynamic form repeater.

type ResponsiveConfig

type ResponsiveConfig struct {
	// Breakpoint in pixels — viewport >= Breakpoint renders the
	// desktop variant; < Breakpoint renders the mobile variant.
	// Defaults to 1024 when zero.
	Breakpoint int

	// Class is appended to the wrapping <div>'s class list.
	Class string
}

ResponsiveConfig configures the swap.

type ResponsiveMode

type ResponsiveMode string

ResponsiveMode selects how a DataTable behaves when its container shrinks below the configured breakpoint. Detection is **container query** based — the table responds to its own container's inline size, not the viewport — so a wide table in a narrow sidebar gets the responsive treatment even when the page itself is wide.

const (
	// ResponsiveScroll keeps the default horizontal-scroll behavior:
	// the table stays a table; the wrapper scrolls on overflow.
	ResponsiveScroll ResponsiveMode = ""

	// ResponsiveCards collapses each row into a labeled card stack
	// (header → value pairs) when the container is narrower than
	// ~640px. Column headers travel with each cell via data-label.
	ResponsiveCards ResponsiveMode = "cards"
)

type Row

type Row struct {
	// Cells is a map from column Key to the rendered cell HTML.
	// Missing cells render as empty strings.
	Cells map[string]render.HTML

	// ID optionally identifies the row for ARIA / interaction. Empty
	// is fine; it just won't get an `id=` attribute.
	ID string
}

Row is a single rendered table row. Cells map column Key → HTML.

type SearchInputConfig

type SearchInputConfig struct {
	// Name is the form-field name (required).
	Name string
	// ID is the input element's id (required).
	ID string
	// Placeholder renders the native placeholder. Defaults to "Search...".
	Placeholder string
	// Action is an optional form action URL. When set, wraps in <form role="search">.
	Action string
	// Method is the form method. Defaults to "GET".
	Method string
	// Class adds extra CSS classes to the wrapper.
	Class string
	// Attrs lets callers attach additional attributes.
	ExtraAttrs map[string]string
}

SearchInputConfig configures a SearchInput.

type SectionConfig

type SectionConfig struct {
	// Eyebrow is an optional short decorative kicker rendered above/around
	// the heading — e.g. a section number ("01 / what it generates"). It is
	// marked aria-hidden because it duplicates the heading for SR users.
	Eyebrow     string
	Heading     string // optional <h2> heading
	Description string // optional supporting text under the heading
	// DescriptionHTML lets the supporting text carry inline markup (code,
	// links). When non-empty it takes precedence over Description.
	DescriptionHTML render.HTML
	// Label sets the section's accessible name when there is no Heading.
	// Without a Heading or Label the section falls back to a generic
	// "Section" aria-label.
	Label string
	Class string
	ID    string
}

SectionConfig configures a labelled content section.

ID behavior:

  • If ID is set, it's used verbatim — caller controls the anchor.
  • If ID is empty and Heading is set, the section auto-slugs the heading as its id ("Forms" → id="forms"). This is the typical case for in-page navs / scrollspy rails where the rail's anchor href should match the section just by typing the heading text twice.
  • If both ID and Heading are empty, the section gets no id and a generic aria-label.

type SegmentedControlConfig

type SegmentedControlConfig struct {
	// Name is the form-submit name shared by all radios. Required.
	Name string

	// Options must contain at least two segments. Required.
	Options []SegmentedOption

	// Selected is the initially selected Value. When empty or not
	// matching any option, defaults to Options[0].Value.
	Selected string

	// Label is the aria-label on the radiogroup wrapper. Required
	// when the surrounding context doesn't already label it (e.g.
	// the SegmentedControl is not inside a <label> or FormField).
	Label string

	// RPCPath, when set, attaches data-fui-rpc to each radio so a
	// change submits to the server. Method is POST.
	RPCPath string

	// RPCSignal, when set, broadcasts the response as the given
	// signal name (data-fui-rpc-signal).
	RPCSignal string

	ID    string
	Class string
}

SegmentedControlConfig configures a segmented radiogroup.

type SegmentedOption

type SegmentedOption struct {
	// Label is the visible text. Required.
	Label string
	// Value is the submit value and the option's stable identifier.
	// Required and unique within the control.
	Value string
	// Disabled marks the segment as non-selectable.
	Disabled bool
}

SegmentedOption is one selectable segment.

type SelectConfig

type SelectConfig struct {
	// Name is the form-field name (required).
	Name string
	// Label is the accessible label (required).
	Label string
	// Options is the list of <option> elements (required, at least one).
	Options []SelectOption
	// Placeholder adds a disabled, selected-first option with empty value
	// that acts as a placeholder hint (e.g. "Choose a country…").
	Placeholder string
	// Required marks the field required.
	Required bool
	// Disabled disables interaction.
	Disabled bool
	// Help renders supporting text under the field.
	Help string
	// Error overrides Help with an error message + aria-invalid.
	Error      string
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

SelectConfig configures a Select.

type SelectOption

type SelectOption struct {
	Value    string
	Text     string
	Selected bool
}

SelectOption describes a single <option>.

type ShortcutHintConfig

type ShortcutHintConfig struct {
	// Chord is the human-readable chord string accepted by the
	// runtime's parseCombo: "Mod+K", "Ctrl+/", "Shift+Tab", "/",
	// "Esc", "Enter". Required.
	Chord string

	// BindTarget is an optional CSS selector. When set, the chord is
	// installed as a global shortcut that clicks the matched element.
	// (The runtime hook lives on the TARGET, not the hint.)
	// NOTE: This component renders only the hint; the caller must
	// place data-fui-shortcut-click="<Chord>" on the actual target,
	// or use ShortcutHintBind which returns both.
	BindTarget string

	// SROnlyLabel overrides the screen-reader announcement.
	// Default: humanized chord (e.g. "Command-K", "Slash", "Escape").
	SROnlyLabel string

	ID    string
	Class string
}

ShortcutHintConfig configures the chord display.

type SidebarConfig

type SidebarConfig struct {
	// Title is rendered as the sidebar's top heading. Empty omits it.
	Title string

	// Items is the navigation tree.
	Items []SidebarItem

	// CurrentPath is the screen's current path, used for active-state
	// highlighting. When empty, falls back to JS: the runtime stamps
	// aria-current on any matching <a> after hydration.
	CurrentPath string

	// Variant defaults to SidebarPersistent.
	Variant SidebarVariant

	// Footer is optional content rendered at the bottom (signed-in
	// user pill, settings link, etc.).
	Footer render.HTML

	// DrawerName overrides the widget name used for the < md drawer.
	// Defaults to "ui-sidebar-drawer". Apps that host multiple
	// sidebars per page must override to avoid collisions.
	DrawerName string

	// SuppressDrawerTrigger hides the hamburger button rendered by
	// Sidebar (some apps put their hamburger in the page header
	// instead and call MountSidebarDrawer themselves).
	SuppressDrawerTrigger bool
}

SidebarConfig describes a navigation sidebar.

type SidebarItem

type SidebarItem struct {
	Label    string
	Href     string
	Icon     render.HTML
	Children []SidebarItem

	// Active forces the item into the active state regardless of the
	// caller's MatchPath. Useful for pages that don't map 1:1 to a URL.
	Active bool

	// MatchPath, when set, overrides the default "current URL equals
	// Href" check used to mark the item as active. Pass a literal
	// prefix ("/customers") to highlight on sub-paths, or use
	// CurrentPath in your screen and set Active manually.
	MatchPath string
}

SidebarItem is one navigation entry. Children nest one level deep. Deeper nesting is unsupported by design — sidebars should not be trees.

type SidebarVariant

type SidebarVariant string

SidebarVariant selects how the sidebar behaves at ≥ md viewports.

SidebarPersistent: fixed-width column, always visible.
SidebarCollapsible: column with a chevron that toggles a compact
  rail; expanded/collapsed state persists in localStorage.
SidebarOffCanvas: hidden by default — opens via the hamburger
  trigger on every viewport (no inline column).

On `< md` every variant collapses to a hamburger + drawer.

const (
	SidebarPersistent  SidebarVariant = "persistent"
	SidebarCollapsible SidebarVariant = "collapsible"
	SidebarOffCanvas   SidebarVariant = "off-canvas"
)

type SignalToggleConfig

type SignalToggleConfig struct {
	SignalName string             // required unless Slice is set
	Slice      *store.Slice[bool] // optional; supplies the signal name + initial value, takes precedence
	Label      string             // optional — aria-label (falls back to the signal name)
	Class      string             // optional — extra CSS classes
}

SignalToggleConfig configures a boolean toggle/switch that flips a signal entirely client-side. Unlike the form-based Switch (which wraps a native <input type="checkbox">), SignalToggle uses the runtime's signal system — no form submission, pure JS reactivity.

Clicking the button toggles the named signal; the signal drives both the aria-checked attribute and a visible label.

type SiteFooterColumn

type SiteFooterColumn struct {
	Title string
	Links []SiteFooterLink
}

SiteFooterColumn is one labelled link list.

type SiteFooterConfig

type SiteFooterConfig struct {
	// Lead is the optional left-most slot (brand mark + tagline).
	// If empty, the grid is just columns.
	Lead render.HTML
	// Columns are the labelled link lists rendered after Lead.
	Columns []SiteFooterColumn
	// Bottom is the optional small-text strip below the grid (e.g.,
	// copyright + colophon). Children render in a horizontal cluster.
	Bottom []render.HTML
	// Class is appended to the ui-site-footer wrapper.
	Class string
}

SiteFooterConfig configures a SiteFooter.

type SiteFooterLink struct {
	Label    string
	Href     string
	External bool
}

SiteFooterLink is one link inside a footer column.

type SiteHeaderConfig

type SiteHeaderConfig struct {
	// Brand is the left-most slot. Usually a link with logo + wordmark
	// + optional status pill. No constraint on shape.
	Brand render.HTML
	// NavItems renders both the desktop nav and the mobile drawer list.
	NavItems []SiteHeaderLink
	// Actions is the right-cluster slot for search, theme toggle,
	// icon links, etc. Rendered before the mobile drawer trigger so
	// the trigram glyph sits at the far right.
	Actions render.HTML
	// MobileExtraLinks are appended only to the mobile drawer list
	// (e.g., "Home", "GitHub ↗"). Lets the consumer surface secondary
	// destinations on phones without cluttering the desktop bar.
	MobileExtraLinks []SiteHeaderLink
	// MobileNavAriaLabel labels the mobile <nav>. Defaults to
	// "Mobile primary".
	MobileNavAriaLabel string
	// PrimaryNavAriaLabel labels the desktop <nav>. Defaults to
	// "Primary".
	PrimaryNavAriaLabel string
	// NavUnderline opts the desktop nav links into an animated
	// underline-reveal on hover / focus / active, instead of the default
	// flat colour-only treatment. The underline colour is themeable via
	// --ui-site-header-nav-underline-color (defaults to the primary colour).
	NavUnderline bool
	// Class is appended to the ui-site-header wrapper.
	Class string
}

SiteHeaderConfig configures a SiteHeader. Brand and Actions are slots — the framework owns layout + drawer mechanics; the consumer owns visual identity.

type SiteHeaderLink struct {
	// Label is the visible text.
	Label string
	// Href is the navigation target.
	Href string
	// MatchPrefix, when true, lights the link active on any URL that
	// shares the Href as a prefix (e.g. /docs/foo matches /docs/).
	// Wires the data-fui-match-prefix runtime attribute.
	MatchPrefix bool
	// External, when true, opens in a new tab. Only honored in the
	// mobile drawer (the desktop nav stays internal-only by design).
	External bool
}

SiteHeaderLink configures one primary-nav entry.

type SkeletonAvatarConfig

type SkeletonAvatarConfig struct {
	// Size overrides the circle diameter (CSS length, e.g. "3rem").
	// Defaults to the skeleton primitive's 2.5rem when empty.
	Size string
	// HideSubline collapses the two stacked lines into one.
	HideSubline bool
	ID          string
	Class       string
}

SkeletonAvatarConfig configures a SkeletonAvatar.

type SkeletonCardConfig

type SkeletonCardConfig struct {
	// BodyLines is the number of skeleton lines rendered in the body.
	// Defaults to 2 when zero.
	BodyLines int
	// ShowFooter renders a hairline-divided skeleton footer line.
	ShowFooter bool
	ID         string
	Class      string
}

SkeletonCardConfig configures a SkeletonCard.

type SkeletonRowConfig

type SkeletonRowConfig struct {
	// HideChevron drops the trailing chevron skeleton — use for plain
	// label/value rows that aren't drill-down navigable.
	HideChevron bool
	ID          string
	Class       string
}

SkeletonRowConfig configures a SkeletonRow.

type SkipLinkConfig

type SkipLinkConfig struct {
	// Target is the id of the element to jump to.
	// Defaults to "main-content" when empty.
	Target string
	// Text is the visible label shown on focus.
	// Defaults to "Skip to main content" when empty.
	Text  string
	Class string
	ID    string
}

SkipLinkConfig configures a skip-navigation link.

Renders a visually-hidden anchor that becomes visible on keyboard focus, letting users jump past repetitive navigation to the main content area. Required for WCAG 2.1 Level A (criterion 2.4.1 "Bypass Blocks").

Place SkipLink as the first element inside <body>.

Usage:

ui.SkipLink(ui.SkipLinkConfig{Target: "main-content"})
// … then on the main element:
// <main id="main-content"> ...
// Or with no Target — defaults to "main-content".
ui.SkipLink(ui.SkipLinkConfig{})

type SliderConfig

type SliderConfig struct {
	// Name is the form-field name (required).
	Name string
	// Label is the accessible label (required, used as <label for=…>).
	Label string
	// Min / Max bound the range. Defaults: 0 / 100.
	Min int
	Max int
	// Step is the step granularity. Default 1.
	Step int
	// Value is the initial value (clamped to [Min,Max]).
	Value int
	// ShowValue renders a value bubble next to the label that updates
	// via :has() / CSS custom-property tricks isn't supported across
	// browsers yet — we emit a simple <output> element instead, which
	// the browser auto-updates as the range input moves (the native
	// form-output association).
	ShowValue bool
	// ShowEdgeLabels renders the Min and Max values under the track.
	ShowEdgeLabels bool
	// Disabled disables interaction.
	Disabled   bool
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

SliderConfig configures a Slider.

type SortDir

type SortDir string

SortDir is the direction of a sort.

const (
	SortAsc  SortDir = "asc"
	SortDesc SortDir = "desc"
)

type SparklineConfig

type SparklineConfig struct {
	// Values are the points in order (≥2).
	Values []float64
	// Width / Height in CSS pixels. Default 120×32.
	Width  int
	Height int
	// Shape picks line or area. Default line.
	Shape SparklineShape
	// Color override — defaults to var(--color-primary) via CSS.
	// Set to "danger" / "success" / "warning" / "info" to use the
	// matching theme token; any other string is passed through as a
	// raw CSS color.
	Color string
	// LabelledBy is the id of an element naming the chart (e.g. the
	// StatCard label) — used as the SVG's aria-labelledby. Without
	// it the chart is aria-hidden (decorative).
	LabelledBy string
	ID         string
	Class      string
}

SparklineConfig configures a Sparkline.

type SparklineShape

type SparklineShape string

SparklineShape picks line (default) or area.

const (
	SparklineLine SparklineShape = ""
	SparklineArea SparklineShape = "area"
)

type SpinnerConfig

type SpinnerConfig struct {
	// Label is the assistive-text announced by screen readers.
	// Defaults to "Loading…" when empty.
	Label string

	// Size selects a named size (sm | md (default) | lg).
	Size SpinnerSize

	// Variant selects the visual treatment.
	Variant SpinnerVariant

	// Inline true renders inline-flex (sits next to text); false
	// renders block (centered in its own row).
	Inline bool

	ID    string
	Class string
}

SpinnerConfig configures a spinner.

type SpinnerSize

type SpinnerSize string

SpinnerSize selects a named size.

const (
	SpinnerSm SpinnerSize = "sm"
	SpinnerMd SpinnerSize = "" // default
	SpinnerLg SpinnerSize = "lg"
)

type SpinnerVariant

type SpinnerVariant string

SpinnerVariant selects the visual style.

const (
	SpinnerRing SpinnerVariant = "" // default — bordered ring
	SpinnerDots SpinnerVariant = "dots"
	// SpinnerGrid renders a 3×3 grid of small squares animated in a
	// staggered ripple. Distinct enough from ring/dots to be the
	// "loading…heavy" indicator on long-running operations.
	SpinnerGrid SpinnerVariant = "grid"
)

type StackConfig

type StackConfig struct {
	Gap     Gap     // gap between children (default md)
	Align   Align   // cross-axis (horizontal) alignment
	Justify Justify // main-axis (vertical) alignment
	ID      string
	Class   string
}

StackConfig configures a vertical stack.

type StatCardConfig

type StatCardConfig struct {
	Label string // required (e.g. "Active users")
	Value string // required (e.g. "12,483" or "98.4%")
	Trend string // optional trend label (e.g. "+12% vs. last week")

	// Direction colors the trend pill. Defaults to flat.
	Direction TrendDirection

	ID    string
	Class string
}

StatCardConfig configures a metric card.

type StatusBadgeConfig

type StatusBadgeConfig struct {
	Label   string        // required visible text
	Variant StatusVariant // defaults to Neutral
	ID      string
	Class   string
}

StatusBadgeConfig configures a small status pill.

type StatusPillConfig

type StatusPillConfig struct {
	Label string         // required visible text
	Tone  StatusPillTone // default StatusPillNeutral
	// Dot adds a leading status dot. Opt-in.
	Dot   bool
	Class string
	ID    string
}

StatusPillConfig configures a StatusPill.

type StatusPillTone

type StatusPillTone string

StatusPillTone selects the colour treatment of a StatusPill.

const (
	// StatusPillNeutral is the muted default — subtle text on the surface.
	StatusPillNeutral StatusPillTone = ""
	// StatusPillAccent uses the brand primary colour with a glowing dot.
	StatusPillAccent StatusPillTone = "accent"
)

type StatusVariant

type StatusVariant string

StatusVariant is the semantic variant of a StatusBadge.

const (
	StatusSuccess StatusVariant = "success"
	StatusWarning StatusVariant = "warning"
	StatusDanger  StatusVariant = "danger"
	StatusInfo    StatusVariant = "info"
	StatusNeutral StatusVariant = "neutral"
)

type StepRailConfig

type StepRailConfig struct {
	// Title is the small heading at the top of the rail
	// (e.g. "The path", "On this page"). Optional.
	Title string
	// Items are the numbered steps, in order.
	Items []StepRailItem
	// ActiveIndex marks one step as the active one (visually
	// highlighted). Must be in [0, len(Items)) or -1 for "no active
	// step" — out-of-range values panic at render time so a typo
	// (or a `slices.Index` -1 result, which is the common one) is
	// caught immediately rather than silently rendering a rail with
	// no highlight.
	ActiveIndex int
	// Meta is optional small text below the list (e.g. a "stuck?
	// open the journal" pointer).
	Meta string
	// MetaHref, when non-empty, renders Meta as a link to this URL
	// instead of plain text — so a "stuck? ask here" pointer is
	// actually clickable.
	MetaHref string
	// Class is appended to the ui-step-rail wrapper.
	Class string
}

StepRailConfig configures a StepRail.

type StepRailItem

type StepRailItem struct {
	// Number is the displayed ordinal (e.g. "01", "02"). Caller picks
	// the format (zero-padded vs. plain) so the visual matches the
	// step headings.
	Number string
	// Anchor is the in-page #id this rail entry jumps to.
	Anchor string
	// Label is the visible step name.
	Label string
}

StepRailItem is one numbered step.

type StepWizardConfig

type StepWizardConfig struct {
	// Steps is the ordered list of wizard steps. Required, min 1.
	Steps []StepWizardStep

	// CurrentStep is 0-indexed. The server sets this after each POST.
	CurrentStep int

	// Action is the form action URL. Required.
	Action string

	// Method defaults to "POST".
	Method string

	// HiddenFields are hidden inputs to carry forward between steps
	// (e.g. previously entered data).
	HiddenFields []render.HTML

	Class string
}

StepWizardConfig configures a multi-step form wizard.

type StepWizardStep

type StepWizardStep struct {
	// Heading is the step heading. Required.
	Heading string
	// Description is optional supporting text below the heading.
	Description string
	// Fields are the form fields rendered for this step.
	Fields []render.HTML
}

StepWizardStep is one step in the wizard.

type StickyConfig

type StickyConfig struct {
	// Edge selects which edge to stick to.
	// Defaults to StickyTop when empty.
	Edge StickyEdge

	// Offset selects the distance preset from the edge.
	// Defaults to StickyOffsetNone when empty.
	Offset StickyOffset

	// ZIndexTier selects the z-index tier from the theme token
	// system. Defaults to "sticky" when empty.
	// Common values: "sticky", "dropdown", "overlay", "modal".
	ZIndexTier string

	ID    string
	Class string
}

StickyConfig configures a position:sticky wrapper.

Wraps children in a div that sticks to the chosen viewport edge on scroll. Uses theme tokens for z-index so sticky elements layer consistently with modals, widgets, and other surfaces.

Usage:

ui.Sticky(ui.StickyConfig{Edge: ui.StickyTop},
	ui.Button(ui.ButtonConfig{Label: "Save"}),
)
ui.Sticky(ui.StickyConfig{Edge: ui.StickyTop, Offset: ui.StickyOffsetLg}, header)
ui.Sticky(ui.StickyConfig{Edge: ui.StickyBottom}, toolbar)

type StickyEdge

type StickyEdge string

StickyEdge selects which edge the element sticks to.

const (
	StickyTop    StickyEdge = "top"
	StickyBottom StickyEdge = "bottom"
)

type StickyOffset

type StickyOffset string

StickyOffset presets for common sticky offsets.

const (
	StickyOffsetNone StickyOffset = "0"
	StickyOffsetSm   StickyOffset = "sm"
	StickyOffsetMd   StickyOffset = "md"
	StickyOffsetLg   StickyOffset = "lg"
	StickyOffsetXl   StickyOffset = "xl"
)

type TOCConfig

type TOCConfig struct {
	// Target is the CSS selector of the content region whose headings
	// the runtime should scan. Required (e.g. "main", "article").
	Target string
	// Label is the accessible nav-label (defaults to "On this page").
	Label string
	// Levels picks which heading levels to harvest. Bit flags:
	// 2 = h2 only, 3 = h3 only, 0 / 5 = h2 + h3. Default 0.
	// We keep the API minimal — most sites want h2 + h3.
	Levels int
	// Sticky toggles the position: sticky behaviour. Default true.
	// When false the nav scrolls with the content.
	Sticky     bool
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

TOCConfig configures a TableOfContents.

type TabItem

type TabItem struct {
	Label   string
	Content render.HTML
}

TabItem is a single tab with a label and content.

type TabsConfig

type TabsConfig struct {
	SignalName string            // required unless Slice is set
	Slice      *store.Slice[int] // optional; supplies the signal name + initial active index, takes precedence
	Tabs       []TabItem         // required, at least 1
	Class      string            // optional extra CSS class
}

TabsConfig configures a signal-driven tab strip.

type TagConfig

type TagConfig struct {
	// Label is the visible text. Required.
	Label string

	// Variant maps to the same StatusVariant set as StatusBadge so
	// status-coded tags compose with the rest of the system. Default
	// neutral.
	Variant StatusVariant

	// Href makes the entire tag an anchor (e.g. a filter link).
	Href string

	// Dismiss, when non-empty, renders a × button that fires an RPC
	// to this path on click. Pair with data-fui-rpc-signal in DismissAttrs
	// or simply rely on the runtime's default RPC behavior.
	Dismiss string

	// DismissLabel is the assistive-text label on the × button.
	// Defaults to "Remove <Label>".
	DismissLabel string

	// DismissAttrs lets callers attach extra data-fui-* attributes to
	// the × button (e.g. data-fui-rpc-signal).
	DismissAttrs html.Attrs

	ID    string
	Class string
}

TagConfig configures a tag/chip.

type TagInputConfig

type TagInputConfig struct {
	// Name is the form-field name (required). Each tag is submitted
	// under this name (repeated key).
	Name string
	// Label is the accessible label (required).
	Label string
	// Values are the initial tags.
	Values []string
	// Placeholder for the text input.
	Placeholder string
	// MaxLength caps individual tag length (chars). 0 = no cap.
	MaxLength int
	// Help renders supporting text under the field.
	Help string
	// Disabled disables all interaction.
	Disabled bool
	ID       string
	Class    string
}

TagInputConfig configures a TagInput.

type TerminalBlockConfig

type TerminalBlockConfig struct {
	Label string // required header text, e.g. "$ install"
	Class string
	ID    string
}

TerminalBlockConfig configures a TerminalBlock.

type TextAreaConfig

type TextAreaConfig struct {
	// Name is the form-field name (required).
	Name string
	// Label is the accessible label (required).
	Label string
	// Value is the initial value.
	Value string
	// Placeholder renders the native placeholder.
	Placeholder string
	// Rows is the initial visible row count. Defaults to 3.
	Rows int
	// Autogrow opts the textarea into runtime auto-resize: every
	// input event resets the height to scrollHeight so the field
	// always shows all content without an internal scrollbar.
	Autogrow bool
	// Required marks the field required.
	Required bool
	// Disabled disables interaction.
	Disabled bool
	// Help renders supporting text under the field.
	Help string
	// Error overrides Help with an error message + aria-invalid.
	Error string
	// MaxLength applies the native maxlength attribute.
	MaxLength  int
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

TextAreaConfig configures a TextArea.

type ThemeToggleConfig

type ThemeToggleConfig struct {
	// Variant selects the visual style.
	// Defaults to ThemeToggleIcon when empty.
	Variant ThemeToggleVariant

	// ID is an optional id for the root element.
	ID string

	// Class is an optional extra CSS class.
	Class string

	// LightLabel overrides the light-mode label for label/pill variants.
	// Defaults to "Light".
	LightLabel string

	// DarkLabel overrides the dark-mode label for label/pill variants.
	// Defaults to "Dark".
	DarkLabel string

	// AutoLabel overrides the auto-mode label for pill variant.
	// Defaults to "Auto".
	AutoLabel string
}

ThemeToggleConfig configures a dark/light mode toggle button.

The toggle writes to localStorage["gofastr.colorScheme"] via the existing colorscheme.js bootstrap, which applies the change immediately. No page reload needed.

The component emits data-fui-theme-toggle so a small runtime module can attach the click logic via event delegation.

type ThemeToggleVariant

type ThemeToggleVariant string

ThemeToggleVariant selects the visual variant of the toggle button.

const (
	// ThemeToggleIcon renders a sun/moon icon button.
	ThemeToggleIcon ThemeToggleVariant = "icon"
	// ThemeToggleLabel renders a text button ("Light" / "Dark").
	ThemeToggleLabel ThemeToggleVariant = "label"
	// ThemeTogglePill renders a segmented pill with light/auto/dark.
	ThemeTogglePill ThemeToggleVariant = "pill"
)

type TimePickerConfig

type TimePickerConfig struct {
	// Name is the form field name (required).
	Name string
	// Label is the accessible label (required).
	Label string
	// Value is the initial value in HH:MM (24-hour) format. Empty
	// means no preselection.
	Value string
	// Min / Max bound the picker (e.g. "09:00", "17:00"). Empty
	// leaves them unset.
	Min  string
	Max  string
	Step int // step in seconds (default = 60). 1 → seconds visible.
	// Required marks the input required.
	Required bool
	// Disabled disables interaction.
	Disabled bool
	// Help renders supporting text under the picker.
	Help string
	// Error overrides Help with an error message + aria-invalid.
	Error string
	ID    string
	Class string
}

TimePickerConfig configures a TimePicker.

type TimelineConfig

type TimelineConfig struct {
	Events     []TimelineEvent
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

TimelineConfig configures a Timeline.

type TimelineEvent

type TimelineEvent struct {
	// Title is the event headline (required, e.g. "Deployed v3.2.1").
	Title string
	// Meta is the optional right-aligned secondary text (e.g. a time
	// or actor — "2h ago" / "by dom").
	Meta string
	// Body is the optional supporting prose / nested HTML.
	Body render.HTML
	// Variant tints the dot on the rail. Defaults to neutral.
	Variant TimelineEventVariant
}

TimelineEvent is one entry in the Timeline.

type TimelineEventVariant

type TimelineEventVariant string

TimelineEventVariant colors the dot on the rail.

const (
	TimelineNeutral TimelineEventVariant = ""
	TimelineSuccess TimelineEventVariant = "success"
	TimelineWarn    TimelineEventVariant = "warn"
	TimelineDanger  TimelineEventVariant = "danger"
	TimelineInfo    TimelineEventVariant = "info"
)

type ToastTrigger

type ToastTrigger struct {
	Variant StatusVariant `json:"variant,omitempty"` // info | success | warning | danger | neutral
	Title   string        `json:"title"`             // required
	Body    string        `json:"body,omitempty"`
	TTL     int           `json:"ttl,omitempty"` // milliseconds; 0 = persistent
	// Stack is the name of the toast stack widget to push into.
	// Defaults to the first stack mounted on the page. Set explicitly
	// when an app hosts multiple stacks (e.g. per-tenant).
	Stack string `json:"stack,omitempty"`
}

ToastTrigger is the JSON shape carried by the X-Gofastr-Toast header — and the same shape accepted by __gofastr.toast(cfg) on the client. Field names match the runtime template; keep both in sync when extending.

type ToggleConfig

type ToggleConfig struct {
	// Name is the form-field name. Required.
	Name string

	// Label is the visible label text shown next to the control.
	// Required for accessibility.
	Label string

	// ID is the input element's id. When empty, defaults to Name.
	// FormField-style components key error wiring off this id.
	ID string

	// Value is the form-submit value (for checkboxes / radios sharing
	// a Name). Defaults to "on" for Checkbox/Switch, required for
	// Radio when several share a Name.
	Value string

	// Checked is the initial selected state.
	Checked bool

	// Disabled disables interaction.
	Disabled bool

	// Required marks the control as required in form submission.
	Required bool

	// Help renders supporting text under the label.
	Help string

	// Error overrides Help and switches the control to the error state
	// (aria-invalid="true", red ring, role="alert" message).
	Error string

	// Attrs lets callers attach data-fui-* attributes (e.g. for RPC).
	ExtraAttrs html.Attrs

	Class string
}

ToggleConfig configures a Checkbox/Radio/Switch.

type ToolbarConfig

type ToolbarConfig struct {
	// Label is the accessible name for the toolbar (required —
	// becomes aria-label).
	Label string
	// Groups are rendered in order with separators between.
	Groups []ToolbarGroup
	// Align picks justify-content. Default is "start". Options:
	// "start", "center", "end", "between".
	Align      string
	ID         string
	Class      string
	ExtraAttrs html.Attrs
}

ToolbarConfig configures a Toolbar.

type ToolbarGroup

type ToolbarGroup struct {
	// Label is the accessible group name (optional). When set the
	// group renders with role="group" + aria-label.
	Label string
	// Children are the actual button/link elements. The caller
	// decides what goes in — Button, Link, IconButton, etc.
	Children []render.HTML
}

ToolbarGroup is a logical group of buttons inside a toolbar. Groups are rendered side-by-side with a visual separator between.

type TooltipConfig

type TooltipConfig struct {
	// Text is the tooltip message. Required.
	Text string

	// Placement selects the side. Default top.
	Placement TooltipPlacement

	// ID is the tooltip's id; the trigger's aria-describedby points
	// to it. When empty, a stable id is derived from the trigger's
	// content position.
	ID string

	Class string
}

TooltipConfig configures a tooltip.

type TooltipPlacement

type TooltipPlacement string

TooltipPlacement selects the side the tooltip appears on.

const (
	TooltipTop    TooltipPlacement = "" // default
	TooltipBottom TooltipPlacement = "bottom"
	TooltipLeft   TooltipPlacement = "left"
	TooltipRight  TooltipPlacement = "right"
)

type TrendDirection

type TrendDirection string

TrendDirection indicates the direction of a stat trend.

const (
	TrendUp   TrendDirection = "up"
	TrendDown TrendDirection = "down"
	TrendFlat TrendDirection = "flat"
)

type ValidationSummaryConfig

type ValidationSummaryConfig struct {
	// Errors maps field names to error messages (required).
	Errors FieldErrors
	// FieldLabels maps field names to human-readable labels.
	// Falls back to the field name when not provided.
	FieldLabels map[string]string
	// FieldIDs maps field names to actual input element IDs.
	// When set, anchor links use these IDs so they point to the
	// correct input. Falls back to the field name when not provided.
	FieldIDs map[string]string
	// FieldOrder controls the order of error rows. Entries that aren't
	// in Errors are silently skipped, so it's safe to pass the full
	// form field list. Without FieldOrder, rows fall back to
	// alphabetical-by-field-name so the rendered HTML is deterministic
	// across requests (Go map iteration is randomized).
	FieldOrder []string
	// Title overrides the default banner heading. Empty → "Please fix
	// the following errors:".
	Title string
	// Class adds extra CSS classes to the wrapper.
	Class string
}

ValidationSummaryConfig configures a ValidationSummary.

type WidgetMounter

type WidgetMounter interface {
	MountWidget(def *widget.Definition)
}

WidgetMounter is the minimal contract for hosting a widget on a router. The framework's *router.Router satisfies it through the router.Adapt() helper or a thin shim — wiring is intentionally pluggable so this package stays router-agnostic.

Directories

Path Synopsis
Package theme is the canonical home for the framework's visual design system.
Package theme is the canonical home for the framework's visual design system.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL