# DateInput
A **free-typing date field**: type a date (or pick it) and it's parsed against `valueFormat`,
showing the formatted result. Reach for it when a plain, keyboard-first date entry beats a full
calendar popover. It carries the same Input wrapper as
[TextInput](/components/inputs/textinput/) — label, description, error, sizes — and hydrates
into an interactive island.
Use it as `{% dateinput %}` in Markdown, or call it from Python logic
(loops, snippets) via `component('aardvark', 'dateinput', …)`.
Mantine 9's date components take and return **date strings** — `YYYY-MM-DD` (or `YYYY-MM-DD HH:mm`
when the format includes time), never `Date` objects. So `defaultValue` is a string like
`'2026-01-15'`.
## A basic field
`defaultValue` seeds the field (a `YYYY-MM-DD` string); `valueFormat` controls how it's displayed.
Source: Markdown
```aardvark
{% dateinput label='Release date' defaultValue='2026-01-15' valueFormat='MMM D, YYYY' clearable=true %}
```
Source: Python
```python
component('aardvark', 'dateinput', label='Release date',
defaultValue='2026-01-15', valueFormat='MMM D, YYYY', clearable=True)
```
## Sizes, variants, and validation
`size` and `radius` run `xs`–`xl`; `variant` is `default`, `filled`, or `unstyled`. `error` shows
a validation message, and `required` / `withAsterisk` add the asterisk.
Source: Markdown
```aardvark
{% dateinput label='Start' description='Pick the first day' size='md' variant='filled' required=true placeholder='Choose a date' %}
{% dateinput label='Due' error='A due date is required' %}
```
Source: Python
```python
component('aardvark', 'dateinput', label='Start', description='Pick the first day',
size='md', variant='filled', required=True, placeholder='Choose a date')
component('aardvark', 'dateinput', label='Due', error='A due date is required')
```
## Attributes
Omit any attribute to take its Mantine default.
| Attribute | Valid values | Description |
| --- | --- | --- |
| `defaultValue` | `YYYY-MM-DD` string | Initial value (a date string, never a `Date`). |
| `valueFormat` | a dayjs format string (e.g. `MMM D, YYYY`) | How the value is displayed and parsed. |
| `label` | string | Field label above the input. |
| `description` | string | Helper text below the label. |
| `placeholder` | string | Placeholder shown when empty. |
| `error` | string | Validation message; switches the field to the error color. |
| `size` | `xs`, `sm`, `md`, `lg`, `xl` | Control size. |
| `radius` | `xs`–`xl` or a CSS length | Corner radius. |
| `variant` | `default`, `filled`, `unstyled` | Input style. |
| `required` | bool (`true` / `false`) | Mark required and add the asterisk. |
| `withAsterisk` | bool (`true` / `false`) | Add the asterisk without the HTML `required`. |
| `disabled` | bool (`true` / `false`) | Render the field disabled. |
| `clearable` | bool (`true` / `false`) | Show an × to clear the value. |
## CSS Selectors
Target a `{% dateinput %}` from your own CSS with the island data attribute or the Mantine Styles API part classes:
```css
/* Every DateInput instance on the page */
[data-aardvark-island="DateInput"] { }
/* Mantine Styles API parts */
.mantine-DateInput-root { }
.mantine-DateInput-input { }
.mantine-DateInput-section { }
```
## Injecting Attributes
Pass `attr={…}` to forward raw HTML attributes — including inline event handlers — straight onto the rendered element. Here it is wired to `onchange`, so committing a typed value or picking a date logs the new value to the console and alerts it:
Source: Markdown
```aardvark
{% dateinput label='Release date' defaultValue='2026-01-15' valueFormat='MMM D, YYYY' clearable=true attr={'onchange': '''
const value = event.target.value;
console.log('attr demo value:', value);
alert(value);
'''} %}
```
Source: Python
```python
component('aardvark', 'dateinput', label='Release date',
defaultValue='2026-01-15', valueFormat='MMM D, YYYY', clearable=True, attr={'onchange': '''
const value = event.target.value;
console.log('attr demo value:', value);
alert(value);
'''})
```