pulse-mantine

Python bindings for Mantine React components. Wraps all @mantine/core components plus forms, dates, and charts packages. Use when building UI with Pulse Mantine components, adapting Mantine docs to Py

SKILL.md

GitHub

Pulse Mantine

Python bindings for Mantine React library. All components from @mantine/core, @mantine/form, @mantine/dates, and @mantine/charts are wrapped.

Quick Reference

from pulse_mantine import MantineProvider, Button, TextInput, Stack, Select

Adapting Mantine Docs to Pulse

Mantine docs use JSX. Convert to Pulse Python:

JSX Pulse Python
<Button variant="outline">Click</Button> Button("Click", variant="outline")
<Stack gap="md"><Item /></Stack> Stack(gap="md")[Item()]
onClick={() => fn()} onClick=fn or onClick=lambda: fn()
<Tabs.Tab value="x"> TabsTab("label", value="x")

Key rules:

  • Children as first positional args: Button("text"), Title("heading")
  • Props use camelCase: withAsterisk, onClick, defaultValue
  • Bracket syntax for nesting: Stack()[child1, child2]
  • Compound components flatten: Tabs.Tab → TabsTab, Modal.Body → ModalBody

Packages

Core (@mantine/core)

100+ UI components. All props from Mantine docs work directly.

Layout: Stack, Group, Grid, GridCol, Flex, Container, Center, AppShell Inputs: TextInput, Select, Checkbox, Switch, Slider, NumberInput, Textarea, PasswordInput, FileInput, ColorInput Buttons: Button, ActionIcon, CloseButton, CopyButton, FileButton Overlays: Modal, Drawer, Menu, Popover, Tooltip, HoverCard, Dialog Feedback: Alert, Notification, Progress, Loader, Skeleton Data Display: Card, Table, Accordion, Badge, Avatar, Timeline, Spoiler Navigation: Tabs, NavLink, Breadcrumbs, Pagination, Stepper Typography: Text, Title, Code, Highlight, List, Blockquote

Forms (@mantine/form)

Form state + client/server validation. See references/forms.md.

form = MantineForm(
    initialValues={"email": ""},
    validate={"email": IsEmail("Invalid email")},
)
return form.render(onSubmit=handle)[TextInput(name="email")]

Dates (@mantine/dates)

Date/time pickers. See references/dates.md.

DatePickerInput(name="date", label="Pick date")
DateTimePicker(name="datetime", label="Pick datetime")
TimeInput(name="time", label="Pick time")

Charts (@mantine/charts)

Recharts wrappers. See references/charts.md.

LineChart(h=300, data=data, dataKey="date", series=[{"name": "value", "color": "blue"}])

Dropzone (@mantine/dropzone)

Drag-and-drop file uploads. See references/dropzone.md.

Dropzone(name="attachments", accept=PDF_MIME_TYPE, maxSize=5 * 1024**2)[
    DropzoneIdle()[Text("Drop PDFs here")],
]
# Inside a MantineForm, files arrive as ps.UploadFile on submit.
# onDrop/onReject callbacks receive metadata only, never file bytes.

Common Patterns

Wrap app with provider:

@ps.component
def App():
    return MantineProvider()[YourContent()]

Form with validation:

form = MantineForm(
    initialValues={"name": "", "email": ""},
    validate={
        "name": IsNotEmpty("Required"),
        "email": [IsNotEmpty("Required"), IsEmail("Invalid")],
    },
    validateInputOnBlur=True,
)

Modal/Drawer state:

with ps.init():
    opened = ps.use_state(False)

Modal(opened=opened.value, onClose=lambda: opened.set(False))[content]

Notifications:

from pulse_mantine import Notifications, notifications
# Add <Notifications /> to layout
notifications.show(title="Success", message="Done", color="green")

Dynamic form lists:

form = MantineForm(
    initialValues={"items": [{"id": uuid.uuid4().hex, "name": ""}]},
    syncMode="change",  # enables form.values access
    onSyncValues=on_sync,  # optional: called with values dict on every sync
)
# Use form.insert_list_item(), form.remove_list_item()
# Access via form.values.get("items")
# Use the per-item id as the row key (index keys go stale in uncontrolled mode)

Nested field paths:

TextInput(name="address.street")      # nested object
TextInput(name="members.0.name")      # array index
TextInput(name="members.0.pets.1.name")  # deeply nested

Validators Quick Reference

Validator Usage
IsNotEmpty(err) Required field
IsEmail(err) Email format
HasLength(min=, max=, exact=) String length
Matches(pattern, err) Regex pattern
IsInRange(min=, max=) Number range
IsDate() / IsISODate() Date validation
IsBefore(field=) / IsAfter(field=) Date comparison
MatchesField(field, err) Field equality
ServerValidation(fn) Async server check
RequiredWhen(field, equals=) Conditional required

Reference Files

For detailed API docs:

  • references/core.md - All core components by category
  • references/forms.md - MantineForm, validators, form actions, sync, file uploads
  • references/dates.md - Date/time picker components
  • references/charts.md - Chart components and data format
  • references/dropzone.md - Drag-and-drop file uploads
  • references/notifications.md - Notifications imperative API