ã¯ããã« ããã«ã¡ã¯ïŒhy094ã§ãã ä»åã¯Zero-Runtime CSS -in-JSã§ãããmacaronã(macaron- css )ã®äœ¿ãæ¹ã調ã¹ãŠã¿ãã®ã§ã ããããŸãšããããšæããŸãã â»æ¬èšäºã¯å€§éšåãå
¬åŒã® GitHub ãš å
¬åŒããã¥ã¡ã³ã ã®åèš³ã§æ§æãããŠããŸãã â»è±èªããšãŠãèŠæãªã®ã§ç¿»èš³ã¢ããªãé§äœ¿ããŠæžããŠããŸãã誀ãããã£ãããã£ããæããŠããã ãããšå¬ããã§ãã ã¯ããã« macaronïŒmacaron-cssïŒã£ãŠçµå±ã©ããªã®ïŒ macaronïŒmacaron-cssïŒã£ãŠäœïŒ ã©ããªç¹åŸŽãããã®ïŒ ã©ããã£ãŠã€ã³ã¹ããŒã«ããã®ïŒ ãã³ãã©ã®èšå®ã¯ïŒ ã©ããã£ãŠäœ¿ãã®ïŒ 1. styled componentãäœæãã 2. ã¹ã¿ã€ã«ã远å ãã 3. variantsã远å ãã 4. ããã©ã«ãã®variantsãèšå®ãã 5. ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãã 6. ãµã³ãã«ã³ãŒããèŠãŠã¿ã ãããã« macaronïŒmacaron- css ïŒã£ãŠçµå±ã©ããªã®ïŒ Vanilla-Extract ã®èŸãéšåã§ãã åçãªã¹ã¿ã€ã«ãããåœãŠã«ãã åããã¡ã€ã«å
ã§ã¹ã¿ã€ã«ãš ã³ã³ããŒãã³ã ã®äž¡æ¹ãèšèŒã§ããªã ãšãã£ãåé¡ã解決ãããŠããŠããšãŠãããã£ãã§ãã ïŒ1ç¹ç®ã¯ç§ã®åé¡ã2ç¹ç®ã¯å¥œã¿ã®åé¡ãããããŸãããã»ã»ã»ïŒ æèŠçã«ã¯ styled-components ãš Stitches ãš Vanilla-Extract ã® ãããšãåã ãããã©ã€ãã©ãªãšãã£ãå°è±¡ã§ããã macaronïŒmacaron- css ïŒã£ãŠäœïŒ äžèšã§èšããš CSS -in-JS with zero runtime, type safety and colocation github.com åèš³ãããšããŒãã©ã³ã¿ã€ã ã»åå®å
šã»ã³ãã±ãŒã·ã§ã³ãå®çŸãã CSS -in-JSãã§ãã ã¢ã€ã³ã³ããå¯ããã«ããããããèåã®ã ã«ãã³ ã§åã£ãŠãããšæããŸãã ãŸãã1.0.0ã®ãªãªãŒã¹ã2022/12/06ãšããªãæ°ããã©ã€ãã©ãªãšãªã£ãŠããŸãã æ£åŒåç§°ã macaron-css ãªã®ã macaron ãªã®ãè¿·ãã©ããã§ããã æ¬èšäºã§ã¯å
¬åŒãµã€ãã® macaron.js.org ãä¿¡ããŠä»¥é㯠macaron ãšåŒç§°ããŸãã å
¬åŒãµã€ãã¯ä»¥äžãåç
§ããŠãã ããã macaron.js.org ã©ããªç¹åŸŽãããã®ïŒ macaronã®ç¹åŸŽãšããŠã以äžã®ãããªãã®ããããŸãã ãã«ãæã«ã¹ã¿ã€ã«ãæœåºãã(ãŒãã©ã³ã¿ã€ã ã§ãã) ã¹ã¿ã€ã«ãš ã³ã³ããŒãã³ã ã®ã³ãã±ãŒã·ã§ã³ïŒç¹ããã匷ããªãïŒ TypeScriptã®ãµããŒã styled-componentsãšvanillaã®äž¡æ¹ã® API ããµããŒã Stitches ã®ãããªvariants API ãå©çšã§ãã 远å ã®èšå®ãªã©äžèŠã§React,Solidã§äœ¿çšå¯èœ esbuild,viteã®ãµããŒã ã©ããã£ãŠã€ã³ã¹ããŒã«ããã®ïŒ npm/yarnããã€ã³ã¹ããŒã«ã§ããŸãã Reactã®å Žåã¯ä»¥äžã®ã³ãã³ããå®è¡ããŸãã # npm npm install @macaron-css/core @macaron-css/react # yarn yarn add @macaron-css/core @macaron-css/react Solidã®å Žåã¯ä»¥äžã®ã³ãã³ããå®è¡ããŸãã # npm npm install @macaron-css/core @macaron-css/solid # yarn yarn add @macaron-css/core @macaron-css/solid ãã®åŸã¯ yarn x React x Vite ã§ã®ç°å¢ãæ³å®ããŠèšèŒããŸãã ãã®ã»ãã®æžãæ¹ãªã©ã¯ å
¬åŒããã¥ã¡ã³ã )ãåç
§ããŠãã ããã ãã³ãã©ã®èšå®ã¯ïŒ viteã® ãã©ã°ã€ã³ ãã€ã³ã¹ããŒã«ããŸãã yarn add @macaron-css/vite vite.config.js ã«ä»¥äžã®ããã«èšèŒããŸãã import { macaronVitePlugin } from '@macaron-css/vite' ; import { defineConfig } from 'vite' ; export default defineConfig ( { plugins: [ macaronVitePlugin (), // other plugins ] , } ); macaronVitePlugin() ã¯ä»ã® ãã©ã°ã€ã³ ã®èšå®ããã åã« èšèŒããå¿
èŠããããšã®ããšã§ãã ã©ããã£ãŠäœ¿ãã®ïŒ 1. styled componentãäœæãã @macaron-css/react ãã styled ãã€ã³ããŒãããstyled componentãäœæããŸãã import { styled } from '@macaron-css/react' ; const Button = styled ( 'button' , {} ); 2. ã¹ã¿ã€ã«ã远å ãã ã³ã³ããŒãã³ã ã«é©çšãããåºæ¬ã¹ã¿ã€ã«(base styles)ã远èšããŸãã hoverãã¡ãã£ã¢ã¯ãšãªããã¹ãããã ã»ã¬ã¯ã¿ ãªã©ãå«ããããšãå¯èœã§ãã macaronã®å
šãŠã®styling API ã¯å
¥åãšããŠstyle objectãåãåããåå®å
šã§ãã ãã®æ©æµãšããŠãªãŒãã³ã³ããªãŒãããããŸãã import { styled } from '@macaron-css/react' ; const Button = styled ( 'button' , { // --- âaddâ --- base: { backgroundColor: 'gainsboro' , borderRadius: '9999px' , fontSize: '13px' , padding: '10px 15px' , ':hover' : { backgroundColor: 'lightgray' , } , } , // --- âaddâ --- } ); 3. variantsã远å ãã variantsãšã¯ãå¯å€ã®ã¹ã¿ã€ã«ãå®è£
ããããããããã®æ©èœã§ãã äŸãã°ä»¥äžã®ãããªãã®ã§ãã // Buttonã³ã³ããŒãã³ãã§variantsãèšå® const Button = styled ( "button" , { variants: { color: { violet: { color: "blueviolet" } , gray: { color: "gainsboro" } , } , } , } ); // å©çšåŽã§ãã䜿ãã () => < Button color = { "violet" } > hello ! < /Button > macaronã§ãvariantsããŒãå©çšããvariantsã远å ã§ããŸãã ãŸãã远å ã§ããæ°ã«å¶éãããŸããã ãããŠãã¡ãããåºæ¬ã¹ã¿ã€ã«ãšåæ§ã«style objectãåãåããŸãã ãããæŽ»çšããããšã§ãåçãªã¹ã¿ã€ã«å€æŽã容æã«ãªããŸãã import { styled } from '@macaron-css/react' ; const Button = styled ( 'button' , { base: { backgroundColor: 'gainsboro' , borderRadius: '9999px' , fontSize: '13px' , padding: '10px 15px' , ':hover' : { backgroundColor: 'lightgray' , } , } , // --- âaddâ --- variants: { color: { violet: { backgroundColor: 'blueviolet' , color: 'white' , ':hover' : { backgroundColor: 'darkviolet' , } , } , gray: { backgroundColor: 'gainsboro' , ':hover' : { backgroundColor: 'lightgray' , } , } , } , } , // --- âaddâ --- } ); 4. ããã©ã«ãã®variantsãèšå®ãã defaultVariants ãå©çšããŠãããã©ã«ãã®variantsãèšå®ã§ããŸãã ãã®äŸã®å Žåãäœãæå®ããªããã° color='violet' ãšãªããŸãã import { styled } from '@macaron-css/react' ; const Button = styled ( 'button' , { base: { backgroundColor: 'gainsboro' , borderRadius: '9999px' , fontSize: '13px' , padding: '10px 15px' , ':hover' : { backgroundColor: 'lightgray' , } , } , variants: { color: { violet: { backgroundColor: 'blueviolet' , color: 'white' , ':hover' : { backgroundColor: 'darkviolet' , } , } , gray: { backgroundColor: 'gainsboro' , ':hover' : { backgroundColor: 'lightgray' , } , } , } , } , // --- âaddâ --- defaultVariants: { color: 'violet' , } , // --- âaddâ --- } ); 5. ã³ã³ããŒãã³ã ã ã¬ã³ããªã³ã° ãã éåžžã®React ã³ã³ããŒãã³ã ãšåãããã«äœ¿çšã§ããŸãã macaronã§ã¯ styled-components ã®ããã« ã³ã³ããŒãã³ã ãšåããã¡ã€ã«å
ã§ã¹ã¿ã€ã«ã宣èšã§ãããããããç¹ããã匷ããªããŸãã ãããmacaron㯠çã® ã³ãã±ãŒã·ã§ã³( true colocation)ãšè¡šçŸããŠããŸãã import { styled } from '@macaron-css/react' ; const Button = styled ( 'button' , { base: { backgroundColor: 'gainsboro' , borderRadius: '9999px' , fontSize: '13px' , padding: '10px 15px' , ':hover' : { backgroundColor: 'lightgray' , } , } , variants: { color: { violet: { backgroundColor: 'blueviolet' , color: 'white' , ':hover' : { backgroundColor: 'darkviolet' , } , } , gray: { backgroundColor: 'gainsboro' , ':hover' : { backgroundColor: 'lightgray' , } , } , } , } , defaultVariants: { color: 'violet' , } , } ); // --- âaddâ --- () => < Button color = "gray" > Click me ! < /Button >; // --- âaddâ --- 6. ãµã³ãã«ã³ãŒããèŠãŠã¿ã æåŸã«ãå
¬åŒã® github ã«èšèŒãããŠãããµã³ãã«ã³ãŒãã§ãã ä»ãŸã§ã®1~5ã«èšèŒããå
å®¹ã§æŠãçè§£ã§ããããšæããŸãã import { styled } from '@macaron-css/react' ; const Button = styled ( 'button' , { base: { borderRadius: 6 , } , variants: { color: { neutral: { background: 'whitesmoke' } , brand: { background: 'blueviolet' } , accent: { background: 'slateblue' } , } , size: { small: { padding: 12 } , medium: { padding: 16 } , large: { padding: 24 } , } , rounded: { true : { borderRadius: 999 } , } , } , compoundVariants: [ { variants: { color: 'neutral' , size: 'large' , } , style: { background: 'ghostwhite' , } , } , ] , defaultVariants: { color: 'accent' , size: 'medium' , } , } ); // Use it like a regular solidjs/react component function App () { return ( < Button color = "accent" size = "small" rounded > Click me ! < /Button > ); } compoundVariants ã¯çµã¿åããã®variantsã§ãã ãã®ãµã³ãã«ã³ãŒãã§ã¯ã color={'neutral'} ã〠size={'large'} ã®å Žåã«ã background: 'ghostwhite' ãåæ ãããŸãã ãããã« æ°ããåºãŠããã°ããã§ ãããã䌞ã³ãŠããæ ãã²ãã²ããšæããmacaronããããã§ããã§ããããïŒ æ°ããããããšãæ¥æ¬èªã®ããã¥ã¡ã³ãã»èšäºãå
šããªãããšãããæ¥åã§äœ¿ãã«ã¯ãŸã æ©ããšæããŸããã å人éçºã§ã¯ã©ãã©ã䜿ã£ãŠããããããã³ã·ã£ã«ãæããŸããã macaronã¯ æ¬¡ã«æ¥ã CSS -in-JS ãããããŸãããèå³ãæ¹§ããæ¹ã¯ãã²äœ¿ã£ãŠã¿ãŠãã ããã ãããŠæ¥æ¬èªã®èšäºãæžããŠããããšåãåã³ãŸãç¬ ããã§ã¯ãã芧ããã ãããããšãããããŸããïŒ ãšã³ãžã㢠äžéæ¡çš ãµã€ã ã©ã¯ ã¹ã§ã¯ããšã³ãžãã¢ã»ãã¶ã€ããŒã® äžéæ¡çš ãç©æ¥µçã«è¡ã£ãŠãããŸãïŒ ãèå³ãããŸãããæ¯éã確èªããé¡ãããŸãã https://career-recruit.rakus.co.jp/career_engineer/ ã«ãžã¥ã¢ã«é¢è«ãç³èŸŒã¿ãã©ãŒã ã©ã®è·çš®ã«å¿åããã°è¯ããããããªããšããæ¹ã¯ãã«ãžã¥ã¢ã«é¢è«ãéæè¡ã£ãŠãããŸãã 以äžãã©ãŒã ãããç³èŸŒã¿ãã ããã rakus.hubspotpagebuilder.com ã©ã¯ ã¹Developersç»é²ãã©ãŒã https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ ã€ãã³ãæ
å ± äŒç€Ÿã®é°å²æ°ãç¥ãããæ¹ã¯ãæ¯é±éå¬ããŠããã€ãã³ãã«ãåå ãã ããïŒ âTECH PLAY techplay.jp âconnpass rakus.connpass.com