(null);
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/dates/time-input) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/dates/src/components/TimeInput)
+
+## Mantine Charts
+
+The `@mantine/charts` package provides charts and data visualization components based on recharts.
+
+### AreaChart
+Display area charts.
+```jsx
+import { AreaChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { month: 'January', value: 400 },
+ { month: 'February', value: 300 },
+ { month: 'March', value: 550 },
+ { month: 'April', value: 600 },
+ { month: 'May', value: 400 },
+ { month: 'June', value: 450 },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/area-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/AreaChart)
+
+### BarChart
+Display bar charts.
+```jsx
+import { BarChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { month: 'January', value: 400 },
+ { month: 'February', value: 300 },
+ { month: 'March', value: 550 },
+ { month: 'April', value: 600 },
+ { month: 'May', value: 400 },
+ { month: 'June', value: 450 },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/bar-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/BarChart)
+
+### LineChart
+Display line charts.
+```jsx
+import { LineChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { month: 'January', value: 400 },
+ { month: 'February', value: 300 },
+ { month: 'March', value: 550 },
+ { month: 'April', value: 600 },
+ { month: 'May', value: 400 },
+ { month: 'June', value: 450 },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/line-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/LineChart)
+
+### DonutChart
+Display donut charts.
+```jsx
+import { DonutChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { name: 'USA', value: 600, color: 'indigo.6' },
+ { name: 'UK', value: 400, color: 'cyan.6' },
+ { name: 'Canada', value: 300, color: 'pink.6' },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/donut-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/DonutChart)
+
+### PieChart
+Display pie charts.
+```jsx
+import { PieChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { name: 'USA', value: 600, color: 'indigo.6' },
+ { name: 'UK', value: 400, color: 'cyan.6' },
+ { name: 'Canada', value: 300, color: 'pink.6' },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/pie-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/PieChart)
+
+### Sparkline
+Display a simple sparkline chart.
+```jsx
+import { Sparkline } from '@mantine/charts';
+
+function Demo() {
+ const data = [10, 20, 40, 20, 40, 10, 50];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/sparkline) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/Sparkline)
+
+### ScatterChart
+Display a scatter chart.
+```jsx
+import { ScatterChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { name: 'Point 1', x: 10, y: 10 },
+ { name: 'Point 2', x: 20, y: 20 },
+ { name: 'Point 3', x: 30, y: 10 },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/scatter-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/ScatterChart)
+
+### BubbleChart
+Display a bubble chart.
+```jsx
+import { BubbleChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { name: 'Point 1', x: 10, y: 10, size: 10 },
+ { name: 'Point 2', x: 20, y: 20, size: 20 },
+ { name: 'Point 3', x: 30, y: 10, size: 15 },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/bubble-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/BubbleChart)
+
+### FunnelChart
+Display a funnel chart.
+```jsx
+import { FunnelChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { name: 'Visited', value: 1000 },
+ { name: 'Registered', value: 800 },
+ { name: 'Purchased', value: 600 },
+ { name: 'Subscribed', value: 400 },
+ { name: 'Renewed', value: 200 },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/funnel-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/FunnelChart)
+
+### RadarChart
+Display a radar chart.
+```jsx
+import { RadarChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { key: 'Group A', metric1: 10, metric2: 20, metric3: 30 },
+ { key: 'Group B', metric1: 20, metric2: 10, metric3: 20 },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/radar-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/RadarChart)
+
+### RadialBarChart
+Display a radial bar chart.
+```jsx
+import { RadialBarChart } from '@mantine/charts';
+
+function Demo() {
+ const data = [
+ { name: 'Metric 1', value: 40 },
+ { name: 'Metric 2', value: 70 },
+ { name: 'Metric 3', value: 30 },
+ { name: 'Metric 4', value: 60 },
+ ];
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/charts/radial-bar-chart) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/charts/src/RadialBarChart)
+
+## Mantine Extensions
+
+### Notifications
+Notifications system for Mantine.
+```jsx
+import { Button } from '@mantine/core';
+import { notifications } from '@mantine/notifications';
+
+function Demo() {
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/x/notifications) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/notifications)
+
+### Spotlight
+Command center/search for your application.
+```jsx
+import { Button } from '@mantine/core';
+import { Spotlight, spotlight } from '@mantine/spotlight';
+import { IconSearch } from '@tabler/icons-react';
+
+function Demo() {
+ const actions = [
+ {
+ id: 'home',
+ label: 'Home',
+ description: 'Get to home page',
+ onClick: () => console.log('Home'),
+ },
+ {
+ id: 'settings',
+ label: 'Settings',
+ description: 'Get to settings page',
+ onClick: () => console.log('Settings'),
+ },
+ ];
+
+ return (
+ <>
+
+
+ }
+ />
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/x/spotlight) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/spotlight)
+
+### CodeHighlight
+Highlight code syntax.
+```jsx
+import { CodeHighlight } from '@mantine/code-highlight';
+
+function Demo() {
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/x/code-highlight) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/code-highlight)
+
+### Carousel
+Image/content carousel based on Embla.
+```jsx
+import { Carousel } from '@mantine/carousel';
+
+function Demo() {
+ return (
+
+ 1
+ 2
+ 3
+
+ );
+}
+```
+[Documentation](https://mantine.dev/x/carousel) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/carousel)
+
+### Dropzone
+Capture files from user with drag and drop.
+```jsx
+import { Dropzone } from '@mantine/dropzone';
+
+function Demo() {
+ return (
+ console.log('Accepted files', files)}>
+ Drag files here or click to select files
+
+ );
+}
+```
+[Documentation](https://mantine.dev/x/dropzone) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/dropzone)
+
+### Modals Manager
+Manage modals state centrally.
+```jsx
+import { Button } from '@mantine/core';
+import { modals } from '@mantine/modals';
+
+function Demo() {
+ const openConfirmModal = () => modals.openConfirmModal({
+ title: 'Please confirm your action',
+ children: 'This action is so important that you need to confirm it.',
+ labels: { confirm: 'Confirm', cancel: 'Cancel' },
+ onConfirm: () => console.log('Confirmed'),
+ });
+
+ return ;
+}
+```
+[Documentation](https://mantine.dev/x/modals) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/modals)
+
+### Rich Text Editor
+Rich text editor based on Tiptap.
+```jsx
+import { RichTextEditor, Link } from '@mantine/tiptap';
+import { useEditor } from '@tiptap/react';
+import StarterKit from '@tiptap/starter-kit';
+
+function Demo() {
+ const editor = useEditor({
+ extensions: [
+ StarterKit,
+ Link,
+ ],
+ content: 'Rich text editor content
',
+ });
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+```
+[Documentation](https://mantine.dev/x/tiptap) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/tiptap)
+
+### NProgress
+Navigation progress component.
+```jsx
+import { NavigationProgress, nprogress } from '@mantine/nprogress';
+
+function Demo() {
+ return (
+ <>
+
+
+
+
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/x/nprogress) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/nprogress)
+
+## Mantine UI
+
+Mantine UI is a collection of more than 120 responsive components built with Mantine.
+
+[Mantine UI Website](https://ui.mantine.dev) | [GitHub](https://github.com/mantinedev/ui.mantine.dev)
+
+### Application UI Components
+
+Mantine UI provides ready-to-use application UI components such as:
+- Navbars (9 components)
+- Headers (6 components)
+- Footers (4 components)
+- Grids (3 components)
+- User info and controls (8 components)
+- Inputs (14 components)
+- Buttons (6 components)
+- Sliders (6 components)
+- Application cards (7 components)
+- Stats (9 components)
+- Tables (4 components)
+- And more...
+
+### Page Sections
+
+Components for building page sections:
+- Hero headers (6 components)
+- Features section (5 components)
+- Authentication (4 components)
+- FAQ sections (4 components)
+- Contact sections (3 components)
+- Error pages (5 components)
+- Banners (3 components)
+
+### Blog UI
+
+Blog-related components:
+- Article cards (7 components)
+- Table of contents (2 components)
+- Comments (2 components)
+
+## Best Practices
+
+1. **Use MantineProvider at the root level** to set up your theme and provide it to all components
+2. **Follow the component documentation** for understanding available props and customization options
+3. **Utilize the style props system** for one-off styling needs
+4. **Use CSS modules or style API** for more complex styling scenarios
+5. **Rely on the existing color system** before creating custom colors
+6. **Make your application responsive** by using Mantine's responsive props API
+7. **Use Mantine hooks** to handle common UI patterns and state management
+8. **Combine with Mantine Form** for complex form state management
+9. **Use Typescript** to get the best development experience and type safety
+10. **Check the documentation** for the latest updates and API changes
+
+## Mantine Hooks
+
+The `@mantine/hooks` package provides utility hooks for common UI patterns.
+
+### UI and DOM Hooks
+
+#### useClickOutside
+Detects clicks outside of a specified element.
+```jsx
+import { useClickOutside } from '@mantine/hooks';
+
+function Demo() {
+ const ref = useClickOutside(() => console.log('Clicked outside'));
+ return This element will detect outside clicks
;
+}
+```
+[Documentation](https://mantine.dev/hooks/use-click-outside) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-click-outside/use-click-outside.ts)
+
+#### useColorScheme
+Gets user's preferred color scheme using `window.matchMedia`.
+```jsx
+import { useColorScheme } from '@mantine/hooks';
+
+function Demo() {
+ const colorScheme = useColorScheme();
+ return Preferred color scheme: {colorScheme}
;
+}
+```
+[Documentation](https://mantine.dev/hooks/use-color-scheme) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-color-scheme/use-color-scheme.ts)
+
+#### useElementSize
+Gets element width and height.
+```jsx
+import { useElementSize } from '@mantine/hooks';
+
+function Demo() {
+ const { ref, width, height } = useElementSize();
+ return Width: {width}, height: {height}
;
+}
+```
+[Documentation](https://mantine.dev/hooks/use-element-size) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-element-size/use-element-size.ts)
+
+#### useEventListener
+Adds an event listener to the specified element.
+```jsx
+import { useEventListener } from '@mantine/hooks';
+
+function Demo() {
+ const ref = useEventListener('keydown', (event) => console.log(event.key));
+ return Press any key when this element is focused
;
+}
+```
+[Documentation](https://mantine.dev/hooks/use-event-listener) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-event-listener/use-event-listener.ts)
+
+#### useFileDialog
+Opens browser file dialog.
+```jsx
+import { useFileDialog } from '@mantine/hooks';
+import { Button } from '@mantine/core';
+
+function Demo() {
+ const { open, files } = useFileDialog();
+ return (
+ <>
+
+ {files && Selected {files.length} files
}
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-file-dialog) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-file-dialog/use-file-dialog.ts)
+
+#### useFocusTrap
+Traps focus inside given node.
+```jsx
+import { useFocusTrap } from '@mantine/hooks';
+import { useState } from 'react';
+
+function Demo() {
+ const [active, setActive] = useState(false);
+ const focusTrapRef = useFocusTrap(active);
+
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-focus-trap) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-focus-trap/use-focus-trap.ts)
+
+#### useHotkeys
+Listens for keyboard shortcuts.
+```jsx
+import { useHotkeys } from '@mantine/hooks';
+
+function Demo() {
+ useHotkeys([
+ ['mod+J', () => console.log('Pressed mod+J')],
+ ['mod+K', () => console.log('Pressed mod+K')],
+ ['alt+mod+Digit1', () => console.log('Pressed alt+mod+1')],
+ ]);
+
+ return Press mod+J, mod+K or alt+mod+1
;
+}
+```
+[Documentation](https://mantine.dev/hooks/use-hotkeys) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-hotkeys/use-hotkeys.ts)
+
+#### useHover
+Detects if mouse is hovering over an element.
+```jsx
+import { useHover } from '@mantine/hooks';
+
+function Demo() {
+ const { hovered, ref } = useHover();
+ return Element is {hovered ? 'hovered' : 'not hovered'}
;
+}
+```
+[Documentation](https://mantine.dev/hooks/use-hover) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-hover/use-hover.ts)
+
+#### useIntersection
+Wrapper for Intersection Observer API.
+```jsx
+import { useIntersection } from '@mantine/hooks';
+
+function Demo() {
+ const { ref, entry } = useIntersection({ threshold: 0.5 });
+ return (
+
+ Element is {entry?.isIntersecting ? 'visible' : 'not visible'} in viewport
+
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-intersection) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-intersection/use-intersection.ts)
+
+#### useMediaQuery
+Subscribes to media queries with `window.matchMedia`.
+```jsx
+import { useMediaQuery } from '@mantine/hooks';
+
+function Demo() {
+ const matches = useMediaQuery('(min-width: 900px)');
+ return Viewport is {matches ? 'larger' : 'smaller'} than 900px
;
+}
+```
+[Documentation](https://mantine.dev/hooks/use-media-query) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-media-query/use-media-query.ts)
+
+### State Management Hooks
+
+#### useCounter
+Manages a numeric state.
+```jsx
+import { useCounter } from '@mantine/hooks';
+import { Button, Group, Text } from '@mantine/core';
+
+function Demo() {
+ const [count, { increment, decrement, reset }] = useCounter(0, { min: 0, max: 10 });
+
+ return (
+ <>
+ Count: {count}
+
+
+
+
+
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-counter) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-counter/use-counter.ts)
+
+#### useDebouncedState
+Creates a state that only updates after the specified delay.
+```jsx
+import { useDebouncedState } from '@mantine/hooks';
+import { TextInput } from '@mantine/core';
+
+function Demo() {
+ const [value, setValue] = useDebouncedState('', 200);
+
+ return (
+ <>
+ setValue(event.currentTarget.value)}
+ />
+ Current value: {value}
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-debounced-state) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-debounced-state/use-debounced-state.ts)
+
+#### useDebouncedValue
+Debounces a value change with useEffect.
+```jsx
+import { useDebouncedValue } from '@mantine/hooks';
+import { TextInput } from '@mantine/core';
+import { useState } from 'react';
+
+function Demo() {
+ const [value, setValue] = useState('');
+ const [debounced] = useDebouncedValue(value, 200);
+
+ return (
+ <>
+ setValue(event.currentTarget.value)}
+ />
+ Current value: {value}
+ Debounced value: {debounced}
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-debounced-value) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-debounced-value/use-debounced-value.ts)
+
+#### useDisclosure
+Manages boolean open/close state.
+```jsx
+import { useDisclosure } from '@mantine/hooks';
+import { Button, Modal } from '@mantine/core';
+
+function Demo() {
+ const [opened, { open, close, toggle }] = useDisclosure(false);
+
+ return (
+ <>
+
+
+
+
+ Modal content
+
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-disclosure) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-disclosure/use-disclosure.ts)
+
+#### useInputState
+Creates a controlled input state.
+```jsx
+import { useInputState } from '@mantine/hooks';
+import { TextInput } from '@mantine/core';
+
+function Demo() {
+ const [value, setValue] = useInputState('');
+
+ return (
+ <>
+
+ Current value: {value}
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-input-state) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-input-state/use-input-state.ts)
+
+#### useListState
+Manages array state with various operations.
+```jsx
+import { useListState } from '@mantine/hooks';
+import { Button, Group, Stack, TextInput } from '@mantine/core';
+import { useState } from 'react';
+
+function Demo() {
+ const [list, handlers] = useListState([
+ { name: 'John', email: 'john@example.com' },
+ { name: 'Jane', email: 'jane@example.com' },
+ ]);
+
+ const [name, setName] = useState('');
+ const [email, setEmail] = useState('');
+
+ const addItem = () => {
+ handlers.append({ name, email });
+ setName('');
+ setEmail('');
+ };
+
+ return (
+
+
+ {list.map((item, index) => (
+
+ {item.name} ({item.email})
+
+
+ ))}
+
+
+
+ setName(event.currentTarget.value)}
+ />
+ setEmail(event.currentTarget.value)}
+ />
+
+
+
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-list-state) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-list-state/use-list-state.ts)
+
+#### useLocalStorage
+Uses localStorage value as React state.
+```jsx
+import { useLocalStorage } from '@mantine/hooks';
+import { Switch, Text } from '@mantine/core';
+
+function Demo() {
+ const [colorScheme, setColorScheme] = useLocalStorage({
+ key: 'color-scheme',
+ defaultValue: 'light',
+ });
+
+ return (
+ <>
+ setColorScheme(event.currentTarget.checked ? 'dark' : 'light')}
+ />
+ Current color scheme: {colorScheme}
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-local-storage) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-local-storage/use-local-storage.ts)
+
+### Utility Hooks
+
+#### useClipboard
+Provides interface to work with clipboard.
+```jsx
+import { useClipboard } from '@mantine/hooks';
+import { Button, TextInput, Group } from '@mantine/core';
+import { useState } from 'react';
+
+function Demo() {
+ const clipboard = useClipboard({ timeout: 500 });
+ const [value, setValue] = useState('');
+
+ return (
+
+ setValue(event.currentTarget.value)}
+ placeholder="Enter text to copy"
+ />
+
+
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-clipboard) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-clipboard/use-clipboard.ts)
+
+#### useId
+Generates a random id for form controls binding.
+```jsx
+import { useId } from '@mantine/hooks';
+import { TextInput } from '@mantine/core';
+
+function Demo() {
+ const id = useId();
+ return (
+ <>
+
+
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-id) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-id/use-id.ts)
+
+#### useIdle
+Detects if user is idle.
+```jsx
+import { useIdle } from '@mantine/hooks';
+
+function Demo() {
+ const idle = useIdle(2000);
+ return User is {idle ? 'idle' : 'active'}
;
+}
+```
+[Documentation](https://mantine.dev/hooks/use-idle) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-idle/use-idle.ts)
+
+#### useInterval
+Wrapper around window.setInterval.
+```jsx
+import { useInterval } from '@mantine/hooks';
+import { Button, Text } from '@mantine/core';
+import { useState } from 'react';
+
+function Demo() {
+ const [count, setCount] = useState(0);
+ const interval = useInterval(() => setCount((c) => c + 1), 1000);
+
+ return (
+ <>
+ Count: {count}
+
+ >
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-interval) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-interval/use-interval.ts)
+
+#### useLogger
+Console.log values when component renders, mounts and unmounts.
+```jsx
+import { useLogger } from '@mantine/hooks';
+import { useState } from 'react';
+import { Button } from '@mantine/core';
+
+function Demo() {
+ const [count, setCount] = useState(0);
+ useLogger('Demo component', [count]);
+
+ return (
+
+ );
+}
+```
+[Documentation](https://mantine.dev/hooks/use-logger) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/hooks/src/use-logger/use-logger.ts)
+
+## Mantine Theming
+
+Mantine provides a powerful theming system that allows you to customize the appearance of all components.
+
+### MantineProvider
+
+The `MantineProvider` component is used to configure the theme for all components within its subtree.
+
+```jsx
+import { MantineProvider, Button } from '@mantine/core';
+
+function Demo() {
+ return (
+
+
+
+ );
+}
+```
+[Documentation](https://mantine.dev/theming/mantine-provider) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/core/src/MantineProvider)
+
+### Theme Object
+
+The theme object contains all customizable properties:
+
+```jsx
+const theme = {
+ // Base colors used to generate color schemes
+ colors: { /* Custom colors */ },
+
+ // Color scheme, 'light', 'dark' or 'auto'
+ colorScheme: 'light',
+
+ // Primary color used in all components
+ primaryColor: 'blue',
+
+ // Primary shade, used to determine which shade of primary color will be used
+ primaryShade: { light: 6, dark: 8 },
+
+ // Font sizes in px, used for text, titles, etc.
+ fontSizes: {
+ xs: 12,
+ sm: 14,
+ md: 16,
+ lg: 18,
+ xl: 20,
+ },
+
+ // Spacing used to generate margins and paddings
+ spacing: {
+ xs: 10,
+ sm: 12,
+ md: 16,
+ lg: 20,
+ xl: 24,
+ },
+
+ // Radius used in components like Button, Card, etc.
+ radius: {
+ xs: 2,
+ sm: 4,
+ md: 8,
+ lg: 16,
+ xl: 32,
+ },
+
+ // Font families
+ fontFamily: 'Roboto, sans-serif',
+ headings: {
+ fontFamily: 'Roboto, sans-serif',
+ sizes: {
+ h1: { fontSize: 36, lineHeight: 1.4 },
+ h2: { fontSize: 30, lineHeight: 1.4 },
+ // ...h3 through h6
+ },
+ },
+
+ // Size scales used to determine component sizes
+ breakpoints: {
+ xs: 576,
+ sm: 768,
+ md: 992,
+ lg: 1200,
+ xl: 1400,
+ },
+
+ // Default props and styles for components
+ components: {
+ Button: {
+ defaultProps: { size: 'sm' },
+ styles: (theme) => ({
+ root: { fontWeight: 500 },
+ }),
+ },
+ // ...other components
+ },
+
+ // Other theme options
+ cursorType: 'pointer',
+ defaultGradient: { from: 'blue', to: 'cyan', deg: 45 },
+ defaultRadius: 'sm',
+ focusRingStyles: { styles: { opacity: 0.5 } },
+ loader: 'oval',
+ respectReducedMotion: true,
+ activeClassName: 'active-class',
+ datesLocale: 'en',
+ dir: 'ltr',
+ // ...more options
+};
+```
+[Documentation](https://mantine.dev/theming/theme-object) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/core/src/MantineProvider/theme.types.ts)
+
+### CSS Variables
+
+Mantine uses CSS variables for theming. You can access them in your styles:
+
+```css
+/* Accessing Mantine CSS variables */
+.my-class {
+ color: var(--mantine-color-blue-6);
+ background-color: var(--mantine-color-gray-0);
+ font-size: var(--mantine-font-size-md);
+ padding: var(--mantine-spacing-md);
+}
+```
+
+### Styling Components
+
+#### Using `styles` prop
+
+The `styles` prop allows you to override component styles:
+
+```jsx
+import { Button } from '@mantine/core';
+
+function Demo() {
+ return (
+
+ );
+}
+```
+
+#### Using `className` prop
+
+You can also use the `className` prop to style components with external CSS:
+
+```jsx
+import { Button } from '@mantine/core';
+import classes from './Button.module.css';
+
+function Demo() {
+ return (
+
+ );
+}
+```
+
+#### Selectors API
+
+Mantine components export selectors that can be used for styling:
+
+```jsx
+import { Button, createStyles } from '@mantine/core';
+
+// Access component selectors
+const useStyles = createStyles((theme) => ({
+ buttonWrapper: {
+ [`& .${Button.classes.root}`]: {
+ backgroundColor: theme.colors.pink[5],
+ },
+
+ [`& .${Button.classes.label}`]: {
+ fontSize: 18,
+ },
+ },
+}));
+
+function Demo() {
+ const { classes } = useStyles();
+ return (
+
+
+
+ );
+}
+```
+
+### Color Management
+
+#### Color Schemes
+
+Mantine supports light and dark color schemes:
+
+```jsx
+import { MantineProvider, Button, useMantineColorScheme } from '@mantine/core';
+
+function ThemeToggle() {
+ const { colorScheme, toggleColorScheme } = useMantineColorScheme();
+
+ return (
+
+ );
+}
+
+function App() {
+ return (
+
+
+
+ );
+}
+```
+
+#### Custom Colors
+
+You can define custom colors in the theme:
+
+```jsx
+import { MantineProvider, Button } from '@mantine/core';
+
+const myCustomColors = {
+ brand: [
+ '#F0BBDD', '#ED9BCF', '#EC7CC3', '#ED5DB8',
+ '#F13EAF', '#F71FA7', '#FF00A1', '#E00890',
+ '#C50E82', '#AD1374'
+ ],
+};
+
+function App() {
+ return (
+
+
+
+ );
+}
+```
+
+### Responsive Styles
+
+Mantine provides utilities for responsive styling:
+
+```jsx
+import { createStyles } from '@mantine/core';
+
+const useStyles = createStyles((theme) => ({
+ responsiveBox: {
+ backgroundColor: theme.colors.blue[5],
+
+ // Media queries using Mantine breakpoints
+ [`@media (max-width: ${theme.breakpoints.sm}px)`]: {
+ backgroundColor: theme.colors.pink[5],
+ },
+
+ // Or use the media function
+ [theme.fn.smallerThan('md')]: {
+ fontSize: theme.fontSizes.sm,
+ },
+
+ [theme.fn.largerThan('lg')]: {
+ padding: theme.spacing.xl,
+ },
+ },
+}));
+```
+
+### Global Styles
+
+You can define global styles with the `globalStyles` api:
+
+```jsx
+import { MantineProvider } from '@mantine/core';
+
+function Demo() {
+ return (
+ ({
+ '*, *::before, *::after': {
+ boxSizing: 'border-box',
+ },
+
+ body: {
+ ...theme.fn.fontStyles(),
+ backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.white,
+ color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.black,
+ lineHeight: theme.lineHeight,
+ },
+
+ 'a': {
+ color: theme.colors[theme.primaryColor][theme.colorScheme === 'dark' ? 4 : 7],
+ textDecoration: 'none',
+
+ '&:hover': {
+ textDecoration: 'underline',
+ },
+ },
+ }),
+ }}
+ >
+ {/* Your app */}
+
+ );
+}
+```
+[Documentation](https://mantine.dev/styles/global-styles) | [Source](https://github.com/mantinedev/mantine/tree/master/packages/@mantine/core/src/MantineProvider)
\ No newline at end of file