テーマ対応コンポーネントシステム · 新しいリソース

Mantine デザインシステム.

ネイティブの参加者テーブルとスケジュール用ドロワーを中心に構成した Mantine 9 のリファレンスです。実際のテーマスケールを確認し、useForm を TextInput、Select、Checkbox、DatePickerInput に接続して、ローカルレコードを追加する前に入力検証を試してください。

OpenDesign ガイド9 章参考項目 32 件オリジナルアプリケーションガイド
01

Mantine デザインシステムのインターフェースプレビュー

ドロワーを開き、フィールドの入力検証を実行し、研究と日付を選択して、ローカルの参加者を追加し、サンプルの同意を撤回します。

参加者テーブルとスケジュール設定ドロワー完全な例を開く
React 19 に対応した Mantine 9.6.3 の core、form、dates パッケージを使用。ライト表示とシアンテーマを固定。状態はローカルのみ。 · 実装リファレンス
02

Mantine デザインシステムのデザインリファレンス

@mantine/core 9.6.3 の DEFAULT_THEME から選んだ値を確認済み。ピクセル換算値はルートを 16px、theme.scale を 1 とした場合の値です。スケールに応じて変わるトークンは --mantine-scale を通じて解決されます。シアンのプライマリカラー、シェード 8、半径 md は、アプリケーションで明示的に上書きしています。

サンプルで使用するシアンパレット

ソース
名前 / ルール値 / 設定用途
colors.cyan[0]#e3fafc 控えめなテーマ概要用のサーフェス。
colors.cyan[1]#c5f6fa 淡い色調。
colors.cyan[2]#99e9f2 淡色。
colors.cyan[3]#66d9e8 淡色。
colors.cyan[4]#3bc9db 中間の淡色。
colors.cyan[5]#22b8cf 中間の濃色。
colors.cyan[6]#15aabf パレットの標準シェード。
colors.cyan[7]#1098ad さらに濃いシェード。
colors.cyan[8]#0c8599 プライマリアクションに選択したシェード。
colors.cyan[9]#0b7285 強調テキスト。

scale 1 の文字サイズスケール

ソース
名前 / ルール値 / 設定用途
fontSizes.xs / sm12px / 14pxレコード ID/補足テキスト。
fontSizes.md / lg / xl16px / 18px / 20px本文と大きめのテキストの標準サイズ。
lineHeights.xs / sm / md1.4 / 1.45 / 1.55本文用の組み合わせたサイズ。
lineHeights.lg / xl1.6 / 1.65大きめの読み物向けサイズ。
headings.h134px / 1.3参加者セッションのタイトル。
headings.h2 / h326px / 1.35; 22px / 1.4使用可能な見出しレベル。
fontFamilyPlatform sans-serif stackフォントのダウンロードは不要です。

scale 1 の間隔と角丸

ソース
名前 / ルール値 / 設定用途
spacing.xs / sm10px / 12px小さな間隔。
spacing.md / lg / xl16px / 20px / 32pxモバイルの余白/フィールド間隔/セクション間隔。
radius.xs / sm2px / 4px小さな形状。
radius.md / lg / xl8px / 16px / 32px標準および大きめの角丸の例。
defaultRadiusmd (application override)createTheme で一元的に適用。

ブレークポイント

ソース
名前 / ルール値 / 設定用途
breakpoints.xs36emデフォルトの 16px 設定で 576px。
breakpoints.sm48em概要カードを 3 列に変更。
breakpoints.md62emデフォルトの 16px 設定で 992px。
breakpoints.lg / xl75em / 88emデフォルトの 16px 設定で 1200px/1408px。

CSS とコンポーネントの対応関係

ソース
名前 / ルール値 / 設定用途
--mantine-primary-color-filledResolved from primaryColor and primaryShadeこのサンプルではシアンのシェード 8 を選択。
--mantine-spacing-lgcalc(1.25rem * var(--mantine-scale))Stack の間隔は lg、パネルのパディングは lg。
--mantine-radius-mdcalc(0.5rem * var(--mantine-scale))標準の角丸パネル。
--mantine-font-size-smcalc(0.875rem * var(--mantine-scale))テーブルのレコードラベル。
Button.extend defaultPropssize: smアプリケーションで明示的に設定したデフォルト。
TextInput.extend defaultPropssize: mdアプリケーションで明示的に設定したデフォルト。
03

