GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Mantine UI
  • FAQ
  • Colors generator
  • use-move
  • use-resize-observer
  • use-hotkeys
  • use-eye-dropper
  • View example code

This view

  • Original page
  • New address

GeezerVison is showing mantine.dev — Mantine

A fully featured React
components library

Build fully functional accessible web applications faster than ever – Mantine includes more than 120 customizable components and 70 hooks to cover you in any situation

Get StartedGitHub

Sponsored by

MetabaseMetabasePropelAuthPropelAuthMedplumMedplumN-iX LtdN-iX LtdFollowerhitFollowerhitYou? ❤️
Sponsor Mantine to get featured here and support the project.

Built for the AI-assisted workflow

LLM-optimized docs, agent skills for complex tasks, and an MCP server for direct API access — Mantine is designed to work with Cursor, Claude Code, Windsurf, and every AI coding tool you already use.

Learn more about LLM integrations

LLM documentation

llms.txt and llms-full.txt files follow the LLMs.txt standard – use them with Cursor, Windsurf, ChatGPT, Claude, and other AI tools

Skills for AI agents

Install Mantine skills for complex tasks like building forms, custom components, and combobox-based inputs

MCP server

Use @mantine/mcp-server to give AI agents direct access to component docs, props, and search across the entire library

Always up to date

LLM documentation is regenerated with every release – AI tools always have access to the latest API and examples

# Reference Mantine docs in Cursor
@Docs https://mantine.dev/llms.txt

# Or download full documentation
curl -o mantine-docs.txt https://mantine.dev/llms-full.txt

# Use with ChatGPT/Claude
"Using Mantine, how do I create a dark mode toggle?
Reference: https://mantine.dev/llms.txt"

120+ components

Build your next app faster with high-quality, well-tested components. Mantine includes everything you need to create complex web applications with ease: custom select, date pickers, notifications, modals, and more.

Text input
Number input
Date range picker
Color input
Tree select
File input
Select
Multiselect
ReactVue
Pin input

Hooks library

70+ hooks for handling tricky and common parts of your application

Browse all hooks
30
70
import { useState } from 'react';
import { DotsSixVerticalIcon } from '@phosphor-icons/react';
import { clamp, useMove } from '@mantine/hooks';
import classes from './Demo.module.css';

function Demo() {
  const [value, setValue] = useState(0.3);
  const { ref } = useMove(({ x }) => setValue(clamp(x, 0.1, 0.9)));
  const labelFloating = value < 0.2 || value > 0.8;

  return (
    <div className={classes.root}>
      <div className={classes.track} ref={ref}>
        <div
          className={classes.filled}
          style={{
            width: `calc(${value * 100}% - var(--thumb-width) / 2 - var(--thumb-offset) / 2)`,
          }}
        >
          <span className={classes.label} data-floating={labelFloating || undefined} data-filled>
            {(value * 100).toFixed(0)}
          </span>
        </div>

        <div
          className={classes.empty}
          style={{
            width: `calc(${(1 - value) * 100}% - var(--thumb-width) / 2 - var(--thumb-offset) / 2)`,
          }}
        >
          <span className={classes.label} data-floating={labelFloating || undefined}>
            {((1 - value) * 100).toFixed(0)}
          </span>
        </div>

        <div
          className={classes.thumb}
          style={{ left: `calc(${value * 100}% - var(--thumb-width) / 2)` }}
        >
          <DotsSixVerticalIcon />
        </div>
      </div>
    </div>
  );
}
Resize me!
Resize element by dragging its right bottom corner
PropertyValue
width0
height0
import { Group, Table } from '@mantine/core';
import { useResizeObserver } from '@mantine/hooks';

function Demo() {
  const [ref, rect] = useResizeObserver();

  return (
    <div className={classes.root}>
      <Group justify="center">
        <div ref={ref} className={classes.demo}>
          Resize me!
        </div>
      </Group>

      <Table
        captionSide="top"
        data={{
          caption: 'Resize element by dragging its right bottom corner',
          head: ['Property', 'Value'],
          body: [
            ['width', rect.width],
            ['height', rect.height],
          ],
        }}
      />
    </div>
  );
}
Ctrl
+
K
– Open search
Ctrl
+
J
– Toggle color scheme
import { useHotkeys } from '@mantine/hooks';
import { spotlight } from '@mantine/spotlight';
import { useMantineColorScheme } from '@mantine/core';
import { Shortcut } from './Shortcut';

function Demo() {
  const { toggleColorScheme } = useMantineColorScheme();

  useHotkeys([
    ['mod + K', () => spotlight.open()],
    ['mod + J', () => toggleColorScheme()],
    ['mod + shift + alt + X', () => secret()],
  ]);

  return (
    <>
      <Shortcut symbol="K" description="Open search" />
      <Shortcut symbol="J" description="Toggle color scheme" />
    </>
  );
}

