Skip to content

Releases: mantinedev/mantine

7.14.1

16 Nov 15:18
Compare
Choose a tag to compare

What's Changed

  • [@mantine/hooks] use-hotkeys: Fix + sign not being supported (syntax: shift+[plus]) (#7123)
  • [@mantine/core] Popover: Fix styles prop being handled incorrectly (#7120)
  • [@mantine/charts] Fix valueFormatter not working in point labels of LineChant, AreaChart and CompositeChart components (#6989)
  • [@mantine/core] Popover: Fix onOpen and onClose callbacks being called on each render (#7022, #7111, #7115)
  • [@mantine/core] Menu: Fix Blocked aria-hidden warning when an interactive element is clicked outside of the Menu.Dropdown when the Menu is opened (#7035)
  • [@mantine/core] Fix top style prop not being conveted to rem (#7112)
  • [@mantine/dates] DateInput: Fix defaultDate prop not working when the value is set to null (#4426)
  • [@mantine/core] NumberInput: Remove increment/decrement control if value cannot be safely incremented (is larger than Number.MAX_SAFE_INTEGER) (#7033)
  • [@mantine/core] NumberInput: Fix value being reverted to start value if intial component value is a string
  • [@mantine/notifications] Fix NotificationData type being too broad (#7097)
  • [@mantine/core] RingProgress: Add transitionDuration prop support (#7103)
  • [@mantine/core] TagsInput: Fix incorrect tag remove logic with duplicated tags (#7105)
  • [@mantine/core] Combobox: Fix incorrect aria-controls attribute being set on the target element when the dropdown is closed (#7114)

New Contributors

Full Changelog: 7.14.0...7.14.1

7.14.0 πŸ’‹

12 Nov 15:23
Compare
Choose a tag to compare

View changelog with demos on mantine.dev website

AngleSlider component

New AngleSlider component:

import { AngleSlider, Group } from '@mantine/core';

function Demo() {
  return (
    <Group p="lg" gap={50}>
      <AngleSlider
        aria-label="Angle slider"
        formatLabel={(value) => `${value}Β°`}
        size={100}
        restrictToMarks
        marks={[
          { value: 0 },
          { value: 45 },
          { value: 90 },
          { value: 135 },
          { value: 180 },
          { value: 225 },
          { value: 270 },
          { value: 315 },
        ]}
      />

      <AngleSlider
        aria-label="Angle slider"
        formatLabel={(value) => `${value}Β°`}
        size={100}
        marks={[
          { value: 0, label: '0Β°' },
          { value: 45, label: '45Β°' },
          { value: 90, label: '90Β°' },
          { value: 135, label: '135Β°' },
          { value: 180, label: '180Β°' },
          { value: 225, label: '225Β°' },
          { value: 270, label: '270Β°' },
          { value: 315, label: '315Β°' },
        ]}
      />
    </Group>
  );
}

RadialBarChart component

New RadialBarChart component:

import { RadialBarChart } from '@mantine/charts';

const data = [
  { name: '18-24', value: 31.47, color: 'blue.7' },
  { name: '25-29', value: 26.69, color: 'orange.6' },
  { name: '30-34', value: 15.69, color: 'yellow.7' },
  { name: '35-39', value: 8.22, color: 'cyan.6' },
  { name: '40-49', value: 8.63, color: 'green' },
  { name: '50+', value: 2.63, color: 'pink' },
  { name: 'unknown', value: 6.67, color: 'gray' },
];

function Demo() {
  return <RadialBarChart data={data} dataKey="value" h={280} withLabels />;
}

FunnelChart component

New FunnelChart component:

import { FunnelChart } from '@mantine/charts';

const data = [
  { name: 'USA', value: 400, color: 'indigo.6' },
  { name: 'India', value: 300, color: 'yellow.6' },
  { name: 'Japan', value: 100, color: 'teal.6' },
  { name: 'Other', value: 200, color: 'gray.6' },
];

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

Modal.Stack and Drawer.Stack components

New Modal.Stack and Drawer.Stack components simplify usage of multiple modals/drawers at the same time.

Use Modal.Stack component to render multiple modals at the same time.
Modal.Stack keeps track of opened modals, manages z-index values, focus trapping
and closeOnEscape behavior. Modal.Stack is designed to be used with useModalsStack hook.

Differences from using multiple Modal components:

  • Modal.Stack manages z-index values – modals that are opened later will always have higher z-index value disregarding their order in the DOM
  • Modal.Stack disables focus trap and Escape key handling for all modals except the one that is currently opened
  • Modals that are not currently opened are present in the DOM but are hidden with opacity: 0 and pointer-events: none
  • Only one overlay is rendered at a time
import { Button, Group, Modal, useModalsStack } from '@mantine/core';

function Demo() {
  const stack = useModalsStack(['delete-page', 'confirm-action', 'really-confirm-action']);

  return (
    <>
      <Modal.Stack>
        <Modal {...stack.register('delete-page')} title="Delete this page?">
          Are you sure you want to delete this page? This action cannot be undone.
          <Group mt="lg" justify="flex-end">
            <Button onClick={stack.closeAll} variant="default">
              Cancel
            </Button>
            <Button onClick={() => stack.open('confirm-action')} color="red">
              Delete
            </Button>
          </Group>
        </Modal>

        <Modal {...stack.register('confirm-action')} title="Confirm action">
          Are you sure you want to perform this action? This action cannot be undone. If you are
          sure, press confirm button below.
          <Group mt="lg" justify="flex-end">
            <Button onClick={stack.closeAll} variant="default">
              Cancel
            </Button>
            <Button onClick={() => stack.open('really-confirm-action')} color="red">
              Confirm
            </Button>
          </Group>
        </Modal>

        <Modal {...stack.register('really-confirm-action')} title="Really confirm action">
          Jokes aside. You have confirmed this action. This is your last chance to cancel it. After
          you press confirm button below, action will be performed and cannot be undone. For real
          this time. Are you sure you want to proceed?
          <Group mt="lg" justify="flex-end">
            <Button onClick={stack.closeAll} variant="default">
              Cancel
            </Button>
            <Button onClick={stack.closeAll} color="red">
              Confirm
            </Button>
          </Group>
        </Modal>
      </Modal.Stack>

      <Button onClick={() => stack.open('delete-page')}>Open modal</Button>
    </>
  );
}

useModalsStack/useDrawersStack hooks

useModalsStack hook provides an easy way to control multiple modals at the same time.
It accepts an array of unique modals ids and returns an object with the following properties:

interface ModalStackReturnType<T extends string> {
  // Current opened state of each modal
  state: Record<T, boolean>;

  // Opens modal with the given id
  open: (id: T) => void;

  // Closes modal with the given id
  close: (id: T) => void;

  // Toggles modal with the given id
  toggle: (id: T) => void;

  // Closes all modals within the stack
  closeAll: () => void;

  // Returns props for modal with the given id
  register: (id: T) => {
    opened: boolean;
    onClose: () => void;
    stackId: T;
  };
}

Example of using useModalsStack with Modal component:

import { Modal, useModalsStack } from '@mantine/core';

function Demo() {
  const stack = useModalsStack(['first', 'second']);

  return (
    <>
      <Modal {...stack.register('first')}>First</Modal>
      <Modal {...stack.register('second')}>Second</Modal>
      <Button onClick={() => stack.open('first')}>Open first</Button>
    </>
  );
}

Restrict Slider selection to marks

Slider component now supports restrictToMarks prop that restricts slider value to marks only.
Note that in this case step prop is ignored:

import { Slider } from '@mantine/core';

function Demo() {
  return (
    <Slider
      restrictToMarks
      defaultValue={25}
      marks={Array.from({ length: 5 }).map((_, index) => ({ value: index * 25 }))}
    />
  );
}

BarChart SVG pattern fill

BarChart now can be used with SVG pattern fill:

import { BarChart } from '@mantine/charts';
import { data } from './data';

function Demo() {
  return (
    <BarChart
      h={300}
      data={mixedStackData}
      dataKey="month"
      series={[
        { name: 'Smartphones', color: 'url(#crosshatch)', stackId: 'a' },
        { name: 'Laptops', color: 'blue.6', stackId: 'b' },
        { name: 'Tablets', color: 'url(#diagonalStripes)', stackId: 'b' },
      ]}
    >
      <defs>
        <pattern
          id="diagonalStripes"
          patternUnits="userSpaceOnUse"
          width={6}
          height={8}
          patternTransform="rotate(45)"
        >
          <rect
            width="2"
            height="8"
            transform="translate(0,0)"
            fill="color-mix(in lch, var(--mantine-color-teal-6) 70%, rgba(0,0,0,0))"
          />
        </pattern>

        <pattern id="crosshatch" patternUnits="userSpaceOnUse" width={8} height={8}>
          <path
            d="M 0 0 L 8 0 L 8 8 L 0 8 Z"
            fill="none"
            stroke="color-mix(in lch, var(--mantine-color-indigo-6) 70%, rgba(0,0,0,0))"
            strokeWidth="1"
          />
          <path
            d="M 0 0 L 8 8"
            stroke="color-mix(in lch, var(--mantine-color-indigo-6) 70%, rgba(0,0,0,0))"
            strokeWidth="1"
          />
          <path
            d="M 8 0 L 0 8"
            stroke="color-mix(in lch, var(--mantine-color-indigo-6) 70%, rgba(0,0,0,0))"
            strokeWidth="1"
          />
        </pattern>
      </defs>
    </BarChart>
  );
}

Help center updates

Other changes

Read more

7.13.5

08 Nov 10:27
Compare
Choose a tag to compare

What's Changed

  • [@mantine/core] Update peer dependencies range for react to allow react and react-dom 19 as dependcy
  • [@mantine/core] Fix error in Next.js with React 19 related to ref prop usage in Tooltip, Popover and Combobox components (#7028)
  • [@mantine/core] FileButton: Fix resetRef throwing error if the component is contidionally rendered (#7025)
  • [@mantine/core] Button: Fix incorrect focus styles of Button.Group (#6992)
  • [@mantine/charts] CompositeCharts: Fix missing key prop error (#7020)
  • [@mantine/core] NumberInput: Fix min/max value being bypassed if 0 has been entered as the first digit (#7021)
  • [@mantine/form] Add useCallback wrapper to form.resetDirty (#7029)
  • [@mantine/core] Combobox: Fix incorrect logic of selected options when the dropdown is closed without selecting value (#7039)
  • [@mantine/charts] BarChart: Add barLabelColor prop support
  • [@mantine/charts] BarChart: Fix bar label being positioned incorrectly with horizontal orientation (#7042)
  • [@mantine/charts] RadarChart: Fix incorrect series prop type (#7046)
  • [@mantine/form] Add additional type exports from the package (#7062)
  • [@mantine/core] Tabs: Fix tabIndex not being overridden by Tabs.Tab props (#7081)
  • [@mantine/dates] DatePickerInput: Fix nextLabel and previousLabel props not being handled correctly (#7082)
  • [@mantine/charts] Update recharts dependency to the latest version to improve Next.js 15 and React 19 support

New Contributors

Full Changelog: 7.13.4...7.13.5

7.13.4

23 Oct 17:00
Compare
Choose a tag to compare

Next.js 15 support

The documentation and templates have been updated to support Next.js 15 release, for more information visit – https://mantine.dev/guides/next/

Other changes

  • [@mantine/dates] DatePickerInput: Fix dropdown staying opened after the disabled prop has been set (#7017)
  • [@mantine/core] NumberInput: Fix incorrect ref node type
  • [@mantine/core] Popover: Fix onClose event firing incorrectly

Full Changelog: 7.13.3...7.13.4

7.13.3

17 Oct 07:48
Compare
Choose a tag to compare

What's Changed

  • [@mantine/core] Fix cqw, cqh, cqi, cqb, cqmax and cqmin size units not being handled correctly in style props
  • [@mantine/dates] DateTimePicker: Remove defaultValue and value props from timeInputProps types to avoid confusion (#6959)
  • [@mantine/dropzone] Set data-disabled attribute on the root element if disabled prop is set (#6946)
  • [@mantine/core] Modal: Fix default Modal.Root transition being different from Modal component (#6967)
  • [@mantine/core] ColorInput: Fix popoverProps={{ opned: true }} not working (#6968)
  • [@mantine/charts] Fix valueFormatter prop not working correctly with orientation="vertical" in BarChart, AreaChart and LineChart components (#6979)
  • [@mantine/core] Popover: Fix onOpen not being called with controlled opened state (#6981)
  • [@mantine/core] NumberInput: Fix incorrect min prop handling for large numbers (#6985)
  • [@mantine/dropzone] Add HEIF image mime type (#6977)
  • [@mantine/core] PasswordInput: Fix cursor shifting when the visibility button is clicked on touch devices (#6971)

New Contributors

Full Changelog: 7.13.2...7.13.3

7.13.2

03 Oct 12:34
Compare
Choose a tag to compare

What's Changed

  • [@mantine/dates] DateInput: Fix onClick handler passed to getDayProps not being called
  • [@mantine/core] Badge: Fix incorrect cursor styles
  • [@mantine/core] FileInput: Add resetRef prop support
  • [@mantine/core] Popover: Fix onClose function being called twice with controlled state
  • [@mantine/spotlight] Fix selected index not being reset when the spotlight is closed (#6842)
  • [@mantine/core] Popover: Improve performance of scrolling when large number of closed Popovers are rendered on the same page (#6771)
  • [@mantine/core] Pagination: Fix getItemProps not being able to override control children prop (#6789)
  • [@mantine/core] ScrollArea: Fix onBottomReached not being called if the viewport has decimal px height value (#6792)
  • [@mantine/hooks] use-in-viewport: Fix hook not reacting to node changes (#6926)
  • [@mantine/core] NumberInput: Fix incorrect handling of decimal numbers with more than 15 decimal places (#6823)
  • [@mantine/core] Slider: Fix marks not being aligned correctly (#6909)
  • [@mantine/hooks] use-fullscreen: Fix target node changes being ignored (#6923)
  • [@mantine/core] Badge: Fix incorrect sections alignment for variant="dot"
  • [@mantine/core] TagsInput: Fix incorrect logic of removing duplicate tags (#6922)
  • [@mantine/core] AppShell: Fix error when Suspense is rendered inside AppShell (#6927)
  • [@mantine/core] Menu: Fix onKeyDown prop not working in Menu.Dropdown component (#6910)

New Contributors

Full Changelog: 7.13.1...7.13.2

7.13.1

30 Sep 07:34
Compare
Choose a tag to compare

What's Changed

  • [@mantine/chart] PieChart: Remove unused CSS (#6903)
  • [@mantine/core] Menu: Fix onKeyDown not working when passed to Menu.Item (#6906)
  • [@mantine/core] TagsInput: Fix duplicated tags being deleted when one of tags with the same value is deleted (#6907)
  • [@mantine/dates] Fix hidden input value not respecting specified timezone (#6881)
  • [@mantine/hooks] use-hover: Fix events not being reattached when the target node changes (#6782)
  • [@mantine/colors-generator] Update chroma-js version to support the latest version (#6879)
  • [@mantine/core] PinInput: Fix incorrect Backspace key handling on the first input (#6880)
  • [@mantine/hooks] use-state-history: Add reset handler support (#6769)
  • [@mantine/core] ScrollArea: Fix onTopReached prop not being passed down in ScrollArea.Autosize component (#6747)
  • [@mantine/chart] Fix incorrect types for props passed down to recharts components (#6820)
  • [@mantine/form] Fix indices over 9 not working in form paths in some cases (#6794)
  • [@mantine/chart] BarChart: Fix BarLabel logging errors in the console (#6810)
  • [@mantine/chart] Fix error when chart tooltip label contains period (#6826)
  • [@mantine/core] Title: Add option to use Text font-size and line-height values with size prop (#6833)
  • [@mantine/date] Calendar: Fix nextLabel and previousLabel props not working (#6847)
  • [@mantine/core] Fix 2xl and other similar values being treated as CSS value instead of theme value (#6855)
  • [@mantine/core] Breadcrumbs: Fix component with large number of values not wrapping on small screens (#6863)
  • [@mantine/core] Table: Fix thead being overlayed to td in some cases (#6860)

New Contributors

Full Changelog: 7.13.0...7.13.1

7.13.0 πŸŽ‡

25 Sep 09:05
Compare
Choose a tag to compare

View changelog with demos on mantine.dev website

Container queries support in Grid

You can now use container queries
in Grid component. With container queries, all responsive values
are adjusted based on the container width, not the viewport width.

Example of using container queries. To see how the grid changes, resize the root element
of the demo with the resize handle located at the bottom right corner of the demo:

import { Grid } from '@mantine/core';

function Demo() {
  return (
    // Wrapper div is added for demonstration purposes only,
    // it is not required in real projects
    <div style={{ resize: 'horizontal', overflow: 'hidden', maxWidth: '100%' }}>
      <Grid
        type="container"
        breakpoints={{ xs: '100px', sm: '200px', md: '300px', lg: '400px', xl: '500px' }}
      >
        <Col span={{ base: 12, md: 6, lg: 3 }}>1</Col>
        <Col span={{ base: 12, md: 6, lg: 3 }}>2</Col>
        <Col span={{ base: 12, md: 6, lg: 3 }}>3</Col>
        <Col span={{ base: 12, md: 6, lg: 3 }}>4</Col>
      </Grid>
    </div>
  );
}

CompositeChart component

New CompositeChart component allows using Line, Area and Bar charts together in a single chart:

import { CompositeChart } from '@mantine/charts';
import { data } from './data';

function Demo() {
  return (
    <CompositeChart
      h={300}
      data={data}
      dataKey="date"
      unit="$"
      maxBarWidth={30}
      series={[
        { name: 'Tomatoes', color: 'rgba(18, 120, 255, 0.2)', type: 'bar' },
        { name: 'Apples', color: 'red.8', type: 'line' },
        { name: 'Oranges', color: 'yellow.8', type: 'area' },
      ]}
    />
  );
}

Points labels

LineChart and AreaChart now support withPointLabels prop to display labels on data points:

import { LineChart } from '@mantine/charts';
import { data } from './data';

function Demo() {
  return (
    <LineChart
      h={300}
      data={data}
      dataKey="date"
      withLegend
      withPointLabels
      series={[
        { name: 'Apples', color: 'indigo.6' },
        { name: 'Oranges', color: 'blue.6' },
      ]}
    />
  );
}

ScatterChart also supports point labels, but also allows to control which axis should display labels with pointLabels prop:

import { ScatterChart } from '@mantine/charts';
import { data } from './data';

function Demo() {
  return (
    <ScatterChart
      h={350}
      data={data}
      dataKey={{ x: 'age', y: 'BMI' }}
      xAxisLabel="Age"
      yAxisLabel="BMI"
      pointLabels="x"
    />
  );
}

BarChart: Mixed stacks

You can now control how BarChart series are stacked by setting stackId property in series object:

import { BarChart } from '@mantine/charts';
import { data } from './data';

function Demo() {
  return (
    <BarChart
      h={300}
      data={data}
      dataKey="month"
      series={[
        { name: 'Smartphones', color: 'violet.6', stackId: 'a' },
        { name: 'Laptops', color: 'blue.6', stackId: 'b' },
        { name: 'Tablets', color: 'teal.6', stackId: 'b' },
      ]}
    />
  );
}

BarChart: Minimum bar size

BarChart now supports minBarSize prop to set the minimum size of the bar in px:

import { BarChart } from '@mantine/charts';
import { data } from './data';

function Demo() {
  return (
    <BarChart
      h={300}
      data={data}
      dataKey="month"
      withLegend
      series={[
        { name: 'Smartphones', color: 'violet.6' },
        { name: 'Laptops', color: 'blue.6' },
        { name: 'Tablets', color: 'teal.6' },
      ]}
    />
  );
}

Help Center updates

Other changes

  • New demo has been added to Chip component with an example of how to deselect radio chip
  • BarChart now supports maxBarWidth prop to set the maximum width of each bar in px

7.12.2

30 Aug 13:32
Compare
Choose a tag to compare

What's Changed

  • [@mantine/hooks] use-idle: Fix idle countdown not starting if the user did non interact with the page (#6683)
  • [@mantine/core] ScrollArea: Fix onBottomReached prop not being available in ScrollArea.Autosize component
  • [@mantine/core] Remove children from Checkbox, Radio and Switch types to avoid accidental errors
  • [@mantine/core] TypographyStylesProvider: Fix incorrect table styles in dark color scheme
  • [@mantine/form] Fix error thrown for nullable values dirty status check (#6672)
  • [@mantine/core] Badge: Fix unexpected change to block layout, fix incorrect alignment when fixed width is set (#6698, #6680)
  • [@mantine/core] ScrollArea: Fix pointer-events being left as none after interaction with scrollbar (#6681)
  • [@mantine/core] Tabs: Fix keepMounted prop being added as attribute to Tabs.Panel DOM element (#6711)
  • [@mantine/core] Tree: Add initialCheckedState support (#6697)
  • [@mantine/spotlight] Fix SpotlightRoot component not being exported (#6710)
  • [@mantine/dropzone] Add 7z and rar mime types exports (#6702)
  • [@mantine/dates] DatePickerInput: Fix incorrect hovered date logic when the component receives value update with partial selected date range (#6718)
  • [@mantine/dates] Fix valueFormatter prop being added to DateTimePicker types
  • [@mantine/core] Badge: Fix right/left sections height affecting the alignment of the label
  • [@mantine/core] Menu: Fix accessibility warning in devtools when the Menu is opened (#6644)

New Contributors

Full Changelog: 7.12.1...7.12.2

7.12.1

12 Aug 12:42
Compare
Choose a tag to compare

What's Changed

  • [@mantine/dates] DateInput: Fix default date being set to the current date when minDate is set to the future (#6646)
  • [@mantine/core] ScrollArea: Fix incorrect thumb::before styles
  • [@mantine/core] Fix incorrect active styles of buttons used inside disabled fieldset
  • [@mantine/form] Fix form.watch callbacks not being fired when form.initialize is called (#6639)
  • [@mantine/core] Switch: Fix Switch shrinking when large label or description is used (#6531)
  • [@mantine/core] Combobox: Fix Combobox.Search overflow when ScrollArea is used in the dropdown (#6562)
  • [@mantine/core] Accordion: Add missing withProps function (#6564)
  • [@mantine/core] Pill: Fix remove icon overflowing pill container if its background color was changed with Styles API (#6565)
  • [@mantine/core] PinInput: Allow passing props to individual input elements depending on index with getInputProps (#6588)
  • [@mantine/charts]: Fix LineChart Legend and Tooltip to support nested names (#6536)
  • [@mantine/core] Tooltip: Add missing Tooltip.Group.extend function (#6576)
  • [@mantine/spotlight] Fix limit prop not working correctly with actions groups (#6632)
  • [@mantine/core] Badge: Fix text overflow not being handled correctly (#6629)
  • [@mantine/core] SegmentedControl: Add data-disabled attribute to the root element to simplify styling with Styles API (#6625)
  • [@mantine/core] SegmentedControl: Fix initial position of indicator being broken when the component is used inside other element that has transitions on mount (#6622)
  • [@mantine/core] TagsInput: Fix onKeyDown prop not working (#6569)
  • [@mantine/charts] PieChart: Fix valueFormatter not working on outside labels (#6616)
  • [@mantine/core] Popover: Fix apply function of size middleware not being handled correctly (#6598)
  • [@mantine/core] Chip: Fix incorrect checked padding for size="xl" (#6586)
  • [@mantine/dates] TimeInput: Fix incorrect focus styles of am/pm input (#6579)
  • [@mantine/hook] use-os: Fix incorrect iPadOS detection (#6535)
  • [@mantine/core] DatePickerInput: Fix incorrect aria-label being set on the input element (#6530)
  • [@mantine/core] Menu: Fix incorrect Escape key handling inside Modal (#6580)

New Contributors

Full Changelog: 7.12.0...7.12.1