Mantine デザインシステムの完全ガイド

実際のインターフェースで、このデザインシステムを選び、適用し、レビューするための実践ガイドです。

DESIGN-mantine.md

詳しいガイダンス、実装の出発点、ソースへのリンクをまとめています。

ガイドをダウンロード

Mantine デザインシステム:Mantineのテーマとパッケージの境界

1 つのプロバイダー、3 つの機能パッケージ

サンプルでは、インターフェースに core、入力検証とバインディングに form、カレンダー入力に dates を使用します。MantineProvider には createTheme のオーバーライドを渡します。core CSS と dates CSS の両方をインポートする必要があります。React コンポーネントだけを読み込んでも、スタイルが適用されたカレンダーは再現できません。

この OpenDesign ガイドから

テーマではシアンを選択し、primaryShade に 8、defaultRadius に md を設定します。Button.extend で小さいボタンをアプリケーションのデフォルトにし、TextInput.extend で中サイズのコントロールを選択しています。これらはソースに示された意図的な設定であり、すべての Mantine 製品で採用すべきだという意味ではありません。

関連する仕様を確認する

Mantine デザインシステム:パレットのインデックスと解決済みの色の役割

順序付けされたパレットは、無関係な色見本の集まりではありません

Mantine の色は、シェードをインデックスで指定する配列です。この例ではシアンを使用します。控えめな概要パネルには cyan.0、強調テキストには cyan.9、塗りつぶしアクションには設定済みのプライマリーシェードを使います。リファレンスには、このテーマで使うシアンの全階調を示しています。

テーブルの確認済みバッジには明るいシアンのバリエーション、撤回済みにはオレンジを使います。どちらのステータスもテキストで表示します。同意を撤回しても、それ以前のセッションは表示したままにします。色の変化だけで履歴が誤って削除されるのを防ぐためです。

関連する仕様を確認する

テーマカラーと任意の CSS

コンポーネントの color プロパティには、名前付きパレットを指定できます。一方、背景色を別途 16 進数で指定すると、バリエーションに関する一部の決定が適用されません。通常の CSS を使う場合、テーマに関する設定を繰り返し使う箇所には生成済みの変数を優先してください。このサンプルの CSS 変数の対応関係では、スケールやプライマリーカラーに連動する値を示しています。

関連する仕様を確認する

Mantine デザインシステム:エクスポートされたフォントと見出しのスケールを適用する

階層を再現する

テーブルでは、名前と研究ラベルに sm、識別子と日付に xs のテキストサイズを使います。Title order={1} は h1 のスケールを使用します。ドロワーには意味的に h2 の見出しを置き、size="h3" で表示することで、見た目の階層を少しコンパクトにしています。これらの設定は、入力コンポーネントが提供するラベルや補助テキストとは独立しています。

Mantine のプラットフォームフォントスタックは、リモートフォントのダウンロードを必要としません。スケールに応じて変わるフォント値には --mantine-scale が含まれます。リファレンスのピクセル値は scale 1 を前提としています。アプリケーションでスケールを変更する場合、ピクセル換算値を不変の値として扱わないでください。

関連する仕様を確認する

Mantine デザインシステム:useForm を実際の入力コンポーネントにバインドする

入力検証はフォームモデルが担います

initialValues には、名前、研究、null 許容の日付、ブール値の同意状態を含めます。validate は、名前、日付、同意の各フィールドについて、エラー文字列または null を返します。form.onSubmit は、ローカルの行を追加する前に入力検証を実行します。手動でエラーラベルを別途作成する必要はありません。

TextInput と DatePickerInput には、フィールドのパスに対応する getInputProps を渡します。Checkbox は checked の値を正しくバインドするため、type:"checkbox" も指定します。Select には固定の研究リストと allowDeselect={false} を設定します。このフローでは研究を未選択にできません。

関連する仕様を確認する

日付の値と表示形式

関連する仕様を確認する