EyeDropper API is not supported in your browser

import { useState } from 'react';
import { ActionIcon, Group, ColorSwatch, Text } from '@mantine/core';
import { CrosshairIcon } from '@phosphor-icons/react';
import { useEyeDropper } from '@mantine/hooks';

function Demo() {
  const [color, setColor] = useState('');
  const [error, setError] = useState<Error | null>(null);
  const { supported, open } = useEyeDropper();

  const pickColor = async () => {
    try {
      const { sRGBHex } = (await open())!;
      setColor(sRGBHex);
    } catch (e) {
      setError(e as Error);
    }
  };

  if (!supported) {
    return <Text ta="center">EyeDropper API is not supported in your browser</Text>;
  }

  return (
    <Group>
      <ActionIcon variant="default" onClick={pickColor} size="xl">
        <CrosshairIcon size={28} />
      </ActionIcon>
      {color ? (
        <Group gap="xs">
          <ColorSwatch color={color} />
          <Text>Picked color: {color}</Text>
        </Group>
      ) : (
        <Text>Click the button to pick color</Text>
      )}
      {error && <Text c="red">Error: {error?.message}</Text>}
    </Group>
  );
}

Flexible styling

Mantine components are built with native CSS – styles are performant and easy to override

Learn more about styles

Built with CSS

Mantine styles are exposed as .css files – styles are performant and do not have any runtime overhead

Override anything

All Mantine components support Styles API which allows to override any part of component styles with inline styles of classes

PostCSS preset

postcss-preset-mantine includes mixins and functions to apply dark/light, rtl and responsive styles

Compatible with any styling solution

You can bring your own library to style Mantine components (Emotion, Vanilla Extract, Sass, etc.) – you are not limited to any specific tool

.root {
  border-top-left-radius: var(--mantine-radius-xl);
  border-bottom-left-radius: var(--mantine-radius-xl);
  padding-left: 4px;

  /* The following styles will be applied only when button is disabled */
  &[data-disabled] {
    /* You can use Mantine PostCSS mixins inside data attributes */
    @mixin light {
      border: 1px solid var(--mantine-color-gray-2);
    }

    @mixin dark {
      border: 1px solid var(--mantine-color-dark-4);
    }

    /* You can target child elements that are inside .root[data-disabled] */
    & .section[data-position='left'] {
      opacity: 0.6;
    }
  }
}

.section {
  /* Apply styles only to left section */
  &[data-position='left'] {
    --section-size: calc(var(--button-height) - 8px);

    background-color: var(--mantine-color-body);
    color: var(--mantine-color-text);
    height: var(--section-size);
    width: var(--section-size);
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--mantine-radius-xl);
  }

  &[data-position='right'] {
    @mixin rtl {
      transform: rotate(180deg);
    }
  }
}

Dark color scheme

Add dark theme to your application with just a few lines of code – Mantine exports global styles both for light and dark theme, all components support dark theme out of the box.

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

function Demo() {
  return (
    <MantineProvider defaultColorScheme="dark">
      <App />
    </MantineProvider>
  );
}

Combobox component

Combobox is a composable component which can be used to create custom select, multiselect, autocomplete, tags input and other similar components. It provides a lot of flexibility and gives you full control over the UI and behavior while keeping your codebase clean and simple.

Explore all 50+ Combobox examples
Pick value or type anything

🍎 Apples

🍌 Bananas

🥦 Broccoli

🥕 Carrots

🍫 Chocolate

🍇 Grapes

Pick one or more values
You can select up to 2 items, currently selected: 0
🍎 Apples
🍌 Bananas
🥦 Broccoli
🥕 Carrots
🍫 Chocolate
🍎 Apples
🍌 Bananas
🥦 Broccoli
🥕 Carrots
🍫 Chocolate
🍎 Apples
🍌 Bananas
🥦 Broccoli
🥕 Carrots
🍫 Chocolate
🍇 Grapes

🍎

Apples

Crisp and refreshing fruit

🍌

Bananas

Naturally sweet and potassium-rich fruit

🥦

Broccoli

Nutrient-packed green vegetable

🥕

Carrots

Crunchy and vitamin-rich root vegetable

🍫

Chocolate

Indulgent and decadent treat

🍎 Apples
🍌 Bananas
🍓 Strawberries
🥦 Broccoli
🥕 Carrots
🥬 Lettuce

Extensions

Extensions are additional packages that provide extra functionality to Mantine, such as rich text editor, notifications system, charts, modals manager and more. They are built to be easily integrated into your application and provide a seamless experience.

Browse all extensions

Form library

@mantine/form – performant form library designed for Mantine components. Works out of the box with all Mantine inputs.

Explore all form features

