7.5.0

mantinedev/mantine7.5.0Jan 26, 2024by rtivital

AI Summary

Introduces DonutChart, PieChart, value formatters for dates, and the `mod` prop.

Key Highlights

  • New DonutChart and PieChart components for data visualization.
  • New `valueFormatter` prop for DatePickerInput, MonthPickerInput, and YearPickerInput.
  • New `consistentWeeks` setting in DatesProvider to force 6 weeks per month.
  • New `mod` prop allowing adding data attributes to the root element of components.

New Features

  • DonutChart
  • PieChart
  • valueFormatter for dates
  • consistentWeeks
  • chart series labels
  • mod prop
  • textWrap prop

Full Release Notes

[View changelog with demos on mantine.dev website](https://mantine.dev/changelog/7-5-0)

## DonutChart component

New [DonutChart](https://mantine.dev/charts/donut-chart) component:

```tsx
import { DonutChart } from '@mantine/charts';
import { data } from './data';

function Demo() {
  return <DonutChart data={data} />;
}
```

## PieChart component

New [PieChart](https://mantine.dev/charts/pie-chart) component:

```tsx
import { PieChart } from '@mantine/charts';
import { data } from './data';

function Demo() {
  return <PieChart data={data} />;
}
```

## @mantine/dates value formatter

[DatePickerInput](https://mantine.dev/dates/date-picker-input), [MonthPickerInput](https://mantine.dev/dates/month-picker-input) and
[YearPickerInput](https://mantine.dev/dates/year-picker-input) 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"`:

```tsx
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](https://mantine.dev/dates/getting-started). This is useful if you want to avoid layout
shifts when month changes.

```tsx
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](https://mantine.dev/charts/area-chart),
[BarChart](https://mantine.dev/charts/bar-chart) and [LineChart](https://mantine.dev/charts/line-chart) components.

```tsx
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.

```tsx
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](https://mantine.dev/core/title) `textWrap` prop sets [text-wrap](https://developer.mozilla.org/en-US/docs/Web/CSS/text-wrap)
CSS property. It controls how text inside an element is wrapped.

```tsx
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](https://mantine.dev/theming/theme-object):

```tsx
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](https://mantine.dev/core/typography-styles-provider)

## mod prop

All components now support `mod` prop, which allows adding data attributes to
the root element:

```tsx
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](https://mantine.dev/guides/vitest/)
- [NativeSelect](https://mantine.dev/core/native-select/#with-dividers) with dividers demo
- [Popover](https://mantine.dev/core/popover/#middlewares) `shift` and `flip` middlewares documentation
- [Combobox](https://mantine.dev/core/combobox/#popover-props) props related to [Popover](https://mantine.dev/core/popover) documentation
- [Loading styles from CDN guide](https://mantine.dev/styles/mantine-styles/#loading-styles-from-cdn)
- [Anchor](https://mantine.dev/core/anchor/#text-props) now includes additional documentation on how to use [Text](https://mantine.dev/core/text) props
- [Pagination](https://mantine.dev/core/pagination) now includes props tables for all compound components
- A more detailed breakdown of [browser support](https://mantine.dev/about/#browser-support) has been added to the about page

## Help center updates

New articles added to the [help center](https://help.mantine.dev):

- [Can I use Mantine with Astro?](https://help.mantine.dev/q/can-i-use-mantine-with-astro)
- [How can I contribute to the library?](https://help.mantine.dev/q/how-can-i-contribute)
- [How can I add dynamic CSS styles?](https://help.mantine.dev/q/dynamic-css-styles)
- [How can I load fonts in Next.js?](https://help.mantine.dev/q/next-load-fonts)
- [How can I load fonts in Vite?](https://help.mantine.dev/q/vite-load-fonts)
- [Is there a floating action button component?](https://help.mantine.dev/q/floating-action-button)
- [How to change inputs placeholder color?](https://help.mantine.dev/q/inputs-placeholder-color)
- [I do not have styles in my dates components...](https://help.mantine.dev/q/dates-missing-styles)

## Other changes

- [Checkbox.Group](https://mantine.dev/core/checkbox), [Radio.Group](https://mantine.dev/core/radio) and [Switch.Group](https://mantine.dev/core/switch) now support `readOnly` prop
- [ActionIcon](https://mantine.dev/core/action-icon) now has `loading` state animation
- [SegmentedControl](https://mantine.dev/core/segmented-control) now supports `withItemsBorder` prop which allows removing border between items
- [Progress](https://mantine.dev/core/progress) now supports `transitionDuration` prop which controls section width animation duration
- [Textarea](https://mantine.dev/core/textarea) and [JsonInput](https://mantine.dev/core/json-input) components now support `resize` prop, which allows setting `resize` CSS property on the input
- `@mantine/hooks` package now exports [readLocalStorageValue and readSessionStorageValue](hooks/use-local-storage/#read-storage-value) function to get value from storage outside of React components