Mantine デザインシステム:コンポーネントの境界で密度とオーバーフローを制御する

テーブルを専用のスクロール領域に収める

Table.ScrollContainer に minWidth={580} を指定し、画面が狭い場合も 4 列を読みやすく保ちます。ドキュメント全体はビューポート内に収め、必要な場合に限りデータ領域を横スクロールさせます。horizontalSpacing="lg" と verticalSpacing="md" には、個別のセルパディングではなくテーマのスペーシングを使用します。

3 枚の概要カードには SimpleGrid を使い、基本は 1 列、sm 以上では 3 列にします。ページの余白も md から xl に切り替わります。これらはレスポンシブなスタイルオブジェクトであり、テーブルの最小幅はコンテンツに応じて明示的に決めています。

関連する仕様を確認する

Mantine デザインシステム:登録の入力不備と同意の撤回を区別する

このサンプルには、異なる 2 種類の変更があります

名前、セッション日、サンプルへの同意が入力検証を通過するまで、スケジュール設定フォームから行を追加することはできません。ローカルへの追加が成功すると、ドロワーを閉じ、レコードを 1 件追加し、概要の件数を更新します。アラートには、研究記録が保存されていないことを示します。

Withdraw は選択した行のステータスだけを変更し、その行のアクションを無効にします。履歴として日付は表示されたままですが、撤回済みの行は予定数に含めません。これはプレビューで定めた方針であり、実際の研究データ保持ルールではありません。

  • フォームが無効です。入力項目ごとのエラーを表示し、ドロワーを開いたままにします。
  • ローカルのエントリーを受け付けました。行を一度だけ追加し、次の入力用にフォームをリセットします。
  • 同意を撤回しました。このレコードは保持し、再度撤回できないようにします。

Mantine デザインシステム:ドロワーと入力のセマンティクスを連携させる

フォーカスとラベル

ドロワーにはタイトルを設定し、ネイティブのフォーカス管理を利用します。名前入力には data-autofocus を指定します。すべてのフォームコントロールに視認できるラベルを付け、バインドされた error プロパティから検証メッセージを表示します。撤回ボタンのアクセシブルネームには参加者名を含めるため、見た目が同じラベルが複数あっても区別できます。

この例では、ドロワーを閉じると入力中の内容は破棄されます。「参加者を追加」を開くとフォームがリセットされます。カレンダーは、ドロワー内に表示されるネイティブの Mantine ポップアップです。それぞれ単体でアクセシブルなコンポーネントでも、組み合わせたときに正しく動作するとは限りません。周囲のフォーカストラップも含めて、キーボード操作を確認してください。

関連する仕様を確認する

Mantine デザインシステム:バージョンをそろえたパッケージと2つのスタイルシートをインストールする

セットアップ一式を提供しています

以下のターミナルコマンドを実行し、App.jsx を完全版の構成に置き換えて、提供されている main.jsx でマウントしてください。4つの Mantine パッケージのバージョンは意図的にそろえています。App.jsx にプロバイダーとテーマが含まれているため、別途プロバイダーファイルを用意する必要はありません。

別のメジャーバージョンの日付入力例を使う場合は、値の型を確認せずにコピーしないでください。フォームの初期日付と検証処理は、実際の DatePickerInput API に合わせてください。この例は、古いチュートリアルから推測したものではなく、指定されたパッケージバージョンを使って作成されています。

  1. core、hooks、form、dates、および dates の依存パッケージ dayjs をインストールします。
  2. アプリケーションのエントリーポイントで core/styles.css と dates/styles.css を一度だけインポートします。
  3. フォームを実行し、日付付きのレコードを追加してから、テーブルと撤回後の状態を確認します。

Mantine デザインシステム:カレンダー、フォーム、テーブルを一体として検証する

試してみること

ドロワーを空のまま送信し、名前、日付、同意に関するエラーを表示します。名前を入力し、カレンダーで日付を選び、同意の例を確認してから、もう一度送信してください。選択した日付と変わらないプレビュー ID を含む新しい参加者が表示されます。その参加者の同意を撤回し、行と概要の両方を確認してください。