Seamless integration

useForm hook works out of the box with all Mantine inputs

Excellent performance

useForm rerenders only for validation and status changes, usually only 2-3 times per form lifecycle

Lightweight

6.3kb minified + gzipped, no dependencies except React

Fully featured

useForm supports lists and nested objects, multiple validation approaches (including schema based with zod) and an easy way to manage subscriptions to values updates

import { Button, Checkbox, Group, TextInput } from '@mantine/core';
import { useForm } from '@mantine/form';

function Demo() {
  const form = useForm({
    mode: 'uncontrolled',
    initialValues: {
      email: '',
      termsOfService: false,
    },

    validate: {
      email: (value) => (/^\S+@\S+$/.test(value) ? null : 'Invalid email'),
    },
  });

  return (
    <form onSubmit={form.onSubmit((values) => console.log(values))}>
      <TextInput
        withAsterisk
        label="Email"
        placeholder="[email protected]"
        key={form.key('email')}
        {...form.getInputProps('email')}
      />

      <Checkbox
        mt="md"
        label="I agree to sell my privacy"
        key={form.key('termsOfService')}
        {...form.getInputProps('termsOfService', { type: 'checkbox' })}
      />

      <Group justify="flex-end" mt="md">
        <Button type="submit">Submit</Button>
      </Group>
    </form>
  );
}

Build even faster with Mantine UI

120+ responsive components
built with Mantine

Build your next website even faster with premade responsive components designed and built by Mantine maintainers and community. All components are free forever for everyone.

Explore components

Trusted by thousands of developers

30,000+ GitHub stars, 5M+ monthly downloads, 500+ contributors. Mantine is built in the open and shaped by the developers who use it every day.

View all reviews from the community

30,000+

Stars on GitHub

5M+

Monthly downloads

12,000+

Discord members

smsuraj100
@smsuraj100
Open on GitHub
One of the best UI libraries I've come across.

I am a senior Frontend Developer and wanted to use something new instead of Material UI and came across this, it has been well thought of all the different scenarios you and come across, and the hooks are just pure love :)

Thank you so much for this.

sideral
@sideral
Open on GitHub
You nailed it!

Man, I've been doing Front-End for 20 years. This is, hands-down, the best component library I've ever used. What's more, the parts that I didn't like (Styling from JS Objects, slow with big forms) have been addressed in v7. Please keep it up, this library deserves more exposure, it just works and works well and beautifully. Many thanks to @rtivital and the contributors!

leighton-carr
@leighton-carr
Open on GitHub
Absurdly good

Hope this kind of post is ok - just wanted to say thank you.

I've been writing software professionally for 25 years, with the last 15 in web (mostly internal projects in my company). This is easily the best component library I've ever used.

In every other instance I've run into the boundaries of what the library does and have to spend a lot of time and energy customizing or extending it. Not only does Mantine provide easy access to everything under the hood, but 99% the things you need are provided as default options. I've started to lose count of the "guess I'd better build my standard xyz... oh wait, they have that too" moments. Also the docs are perfect.

Bravo, thank you.

Gitgud6969
@Gitgud6969
Open on GitHub
Thank you mantine 💘

Dear Mantine Team, thank you for putting this library together. I have started to use and love Mantine in my free time, and bringing this great library to good use in our company now. All the developers are very pleased with the development experience, the time savings for any bigger project is insane. The amount of flexibility we have with our designers and developers will result in great products. All thanks to every contributor. Continue the good work!

SeeSharpCode
@SeeSharpCode
Open on GitHub
A solution for every problem

Mantine has a solution for every problem I’ve needed to solve in my web app. Components and props are named clearly, design choices promote simplicity, and it looks beautiful out of the box. Thank you for jump starting my application in a big way!

OmkoBass
@OmkoBass
Open on GitHub
Thank you Mantine!

Out of all react component libraries that I have ever seen this one is the most straight forward, easy to use, well documented and really beautiful. I plan on switching and using this full time. Just wanted to say huge thanks to the people that made this.

Join the community

Mantine is an open-source project with a growing community of developers and contributors. Join us on GitHub, Discord, Twitter and other platforms to stay updated and get help with your projects.

Chat on Discord
Join a community of 10,000+ developers to ask questions, share feedback and explore upcoming features
Start a discussion
Request new features, ask questions and provide feedback with GitHub discussions
Follow on X
Get notified about new minor and major releases

Ready to get started?

Mantine can be used with any modern React framework or build tool: get started with Next.js, Vite, React Router and other tools in minutes by following the installation guide or using one of the available templates.

Get started without a framework
Recommended

Vite

Best choice for a single page application (SPA)

Recommended

Next.js

Best choice for an application with SSR

React Router

Get started with React Router

TanStack Start

Get started with TanStack Start

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.