Releases: mantinedev/mantine
7.5.2
What's Changed
[@mantine/core]
ActionIcon: Fix icon width and height defined in % not working correctly[@mantine/core]
ScrollArea: FixoffsetScrollbars
not working (#5733)[@mantine/tiptap]
FixinitialExternal
onRichTextEditor.Link
control not working correctly[@mantine/core]
FileInput: Fix incorrectextend
function type[@mantine/core]
PinInput: Fix various issues related to user input and pasting into the input (#5704)[@mantine/form]
Add callback argument support toform.setFieldValue
handler (#5696)[@mantine/core]
Add explicit extension to exports to support NodeNext TypeScript resolution (#5697)[@mantine/hooks]
use-list-state: Addswap
handler support (#5716)[@mantine/core]
Fix NodeNext TypeScript resolution not working correctly for PolymorphicComponentProps and PolymorphicRef types (#5730)[@mantine/core]
Fix cjs builds unable to resolve third-party dependencies with certain TypeScript settings (#5741)[@mantine/core]
Transition: Fix skew-up transition not working (#5714)[@mantine/core]
Select: Fix active option not being scrolled into view when the dropdown opens[@mantine/core]
Menu: Fix unexpected focus trap when keepMounted is false (#4502)[@mantine/core]
ScrollArea: Fixstyle
prop not being passed to the element when used inviewportProps
(#5594)[@mantine/core]
Divider: Fix poor color contrast with light color scheme[@mantine/core]
Modal: Fix incorrect content border-radius whenfullScreen
prop is set[@mantine/core]
Modal: Fix scroll container not working correctly when ScrollArea is used as a scroll container for a full screen modal[@mantine/notifications]
Fix notifications handlers not allowing passing data-* attributes (#5640)
New Contributors
- @kblcuk made their first contribution in #5741
- @qweered made their first contribution in #5694
- @kkaplita made their first contribution in #5704
Full Changelog: 7.5.1...7.5.2
7.5.1
What's Changed
[@mantine/core]
Indicator: Improve processing animation for lo-resolution monitors (#5682)[@mantine/hooks]
use-debounced-state: Fix incorrect type definition (#5665)[@mantine/hooks]
use-session-storage: Fix default value not being set in the storage on initial render (#5663)[@mantine/core]
Combobox: Fix incorrect dropdown styles with custom ScrollArea component (#5677)[@mantine/form]
Fix incorrect touch and dirty state handling inform.initialize
(#5623)[@mantine/core]
Chip: Fix error thrown when page is modified with Google Translate (#5586)[@mantine/form]
Add previous value as second argument toonValuesChange
(#5649)[@mantine/core]
FixautoContrast
defined on theme not working in some components (#5655)[@mantine/core]
Fix broken alignment in Checkbox, Radio and Switch (#5648)[@mantine/core-highlight]
AddwithCopyButton
prop support to CodeHighlightTabs (#5608)[@mantine/core]
UpdateuseComputedColorScheme
types to match definition with other similar hooks (#5588)[@mantine/core]
MultiSelect: Forbid select item removal if associated item becomes disabled (#5630)
New Contributors
- @Phirb made their first contribution in #5630
- @c0nd3v made their first contribution in #5588
- @sxflynn made their first contribution in #5605
- @vizath made their first contribution in #5648
- @mariansimecek made their first contribution in #5649
- @gabrielmaldi made their first contribution in #5670
- @waweber made their first contribution in #5668
- @msv96 made their first contribution in #5663
- @cristianghita24 made their first contribution in #5665
- @matthiasfeist made their first contribution in #5682
Full Changelog: 7.5.0...7.5.1
✨ 7.5.0
View changelog with demos on mantine.dev website
DonutChart component
New DonutChart component:
import { DonutChart } from '@mantine/charts';
import { data } from './data';
function Demo() {
return <DonutChart data={data} />;
}
PieChart component
New PieChart component:
import { PieChart } from '@mantine/charts';
import { data } from './data';
function Demo() {
return <PieChart data={data} />;
}
@mantine/dates value formatter
DatePickerInput, MonthPickerInput and
YearPickerInput now support valueFormatter
prop.
valueFormatter
is a more powerful alternative to valueFormat
prop.
It allows formatting value label with a custom function.
The function is the same for all component types (default
, multiple
and range
)
– you need to perform additional checks inside the function to handle different types.
Example of using a custom formatter function with type="multiple"
:
import dayjs from 'dayjs';
import { useState } from 'react';
import { DateFormatter, DatePickerInput } from '@mantine/dates';
const formatter: DateFormatter = ({ type, date, locale, format }) => {
if (type === 'multiple' && Array.isArray(date)) {
if (date.length === 1) {
return dayjs(date[0]).locale(locale).format(format);
}
if (date.length > 1) {
return `${date.length} dates selected`;
}
return '';
}
return '';
};
function Demo() {
const [value, setValue] = useState<Date[]>([]);
return (
<DatePickerInput
label="Pick 2 dates or more"
placeholder="Pick 2 dates or more"
value={value}
onChange={setValue}
type="multiple"
valueFormatter={formatter}
/>
);
}
@mantine/dates consistent weeks
You can now force each month to have 6 weeks by setting consistentWeeks: true
on
DatesProvider. This is useful if you want to avoid layout
shifts when month changes.
import { DatePicker, DatesProvider } from '@mantine/dates';
function Demo() {
return (
<DatesProvider settings={{ consistentWeeks: true }}>
<DatePicker />
</DatesProvider>
);
}
Charts series label
It is now possible to change series labels with label
property
in series
object. This feature is supported in AreaChart,
BarChart and LineChart components.
import { AreaChart } from '@mantine/charts';
import { data } from './data';
function Demo() {
return (
<AreaChart
h={300}
data={data}
dataKey="date"
type="stacked"
withLegend
legendProps={{ verticalAlign: 'bottom' }}
series={[
{ name: 'Apples', label: 'Apples sales', color: 'indigo.6' },
{ name: 'Oranges', label: 'Oranges sales', color: 'blue.6' },
{ name: 'Tomatoes', label: 'Tomatoes sales', color: 'teal.6' },
]}
/>
);
}
Charts value formatter
All @mantine/charts
components now support valueFormatter
prop, which allows
formatting value that is displayed on the y axis and inside the tooltip.
import { AreaChart } from '@mantine/charts';
import { data } from './data';
function Demo() {
return (
<AreaChart
h={300}
data={data}
dataKey="date"
type="stacked"
valueFormatter={(value) => new Intl.NumberFormat('en-US').format(value)}
series={[
{ name: 'Apples', color: 'indigo.6' },
{ name: 'Oranges', color: 'blue.6' },
{ name: 'Tomatoes', color: 'teal.6' },
]}
/>
);
}
Headings text wrap
New Title textWrap
prop sets text-wrap
CSS property. It controls how text inside an element is wrapped.
import { Title } from '@mantine/core';
function Demo() {
return (
<Title order={3} textWrap="wrap">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Quasi voluptatibus inventore iusto
cum dolore molestiae perspiciatis! Totam repudiandae impedit maxime!
</Title>
);
}
You can also set textWrap
on theme:
import { createTheme, MantineProvider } from '@mantine/core';
const theme = createTheme({
headings: {
textWrap: 'wrap',
},
});
function Demo() {
return (
<MantineProvider theme={theme}>
<Title>Some very long title that should wrap</Title>
</MantineProvider>
);
}
If set on theme, textWrap
is also applied to headings in TypographyStylesProvider
mod prop
All components now support mod
prop, which allows adding data attributes to
the root element:
import { Box } from '@mantine/core';
<Box mod="data-button" />;
// -> <div data-button />
<Box mod={{ opened: true }} />;
// -> <div data-opened />
<Box mod={{ opened: false }} />;
// -> <div />
<Box mod={['button', { opened: true }]} />;
// -> <div data-button data-opened />
<Box mod={{ orientation: 'horizontal' }} />;
// -> <div data-orientation="horizontal" />
Documentation updates
- New testing with Vitest guide
- NativeSelect with dividers demo
- Popover
shift
andflip
middlewares documentation - Combobox props related to Popover documentation
- Loading styles from CDN guide
- Anchor now includes additional documentation on how to use Text props
- Pagination now includes props tables for all compound components
- A more detailed breakdown of browser support has been added to the about page
Help center updates
New articles added to the help center:
- Can I use Mantine with Astro?
- How can I contribute to the library?
- How can I add dynamic CSS styles?
- How can I load fonts in Next.js?
- How can I load fonts in Vite?
- Is there a floating action button component?
- How to change inputs placeholder color?
- I do not have styles in my dates components...
Other changes
- Checkbox.Group, Radio.Group and Switch.Group now support
readOnly
prop - ActionIcon now has
loading
state animation - SegmentedControl now supports
withItemsBorder
prop which allows removing border between items - Progress now supports
transitionDuration
prop which controls section width animation duration - Textarea and JsonInput components now support
resize
prop, which allows settingresize
CSS property on the input @mantine/hooks
package now exports readLocalStorageValue and readSessionStorageValue function to get value from storage outside of React components
7.4.2
What's Changed
[@mantine/modals]
FixonClose
throwing error iftrapFocus: false
is passed to one of the modals (#5577)[@mantine/dates]
Add missingplaceholder
styles api selector to DatePickerInput, MonthPickerInput and YearPickerInput components[@mantine/tiptap]
Fix incorrect disabled controls in dark color scheme[@mantine/core]
MultiSelect: Fixcombobox.closeDropdown()
called twice inonBlur
method[@mantine/tiptap]
Fix incorrect peer dependencies[@mantine/core]
Fix incorrect colors resolving logic forbg
style prop[@mantine/core]
Remove global height styles from body and html[@mantine/hooks]
use-media-query: FixgetInitialValueInEffect
not working correctly when initial value is provided (#5575, #5549)[@mantine/core]
Divider: Change default colors to match other components (#5480)[@mantine/core]
Fix incorrectforceColorScheme={undefined}
handling (#4959)[@mantine/core]
Menu: Remove duplicated static class on the dropdown element (#5537)[@mantine/core]
Add/
support for rgba calculations (#5544)
New Contributors
Full Changelog: 7.4.1...7.4.2
7.4.1
What's Changed
[@mantine/core]
Combobox: Fix numpad enter not working (#5526)[@mantine/core]
Combobox: FixonClose
prop not working (#5509)[@mantine/core]
AppShell: Fix header height 0 not working (#5514)[@mantine/core]
ColorPicker: Fix incorrect background gradient in AlphaSlider (#5518)[@mantine/core]
Indicator: FixautoContrast
being passed to the dom node as attribute (#5508)[@mantine/core]
NumberInput: FixallowLeadingZeros
prop not working[@mantine/core]
NumberInput: Fix incorrect controls border color in disabled state[@mantine/core]
NumberInput: Fix incorrect -0.0, -0.00, -0.000 ... inputs handling[@mantine/core]
Popover: Improvewidth
prop type[@mantine/core]
Improve types ofdata
prop in Autocomplete and TagsInput components[@mantine/core]
MultiSelect: Fixrequired
prop not displaying required asterisk[@mantine/hooks]
use-scroll-into-view: Improve types (#5426)[@mantine/core]
MultiSelect: Fix incorrectpointer-events
style on the right section (#5472)[@mantine/core]
Fix breakpoints defined in px being transformed into em whenvisibleFrom
andhiddenFrom
props are used (#5457)[@mantine/core]
Rating: Improvesize
type (#5470)[@mantine/core]
ScrollArea: Fix ScrollArea.Autosize working incorrectly with some tables (#5481)[@mantine/core]
NumberInput: Add support for numbers that are larger than Number.MAX_SAFE_INTEGER (#5471)[@mantine/core]
Combobox: Fix readonly data array not being supported (#5477)[@mantine/charts]
Fix incorrect y-axis styles in RTL (#5505)
New Contributors
- @hexcowboy made their first contribution in #5477
- @giveerr made their first contribution in #5471
- @ayovev made their first contribution in #5481
- @hirotomoyamada made their first contribution in #5518
- @buzzthedev made their first contribution in #5535
- @ID-JA made their first contribution in #5509
Full Changelog: 7.4.0...7.4.1
7.4.0 ⭐
View changelog with demos on mantine.dev website
@mantine/charts
New @mantine/charts package provides a set of components
to build charts and graphs. All components are based on recharts.
Currently, the package provides AreaChart, BarChart,
LineChart and Sparkline components.
More components will be added in the next minor releases.
AreaChart component
New AreaChart component:
import { AreaChart } from '@mantine/charts';
import { data } from './data';
function Demo() {
return (
<AreaChart
h={300}
data={data}
dataKey="date"
type="stacked"
series={[
{ name: 'Apples', color: 'indigo.6' },
{ name: 'Oranges', color: 'blue.6' },
{ name: 'Tomatoes', color: 'teal.6' },
]}
/>
);
}
LineChart component
New LineChart component:
import { LineChart } from '@mantine/charts';
import { data } from './data';
function Demo() {
return (
<LineChart
h={300}
data={data}
dataKey="date"
withLegend
series={[
{ name: 'Apples', color: 'indigo.6' },
{ name: 'Oranges', color: 'blue.6' },
{ name: 'Tomatoes', color: 'teal.6' },
]}
/>
);
}
BarChart component
New BarChart component:
import { BarChart } from '@mantine/charts';
import { data } from './data';
function Demo() {
return (
<BarChart
h={300}
data={data}
dataKey="month"
type="stacked"
orientation="vertical"
yAxisProps={{ width: 80 }}
series={[
{ name: 'Smartphones', color: 'violet.6' },
{ name: 'Laptops', color: 'blue.6' },
{ name: 'Tablets', color: 'teal.6' },
]}
/>
);
}
Sparkline component
New Sparkline component:
import { Sparkline } from '@mantine/charts';
function Demo() {
return (
<Sparkline
w={200}
h={60}
data={[10, 20, 40, 20, 40, 10, 50]}
curveType="linear"
color="blue"
fillOpacity={0.6}
strokeWidth={2}
/>
);
}
OKLCH colors support
You can now use OKLCH colors in theme.colors
.
OKLCH color model has 88.18% browser support,
it is supported in all modern browsers. OKLCH model provides 30% more colors than HSL model and
has several other advantages.
Example of adding OKLCH color to the theme:
import { Button, createTheme, Group, MantineProvider } from '@mantine/core';
const theme = createTheme({
colors: {
'oklch-blue': [
'oklch(96.27% 0.0217 238.66)',
'oklch(92.66% 0.0429 240.01)',
'oklch(86.02% 0.0827 241.66)',
'oklch(78.2% 0.13 243.83)',
'oklch(71.8% 0.1686 246.06)',
'oklch(66.89% 0.1986 248.32)',
'oklch(62.59% 0.2247 250.29)',
'oklch(58.56% 0.2209 251.26)',
'oklch(54.26% 0.2067 251.67)',
'oklch(49.72% 0.1888 251.59)',
],
},
});
function Demo() {
return (
<MantineProvider theme={theme}>
<Group>
<Button color="oklch-blue">Filled</Button>
<Button color="oklch-blue" variant="outline">
Outline
</Button>
<Button color="oklch-blue" variant="light">
Light
</Button>
</Group>
</MantineProvider>
);
}
autoContrast
New theme.autoContrast
property controls whether text color should be changed based on the given color
prop
in the following components:
- ActionIcon with
variant="filled"
only - Alert with
variant="filled"
only - Avatar with
variant="filled"
only - Badge with
variant="filled"
only - Button with
variant="filled"
only - Chip with
variant="filled"
only - NavLink with
variant="filled"
only - ThemeIcon with
variant="filled"
only - Checkbox with
variant="filled"
only - Radio with
variant="filled"
only - Tabs with
variant="pills"
only - SegmentedControl
- Stepper
- Pagination
- Progress
- Indicator
- Timeline
- Spotlight
- All @mantine/dates components that are based on Calendar component
autoContrast
can be set globally on the theme level or individually for each component via autoContrast
prop,
except for Spotlight and @mantine/dates components, which only support global theme setting.
import { Button, Code, Group } from '@mantine/core';
function Demo() {
return (
<>
<Code>autoContrast: true</Code>
<Group mt="xs" mb="lg">
<Button color="lime.4" autoContrast>
Lime.4 button
</Button>
<Button color="blue.2" autoContrast>
Blue.2 button
</Button>
<Button color="orange.3" autoContrast>
Orange.3 button
</Button>
</Group>
<Code>autoContrast: false</Code>
<Group mt="xs">
<Button color="lime.4">Lime.4 button</Button>
<Button color="blue.2">Blue.2 button</Button>
<Button color="orange.3">Orange.3 button</Button>
</Group>
</>
);
}
autoContrast
checks whether the given color luminosity is above or below the luminanceThreshold
value
and changes text color to either theme.white
or theme.black
accordingly:
import { Button, createTheme, MantineProvider, Stack } from '@mantine/core';
const theme = createTheme({
autoContrast: true,
luminanceThreshold: 0.3,
});
function Wrapper(props: any) {
const buttons = Array(10)
.fill(0)
.map((_, index) => (
<Button key={index} color={`blue.${index}`}>
Button
</Button>
));
return (
<MantineProvider theme={theme}>
<Stack>{buttons}</Stack>
</MantineProvider>
);
}
Color functions improvements
alpha
, lighten
and darken
functions now support CSS variables (with color-mix) and OKLCH colors.
All functions are available both in @mantine/core
(.ts
/.js
files) and postcss-preset-mantine (.css
files, requires version 1.12.0 or higher).
In .css
files:
.demo-alpha {
color: alpha(var(--mantine-color-red-4), 0.5);
border: 1px solid alpha(#ffc, 0.2);
}
.demo-lighten-darken {
color: lighten(var(--mantine-color-red-4), 0.5);
border: 1px solid darken(#ffc, 0.2);
}
Will be transformed to:
.demo-alpha {
color: color-mix(in srgb, var(--mantine-color-red-4), transparent 50%);
border: 1px solid color-mix(in srgb, #ffc, transparent 80%);
}
.demo-lighten-darken {
color: color-mix(in srgb, var(--mantine-color-red-4), white 50%);
border: 1px solid color-mix(in srgb, #ffc, black 20%);
}
In .ts
/.js
files:
import { alpha, lighten } from '@mantine/core';
alpha('#4578FC', 0.45); // -> rgba(69, 120, 252, 0.45)
alpha('var(--mantine-color-gray-4)', 0.74);
// -> color-mix(in srgb, var(--mantine-color-gray-4), transparent 26%)
lighten('#4578FC', 0.45); // -> #a3c1ff
lighten('var(--mantine-color-gray-4)', 0.74);
// -> color-mix(in srgb, var(--mantine-color-gray-4), white 74%)
Note that alpha
function is a replacement for rgba
. It was renamed to
have a more clear meaning, as it can now be used with CSS variables and OKLCH colors.
rgba
function is still available as an alias for alpha
function.
enhanceGetInputProps
@mantine/form
now supports enhanceGetInputProps. enhanceGetInputProps
is a function that can be used to add additional props to the object returned by form.getInputProps
.
You can define it in useForm
hook options. Its argument is an object with the following properties:
inputProps
– object returned byform.getInputProps
by defaultfield
– field path, first argument ofform.getInputProps
, for examplename
,user.email
,users.0.name
options
– second argument ofform.getInputProps
, for example{ type: 'checkbox' }
, can be used to pass additional
options toenhanceGetInputProps
functionform
– form instance
Example of using enhanceGetInputProps
to disable input based on field path:
import { NumberInput, TextInput } from '@mantine/core';
import { useForm } from '@mantine/form';
interface FormValues {
name: string;
age: number | string;
}
function Demo() {
const form = useForm<FormValues>({
initialValues: { name: '', age: '' },
enhanceGetInputProps: (payload) => ({
disabled: ...
7.3.2
What's Changed
[@mantine/core]
Portal: Fix empty className string throwing error (#5400)[@mantine/core]
Select: Fix incorrect empty string as initial value handing[@mantine/core]
Fix error thrown in jest tests when autosize Textarea is used in Next.js application (#5393)[@mantine/core]
Loader: Fix default loaders not being available if custom loader was default with defaultProps on theme[@mantine/core]
Chip: Fixcolor
prop not working without specifying variant[@mantine/core]
MultiSelect: Fix dropdown not being opened when Space key is pressed and the component is not searchable[@mantine/core]
NavLink: Add missing Space key handling for collapse/expand nested links[@mantine/dates]
DateInput: Fix incorrect clear button size[@mantine/core]
Fix text inside MultiSelect, TagsInput and PillsInput search field not being possible to select with mouse[@mantine/core]
Set cursor tonot-allowed
on disabled Checkbox, Radio and Switch[@mantine/core]
NumberInput: Improve disabled increment/decrement controls styles[@mantine/core]
Button: Fix incorrect alignment if button is used in the same container as other buttons withcomponent
prop[@mantine/core]
SegmentedControl: Improve readOnly styles[@mantine/core]
NumberInput: Fix incorrect controls text color in error state[@mantine/core]
Change divs to more semantic elements in Modal and Drawer[@mantine/core]
Make header height of Modal and Drawer consistent to prevent layout shift whenwithCloseButton
prop is changed[@mantine/core]
FixonChange
not being called in Radio, Checkbox and Chip components if they are used insideX.Group
[@mantine/core]
NumberInput: Fix incorrect negative decimal values input handing[@mantine/core]
Button: Fix incorrect Loader vertical alignment[@mantine/vanilla-extract]
Expose all primary colors values[@mantine/core]
Menu: Fix incorrect aria roles (#5372)[@mantine/core]
Table: Fix sticky header being overlayed by elements in table rows in some cases (#5385)[@mantine/core]
Combobox: FixrightSection
andleftSection
nor being visible onCombobox.Search
(#5368)[@mantine/core]
Tabs: Fix clipped border of outline variant (#5370)[@mantine/core]
Fix incorrectrightSectionPointerEvents
in Select and MultiSelect components (#5371)[@mantine/core]
Alert: Fix incorrect margin if title is hidden[@mantine/core]
Overlay: Fix blur styles not working in old Safari
New Contributors
- @abdulbasithqb made their first contribution in #5385
Full Changelog: 7.3.1...7.3.2
7.3.1
What's Changed
[@mantine/core]
Fix broken default colors override[@mantine/core]
Menu: Improveclick-hover
trigger accessibility (#5335)[@mantine/core]
Fix incorrectlineHeight
theme variables resolving (#5375)[@mantine/core]
Select: Fix error thrown if google translate changes labels (#5377)[@mantine/tiptap]
Add missingcontrol
Styles API selector toRichTextEditor.Link
(#5171)[@mantine/core]
Grid: Fix incorrect Grid.Col auto span handing if one Grid is used inside another Grid (#5278)[@mantine/core]
Grid: Fix incorrect Grid.Col styles when the column isauto
as base value andcontent
as breakpoint value (#5280)[@mantine/core]
Fix various RTL issues (#5250)[@mantine/dates]
FixhideOutsideDates
now working if@mantine/dates
is used as a headless library (#5003)[@mantine/core]
SegmentedControl: Remove animation during initialization (#5182)[@mantine/core]
Menu: Fix broken focus logic whenkeepMounted
is set (#4502)[@mantine/tiptap]
Remove@tabler/icons
dependency to improve bundling performance (#5279)[@mantine/core]
Fix inputs have incorrect left and right sections colors in error state (#5304)[@mantine/core]
Title: AddlineClamp
support (#5321)[@mantine/core]
Grid: Change default overflow to visible (#5276)[@mantine/core]
ScrollArea: Fix incorrect scrollbars styles (#4904)[@mantine/core]
Expose--mantine-primary-color-x
CSS variables (#5331)[@mantine/core]
Combobox: Fix incorrect Enter key handling when dropdown is opened and option is not selected (#5348)[@mantine/core]
NumberInput: FixstartValue
nor working ifmin
is set (#5308)[@mantine/core]
Collapse: Add missing Collapse.extend function (#5313)[@mantine/core]
Fix incorrect clamp() function handing in style props (#5330)[@mantine/core]
PinInput: Trim value on paste before validation (#5340)[@mantine/core]
PinInput: Fix incorrectly assigned ref (#5365)[@mantine/core]
Remove use client from createPolymorphicComponent factory (#5367)
New Contributors
- @manuelbosi made their first contribution in #5377
- @riettsruff made their first contribution in #5375
Full Changelog: 7.3.0...7.3.1
7.3.0 🌟
View changelog with demos on mantine.dev website
smaller-than and larger-than mixins
smaller-than
and larger-than
mixins can be used to create styles that will be applied only when the screen is smaller or larger than specified breakpoint.
Note that to use these mixins, you need to update postcss-preset-mantine to version 1.11.0
or higher.
.demo {
@mixin smaller-than 320px {
color: red;
}
@mixin larger-than 320px {
color: blue;
}
}
Will be transformed to:
// Breakpoint values are converted to em units
// In smaller-than mixin 0.1px is subtracted from breakpoint value
// to avoid intersection with larger-than mixin
@media (max-width: 19.99375em) {
.demo {
color: red;
}
}
@media (min-width: 20em) {
.demo {
color: blue;
}
}
You can also use smaller-than
and larger-than
mixins with mantine breakpoints:
.demo {
@mixin smaller-than $mantine-breakpoint-sm {
color: red;
}
@mixin larger-than $mantine-breakpoint-sm {
color: blue;
}
}
Form schema resolvers packages
@mantine/form
schema validation resolver packages are now available as separate packages.
Moving resolvers to separate packages allows making them type-safe and fully tested.
Old resolvers are still exported from @mantine/form
package – you will be able to use them without any changes
until 8.0.0 release.
The new packages are drop-in replacements for old resolvers, they have the same API and can be used in the same way.
Example of zod resolver:
yarn add zod mantine-form-zod-resolver
import { z } from 'zod';
import { useForm } from '@mantine/form';
import { zodResolver } from 'mantine-form-zod-resolver';
const schema = z.object({
name: z.string().min(2, { message: 'Name should have at least 2 letters' }),
email: z.string().email({ message: 'Invalid email' }),
age: z.number().min(18, { message: 'You must be at least 18 to create an account' }),
});
const form = useForm({
initialValues: {
name: '',
email: '',
age: 16,
},
validate: zodResolver(schema),
});
form.validate();
form.errors;
// -> {
// name: 'Name should have at least 2 letters',
// email: 'Invalid email',
// age: 'You must be at least 18 to create an account'
// }
rem/em functions improvements
rem and em function now support space-separated values. This feature is available
both in rem
function exported from @mantine/core
package and postcss-preset-mantine.
Note that you need to update postcss-preset-mantine to 1.11.0
to use this feature.
import { rem } from '@mantine/core';
rem('16px 32px');
// -> calc(1rem * var(--mantine-scale)) calc(2rem * var(--mantine-scale))
All components props that are converted to rem
units now support space-separated values as well.
For example, space-separated values can be used in radius
prop of Modal component:
import { Modal } from '@mantine/core';
function Demo() {
return <Modal radius="10px 10px 0 0" opened onClose={() => {}} />;
}
component and renderRoot props for non-polymorphic components
All Mantine components now support component
and renderRoot
props event if they are not polymorphic.
The difference between polymorphic and non-polymorphic components is that polymorphic components
include the full set of props of the component passed to the component
prop, while non-polymorphic
components only include props that are specific to the original component. It is done this way to
improve TypeScript performance.
import { Group } from '@mantine/core';
// Group is not polymorphic component,
// but it still supports component and renderRoot props
function Demo() {
return (
<Group component="nav">
<a>Item 1</a>
<a>Item 2</a>
<a>Item 3</a>
</Group>
);
}
Outline Checkbox and Radio variant
Checkbox and Radio components now support outline
variant:
import { Radio, Checkbox, Stack } from '@mantine/core';
function Demo() {
return (
<Stack gap={7}>
<Checkbox variant="outline" label="Outline Checkbox" defaultChecked />
<Checkbox variant="outline" label="Outline indeterminate Checkbox" indeterminate />
<Radio variant="outline" label="Outline Radio" defaultChecked />
</Stack>
);
}
HueSlider and AlphaSlider components
HueSlider and AlphaSlider components were added back:
import { useState } from 'react';
import { HueSlider, Text } from '@mantine/core';
function Demo() {
const [value, onChange] = useState(250);
return (
<>
<Text>Hue value: {value}</Text>
<HueSlider value={value} onChange={onChange} />
</>
);
}
import { useState } from 'react';
import { AlphaSlider, Text } from '@mantine/core';
function Demo() {
const [value, onChange] = useState(0.55);
return (
<>
<Text>Alpha value: {value}</Text>
<AlphaSlider color="#1c7ed6" value={value} onChange={onChange} />
</>
);
}
Button loading state animation
Button component now has loading state animation:
import { Button, Group } from '@mantine/core';
function Demo() {
const [loading, { toggle }] = useDisclosure();
return (
<>
<Group>
<Button loading={loading}>Filled button</Button>
<Button variant="light" loading={loading}>
Light button
</Button>
<Button variant="outline" loading={loading}>
Outline button
</Button>
</Group>
<Switch checked={loading} onChange={toggle} label="Loading state" mt="md" />
</>
);
}
Drawer offset
Drawer now supports offset
prop. It changes drawer offset from the edge of the viewport:
import { useDisclosure } from '@mantine/hooks';
import { Drawer, Button } from '@mantine/core';
function Demo() {
const [opened, { open, close }] = useDisclosure(false);
return (
<>
<Drawer offset={8} radius="md" opened={opened} onClose={close} title="Authentication">
{/* Drawer content */}
</Drawer>
<Button onClick={open}>Open Drawer</Button>
</>
);
}
z-index CSS variables
You can now use Mantine z-index CSS variables:
--mantine-z-index-app
– value100
--mantine-z-index-modal
– value200
--mantine-z-index-popover
– value300
--mantine-z-index-overlay
– value400
--mantine-z-index-max
– value9999
Example of using --mantine-z-index-modal
variable:
/* Display content above the modal */
.my-content {
z-index: calc(var(--mantine-z-index-modal) + 1);
}
Improved dark color scheme colors
theme.colors.dark
colors were slightly changed to improve contrast and make it easier to read text.
You can preview new colors on this page. New colors values are:
--mantine-color-dark-0: #c9c9c9;
--mantine-color-dark-1: #b8b8b8;
--mantine-color-dark-2: #828282;
--mantine-color-dark-3: #696969;
--mantine-color-dark-4: #4a4a4a;
--mantine-color-dark-5: #404040;
--mantine-color-dark-6: #383838;
--mantine-color-dark-7: #2e2e2e;
--mantine-color-dark-8: #242424;
--mantine-color-dark-9: #212121;
If you prefer old colors, change theme settings on MantineProvider
:
import { createTheme } from '@mantine/core';
const theme = createTheme({
colors: {
dark: [
'#C1C2C5',
'#A6A7AB',
'#909296',
'#5c5f66',
'#373A40',
'#2C2E33',
'#25262b',
'#1A1B1E',
'#141517',
'#101113',
],
},
});
function Demo() {
return <MantineProvider theme={theme}>{/* Your app here */}</MantineProvider>;
}
Documentation updates
- Schema-based validation with
@mantine/form
now has a dedicated page. It includes more examples for basic, nested and list fields validation for each resolver. - Autocomplete, Select, MultiSelect and TagsInput now include new demos that show how to customize dropdown behavior and styles.
- Example of using Mantine with disabled JavaScript was added to the color schemes guide.
- Pagination now includes an additional example with chunked content handling.
- A new section about dayjs localization with Next.js app router and server components has been added to the dates getting started page
- Modals manager now includes a guide on how to pass props down to the underlying Modal component.
- Slider now has sections about decimal values and
minRange
prop. - You can now view all 200+ releases with release dates on the all releases page.
Other changes
- [use-has...
7.2.2
What's new
[@mantine/core]
HoverCard: Removeopened
andonChange
props from types[@mantine/core]
RingProgress: Fix error thrown when thickness is larger thansize / 4
[@mantine/dates]
DateInput: Fix unexpected values updates when the user tries to type in value with closed dropdown (#3818)[@mantine/core]
NumberInput: FixonChange
called when value is changed by external state (#5235)[@mantine/core]
NumberInput: FixonChange
function called inonBlur
when the value does not require updating[@mantine/core]
NumberInput: ImproveonChange
handler to be called with number unless the input is empty (#5037)[@mantine/core]
SegmentedControl: Fix incorrect indicator position if padding is set on the root element[@mantine/core]
Select: Fix empty string not being handled correctly as option value[@mantine/core]
Blockquote: Fix incorrectborder-radius
[@mantine/core]
Chip: Fix incorrect disabled styles in dark color scheme[@mantine/core]
Table: Setbackgound-color
onthead
only ifstrickyHeader
prop is set[@mantine/core]
Radio: Fix radio icon size being the same width and height at every size[@mantine/tiptap]
Fix incorrect rtl controls styles (#5223)[@mantine/tiptap]
Fix unexpected background-color set oncode
element