ããµãã¹ããŒãªãŒããŸãã¯ã¹ããŒãªãŒã®éå±€ãæã€ããšãã§ããã°çŽ æŽããããšæããŸãã ç§ã®å Žåãåããªããžããªã«ããŸããŸãªãããã¢ããªããå«ãŸããŠããŸãã ç°¡åãªè§£æ±ºçã¯ã ui.core.foo
ãui.core.bar
ãããªååã®ã¹ãã¢ã次ã®ããã«è¡šç€ºãããªãã·ã§ã³ã§ãã
âââ core
âââ bar
âââ foo
ããŒãã®æ¡åŒµãšæãããã¿ããµããŒãããŸãã
çŸåšããããå®è£ ããäºå®ã¯ãããŸããã ããã²ãŒã·ã§ã³ãé£ãããªãããã§ãã ãui.coreãããui.appãã®ãããªãããã§ã¹ããŒãªãŒã®çš®é¡ã«åå空éãä»ããããšãã§ããŸãã 次ã«ãå¿ èŠã«å¿ããŠãããããã£ã«ã¿ãªã³ã°ã§ããŸãã
ã¹ããŒãªãŒãããããããå Žåã¯ãããã€ãã®ã¹ããŒãªãŒããã¯ã€ã³ã¹ã¿ã³ã¹ãéå§ã§ããŸãã ããªãã¯2ã€ã®ã¹ããŒãªãŒããã¯èšå®ãã£ã¬ã¯ããªãæã€ããšã«ãã£ãŠãããè¡ãããšãã§ããŸãã ãããããšã«ããããã¯æ¥µç«¯ãªã±ãŒã¹ã§ãã
ç§ã¯ãã®ç¹ãèªããããšæã£ãŠãããå¥ã®æ§æãäœæããŠå¥ã®ããŒãã§å®è¡ããã ãã ãšæã£ãŠããŸãã...
ããããã¹ããŒãªãŒããã¯ãè€æ°ã®æ§æãã¡ã€ã«ãååŸã§ããããã«ããŠãããååä»ãã®æ§æãã¡ã€ã«ãåãæ¿ããŠããããããªããŒãããæ¹ãã¯ããã«è¯ããšæããŸã...
æ§æãåãæ¿ããUIã«é¢ããŠã¯ãæ§æãã¡ã€ã«ãä»ã®æ§æãã¡ã€ã«ããããŒããããå Žåã«ã®ã¿è¡šç€ºããããµã€ãããŒããã²ãŒã·ã§ã³ã®äžéšãŸãã¯äžéšã«ãããµã€ãããŒã¢ã€ãã ã§ããå¯èœæ§ããããŸãã
ãšã«ãã-ç§ã¯ããã倧ããªã¢ããªã®å Žåãæ§æãåå²ã§ããªãïŒãŸãã¯åå²ã§ããªãïŒå Žåãããã¯ã¡ãã£ãšã¯ã¬ã€ãžãŒã ãšæããŸãã
æ§æãè¿œå ããã®ã¯éåžžã«è€éãªããã§ãã ã¯ã©ã·ãã¯/éå±€ãã¥ãŒã®åãæ¿ãã¯ã©ãã§ããïŒ ä»åŸæ°æ¥éã§å®è£ ãæ¥å¢ããããšãå¬ããæããŸãã
ããã¯ç§ã«ãšã£ãŠãéåžžã«äŸ¡å€ã®ããæ©èœã§ãããè€æ°ã®ã¢ããªã§ã¯ãªããåäžã®ã¢ããªå ã§ã³ã³ããŒãã³ãã¿ã€ããæŽçããå Žåã«åœ¹ç«ã¡ãŸãã
ãããåé²ã§ããã°ãäž¡æ¹ã®ãŠãŒã¹ã±ãŒã¹ã§æ©èœããå®è£ ã圢æããããã®æ¯æŽãæäŸã§ããã°å¹žãã§ãã
@traviãã1ã€ã®ã¢ã€ãã¢ã¯ããã£ã«ã¿ãŒããã¯ã¹ã®ããäžã«ããããããŠã³ã¡ãã¥ãŒãæäŸããŠãã«ããŽãªãéžæããããšã§ãã
ã«ããŽãªã¯ãconfig.jsããã³ããŸããŸãªãã¡ã€ã«ã»ããã§å²ãåœãŠãããŸãã ãããã£ãŠãã°ã«ãŒãåã®å¥ã®ã¬ã€ã€ãŒãäœæã§ããŸãã
ãã®æç¹ã§ã®ç§ã®ããŒãºãæºããã«ã¯ããã®ã¿ã€ãã®ãœãªã¥ãŒã·ã§ã³ã§ååã ãšæããŸãã ããã«ãäžèšã®åå空éã®èŠåã¯ãããããããŠã³ã®éžæè¢ã«è§£éã§ããã«ããŽãªãå²ãåœãŠãããã®åççãªæ¹æ³ã§ããå¯èœæ§ããããšæããŸãã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã«ãããã«ããŽãªéã®ãªã³ã¯ãã·ã³ãã«ãªãŸãŸã«ãªããŸãã
ç§ãæ§ç¯ããŠããã¢ããªïŒæ°çŸã®ã³ã³ããŒãã³ããç·©ããæ±ãé åå ã«ç·šæïŒã§ãããåé¿ããæ¹æ³ã¯ãçŸåšåãçµãã§ããé åã®ã¹ããŒãªãŒãåçã«æžãåºãã¹ã¯ãªããã䜿çšããããšã§ãã
find.file(
/\.story\.js/,
path.resolve(__dirname, '../src/app/components', targetComponentPath),
function(files) {
var requires = files.map(function(file) {
return "require('" + path.relative(__dirname, file) + "');";
});
fs.writeFileSync(path.resolve(__dirname, '../.storybook/stories.js'), requires.join("\n"));
}
);
ããã¯ãStorybookãä»ã®ã³ã³ããŒãã³ããæ§ç¯ããå¿ èŠãããªãããšãæå³ããŸãã çµã¿èŸŒã¿ãªãã·ã§ã³ãšããŠãããã«å¯ŸããããçšåºŠã®ãµããŒããå¿ èŠã§ãã
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
+1
ç§ã¯éåžžã«äŸ¿å©ãªæ©èœã§ãïŒ
+1
+1
+1
+1
+1
+1
ãã@arunoda ãã«ããŽãªã®å®è£ ã®é¢ã§äœãé²æ©ã¯ãããŸãããïŒ
ããã§ãªãå Žåãä»ã®èª°ãã2ã€ã®ã¹ããŒãªãŒããã¯æ§æãåãæ¿ãããµã³ãã«ã¢ããªãæã£ãŠããŸããïŒ
+1ç§ã¯çµ¶å¯Ÿã«ãã1ã€ã®ã¬ãã«ã®ãã¹ããå¿ èŠã§ãïŒ/
+1
+1
+1
+1
+1
+1
ã¢ããªãæé·ããäžæ¹ã§ãã³ã³ããŒãã³ããªã¹ããæé·ããããã«èŠããŸããããã«ããã¹ããå¿ èŠã§ãã ãã1ã€ã®ã¬ãã«ã¯ãã§ã«å€ãã®ã±ãŒã¹ãã«ããŒããŸã
+1
ãããã¿ããªïŒ
ãã®ãããªæ©èœã¯è¿ãå°æ¥èšç»ãããŠããªããšããäºå®ã«ãããããããããã¯Storybook AddonsAPIãä»ããŠãã®ãããªåäœãååŸã§ããªãããšãæå³ãããã®ã§ã¯ãããŸããã
ããããã®ãããªã¢ããªã³ã§ãïŒ
ïŒãµãïŒã¹ããŒãªãŒã«ç¡å¶éã®ã¬ãã«ã®ãã¹ããè¿œå ããŸã
ãã¹ãã¬ãã«ããã1ã€è¿œå ããã«ã¯ãã¹ããŒãªãŒã«.chapter(name)
ãè¿œå ããŸãã
// stories.js:
storiesOf('React App', module)
.chapter('Left panel')
.add('Button 1', fn(1))
.add('Button 2', fn(2))
.chapter('Bottom Panel')
.add('Input 3', fn(3))
.add('Input 4', fn(4))
.endOfChapter()
.chapter('Header Panel')
.add('Input 5', fn(5))
.add('Input 6', fn(6))
.endOfChapter()
.endOfChapter()
.chapter('Right panel')
.add('Button 7', fn(7))
.add('Button 8', fn(8))
.endOfChapter()
Knobs
ã addWithInfo
ããã³ãã®ä»ã®ã¢ããªã³ãšäºææ§ããããŸãstoryDecorator
ã䜿çšããŠãã¹ãŠã®ç« ãæãè¿ããŸããã£ãŒãããã¯ã¯å€§æè¿ã§ãïŒ :)
@UsulProãããïŒ
@UsulPro Storybook Chaptersã¯ããã°ããããœãªã¥ãŒã·ã§ã³ã§ãã ããããšãïŒ
@UsulProã¯ãŸãã«ç§ãæ¢ããŠãããã®ã®ããã§ããããããšãïŒ
ããã«ã¡ã¯ãã¿ããªïŒ @UsulPro ïŒ storybook-chapters
çŽ æŽãããä»äºãããïŒãšç«¶äºããããšã¯ããŠããŸãããã preview
ãã¿ã³ã§ã¹ããŒãªãŒã®ããŸããŸãªã°ã«ãŒããåãæ¿ããããšãã§ããå°ããªãããã«ç°ãªããœãªã¥ãŒã·ã§ã³ãæãã€ããŸããrelated components view
ãšã¹ããŒãªãŒããã¯ãé©ããŠããdetailed components view
ç°¡åã«åãæ¿ããããšãã§ããããã«ãããããã§ããèªæ
¢ã§ããã³ã³ããŒãã³ãããããããããŸãã ããã¯ãè€æ°ã®ã¹ããŒãªãŒããã¯ã€ã³ã¹ã¿ã³ã¹ãèšå®ãã軜éããŒãžã§ã³ã ãšæããŸãã
圹ã«ç«ã€å Žåã¯ããã¡ãã§ç¢ºèªã§ããŸã-httpsïŒ//github.com/majapw/storybook-addon-toggle
ç§ã¯@UsulProã®çŽ æŽãããstorybook-chapters
ã«åºã¥ããŠãã³ã³ããŒãã³ããã¡ã€ã«éå±€ãã¹ããŒãªãŒããã¯ã®ç« ãšããŠãã©ãŒãªã³ã°ããã¹ããŒãªãŒããã¯ããŒããŒãäœæããŸããïŒ storybook-filepath-chapters
ããã«ãããã¹ããŒãªãŒã_stories
ãã¡ã€ã«ãŸãã¯ãã©ã«ããŒã«ã³ã³ããŒãã³ããšã€ã³ã©ã€ã³ã§é
眮ã§ããŸãã ããŒããŒã¯ãã¹ãŠã®ã¹ããŒãªãŒãã¡ã€ã«ãèŠã€ããŠã察å¿ããããã²ãŒã·ã§ã³æ§é ã«ãããããŸãã
æãããã£ãŒãããã¯ãããããšããã¿ããªïŒ
@hadfieldnã®storybook-filepath-chapters
ãèŠãã®ã¯æ¬åœã«ã¯ãŒã«ã§ãïŒ ð
äŸãšããŠstorybook-addon-toggle
奜ãã§ããæ·±ãã ãã§ãªããæäžäœã«ãéå±€ãæ§ç¯ã§ããå¯èœæ§ãããããšãæãŸãããšããããšã§ãã å®éã«ã¯ãæè¡çã«ã¯å¯èœã§ãããæåã®æ¹æ³ãéžæããã®ã¯é£ãããšæããŸãïŒã¢ããªã³APIå
ã«ãšã©ãŸãïŒã ãããããããã¯ãã³ã¬ãŒã¿ïŒ@majapwãªã©ïŒã䜿çšããããã¢ããªã³ããã«ãä»ããŠè¡ãããšãã§ããŸãã
ã¹ããŒãªãŒã«éå±€ãè¿œå ããäºå®ã¯ãŸã ãããŸãããã storybook-chapters
ã¢ããªã³ã«APIãè¿œå ããããã®ãããªéå±€ã®æ§ç¯ãç°¡çŽ åã§ããããã«ãªããŸããã
enable
/disable
ã¹ããŒãªãŒã衚瀺/é衚瀺
ããã¯æ¬¡ã®ããã«æ©èœããŸãã
-
ã¹ããŒãªãŒã«enable()
/ disable()
ãè¿œå ããŸãã åŒæ°ãšããŠãå¶åŸ¡é¢æ°ã®è»¢éå
ã®ã³ãŒã«ããã¯ãæå®ããŸãã
let toLight = () => {};
let toDark = () => {};
storiesOf('Heroes Lightside', module)
.enable((en) => { toLight = en; })
.add('Yoda', info('Yoda'))
.add('Mace Windu', info('Mace Windu'));
storiesOf('Heroes Darkside', module)
.disable((en) => { toDark = en; })
.add('Darth Sidious', info('Darth Sidious'))
.add('Darth Maul', info('Darth Maul'));
ããªãã䜿çšããããšãã§ããŸãtoLight(false)
é ãããã«Heroes Lightside
ãštoDark(true)
衚瀺ããããã«Heroes Darkside
ç©èªãã toLight
ãštoDark
ãããã€ãã®ãã³ã¬ãŒã¿ã«å
¥ããããä»ã®ã¹ããŒãªãŒããã³ãŒã«ããã¯ãããããããšããå§ãããŸãã æãç°¡åãªäŸã瀺ããŸãã
storiesOf('Choose Your Side', module)
.add('Lightside', () => {
toLight();
toDark(false);
return (<div>{'Lightside selected'}</div>);
})
.add('Darkside', () => {
toDark();
toLight(false);
return (<div>{'Darkside selected'}</div>);
});
ããã§ã Choose Your Side
ã Heroes Lightside
ã Heroes Darkside
3ã»ããã®ã¹ããŒãªãŒãã§ããŸããã æåŸã®2ã€ã®ãã¡ã1ã€ã ãã衚瀺ãããæåã®1ã€ã§åãæ¿ããããšãã§ããŸãã
次ã®ãªãªãŒã¹ã§ã¯ãã«ã¹ã¿ãã€ãºå¯èœãªã¢ããªã³ããã«ãä»ããŠã¹ããŒãªãŒã®å¯èŠæ§ãå¶åŸ¡ããæ©èœãè¿œå ããäºå®ã§ãã
-
æå¹å/ç¡å¹åæ©èœã䜿çšãããšã奜ã¿ã®ããžãã¯ã§ã«ã¹ã¿ã ããã²ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
éå±€åãã©ãŠã¶ãŒãå®è£ ããŸãããã³ãã¥ããã£ããããå®è¡ããå¿ èŠããããšèããæ¹æ³ã®æŠå¿µãå¿ èŠã§ãã
UXã«é¢ããŠã¯ãç§ã¯ãã®ã¢ã€ãã¢ã奜ãã§ãïŒ http ïŒ
æ§æãŸã ããããŸããããã¡ã€ã«æ¢çŽ¢ã䜿çšããŠãã¡ã€ã«ã·ã¹ãã ããã©ãŒãªã³ã°ãããã次ã®ããã«ããããšãã§ããŸãïŒ https ïŒ
@ndelangen ïŒå°ãªããšããªãã·ã§ã³ã§ïŒïŒããã²ãŒã·ã§ã³ãã¹ããŒãªãŒã®å€ã§å®çŸ©ã§ããããã«ããããšãèããŸãããïŒ ã¹ããŒãªãŒãã©ã®ããã«èŠãããïŒãã¬ãã¥ãŒé å/ iframeïŒãšããã©ãŠãžã³ã°ãã©ã®ããã«æŽçãããïŒãããŒãžã£ãŒïŒãåå¥ã®é¢å¿äºãšããŠæ±ãããšã«ã¯äŸ¡å€ãããããã«æãããŸãã
@jackmccloyèå³ããããŸãããã©ãããæå³ã詳ããæããŠããã ããŸããïŒ
å¥ã®åé¡ã§èšåããŸããããã«ããŽãªã®ç§ã®ç®æšã¯ãäž»ã«ã¢ãããã¯ãã¶ã€ã³ãšæŽåããããšã§ãã ãã¿ãŒã³ã©ãã¯ã¢ãããã¯ãã¶ã€ã³ã®å ¬åŒã¹ã¿ã€ã«ã¬ã€ãã¢ãããŒãã§ãããã¹ããŒãªãŒããã¯ã«ã«ããŽãªãè¿œå ãããšãæåŸã«æ®ã£ãã®ã£ãããåããããšãã§ããŸãã
ç§ã¯ãã§ã«ã³ã³ããŒãã³ãããããã®ã«ããŽãªã®ãããã¬ãã«ãã©ã«ãã«é 眮ããŠããã®ã§ããããã¬ãã«ãã©ã«ãã«åºã¥ããŠã³ã³ããŒãã³ããã«ããŽãªã«ããŒãã§ããããšãçŽ æŽãããããšã§ãã
@traviãã©ã«ãã¬ã€ã¢ãŠãã®ããªã³ããæããŠããã ããŸããïŒ
ç§ã¯ãã®æ£ç¢ºãªç®çã®ããã«ã¹ããŒãªãŒããã¯ãæ¹åããããšã«ééããªãèå³ããããŸããããã©ã«ããŒæ§é ãããã®åé¡ãèªã¿åãããã«æè¡çã«å¿ èŠãªãã®ã«èå³ããããŸãã
ãã®æ¬è³ªçã«
project root
|
+--
| +-- atoms
| | +-- foo
| | +-- index.js // the component
| | +-- stories.js
...
| +-- molecules
| | +-- bar
| | +-- index.js
| | +-- stories.js
...
| +-- organisms
| | +-- baz
| | +-- index.js
| | +-- stories.js
ããã¯åœ¹ã«ç«ã¡ãŸããïŒ åãããã¬ãã«ãã©ã«ãã®äžã«è€æ°ã®ã³ã³ããŒãã³ãããããå¥ã®ãã©ã«ãã¬ãã«ã§ããã«ã°ã«ãŒãåãããããšããããŸãã 圹ç«ã€å Žåã¯ã詳现ããç¥ãããã ããã
ããŠãç§ãã¡ã«ã§ããããšã¯config.js
ãã©ã°ãèšå®ããããšã§ãã autoDiscoverStories
ããããã®ãããªãã®ã ã€ãŸããã¹ããŒãªãŒãæåã§ã€ã³ããŒãããå¿
èŠã¯ãªãããã¡ã€ã«ã·ã¹ãã ãã©ã«ããŒãã«ããŽãªãšããŠäœ¿çšãããŸãã
@ndelangenç§ãèããŠããã®ã¯ããã ãšæããŸããä»ã®ãšãããç§ãã¡ã®äŒè©±ã¯ãããã²ãŒã·ã§ã³ãæ¹åããæ¹æ³ãã«é¢ãããã®ã§ããã誰ãã䜿çšããåäžã®ããã²ãŒã·ã§ã³ãããããšãåæãšããŠããŸãã ã¢ããªã³ãã¹ããŒãªãŒèªäœã®æ©èœãæ¡åŒµããã®ãšåãããã«ãããã²ãŒã·ã§ã³ãæ¡åŒµå¯èœã«ããæ¹æ³ã«ã€ããŠè©±ã䟡å€ããããšæããŸãã
1ã€ã®å¯èœæ§ïŒ
çŸåšãåã¹ããŒãªãŒã¯2ã€ã®ã¹ãããã§è¿œå ãããŠããŸããæåã®ã¹ãããã§ã¯ã«ããŽãªãå²ãåœãŠããã2çªç®ã®ã¹ãããã§ã¯ã¿ã€ãã«ãå²ãåœãŠãããŸãã
storiesOf('storyCategory', module).add('storyTitle', () => <Component />)
åãã«ããŽãªã«è€æ°ã®ã¹ããŒãªãŒããã§ãŒã³ã§è¿œå ããããšã¯ã§ããŸãããæ§é ã«ãã£ãŠæè»æ§ãããçšåºŠå¶éãããŸãããã¹ãŠã®ã¹ããŒãªãŒã«ã¯ã«ããŽãªãšã¿ã€ãã«ãå¿ èŠã§ãããã«ããŽãªã¯ã¿ã€ãã«ããããäžäœã¬ãã«ãã§ãã
ããããã¹ããŒãªãŒããããã«ç°ãªãæ¹æ³ã§å®çŸ©ã§ããå Žåãã€ãŸã
const storyData = {
category: "category",
title: "storyTitle",
}
stories.add(() => <Component />, storyData)
ããŸããŸãªããã²ãŒã·ã§ã³ãªãã·ã§ã³ãããç°¡åã«è©Šãããšãã§ããŸãã
ããã©ã«ãã®ããã²ãŒã·ã§ã³ã¯ãã®ãŸãŸã«ããŠããããšãã§ããŸãã ããã¯é©åãªããã©ã«ãã§ãããããããç§ãã¡ã®ã»ãšãã©ã«ãšã£ãŠååã«æ©èœããŸãã storyData
ã¯ãªãã·ã§ã³ã®å ŽåããããŸããã«ããŽãªã®ãªãã¹ããŒãªãŒããããã¬ãã«ã«è¡šç€ºãããã¿ã€ãã«ã®ãªãã¹ããŒãªãŒã¯ããã©ã«ãã§ã³ã³ããŒãã³ãã®displayName
ã«ãªããŸãã
ãã ããã³ãã¥ããã£ã¯ãïŒaïŒã¡ã¿ããŒã¿ãã£ãŒã«ããstroyData
è¿œå ããããïŒbïŒã¡ã¿ããŒã¿ãã£ãŒã«ãã«åºã¥ããŠããã²ãŒã·ã§ã³ããã«ã®ã¬ã³ããªã³ã°æ¹æ³ãå€æŽãããããããšã§ãã¹ããŒãªãŒãæŽçããããŸããŸãªæ¹æ³ãè©Šãããšãã§ããŸãã
ããã€ãã®ã¢ã€ãã¢ïŒ
// add an additional level to the hierarchy called subCategory
const stroyData = {
category: "Buttons",
subCategory: "Blue",
title: "BlueButton",
}
stories.add(() => <BlueButton />, storyData)
// add tags to a story that you could then filter by
const stroyData = {
category: "Buttons",
tags: ["button", "homepage"],
title: "HomepageButton",
}
stories.add(() => <HomepageButton />, storyData)
// have a story to appear in multiple categories
const stroyData = {
categories: ["Buttons", "Homepage Elements"],
title: "HomepageButton",
}
stories.add(() => <HomepageButton />, storyData)
è¯ãïŒ ããã¯ç®±ããåºããŠããã«äœ¿çšã§ããå®éã«æ¡åŒµå¯èœã§ãã ããã«ã€ããŠå°ãèããŠã¿ãŸãã ð€
çŽ æŽãããã ããªããäœã決ãããæããŠãã ãã-ããªããã©ã®æ¹åã«é²ããã«é¢ããããç§ã¯ã§ãããšããã«å£²ã蟌ã¿ãŸã-ãããžã§ã¯ãã®å€§ãã¡ã³
@jackmccloyã®ææ¡ã¯çŽ æŽãããã§ããã¯ãŒã«ãªã¢ã€ãã¢ã«æè¬ããŸãïŒ
ãã ããUIãäžé£ã®ãããžã¥ã¢ã«ãã¹ãã±ãŒã¹ããšèŠãªããç¶æ
ããšã«add()
åŒã³åºãã䜿çšããŠãUIç¶æ
ãåã
ã®ã¹ããŒãªãŒãšããŠç°¡åã«å®çŸ©ãããã¹ããŒãªãŒããã¯ã®1ã€ã®åŒ·åãªãŠãŒã¹ã±ãŒã¹ãæããšã©ãŸãããããã§ãã
add()
åŒã³åºãã«ã¹ããŒãªãŒã®ã¡ã¿ããŒã¿ãç»é²ãããšãã«ããŽãªãééã£ãã¬ãã«ã§è¿œå ãããŠããããã«æããŸãã åãææ¡ãèŠããã®ã§ããã storiesOf()
é¢æ°ã䜿çšããŠããŸãã
storiesOf({
title: Component,
category: "My Category"
}, module)
.add("when empty", () => <List items=[] />)
.add("with items", () => <List items=["one", "two", "three"] />)
.add("etc.", () => <List items={etc} />);
Component.displayName
ããã¿ã€ãã«ãååŸã§ãããšããã¢ã€ãã¢ãããµãã«ããŽãªã«é¢ããä»ã®ãã¹ãŠã®ã¢ã€ãã¢ããŸãã¯ã³ã³ããŒãã³ããè€æ°ã®ã«ããŽãªã«è¿œå ã§ãããšããã¢ã€ãã¢ã奜ãã§ããç¶æ
ãè¿œå ãããšããåçŽããç¶æããããšæããŸãã
ã«ããŽãªãå®çŸ©ãããŠããå Žæã«é¢ä¿ãªããèŠããŠããã¹ãããšã®1ã€ã¯ãå¥ã®ãã¡ã€ã«ãã«ããŽãªã«è¿œå ã§ããå¿ èŠããããšããããšã§ãã ã«ããŽãªãåäžã®ãã¡ã€ã«ããããå®çŸ©ã§ããªãå Žåãããã¯éåžžã«å¶éããããšæããŸã
@traviã«åæã
次ã®ãããªã¿ã€ããã¹ãé²ãããã«ãã«ããŽãªã1ãæã§å®çŸ©ããããšãæ³åããŠããŸãã
// categories.js
export const Layouts = "Layouts";
export const Components = "Components";
export const Styles = "Styles";
// DashboardLayout.story.js
import { Layouts } from "../categories";
import DashboardLayout from "./DashboardLayout";
storiesOf({
title: DashboardLayout,
category: Layouts
}, module)
.add("default", () => <DashboardLayout />);
ããããããã¯ç§ã®ã¢ããªã«ä»»ãããŠããå®è£ ã®è©³çŽ°ã«ãªããŸãã
@ theinterned @ jackmccloyç§ã¯ããªãã®ææ¡ã奜ãã§ãã
ä»»æã®æ·±ãã®éå±€ã§ææ¡ãã©ã®ããã«äœ¿çšã§ããããèããŠããŸãã ããããcategory
/ subCategory
代ããã«ããã¹ã³ã³ããŒãã³ãã®é
åãæã€path
ã§ããå¯èœæ§ããããŸãã ïŒç§ã¯ããªããå¿
ãããããã«è©³çŽ°ãæå³ããŠããªãã£ãããšãç¥ã£ãŠããŸãããã ããªãã®èãããªãããŸããïŒ
ãŸãããã¡ã€ã«ã·ã¹ãã ã䜿çšããŠããã²ãŒã·ã§ã³éå±€ãäœæããæ§æãªãã·ã§ã³ã®ã¢ã€ãã¢ãæ°ã«å
¥ã£ãŠããŸãã ãã®ãªãã·ã§ã³ãæå¹ã«ãããšã path
åŒæ°ã¯ãªãã·ã§ã³ã«ãªããŸãã
ããã¯ããé£ããç®æšã§ãããéå±€å ã®ã¹ããŒãªãŒã®åããŒãžãåå¥ã®ãã£ã³ã¯ãšããŠããŒãããŠãã¹ããŒãªãŒããã¯ã倧ãããªã£ãŠã軜éã«ä¿ã€ã®ãããå ŽåããããŸãã ãŸããã¹ããŒãªãŒããã¯ããŒããŒãç¹å®ã®ãã¡ã€ã«ã·ã¹ãã ãã©ã«ããŒãã«ãŒãã³ã³ããã¹ããšããŠå®è¡ã§ããããã«ããŠããããžã§ã¯ãå šäœã®ãã¹ãŠã®ã¹ããŒãªãŒã§ã¯ãªãããã®ãã©ã«ããŒã§å®çŸ©ãããã¹ããŒãªãŒã®ã¿ã䜿çšããŠã¹ããŒãªãŒããã¯ãæ§ç¯ã§ããããã«ããã®ãããã§ãããã
èšå®ã§ã«ããŽãªãäºåã«å®çŸ©/ç»é²ããããšã«ã€ããŠã人ã ã¯ã©ãæããŸããïŒ
// config.js
import { configure, addCategory } from '@kadira/storybook';
function init() {
require('../src/stories');
addCategory({
id: 'atom',
name: 'Atoms',
index: 0
});
addCategory({
id: 'molecule',
name: 'Molecules',
index: 1
})
}
configure(init, module);
// component.story.js
import Component from "./Component";
storiesOf({
title: Component,
category: 'atom'
}, module)
.add("default", () => <DashboardLayout />);
é
åããµããŒãããããšãã§ããŸãïŒ category: ['atom', 'deprecated']
ããªãã§ããïŒ
ããã¯ãã«ããŽãªãæ£ããé åºã§é 眮ãããŠããããšã確èªããã®ã«åœ¹ç«ã¡ãŸããããã¯ãã¢ãããã¯ãã¶ã€ã³ã§ã¯éèŠã§ãã
èšå®ããã«ããŽãªãååŸããã®ã¯è¯ãããšã§ãããããžãã¯ã¹ããªã³ã°ã¯æªãã§ãð
ããã¯ç§ã«ã¯çã«ããªã£ãŠããŸãã
ãŸããæååãšäžèŽããããšãæåŸ ããã®ã§ã¯ãªããæ§æã§å®çŸ©ããããã®ããã¹ããŒãªãŒã®ã«ããŽãªããã«ããããã®+1
@ndelangenã§ã«ããŽãªãå°é£ã§ãã ãã ããã«ããŽãªãèšå®ã§å®çŸ©ã§ããããã«ããããšãéèŠã ãšæããŸããã«ããŽãªãèšå®ã§å®çŸ©ããå¿ èŠã¯ãããŸããã
Storybookã§æ°ã«å
¥ã£ãŠããã®ã¯ãã³ã³ããŒãã³ããšåãå Žæã«story.jsx
ãã¡ã€ã«ããããã©ããã確èªããã ãã§ãã³ã³ããŒãã³ããStorybookã«ãããã©ãããå€æã§ããããšã§ãã ãã®ä¿èšŒ-
story.jsx
ãã¡ã€ã«ãååšããå Žåãã¹ããŒãªãŒãååšããŸããããã¯ãã«ããŽãªimoãäºåã«å®çŸ©ããããšã«ãã£ãŠå
ã«æ»ããŠã¯ãªããªãéèŠãªãã¡ã€ã«ã§ãã
ãã®èŠ³ç¹ãããããšãæ§æå
ã®ã«ããŽãªã«id
ãšindex
ãå¿
èŠãªããšããå¿
èŠãªããããããŸãã-ãã®ãããªãã®ïŒãªãã·ã§ã³ãã©ã°ã€ã³ã䜿çšããŠãããšä»®å®ïŒã¯æ©èœããå¯èœæ§ããããŸã
setOptions({
categoryOrder: [
"First Category",
"Second Category",
"Third Category",
});
ããã§ã First Category
ã Second Category
ãããã³Third Category
ã¯ã1çªç®ã2çªç®ãããã³3çªç®ã«è¡šç€ºãããããšãä¿èšŒãããã¹ããŒãªãŒã§å®£èšãããä»ã®ã«ããŽãªã¯ãããã3ã€ã®åŸã«ã¢ã«ãã¡ãããé ã«è¡šç€ºãããŸãã
ãã®ã¢ãããŒãã¯ã次ã®ãããªããšãè¡ãããšã§ãä»»æã®æ·±ãã®ãã¹ããå¶åŸ¡ããããã®è³¢ãæ¹æ³ã§ããããŸãã
categoryOrder: [
{
"Atoms": [
{
"Buttons": []
}
],
}, {
"Molecules": [],
}],
ã«ããŽãªããã¿ã³ãã®ã¹ããŒãªãŒã¯ã Atoms -> Buttons
å
ã«è¡šç€ºãããŸãã ã«ããŽãªãAtomsãã®ã¹ããŒãªãŒã¯ã Atoms
ã Buttons
ïŒãã ãããã®äžã§ã¯ãªãïŒãªã©ã«è¡šç€ºãããŸãã
ãŠãŒã¶ãŒã¯ãïŒä»ã®ããã«ïŒæ§æãªãã§1ã¬ãã«ã®æ·±ããååŸããæå°éã®æ§æã§ä»»æã®ã¬ãã«ã®æ·±ããååŸããŸãã éèŠãªã®ã¯ãã¹ããŒãªãŒèªäœã§ã¯ãªããæ·±ãïŒæ§æã¬ãã«ã§èšå®ïŒãæã€ã«ããŽãªã«ãªãããšã§ãïŒã€ãŸããã¹ããŒãªãŒã¯ã«ããŽãªãèšå®ããã ãã§ããã®ã«ããŽãªãéå±€ã®ã©ãã«è¡šç€ºããããã¯å®çŸ©ãããŸããïŒã
@theinternedç§ã¯ããªãã«åæããŸãïŒç¶æ ãè¿œå ããåçŽããç¶æããå¿ èŠããããŸãã ç§ã¯ããã«ã€ããŠèããŠããŸããã§ãããããããb / cç§ã¯ããã¢ããªã³ãå€çšããŠããŸãã ã§ããããç§ã«ãšã£ãŠã¯ãã³ã³ããŒãã³ããšã¹ããŒãªãŒã®éã«1察1ã®é¢ä¿ãæãããããšããŠããŸããã¹ããŒãªãŒã®ã¿ã€ãã«ã¯ãã³ã³ããŒãã³ãã®ç¶æ ã説æããã®ã§ã¯ãªããã³ã³ããŒãã³ãã説æããŠããŸãã
äž¡æ¹ã®ãŠãŒã¹ã±ãŒã¹ã§æ©èœããå¯èœæ§ã®ãã1ã€ã®è§£æ±ºçã¯ã次ã®ãããªããšã§ãã
const storyData = {
category: "category",
title: "first item",
}
stories.add(() => <Component />, storyData)
.add(() => <Component />, {title: "second item"})
.add(() => <Component />, {title: "third item"})
ããã§ãïŒaïŒã¹ããŒãªãŒã®é åºã¯ã宣èšãããå Žæããå¶åŸ¡ã§ãïŒå€éšæ§æã¯å¿
èŠãããŸããïŒãïŒbïŒ storyData
ãã©ã¡ãŒã¿ãŒã¯åã®ãªããžã§ã¯ããä¿æãã次ã®å€ã®ã¿ãäžæžãããŸããæ瀺çã«æž¡ãããŸãã
ã¡ãã£ãšããèãã
ãããã¬ãã«ã®ã«ããŽãªã ãã§ãã¯ã¯ã¯ã¯ããŸããããã¹ããããã«ããŽãªããµããŒãããã®ã«ååãªå Žåã¯ãã«ããŽãªåãç°ãªãã«ããŽãªéã§äžæã§ãããšæ³å®ããã®ã¯å®å šã§ã¯ãªãããšã«æ³šæããŠãã ããã
ååèšèšã®äŸãç¶ãããšãååãååãããã³çç©ã®ãããã¬ãã«ã®åã«ããŽãªã«åãååã®ãµãã«ããŽãªãååšããã®ãäžè¬çã§ãã ãã¿ãŒã³ã©ãã®ãã¢ã§ã¯ããã©ãŒã ããã®è¯ãäŸã§ãã åã ã®ãã£ãŒã«ãèŠçŽ ã¯ååã®äžã«ãªã¹ãããããã£ãŒã«ããšã©ãã«ã®çµã¿åããã¯ååã®äžã«ãªã¹ããããå®å šãªãã©ãŒã ãšããŠã°ã«ãŒãåãããè€æ°ã®ãã£ãŒã«ãã¯çç©ã®äžã«è¡šç€ºãããŸãã
èå³æ·±ãèãã¯ãã¿ã€ãã«ãã¹ããŒãªãŒãã¹ããŒãªãŒãã¡ã€ã«ãžã®ãã¹ãååŸããã³ãŒã«ããã¯ãšããŠãŒã¶ãŒãã³ãŒã«ããã¯ãæ§æããããã«æž¡ãããšãã§ããã¡ã¿ããŒã¿ã䜿çšããŠã«ããŽãªãå®çŸ©ã§ãããã©ãããæ€èšããããšã§ãã
storyData = {
title: Component,
category: ({ title, story, storyPath, meta }) => someCategoryPath,
meta: { ..whateverMeta }
}
å¯äžã®èŠä»¶ã¯ãã³ãŒã«ããã¯ãã¹ããŒãªãŒãžã®ã«ããŽãªãã¹ãå®çŸ©ãããªããžã§ã¯ããè¿ãå¿ èŠãããããšã§ãã
storyData.category() //=> returns the below array
// a simple category path might look like:
[ "One category" ];
// The path for a story nested three categories deep would look like:
[ "Parent Category", "Child Category", "Grandchild category where the story lives" ];
ããã«ããã人ã ã¯å¥œããªã«ããŽãªã·ã¹ãã ãæžãããšãã§ããŸãã
ã°ããŒãã«èšå®ãå¿ èŠãªå Žåã¯ãã³ãŒã«ããã¯å ã«ç»é²ããã«ã¹ã¿ã ã¡ã¿ããŒã¿ã䜿çšããŠãã¹ããŒãªãŒãç»é²ããã«ããŽãª/ãµãã«ããŽãªãèšå®ã§ããŸãã
categories: [
{
"Atoms": [
{
"Buttons": []
}
],
}, {
"Molecules": [],
}];
function setCategory({ meta }) {
const { categroyPath } = meta; // maybe a dot path string like "Atoms.Buttons" ?
const category = categroyPath.split('.'); // [ "Atoms", "Buttons" ]
return validatePath(category, categories); // categories["Atoms"]["Buttons"] is a valid path
}
ãã¡ã€ã«æ§é ã«åºã¥ããŠã«ããŽãªæ§é ãèšå®ããå Žåã¯ããããè¡ãããã®ãã¹æ å ±ããããŸãã
function setCategory({ storyPath }) {
// for story path `src/components/Atoms/MyComponent.story.js`
let folders =storyPath.split('/'); // [ "src", "components", "Atoms", "MyComponent.story.js" ];
folders = without(folders, 'src'); // ["components", "Atoms", "MyComponent.story.js" ];
folders.pop(); // [ "components", "Atoms" ]
return folders;
}
åçŽãªã«ããŽãªåã䜿çšãããå Žåã¯ã1ã€ã ã䜿çšã§ããŸãã ïŒãããããcategoryã¯ãåçŽãªæååãã«ããŽãªãã¹ã説æããé åããŸãã¯ã«ããŽãªãã¹ãè¿ãã³ãŒã«ããã¯ã®ãããããåãããšãã§ããŸãïŒã
ä»ã空ã¯éçã§ãïŒ
åæ§ã«ã䞊ã¹æ¿ãé åºãå®çŸ©ããããã«ããã¹ãŠã®ã¹ããŒãªãŒãèªã¿èŸŒãã§äžŠã¹æ¿ããããšã«ãã£ãŠçæãããããªãŒã«ããŽãªæ§é ãååŸããç»é²å¯èœãªaddCategorySort
é¢æ°ããå§ãããŸãã
import { configure, addCategorySort } from "@kadira/storybook";
addCategorySort( categories => /* sort logic here */ );
configure(loadStories, module);
@traviéè€ããååã®ã«ããŽãªã®å¿ èŠæ§ã«ã€ããŠã¯èããŠããŸããã§ãããããããéèŠã§ããããšã«åæããŸãã 解決çã«ã€ããŠäœãèãã¯ãããŸããïŒ ãããç§ã«ãšã£ãŠé ã«æµ®ãã¶ããšã§ããããã£ãšè¯ã解決çããããããããŸããïŒ
const storyData = {
categories: ["Buttons"], // any category with the title "buttons"
}
const storyData = {
categories: ["Atoms.Buttons"], // any category with the title "buttons" that also has the parent category "atoms"
}
@theinternedç§ã¯ã¢ãããŒããæãäžããŸããããã¯ãŒãŠãŒã¶ãŒïŒå®å šã«æ©èœãããã®ãå¿ èŠãªãã®ïŒã®å©çã®ããã«ãäžè¬çãªãŠãŒã¶ãŒïŒç®±ããåºããŠããã«æ©èœãããã®ãå¿ èŠ/å¿ èŠãªãã®ïŒã«ãšã£ãŠãç©äºãé£ãã/çŽæçã§ãªããªãå¯èœæ§ãããããšãå¿é ããŠããŸãå°ãã®åªåïŒã
@jackmccloyãã...ç§ã¯é¢æ°ã®å®è£ ããã¹ãŠã®äººã®èŠä»¶ã§ãã£ãŠã¯ãªããªãããšã«åæããŸãã ãããã人ã ããµããŒãããããšããŠããããŸããŸãªãŠãŒã¹ã±ãŒã¹ãããã€ãããããã«æããããããã³ãŒã«ããã¯ã·ã¹ãã ã¯ããã¹ãŠã®äººãç¬èªã®ãŠãŒã¹ã±ãŒã¹ãã«ã¹ã¿ãã€ãºããããã®æ¡åŒµæ§ãæäŸããããã®åªããæ¹æ³ã®ããã§ãã
ãããã幞ããªéããé£ãããããšããå¿é ãåãããããã«ãç§ã¯ä»¥äžããå§ãããŸãïŒ
storydData.category
ãæååãåãå
¥ããããã«ããŸãããã®å Žåãã«ããŽãªã¯æäžäœã®ã«ããŽãªã«ãªããŸããstorydData.category
ãé
åãåãå
¥ããé
åå
ã®èŠçŽ ãã«ããŽãªãžã®ãã¹ã§ãããšããŸãã// given
storydData.category = ["grand parent", "parent", "story category"];
// category tree would look like:
categories = {
"grand parent": {
"parent": {
"story category": /* the story lives here */
}
}
};
åæ§ã«ã䞊ã¹æ¿ãã«ã€ããŠã¯ãããã©ã«ãã§ããã©ã«ãã®æŠç¥ïŒééããªãã¢ã«ãã¡ïŒãââãµããŒãã§ããŸããå¿ èŠã«å¿ããŠãä»ã®äºåã«äœæããã䞊ã¹æ¿ãæŠç¥ïŒãªããžã§ã¯ãã®åœ¢ç¶ã«åºã¥ã䞊ã¹æ¿ããã¡ã¿ããŒã¿ã®äžŠã¹æ¿ãã€ã³ããã¯ã¹ãªã©ïŒãæäŸã§ããŸãã
@ndelangenãããåé²ãããéãšããŠäœãèŠãŠããŸããïŒ èª°ããããã«åãçµãã§ããŸããïŒ ããã§ãªãå Žåã¯ãé±æ«ã«ãããè©ŠããŠã¿ãŠãã ãã
誰ããäœæ¥ãéå§ãããã®è§£æ±ºçãå®è¡å¯èœã§ããããšã«æ°ä»ãããã PR needed
ã©ãã«ãåé€ããŸãã ãããã£ãŠãããã¯çŸåšããŒããããäžã«ãããŸããããŸã äœæ¥ã¯è¡ãããŠããŸããã
ããªãããããå§ãããã®ãªããããã¯å€§æè¿ã§ãïŒ
@jackmccloyãããããã°ããã®äœåã«ãåå ããŠ
@UsulPro 100ïŒ ãç§ã¯ããã«ã€ããŠè奮ããŠããã§ãããã æ¥ææ¥ã®ååŸïŒãã¥ãŒãšãŒã¯æéïŒã«å®éã«èŠãŠã¿ãäºå®ã§ãã åæã«ãªã³ã©ã€ã³ã«ãªãå Žåã¯ãlmkãšã³ã³ããSlackã«ç§»åã§ããŸãã ãã以å€ã®å Žåã¯ãå°ãæãäžããåŸãããã€ãã®èããããã«æçš¿ããŸã
@ jackmccloy @ usulproç§ãããã«åãçµãããšã«ééããªãèå³ããããŸãã
@theinternedããã¯çŽ æŽãããããšã§ãïŒ ãããã§æ¥ç¶ããŸããïŒ
@UsulProç³ãèš³ãããŸããâæªãèã®ã€ã³ãã«ãšã³ã¶ãç§ã®å®¶åºã襲ããŸããã
éææ¥ã«ä»äºã§ããã¯ã®æ¥ãè¿ã¥ããŠããŸããããããããã«åãçµãäºå®ã§ãã å§ããæ©äŒã¯ãããŸãããïŒ Slackã§åæã§ããã°å¹žãã§ãã ç§ã¯SBãã£ã³ãã«ã«ããŸãã
1ã¬ãã«ã®ãã¹ãã ããå¿ èŠãªå Žåã¯ã React Storybook AddonChaptersãããŒãºã«åãå¯èœæ§ããããŸãã
@ igor-dvã®ã¹ããŒãªãŒéå±€ã®åªããå®è£ ã®æåã®ããŒãžã§ã³ããªãªãŒã¹ããŸãããããåºãã³ãã¥ããã£ã«ãªãªãŒã¹ããåã«ã¢ã«ãã¡çãæ¹åã§ããããã«ãã¢ã«ãã¡çã«é¢ãããã£ãŒãããã¯ããåŸ ã¡ããŠããŸãã
https://gist.github.com/shilman/947a3d1d4cfdf5c3a8bb06d3d4eb84cf
@ 1i1it @andrubot @arunoda @atnovember @danielbartsch @franzihubrick @hadfieldn @iaanvn @imsnif @isuvorov @jackmccloy @joeruello @johnnyghost @lnmunhoz @majapw @markopavlovic @mystetskyivlad @mzedeler @ndelangen @nirhart @ noahprince22 @revolunet @sethkinast @theinterned @thesisb @travi @usulpro @yangshun @zeroasterisk @zvictor
ã¹ããŒãªãŒã®éå±€ã§æ°ä»ããã¡ãã£ãšããçïŒ
ãã£ã¬ã¯ããªã«ãµããã£ã¬ã¯ããªããããã©ããã«å¿ããŠããã£ã¬ã¯ããªãã¯ãªãã¯ããçµæãå€ãããŸãã
ãµããã£ã¬ã¯ããªãããå Žåããã©ã«ãã¯å±éãããŸãããã¹ããŒãªãŒã¬ãã«ã§ããŠã³ããŠããå Žåãã¹ããŒãªãŒã¯èªåçã«éžæãããŸãã
ãŠãŒã¶ãŒã¯ãå
éšã®ã¹ããŒãªãŒãéžæããââã«dirã®å
容ã衚瀺ãããå ŽåããããŸãã
react-treebeard
ãã®åé¡ã«é¢é£ããŠããå¯èœæ§ããããŸã
https://github.com/alexcurtis/react-treebeard/issues/33
storybooks/react-treebeard
ã¬ãã®PRã調ã¹ã䟡å€ããããããããŸãã
以åã®å®è£
ã§ã¯ã kind
éžæãããšãæåã®ã¹ããŒãªãŒãèªåéžæãããŸããã ãããã£ãŠããã®æ©èœã¯ä¿æãããã£ãã®ã§ãã ããããéå±€ã䜿çšãããšããã§ã«ãã°ã®ããã«èŠããŸãã
åçã§ã¯ã Component 5
ã¯ãã£ã¬ã¯ããªã§ã¯ãªãã kind
ã§ãã
å®éãç§ããã®æ¯ãèãã奜ãã§ã¯ãããŸãã...
é·ã話ã®ååã¯å¥åŠã«æãè¿ãããŸã
ãµã€ãããŒã®ãµã€ãºãéåžžã«å°ãããããšããã¬ãã¥ãŒãã€ã³ããªãŒããŒãããŒããŸãã
éå±€ãã©ã«ããåã ã®ã¹ããŒãªãŒãšçµã¿åãããããšãã§ããŸããïŒ ãããã¬ãã«ã«æ¬²ããã¹ããŒãªãŒãããã€ããããŸãããã以å€ã®å Žåã¯ãåäžã®ã¢ã€ãã ãå«ããã©ã«ããŒããããŸãã
çŸåšãããè¡ãå Žå
storiesOf('Something', module).add('top story');
storiesOf('Something.Chapter', module).add('substory');
次ã«ããSomethingãã®2ã€ã®ãšã³ããªãäœæããŸãã1ã€ã¯ãã©ã«ããæã¡ããã1ã€ã¯ã¢ã€ãã ãæã¡ãŸãã
@TheSisb ãããããšããå ¬åŒãªãªãŒã¹ã§ä¿®æ£ãããŸãã
@psimyn ãçŸåšã®å®è£
ã§ã¯äžå¯èœã§ãããå€æŽãããå¯èœæ§ããããŸãã @ UsulProã¯æåã®PRã§ãããã«ã€ããŠèšåããŸããã
IMOããã¯è¯ãåäœã§ã¯ãããŸããïŒãããŠããè€éã«ãªããŸãïŒã ãã¹ãŠã®IDEãšæ¯èŒãããšãåå空éïŒdirs / folder / packagesïŒãããããããã®åå空éïŒãŸãã¯ãã®è¿ãïŒã«åãååã®ã¢ã€ãã ãå«ãŸããŠããå¯èœæ§ããããŸãã
ãšã«ããããããã³ãã¥ããã£ã®æãŸããæ¯ãèãã§ãããªãã°ãããã¯å€æŽãããã¹ãã§ãããããç§ã¯ããããªãªãŒã¹ã®ã¹ããããŒã«ãªãããšãæãŸãªã=ïŒ
ããã¯ç§ãå¿ èŠãšããæ£ç¢ºãªè§£æ±ºçã§ã!!! ããããšã+1
@psimynæ©èœã説æããæ°ããåé¡ãéããŠãã ããã ãã®åé¡ã¯ã 3.2.0
ãªãªãŒã¹ã«ããããŸããªãçµäºããŸãã
æ°ããCSFãã©ãŒãããã§è€æ°ã¬ãã«ã®ãã¹ããå¯èœã«ãªããŸãããïŒ
@ gaurav5430ãã°ããã®éå¯èœã§ãããããã§ç§ãã¡ã®äŸãèŠãŠãã ããïŒ
CSFïŒ
import React from 'react';
import { linkTo } from '@storybook/addon-links';
import { Welcome } from '@storybook/react/demo';
export default {
title: 'Other/Demo/Welcome',
component: Welcome,
};
export const ToStorybook = () => <Welcome showApp={linkTo('Other/Demo/Button')} />;
ToStorybook.storyName = 'to Storybook';
ãã@ndelangen
ãããã§ç§ã¯ãããããããååŸããŸãïŒ https ïŒ//storybook.js.org/docs/basics/writing-stories/#story -hierarchy
ç§ã欲ããã®ã¯ãããã©ã«ãã®ãšã¯ã¹ããŒãã¿ã€ãã«ã ãã§ãªãã story.name
åºã¥ããŠãµããã©ã«ããŒãäœæããæ©èœã ãšæããŸãã
export default {
title: 'Other/Demo/Welcome',
component: Welcome,
};
export const ToStorybook = () => <Welcome showApp={linkTo('Other/Demo/Button')} />;
ToStorybook.story = { name: 'to/Storybook' };
Other/Demo/Welcome/To/Storybook
ãšããŠè¡šç€ºãããŸã
äžèšã®åé¡ã®åé¿çã¯ãè€æ°ã®ã¹ããŒãªãŒãã¡ã€ã«ãäœæããããããã«æ£ããéå±€ã䜿çšããŠããã©ã«ãããšã¯ã¹ããŒãããããšã ãšæããŸãã
one.stories.js
ïŒ
export default {
title: 'Other/Demo/Welcome/One',
component: Welcome,
};
export const ToStorybookOne = () => <Welcome showApp={linkTo('Other/Demo/Button')} />;
ãããŠtwo.stories.js
export default {
title: 'Other/Demo/Welcome/Two',
component: Welcome,
};
export const ToStorybookTwo = () => <Welcome showApp={linkTo('Other/Demo/Button')} />;
ããããã°ãäž¡æ¹ã®ã¹ããŒãªãŒãã¹ããŒãªãŒããã¯ã®ãã©ã«ããŒæ§é ã«æåŸ ã©ããã«è¡šç€ºãããŸãã
@ gaurav5430ã¯æšå¥šããã䜿çšæ³ã§ãããåé¿çã§ã¯ãããŸããã ð
@ gaurav5430ã¯æšå¥šããã䜿çšæ³ã§ãããåé¿çã§ã¯ãããŸããã ð
ã¯ãããããã®ãã¡ã€ã«ã¯äž¡æ¹ãšãåãã³ã³ããŒãã³ãã®ç°ãªãç¶æ çšã§ãããããç§ã¯ãããè¡ãã®ããããã£ãŠããŸããã ç§ã®å Žåãã³ã³ããŒãã³ãã«ã¯2ã€ã®ã¡ã€ã³ç¶æ ãšããããã®2ã€ã®ã¡ã€ã³ç¶æ ã«åºã¥ãè€æ°ã®ãµãç¶æ ããããŸãã éåžžãã³ã³ããŒãã³ãã®ãã¹ãŠã®ç¶æ ãåããã¡ã€ã«ã«ä¿æããŸããããã®å Žåãã¹ããŒãªãŒã®éå±€çšã«å¥ã®ãã¡ã€ã«ãå¿ èŠã«ãªããŸãã
æãåèã«ãªãã³ã¡ã³ã
ãããã¿ããªïŒ
ãã®ãããªæ©èœã¯è¿ãå°æ¥èšç»ãããŠããªããšããäºå®ã«ãããããããããã¯Storybook AddonsAPIãä»ããŠãã®ãããªåäœãååŸã§ããªãããšãæå³ãããã®ã§ã¯ãããŸããã
ããããã®ãããªã¢ããªã³ã§ãïŒ
ã¹ããŒãªãŒããã¯ã®ç«
ã¹ããŒãªãŒããã¯ã®ç«
ïŒãµãïŒã¹ããŒãªãŒã«ç¡å¶éã®ã¬ãã«ã®ãã¹ããè¿œå ããŸã
ãã¹ãã¬ãã«ããã1ã€è¿œå ããã«ã¯ãã¹ããŒãªãŒã«
.chapter(name)
ãè¿œå ããŸããç¹åŸŽ
Knobs
ãaddWithInfo
ããã³ãã®ä»ã®ã¢ããªã³ãšäºææ§ããããŸãstoryDecorator
ã䜿çšããŠãã¹ãŠã®ç« ãæãè¿ããŸããã¢ããŒãž
èšç»
äŸ
ãã£ãŒãããã¯ã¯å€§æè¿ã§ãïŒ :)