データモデルは意図的に簡素化されており、データはメモリ内にのみ保持されます。研究参加者の募集、同意の取得、サーバーへのデータ保存、タイムゾーン変換は行いません。この例の主な価値は、ネイティブパッケージとの連携と、目に見えるコントロールの動作にあります。研究管理用のバックエンド機能を示唆するものではありません。

Mantine デザインシステムのコンポーネント例

App.jsx — プロバイダー、テーマ、テーブル、スケジュール設定用ドロワー

ネイティブの Mantine を使った完全な例です。テーマのオーバーライド、useForm による検証、DatePickerInput、テーブルの更新、同意ステータスの変更が含まれます。

jsx
import React, {useState} from 'react';
import {MantineProvider, createTheme, Box, Group, Stack, Title, Text, Button, Paper, Badge, Table, Drawer, TextInput, Select, Checkbox, Alert, SimpleGrid} from '@mantine/core';
import {useForm} from '@mantine/form';
import {DatePickerInput} from '@mantine/dates';
import '@mantine/core/styles.css';
import '@mantine/dates/styles.css';
const theme=createTheme({primaryColor:'cyan',primaryShade:8,defaultRadius:'md',components:{Button:Button.extend({defaultProps:{size:'sm'}}),TextInput:TextInput.extend({defaultProps:{size:'md'}})}});
function Tracker(){
 const[opened,setOpened]=useState(false),[notice,setNotice]=useState(''),[rows,setRows]=useState([{name:'Alex Morgan',study:'Navigation study',date:'2026-10-14',status:'Confirmed'},{name:'Sam Rivera',study:'Editor study',date:'2026-10-16',status:'Confirmed'}]);
 const form=useForm({initialValues:{name:'',study:'Navigation study',date:null,consent:false},validate:{name:v=>v.trim().length<2?'Enter a name with at least two characters.':null,date:v=>!v?'Choose a session date.':null,consent:v=>!v?'Confirm consent before scheduling this example.':null}});
 const submit=values=>{setRows([...rows,{name:values.name.trim(),study:values.study,date:values.date,status:'Confirmed'}]);setOpened(false);setNotice('Participant added in this browser only. No research record was stored.');form.reset();};
 return <Box p={{base:'md',sm:'xl'}} bg='gray.0'><Box maw={1040} mx='auto'>
 <Group justify='space-between' align='flex-start' mb='xl'><Box><Text c='cyan.9' fw={700} size='xs' tt='uppercase' mb='xs'>Mantine · Research operations</Text><Title order={1}>Participant sessions</Title><Text c='dimmed' mt='xs'>Consent and scheduling stay visible in the same working view.</Text></Box><Button onClick={()=>{form.reset();setOpened(true)}}>Add participant</Button></Group>
 <SimpleGrid cols={{base:1,sm:3}} mb='xl'><Paper withBorder p='lg'><Text size='sm' c='dimmed'>In this preview</Text><Text fz={32} fw={700}>{rows.length}</Text><Text size='sm'>Participant records</Text></Paper><Paper withBorder p='lg'><Text size='sm' c='dimmed'>Scheduled</Text><Text fz={32} fw={700}>{rows.filter(r=>r.status==='Confirmed').length}</Text><Text size='sm'>With confirmed example consent</Text></Paper><Paper withBorder p='lg' bg='cyan.0'><Text size='sm' c='cyan.9' fw={600}>Working theme</Text><Text mt='xs' size='sm'>cyan.8 action · radius md<br/>spacing lg · body md</Text></Paper></SimpleGrid>
 {notice&&<Alert title='Local change' color='cyan' mb='md' withCloseButton onClose={()=>setNotice('')}>{notice}</Alert>}
 <Paper withBorder radius='md'><Table.ScrollContainer minWidth={580}><Table verticalSpacing='md' horizontalSpacing='lg' highlightOnHover><Table.Thead><Table.Tr><Table.Th>Participant</Table.Th><Table.Th>Study / session</Table.Th><Table.Th>Consent</Table.Th><Table.Th>Action</Table.Th></Table.Tr></Table.Thead><Table.Tbody>{rows.map((r,i)=><Table.Tr key={i}><Table.Td><Text fw={600} size='sm'>{r.name}</Text><Text size='xs' c='dimmed'>P-{String(i+1).padStart(3,'0')}</Text></Table.Td><Table.Td><Text size='sm'>{r.study}</Text><Text size='xs' c='dimmed'>{r.date}</Text></Table.Td><Table.Td><Badge variant='light' color={r.status==='Confirmed'?'cyan':'orange'}>{r.status}</Badge></Table.Td><Table.Td><Button variant='subtle' color='gray' disabled={r.status==='Withdrawn'} aria-label={'Withdraw consent for '+r.name} onClick={()=>{setRows(rows.map((x,j)=>j===i?{...x,status:'Withdrawn'}:x));setNotice('Consent withdrawn in the preview. The prior session remains visible as history.')}}>Withdraw</Button></Table.Td></Table.Tr>)}</Table.Tbody></Table></Table.ScrollContainer></Paper>
 <Text size='xs' c='dimmed' mt='lg'>Native Mantine 9.6.3: Table, Drawer, useForm, DatePickerInput, and input error styles. All records are memory-only examples.</Text>
 <Drawer opened={opened} onClose={()=>setOpened(false)} position='right' size='md' title={<Title order={2} size='h3'>Schedule a participant</Title>}><form onSubmit={form.onSubmit(submit)} noValidate><Stack gap='lg'><Text size='sm' c='dimmed'>All fields below belong to this one study enrollment. Closing discards the draft.</Text><TextInput label='Participant name' placeholder='Jules Davis' data-autofocus {...form.getInputProps('name')}/><Select label='Study' data={['Navigation study','Editor study']} allowDeselect={false} {...form.getInputProps('study')}/><DatePickerInput label='Session date' placeholder='Choose a date' valueFormat='DD MMM YYYY' defaultDate='2026-10-01' {...form.getInputProps('date')}/><Checkbox label='Consent is confirmed for this example study' {...form.getInputProps('consent',{type:'checkbox'})}/><Button type='submit'>Add to preview</Button><Text size='xs' c='dimmed'>This checkbox demonstrates validation; it is not a research consent collection process.</Text></Stack></form></Drawer>
 </Box></Box>;
}
export default function App(){return <MantineProvider theme={theme} forceColorScheme='light'><Tracker/></MantineProvider>}

