Mantine入門 2 スタイルを書く
ライティングスタイルの概要
Mantineはemotionを使ったcss-in-js libraryで構築されています。ライブラリの競合などを避けるため、可能な限りcreateStylesを作ってスタイリングすることを推奨します。
createStylesは以下のように使います。
import type { NextPage } from 'next'
import { createStyles } from '@mantine/core'
const useStyles = createStyles((theme, _params, getRef) => ({
wrapper:{
backgroundColor:theme.colors.blue[0],
maxWidth: 400,
width: '100%',
height:200,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
borderRadius: theme.radius.sm,
},
child:{
backgroundColor:theme.colors.gray[0],
padding: theme.spacing.md,
borderRadius: theme.radius.sm,
boxShadow: theme.shadows.md,
}
}))
const StyleDemo:NextPage =()=>{
const { classes } = useStyles();
return (
<div className={classes.wrapper}>
<div className={classes.child}>createStyles</div>
</div>
)
}
export default StyleDemo
関数(NextPage)コンポーネントの外でcreateStylesのインスタンスuseStylesを定義し、コンポーネントの中でインスタンスを呼び出すとclassesオブジェクトが帰ってくるので、JSXの要素のclassName に設定してあげています。
以下のような、指定した要素の直下にある要素にスタイルを適用するセレクタ「>」についても、
<!DOCTYPE html>
<html lang="ja">
<head>
<title>css</title>
<style>
.red {
color: orange;
}
.dev > .red {
color: red;
font-weight: bold;
}
</style>
</head>
<body>
<p class="red">out</p>
<div class="dev">
<p class="red">in</p>
</div>
<p class="red">out</p>
</body>
</html>
createStyles内でgetRef関数を用いると、再現できます。
import type { NextPage } from 'next'
import { createStyles } from '@mantine/core'
const useStyles = createStyles((theme, _params, getRef) => ({
red:{
ref:getRef('red'),
color:"#FF8000",
},
dev: {
[`& .${getRef('red')}`]: { // [& .red]:のイメージ
color:"#FF0000",
fontWeight:'bold'
}
},
}))
const StyleDemo:NextPage =()=>{
const { classes } = useStyles();
return (
<>
<p className={classes.red}>out</p>
<div className={classes.dev}>
<p className={classes.red}>in</p>
</div>
<p className={classes.red}>out</p>
</>
)
}
export default StyleDemo
component props概要
Mantineエレメントによってはcomponent propsが定義されているものがあります。
次のように使用します。
import type { NextPage } from 'next'
import { Container, Slider } from '@mantine/core'
const StylesAPI:NextPage =()=>{
return (
<Container>
<Slider
defaultValue={30}
marks={[
{ value: 20, label: '20%' },
{ value: 50, label: '50%' },
{ value: 80, label: '80%' },
]}
/>
</Container>
)
}
export default StylesAPI
Styles API概要
MantineエレメントによってはStylse APIが定義されているものもあります。
次のように設定できます。
import type { NextPage } from 'next'
import { Container, Slider } from '@mantine/core'
const StylesAPI:NextPage =()=>{
return (
<Container>
<Slider
defaultValue={30}
marks={[
{ value: 20, label: '20%' },
{ value: 50, label: '50%' },
{ value: 80, label: '80%' },
]}
styles={(theme) => ({
markLabel:{
color:theme.colors.red,
fontFamily:"fantasy"
}
})}
/>
</Container>
)
}
export default StylesAPI
components propsについて
共通の設定(props)
全てのMantineコンポーネントは以下のpropsを持ちます。
className
sx
m,my,mx,mt,mb,ml,mr
p,py,px,pt,pb,pl,mr
className
className は、最初に指名したおり、createStylesで作成した名前付きのスタイルオブジェクトを設定します。複数の要素にわたって共通のスタイルを適用できます。
SX
sx プロパティは、個別の要素にインラインでスタイルを適用します。:hoverなどの擬似クラス、メディアクエリなどの設定もできます。
import type { NextPage } from 'next'
import { Container, Text} from '@mantine/core'
const StylesAPI:NextPage =()=>{
return (
<Container>
<Text
sx={{
color:'#008080',
'&:hover': {
backgroundColor: '#F00000',
},
}}
>
My custom text
</Text>
</Container>
)
}
export default StylesAPI
マージンm,my,mx,mt,mb,ml,mr
m:上下左右のマージンを設定します。
my:上下のマージンを設定します。
mx:左右のマージンを設定します。
mt:上のマージンを設定します。
mb:下のマージンを設定します。
ml:左のマージンを設定します。
mr:右のマージンを設定します。
パディング p,py,px,pt,pb,pl,pr
p:上下左右のパディングを設定します。
py:上下のパディングを設定します。
px:左右のパディングを設定します。
pt:上のパディングを設定します。
pb:下のパディングを設定します。
pl:左のパディングを設定します。
pr:右のパディングを設定します。
{数値}か"xs","sm","md","lg","xl"の文字列で指定します。"-sm"のような表記でマイナスを表現できます。
文字列指定の場合の初期値は下記です。
{ xs: 10, sm: 12, md: 16, lg: 20, xl: 24 }
MantineProviderで下記のように変更することができます。
import { MantineProvider } from '@mantine/core';
const Some =()=> {
return (
<MantineProvider theme={
{ spacing: { xs: 15, sm: 20, md: 25, lg: 30, xl: 40 } }}>
////
JSX
////
</MantineProvider>
);
}
マージン、パディングの例を示します。
import type { NextPage } from 'next'
import { Button, Container, Text} from '@mantine/core'
const Stylesmp:NextPage =()=>{
return (
<>
<Text sx={{backgroundColor:"#80FFFF"}}>
default
</Text>
<Text m={10} sx={{backgroundColor:"#80FFFF"}}>
margin 10px
</Text>
<Text m={20} sx={{backgroundColor:"#80FFFF"}}>
margin 20px
</Text>
<Text p={10} mb={5} sx={{backgroundColor:"#80FFFF"}}>
padding 10px margin-bottom 5px
</Text>
<Text p={20} mb={5} sx={{backgroundColor:"#80FFFF"}}>
padding 20px margin-bottom 5px
</Text>
<Button ml="xs" > ml extra small</Button>
<Button ml="sm" > ml small</Button>
<Button ml="md" > ml middle </Button>
<Button ml="lg" > ml large </Button>
<Button ml="xl" > ml extra large </Button>
<Container mt="md">
<Button ml="md" > ml md</Button>
<Button ml="-md" sx={{backgroundColor:"#F00"}}> ml md * -1</Button>
</Container>
</>
)
}
export default Stylesmp
colorの設定
Mantineコンポーネントはtheme.colorsで定義された色で動きます。theme.colorsの中に含まれる色はそれぞれ10この色合いを配列として持ちます。
import type { NextPage } from 'next'
import { Button} from '@mantine/core'
const StylesColor:NextPage =()=>{
return (
<>
<Button color="blue">blue</Button>
<Button color="blue.0">blue.0</Button>
<Button color="blue.6">blue.6</Button>
<Button color="blue.9">blue.9</Button>
<Button color="red">red</Button>
<Button color="gray">gray</Button>
<Button color="pink">pink</Button>
<Button color="teal">teal</Button>
</>
)
}
export default StylesColor
Size
Mantineコンポーネントの大きさは、sizeで指定します。
"xs","sm","md","lg","xl"の文字列を設定できます。
コンポーネントによっては数値で指定出来るものもあります。
import type { NextPage } from 'next'
import { Button,Slider} from '@mantine/core'
const StylesColor:NextPage =()=>{
return (
<>
<Button size="sm">sm</Button>
<Button size="md">md</Button>
<Button size="lg">lg</Button>
<Slider size="md" />
<Slider size="xl" />
<Slider size={20} />
</>
)
}
export default StylesColor
Shadows
CardやPaperなどのhadowプロパティを下記のように設定できます。
import type { NextPage } from 'next'
import {Card,Paper} from '@mantine/core'
const StylesColor:NextPage =()=>{
return (
<Paper p="lg" sx={{backgroundColor:"#F8F8F8"}}>
<Card m="xl" shadow="xs">shadow="xs"</Card>
<Card m="xl" shadow="md">shadow="md"</Card>
<Card m="xl" shadow="xl">shadow="xl"</Card>
</Paper>
)
}
export default StylesColor
独自の影を設定することもできます。
theme.shadowsのパラメータは順に左ずらし幅、下ずらし幅、ぼかし幅、影範囲、影の濃さ(rgba)指定です。
import type { NextPage } from 'next'
import {MantineProvider,Card,Paper} from '@mantine/core'
const StylesColor:NextPage =()=>{
return (
<>
<MantineProvider
theme={{
shadows: {
xs: '0px 0px 2px 5px rgba(0, 0, 0, 0.2)',
md: '5px 0px 5px 10px rgba(0, 0, 0, 0.1)',
xl: '0px 5px 0px 15px rgba(0, 0, 0, 0.3)',
},
}}
>
<Paper p="lg" sx={{backgroundColor:"#F8F8F8"}}>
<Card m="xl" shadow="xs">shadow="xs"</Card>
<Card m="xl" shadow="md">shadow="md"</Card>
<Card m="xl" shadow="xl">shadow="xl"</Card>
<Card m="xl" shadow='0px 0px 5px 10px rgba(0, 0, 0, 0.3)'>shadow="xl"</Card>
</Paper>
</MantineProvider>
</>
)
}
export default StylesColor