A simple card with just content. Uses Pico's <article> element.
Every bfx/ macro rendered live with copy-paste Jinja2 code. Import, pass your data, ship.
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
This is a paragraph of body text. The default Bluefox theme uses DM Sans for body copy and JetBrains Mono for code. Each theme variant overrides the font stack — try switching themes with the picker in the bottom right.
Text can include bold, italic, links, highlighted, small text, and inline code.
Body text with bold, italic, links,
highlighted, small, and inline code.
"Design is not just what it looks like and feels like. Design is how it works."
"Design is not just what it looks like..."
- Unordered item
- Ordered item
from bluefox_components import setup_components
app = create_bluefox_app(settings)
setup_components(app)
your code here
{{ input("email", type="email", label="Email address", placeholder="you@example.com") }}
{{ input("email", type="email", label="Email", value="not-an-email",
error="Please enter a valid email address") }}
{{ input("password", type="password", label="Password", required=true) }}
{{ select("color", ["Red", "Green", "Blue"], label="Favorite color") }}
{{ select("role", [
{"value": "admin", "label": "Administrator"},
{"value": "editor", "label": "Editor"},
{"value": "viewer", "label": "Viewer"}
], label="Role", selected="editor") }}
{{ select("plan", ["Free", "Pro"], label="Plan", error="Selection required") }}
{{ textarea("bio", label="Biography", placeholder="Tell us about yourself...") }}
{{ textarea("bio", label="Biography", error="Must be at least 20 characters", rows=3) }}
{% call form_group("Email address", for_id="email") %}
{{ input("email", type="email", placeholder="you@example.com") }}
{% endcall %}
{% call form_group("Password", error="Password is required") %}
{{ input("password", type="password") }}
{% endcall %}
{{ csrf_input(csrf_token) }}
{# Renders: #}
A simple card with just content. Uses Pico's <article> element.
{% call card() %}
A simple card with just content.
{% endcall %}
Card body content goes here. The title renders in a <header> and footer in a <footer>.
{% call card(title="User Profile", footer="Last updated: today") %}
Card body content goes here.
{% endcall %}
{{ alert("This is an informational message.", variant="info") }}
{{ alert("Operation completed successfully!", variant="success") }}
{{ alert("Please check your input.", variant="warning") }}
{{ alert("Something went wrong.", variant="error") }}
{{ alert("You can close this alert.", variant="info", dismissible=true) }}
| Name | Role | |
|---|---|---|
| Alice Johnson | alice@example.com | Admin |
| Bob Smith | bob@example.com | Editor |
| Carol White | carol@example.com | Viewer |
{{ data_table(
["Name", "Email", "Role"],
[
["Alice Johnson", "alice@example.com", "Admin"],
["Bob Smith", "bob@example.com", "Editor"],
["Carol White", "carol@example.com", "Viewer"]
]
) }}
| Name | |
|---|---|
| No users found. | |
{{ data_table(["Name", "Email"], [], empty_message="No users found.") }}
{{ pagination(page=3, total_pages=7) }}
{{ pagination(page=1, total_pages=5) }}
{{ pagination(page=2, total_pages=10, base_url="/users?page=") }}
No items found.
{{ empty_state() }}
No projects yet.
Create your first project{{ empty_state("No projects yet.",
action_label="Create your first project",
action_url="/projects/new") }}
{{ badge("Primary") }}
{{ badge("Secondary", variant="secondary") }}
{{ badge("Success", variant="success") }}
{{ badge("Warning", variant="warning") }}
{{ badge("Error", variant="error") }}
{{ badge("Info", variant="info") }}
Notifications {{ badge("3", variant="error") }}
Status: {{ badge("Active", variant="success") }}
{{ modal_trigger("confirm-dlg", "Open Modal") }}
{% call modal("confirm-dlg", title="Confirm Action") %}
Are you sure you want to proceed?
{% endcall %}
{{ loading_spinner() }}
{{ loading_spinner(size="2.5rem") }}
{{ loading_skeleton(lines=4) }}
{{ loading_skeleton(lines=3) }}