コードリファレンス

  • core と dates の両方の CSS をインポートしています。
  • 同意チェックボックスは検証条件の例であり、実際に同意を取得するフローではありません。
04

Mantine デザインシステム:AIエージェントのセットアップ

実装の出発点

選択した Vite テンプレートがサポートする Node のリリースを使用してください。ソースにはプロバイダー、テーマ、スタイルシートのインポートが含まれているため、ここで示すフローにバックエンドやカスタム CSS は必要ありません。

テキスト
# Terminal
npm create vite@latest participant-demo -- --template react
cd participant-demo
npm install
npm install @mantine/[email protected] @mantine/[email protected] @mantine/[email protected] @mantine/[email protected] dayjs

# Save the complete example as src/App.jsx.
# Replace src/main.jsx with:
import React from 'react';
import {createRoot} from 'react-dom/client';
import App from './App';
createRoot(document.getElementById('root')).render(<App/>);

# Terminal
npm run dev

あなたのプロジェクト向けプロンプト

AI エージェント用プロンプト
提供されている Mantine 9.6.3 の構成を使い、core/form/dates のバージョンをそろえてください。プロバイダー、2つの CSS のインポート、getInputProps のバインド、日付の値の型、テーブルのスクロール境界を維持してください。同意とデータ保存の方針を定めてから、ローカルの登録処理を実際のサービスに置き換えます。撤回と削除を明確に区別し、読みやすい入力エラーとドロワーのフォーカス管理を維持してください。
05

Mantine デザインシステムの参照元と対象範囲

Mantine 9.6.3 を使用したオリジナルの OpenDesign の例です。デフォルトのテーマ値と、アプリケーションでオーバーライドしたシアン系の色やシェイプを区別しています。ネイティブのプレビューで示すのは、ローカルのレコードと検証のみです。同意の取得や研究データの保存は行いません。