diff --git a/changelog/7.1.0.md b/changelog/7.1.0.md new file mode 100644 index 00000000000..707b7228862 --- /dev/null +++ b/changelog/7.1.0.md @@ -0,0 +1,142 @@ +## CSS layers + +Starting from 7.1.0 it is possible to import all `@mantine/*` packages styles with rules +defined in `mantine` [CSS layer](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer). +CSS rules within a layer are grouped together and applied before rules without a layer. This means that +even if you do not have control over styles import order, you can still override Mantine styles with +regular styles. + +```tsx +// If your styles are not wrapped in @layer directive, +// they will be applied after Mantine styles. +// Import order does not affect styles in this case +import classes from './Demo.module.css'; +import '@mantine/core/styles.layer.css'; +``` + +You can import styles within a layer by importing `@mantine/*/styles.layer.css` files. +Note that these files are a full replacement for `@mantine/*/styles.css` files – +you should not import both of them. + +```tsx +import '@mantine/core/styles.layer.css'; +import '@mantine/dates/styles.layer.css'; +// ... other styles +``` + +CSS layers are also useful if you want to combine Mantine components with other libraries which also +provide styles. You can use `@layer` directive to control the order of styles: + +```scss +@layer base, mantine, components; +``` + +In this example, Mantine styles will take precedence over other library `base` styles, but other library +`components` styles will take precedence over Mantine component styles. + +As of September 2023, CSS layers are supported in all modern browsers and have [90% browser support](https://caniuse.com/css-cascade-layers). + +## renderRoot prop + +All [polymorphic](https://mantine.dev/guides/polymorphic) components now support `renderRoot` prop, which +is an alternative to `component` prop. `renderRoot` prop allows changing the root element +to any other component or HTML tag with a callback function. It can be used in cases when +`component` prop is not flexible enough: + +- Target component props are incompatible with Mantine component. For example, [Button](https://mantine.dev/core/button) component expects `className` + to be a string, but [react-router-dom NavLink](https://reactrouter.com/en/6.16.0/components/nav-link) expects + `className` to be a function. +- Target component is a generic – it either accepts type as a parameter or its type changes depending + on its props. Examples: [typed Next.js Link](https://nextjs.org/docs/app/building-your-application/configuring/typescript#statically-typed-links), [TanStack router Link](https://tanstack.com/router/v1) + +`renderRoot` example with [react-router-dom NavLink](https://reactrouter.com/en/6.16.0/components/nav-link): + +```tsx +import cx from 'clsx'; +import { Button } from '@mantine/core'; +import { NavLink } from 'react-router-dom'; + +function Demo() { + return ( + + ); +} +``` + +`renderRoot` example with [typed Next.js Link](https://nextjs.org/docs/app/building-your-application/configuring/typescript#statically-typed-links): + +```tsx +import Link from 'next/link'; +import { Button } from '@mantine/core'; + +function Demo() { + return ( + + ); +} +``` + +## Improved ESM support + +All `@mantine/*` packages now have improved ESM support: + +- Files in `esm` folder now have `.mjs` extension +- You can use `@mantine/*` packages with `type: module` in `package.json` without any additional configuration +- All packages are now fully compatible with [Remix v2](https://remix.run/blog/remix-v2) +- Tree shaking was improved for some bundlers + +## CSS variables in style prop + +It is now possible to define CSS variables in `style` prop in all Mantine components – +[style](https://mantine.dev/styles/style) prop is no longer restricted by `React.CSSProperties` type: + +```tsx +import { Box } from '@mantine/core'; + +function Demo() { + return ; +} +``` + +## form.setInitialValues + +[@mantine/form](https://mantine.dev/form/values/#setinitialvalues-handler) now supports `form.setInitialValues` method +which allows updating initial values after the form was initialized. This method is useful when you +want to update values that are used in `form.reset` and to compare values for dirty fields state: + +```tsx +import { useEffect } from 'react'; +import { useForm } from '@mantine/form'; + +function Demo() { + const form = useForm({ + initialValues: { + name: '', + email: '', + }, + }); + + useEffect(() => { + fetch('/api/user') + .then((res) => res.json()) + .then((data) => { + // Update initial values after form was initialized + // These values will be used in form.reset + // and to compare values to get dirty state + form.setInitialValues(data); + form.setValues(data); + }); + }, []); +} +```