Tailwind + Emotion = twin.macro?
Tailwind + Emotion
Tailwind
Tailwind CSSはUtility-First向けです.起動ベルトを試したことがあるなら、もっとよく知っています.margin-top
をあげたいなら、mt-숫자
と一緒に使います.<p class="mt-3 p-5 text-red bg-yellow-400">
안녕하세요
</p>
迅速で簡単なデザインで、一貫したデザインに適しています.使用方法はclassに名前を追加するのではなく、classにスタイルを追加すればいいです.Tailwind公式ドキュメントで使用していたCSS構文を検索し、Tailwind構文に変換された内容を簡単に検索することもできます.
しかし、いくつかの欠点もあります.元々知っていた属性は別の名前で存在するので、それを熟知する必要があり、JavaScriptコードが使えないので不便です.また、内線の造形を見せるのも不便です.(興味は離れない)
そこで,注目点を分離するためにもJavaScriptコードを使用するためにもEmotionと併用することにした.
Emotion
CS-In-JS、例えばStyled-Components.CSSでは、明示的に定義されていない場合、親要素から属性が自動的に継承されます.ただし、CSS-in-JSは、ドキュメントレベルではなくコンポーネントレベルにCSSを抽象化するため、親要素の属性を継承しません.
ReactではCS-In-JSが多く使われています.interface StrNumTheme {
strNum: number;
theme: Theme;
isTrue: boolean;
}
//...
<List strNum={strNum} theme={theme} isTrue={isTrue} />
//...
const List = styled.div<StrNumTheme>`
font-size: 14px;
margin-bottom: 5px;
margin-left: ${({ strNum }) => strNum * 10}px;
color: ${({ isTrue, theme }) => (isTrue ? theme.MAIN : theme.POINT_FONT)};
font-weight: ${({ isTrue }) => (isTrue ? 700 : 400)};
&:hover {
color: ${({ theme }) => theme.BUTTON_SUB};
font-weight: 700;
}
`;
JavaScript変数を使用してスタイルに影響を与える場合は、propsに渡すことができます.タイプスクリプトを使用する場合は、インタフェースを宣言する必要があります.
twin.macro
私たちはTailwindとEmionを理解しました.今回は両方の長所を生かしていきましょう.
設定
타입스크립트 기반 next
yarn create next-app --example with-typescript-eslint-jest test-next
테일윈드, 이모션, 트윈마크로
yarn add @emotion/react @emotion/styled @emotion/css @emotion/server
yarn add -D twin.macro tailwindcss postcss@latest autoprefixer@latest @emotion/babel-plugin babel-plugin-macros
tailwind.config.js 생성
npx tailwindcss-cli@latest init -p
package.json
"babelMacros": {
"twin": {
"preset": "emotion"
}
}
.babelrc.js
module.exports = {
presets: [
['next/babel', { 'preset-react': { runtime: 'automatic', importSource: '@emotion/react' } }],
],
plugins: ['@emotion/babel-plugin', 'babel-plugin-macros'],
};
twin.d.ts
twin.マクロの設定import 'twin.macro';
import { css as cssImport } from '@emotion/react';
import styledImport from '@emotion/styled';
declare module 'twin.macro' {
// The styled and css imports
const styled: typeof styledImport;
const css: typeof cssImport;
}
tsconfig.json
.d.tsファイルincludeと絶対パス "compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"baseUrl": ".",
"paths": {
"@/*": ["./*"],
"@pages/*": ["pages/*"],
"@server/*": ["server/*"],
"@public/*": ["public/*"],
"@styles/*": ["styles/*"],
"@components/*": ["components/*"],
"@utils/*": ["utils/*"],
"@hooks/*": ["hooks/*"]
},
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true
},
"include": ["**/*.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
postcss.config.js
cssnanoとTailwind CSS v 2のIEでサポートされているautofrefixerをプラグインに配置し、cssファイルを圧縮します.module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
cssnano: {},
},
};
tailwind.config.js
カスタマイズできる場所です.margin-top
プロパティを入力し、自動完了を待機します.選択肢の範囲が狭い.しかし、画素単位でUIを実現したり、私の希望に応じてUIを実現したりする必要がある場合があります.const plugin = require('tailwindcss/plugin');
module.exports = {
mode: 'jit',
content: ['pages/**/*.{ts,tsx}', 'components/**/*.{ts,tsx}'],
theme: {
extend: {
spacing: {
1: '1px',
2: '2px',
//...
},
fontSize: {
'title-0': '90px',
//...
'head-0': '45px',
//...
'body-1': '18px',
//...
'caption-1': '12px',
//...
},
fontFamily: {
garamond: 'GaramondPremrPro, Arial, sans-serif',
noto: 'Noto Sans, Arial, sans-serif',
},
fontWeight: {
ultralight: 100,
light: 200,
thin: 300,
normal: 400,
medium: 500,
semibold: 600,
bold: 700,
extrabold: 800,
black: 900,
},
lineHeight: {
default: '1.2',
12: '12px',
//...
},
minWidth: {
320: '320px',
//...
},
maxWidth: {
140: '140px',
//...
},
minHeight: {
882: '882px',
},
maxHeight: {
460: '460px',
},
boxShadow: {
sm: '0px 0px 8px rgba(0, 0, 0, 0.1)',
md: '0px 2px 16px rgba(0, 0, 0, 0.1)',
lg: '0px 4px 32px rgba(0, 0, 0, 0.1)',
},
keyframes: {
show: {
'0%': { transform: 'scale(0)', opacity: 1 },
'100%': { transform: 'scale(1)', opacity: 1 },
},
fadeIn: {
'0%': { opacity: 0 },
'100%': { opacity: 1 },
},
},
animation: {
show: 'show 200ms cubic-bezier(.6, 0, .4, 1) 1000ms forwards',
fadeIn: 'fadeIn 300ms cubic-bezier(.6, 0, .4, 1) forwards',
},
},
screens: {
xsm: '320px',
sm: '428px',
md: '768px',
lg: '1024px',
xl: '1280px',
},
},
variants: {
extend: {
backgroundColor: ['disabled'],
},
},
plugins: [
plugin(({ addComponents }) => {
const components = {
'.flex-center': {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
},
};
addComponents(components);
}),
],
};
mt-
のようにfont-sizeを使用して付与できるようになりました.フォントのサイズは18 pxになります.自分の好みに応じてフォントやボックス、さらにはアニメーションの関連部分を追加することができます.
プラグインに触れることもできます.△気になったら詳細については、「文書」を参照してください。を試してみましょう.
使用
import { css } from '@emotion/react';
import tw, { styled } from 'twin.macro';
Tailwindにtwとcss-in-jsのstyledとcssをロードします.const Caption = tw.p`
font-noto font-light text-caption-1 w-full
md:font-thin md:text-head-5 md:leading-26 md:whitespace-normal md:text-left md:mt-37
`;
まずはTailwindを使いましょうtext-body-1
形を使用し、天命素子を使用するようにします.ここではTailwind構文を使用します.
mdは反応型のTailwind属性である.反応型を簡単に実現できるのは、移動第一です.<Icon index={i + 1} />
Iconというインデックスでスタイリングしたいです.
JavaScriptを使用します.interface IconProps {
index: number;
}
const Icon = styled.div<IconProps>(({ index }) => [
tw`
md:w-198 md:flex-shrink-0 md:mt-20
`,
css`
position: relative;
&::before {
content: '0${index}';
padding: ${index};
}
`,
]);
Tailwindだけを使うとありえない動作は感情Twinマクロで可能にする.
また,スタイルをインラインとして使用する必要はなく,htmlとcssは別々である.
プラグイン
aspectratioを設定できないのは双子です.これがmacroの欠点だと言われていますしかし、What is twin.macro?の記事から分かるように、aspect-ratioプラグインが存在する.他にもTailwindui、Custom Forms、Type graphy、Gradientのプラグインがあり、利用できます.
複雑な初期設定、尾風の欠点と同様に、属性を再認識する必要があります.欠点は可読性が悪いことです.
開発環境構築リファレンス
Reference
この問題について(Tailwind + Emotion = twin.macro?), 我々は、より多くの情報をここで見つけました
https://velog.io/@leehyunho2001/Tailwind-Emotion-twin.macro
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
<p class="mt-3 p-5 text-red bg-yellow-400">
안녕하세요
</p>
interface StrNumTheme {
strNum: number;
theme: Theme;
isTrue: boolean;
}
//...
<List strNum={strNum} theme={theme} isTrue={isTrue} />
//...
const List = styled.div<StrNumTheme>`
font-size: 14px;
margin-bottom: 5px;
margin-left: ${({ strNum }) => strNum * 10}px;
color: ${({ isTrue, theme }) => (isTrue ? theme.MAIN : theme.POINT_FONT)};
font-weight: ${({ isTrue }) => (isTrue ? 700 : 400)};
&:hover {
color: ${({ theme }) => theme.BUTTON_SUB};
font-weight: 700;
}
`;
私たちはTailwindとEmionを理解しました.今回は両方の長所を生かしていきましょう.
設定
타입스크립트 기반 next
yarn create next-app --example with-typescript-eslint-jest test-next
테일윈드, 이모션, 트윈마크로
yarn add @emotion/react @emotion/styled @emotion/css @emotion/server
yarn add -D twin.macro tailwindcss postcss@latest autoprefixer@latest @emotion/babel-plugin babel-plugin-macros
tailwind.config.js 생성
npx tailwindcss-cli@latest init -p
package.json
"babelMacros": {
"twin": {
"preset": "emotion"
}
}
.babelrc.js
module.exports = {
presets: [
['next/babel', { 'preset-react': { runtime: 'automatic', importSource: '@emotion/react' } }],
],
plugins: ['@emotion/babel-plugin', 'babel-plugin-macros'],
};
twin.d.ts
twin.マクロの設定
import 'twin.macro';
import { css as cssImport } from '@emotion/react';
import styledImport from '@emotion/styled';
declare module 'twin.macro' {
// The styled and css imports
const styled: typeof styledImport;
const css: typeof cssImport;
}
tsconfig.json
.d.tsファイルincludeと絶対パス
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"baseUrl": ".",
"paths": {
"@/*": ["./*"],
"@pages/*": ["pages/*"],
"@server/*": ["server/*"],
"@public/*": ["public/*"],
"@styles/*": ["styles/*"],
"@components/*": ["components/*"],
"@utils/*": ["utils/*"],
"@hooks/*": ["hooks/*"]
},
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true
},
"include": ["**/*.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
postcss.config.js
cssnanoとTailwind CSS v 2のIEでサポートされているautofrefixerをプラグインに配置し、cssファイルを圧縮します.
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
cssnano: {},
},
};
tailwind.config.js
カスタマイズできる場所です.
margin-top
プロパティを入力し、自動完了を待機します.選択肢の範囲が狭い.しかし、画素単位でUIを実現したり、私の希望に応じてUIを実現したりする必要がある場合があります.const plugin = require('tailwindcss/plugin');
module.exports = {
mode: 'jit',
content: ['pages/**/*.{ts,tsx}', 'components/**/*.{ts,tsx}'],
theme: {
extend: {
spacing: {
1: '1px',
2: '2px',
//...
},
fontSize: {
'title-0': '90px',
//...
'head-0': '45px',
//...
'body-1': '18px',
//...
'caption-1': '12px',
//...
},
fontFamily: {
garamond: 'GaramondPremrPro, Arial, sans-serif',
noto: 'Noto Sans, Arial, sans-serif',
},
fontWeight: {
ultralight: 100,
light: 200,
thin: 300,
normal: 400,
medium: 500,
semibold: 600,
bold: 700,
extrabold: 800,
black: 900,
},
lineHeight: {
default: '1.2',
12: '12px',
//...
},
minWidth: {
320: '320px',
//...
},
maxWidth: {
140: '140px',
//...
},
minHeight: {
882: '882px',
},
maxHeight: {
460: '460px',
},
boxShadow: {
sm: '0px 0px 8px rgba(0, 0, 0, 0.1)',
md: '0px 2px 16px rgba(0, 0, 0, 0.1)',
lg: '0px 4px 32px rgba(0, 0, 0, 0.1)',
},
keyframes: {
show: {
'0%': { transform: 'scale(0)', opacity: 1 },
'100%': { transform: 'scale(1)', opacity: 1 },
},
fadeIn: {
'0%': { opacity: 0 },
'100%': { opacity: 1 },
},
},
animation: {
show: 'show 200ms cubic-bezier(.6, 0, .4, 1) 1000ms forwards',
fadeIn: 'fadeIn 300ms cubic-bezier(.6, 0, .4, 1) forwards',
},
},
screens: {
xsm: '320px',
sm: '428px',
md: '768px',
lg: '1024px',
xl: '1280px',
},
},
variants: {
extend: {
backgroundColor: ['disabled'],
},
},
plugins: [
plugin(({ addComponents }) => {
const components = {
'.flex-center': {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
},
};
addComponents(components);
}),
],
};
mt-
のようにfont-sizeを使用して付与できるようになりました.フォントのサイズは18 pxになります.自分の好みに応じてフォントやボックス、さらにはアニメーションの関連部分を追加することができます.プラグインに触れることもできます.△気になったら詳細については、「文書」を参照してください。を試してみましょう.
使用
import { css } from '@emotion/react';
import tw, { styled } from 'twin.macro';
Tailwindにtwとcss-in-jsのstyledとcssをロードします.const Caption = tw.p`
font-noto font-light text-caption-1 w-full
md:font-thin md:text-head-5 md:leading-26 md:whitespace-normal md:text-left md:mt-37
`;
まずはTailwindを使いましょうtext-body-1
形を使用し、天命素子を使用するようにします.ここではTailwind構文を使用します.mdは反応型のTailwind属性である.反応型を簡単に実現できるのは、移動第一です.
<Icon index={i + 1} />
Iconというインデックスでスタイリングしたいです.JavaScriptを使用します.
interface IconProps {
index: number;
}
const Icon = styled.div<IconProps>(({ index }) => [
tw`
md:w-198 md:flex-shrink-0 md:mt-20
`,
css`
position: relative;
&::before {
content: '0${index}';
padding: ${index};
}
`,
]);
Tailwindだけを使うとありえない動作は感情Twinマクロで可能にする.また,スタイルをインラインとして使用する必要はなく,htmlとcssは別々である.
プラグイン
aspectratioを設定できないのは双子です.これがmacroの欠点だと言われていますしかし、What is twin.macro?の記事から分かるように、aspect-ratioプラグインが存在する.他にもTailwindui、Custom Forms、Type graphy、Gradientのプラグインがあり、利用できます.
複雑な初期設定、尾風の欠点と同様に、属性を再認識する必要があります.欠点は可読性が悪いことです.
開発環境構築リファレンス
Reference
この問題について(Tailwind + Emotion = twin.macro?), 我々は、より多くの情報をここで見つけました https://velog.io/@leehyunho2001/Tailwind-Emotion-twin.macroテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol