Storybook: рд╕рдмрд╕реНрдЯрд░реАрдЬ/рдкрджрд╛рдиреБрдХреНрд░рдо

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  79рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: storybookjs/storybook

"рд╕рдмрд╕реНрдЯрд░реАрдЬ" рдпрд╛ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╣реА рд░реЗрдкреЛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд┐рднрд┐рдиреНрди рдорд┐рдиреА "рдРрдкреНрд╕" рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди ui.core.foo рдФрд░ ui.core.bar рдЬреИрд╕реЗ рдирд╛рдо рд╡рд╛рд▓реЗ рд╕реНрдЯреЛрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛:

тФФтФАтФА core
    тФЬтФАтФА bar
    тФФтФАтФА foo

рдиреЛрдбреНрд╕ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдкрддрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рдеред

stories feature request merged ui

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣реЗ рд▓реЛрдЧреЛрдВ!

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Storybook Addons API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ

рдпрд╣рд╛рдБ рдПрдХ рдРрд╕рд╛ рдРрдбрдСрди рд╣реИ:



рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЕрдзреНрдпрд╛рдп

рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЕрдзреНрдпрд╛рдп

(рдЙрдк) рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдЕрд╕реАрдорд┐рдд рд╕реНрддрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ

preview

рдПрдХ рдФрд░ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╕реНрддрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЕрдкрдиреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ .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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдбреЗрдореЛ рдкреЗрдЬ

рдкрд░рд┐рдпреЛрдЬрдирд╛

рдЙрджрд╛рд╣рд░рдг


рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА! :)

рд╕рднреА 79 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╣рдорд╛рд░реА рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк "ui.core", "ui.app" рдЬреИрд╕реЗ рдбреЙрдЯ рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдиреА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдХрд╣рд╛рдирд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рджреЛ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЙрдиреНрдлрд┐рдЧ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рд╡реИрд╕реЗ рднреА рдпрд╣ рдПрдХ рдЪрд░рдо рдорд╛рдорд▓рд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ, рдФрд░ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдмрд╕ рдПрдХ рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдЙрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ рдЪрд▓рд╛рдКрдВрдЧрд╛ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ ...

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЛ рдПрдХрд╛рдзрд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ ... рдФрд░ рдлрд┐рд░ рдирд╛рдорд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рдЯреЙрдЧрд▓ рдХрд░рдирд╛, рд╢рд╛рдпрдж рдкреБрдирдГ рд▓реЛрдб рдХрд░рдирд╛ ...

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд┐рдЧ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЬрдм рдЖрдкрдХреА рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓ рдЕрдиреНрдп рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ "рд▓реЛрдб" рдХрд░рддреА рд╣реИ, рдФрд░ рдпрд╣ рд╕рд╛рдЗрдбрдмрд╛рд░ рдиреЗрд╡реА рдХреЗ рдКрдкрд░ рдпрд╛ рдиреАрдЪреЗ рд╕рд╛рдЗрдбрдмрд╛рд░ рдЖрдЗрдЯрдо рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╡реИрд╕реЗ рднреА - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдбрд╝реЗ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ (рдпрд╛ рдирд╣реАрдВ), рдпрд╣ рдереЛрдбрд╝реЗ рдкрд╛рдЧрд▓ рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдХреНрд▓рд╛рд╕рд┐рдХ/рдкрджрд╛рдиреБрдХреНрд░рдо рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЯреЙрдЧрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдПрдХ рдмрд╣реБрдд рд╣реА рдореВрд▓реНрдпрд╡рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдХрдИ рдРрдк рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╣реА рдРрдк рдХреЗ рднреАрддрд░ рдШрдЯрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рд▓рд┐рдПред

рдореБрдЭреЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЖрдХрд╛рд░ рджреЗрдиреЗ рдореЗрдВ рдХреЛрдИ рднреА рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЬреЛ рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдпрд╣ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред

@travi рд╣рдорд╛рд░рд╛ рдПрдХ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╢реНрд░реЗрдгреА рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рдмреЙрдХреНрд╕ рдХреЗ рдареАрдХ рдиреАрдЪреЗ рдПрдХ рдбреНрд░реЙрдк рдбрд╛рдЙрди рдореЗрдиреВ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред

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 рдХреЛ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╕реНрддрд░ рдХрд╛ рд╕рдорд░реНрдерди рдкрд╕рдВрдж рдЖрдПрдЧрд╛ред

201 рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

+1

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ!

+1

+1

+1

+1

+1

+1

рдЕрд░реЗ @arunoda , рдХреНрдпрд╛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдореЛрд░реНрдЪреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ?

рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдРрдк рд╣реИ рдЬреЛ рджреЛ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмреАрдЪ рдЯреЙрдЧрд▓ рдХрд░рддрд╛ рд╣реИ?

+1 рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: /

+1

+1

+1

+1

+1

+1

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдкрдХрд╛ рдРрдк рдмрдврд╝рддрд╛ рд╣реИ, рдШрдЯрдХреЛрдВ рдХреА рд╕реВрдЪреА рднреА рдмрдврд╝рддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдШреЛрдВрд╕рд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред 1 рдФрд░ рд╕реНрддрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ

+1

рд╣реЗ рд▓реЛрдЧреЛрдВ!

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Storybook Addons API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ

рдпрд╣рд╛рдБ рдПрдХ рдРрд╕рд╛ рдРрдбрдСрди рд╣реИ:



рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЕрдзреНрдпрд╛рдп

рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЕрдзреНрдпрд╛рдп

(рдЙрдк) рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдЕрд╕реАрдорд┐рдд рд╕реНрддрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ

preview

рдПрдХ рдФрд░ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╕реНрддрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЕрдкрдиреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ .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 рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЪреИрдкреНрдЯрд░ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

@UsulPro рдареАрдХ рд╡рд╣реА рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ

рдирдорд╕реНрддреЗ! @UsulPro (рдЬрд┐рд╕рдиреЗ storybook-chapters рд╕рд╛рде рдПрдХ рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рдХрд┐рдпрд╛) рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛, рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдВ рдЬреЛ рдЖрдкрдХреЛ preview рдореЗрдВ рдПрдХ рдмрдЯрди рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдореВрд╣реЛрдВ рдХреЗ рдмреАрдЪ рдЯреЙрдЧрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред related components view рдмреАрдЪ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ detailed components view a la рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИ рдФрд░ рд╣рдо рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ рдЯрди рд╣реИред рдореИрдВ рдЗрд╕реЗ рдХрдИ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╣рд▓реНрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдорд╛рдиреВрдВрдЧрд╛:

рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - https://github.com/majapw/storybook-addon-toggle

рдореИрдВрдиреЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд▓реЛрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП @UsulPro рдХреЗ рднрдпрд╛рдирдХ storybook-chapters рдкрд░ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЗ рдШрдЯрдХ рдлрд╝рд╛рдЗрд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдЧрд╛: рд╕реНрдЯреЛрд░реАрдмреБрдХ-рдлрд╛рдЗрд▓рдкрд╛рде-рдЕрдзреНрдпрд╛рдп

рдЗрд╕рдХреЗ рд╕рд╛рде, рдореИрдВ рдЕрдкрдиреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ _stories рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдЗрдирд▓рд╛рдЗрди рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЛрдбрд░ рд╕рднреА рдХрд╣рд╛рдиреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдвреВрдВрдврддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдиреЗрд╡рд┐рдЧреЗрд╢рдирд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдореИрдк рдХрд░рддрд╛ рд╣реИред

рдЧрд░реНрдордЬреЛрд╢реА рднрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ!

@hadfieldn рдХреЗ storybook-filepath-chapters рдХреЛ рджреЗрдЦрдХрд░ рд╡рд╛рдХрдИ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛! рдореИрдВ

рдореБрдЭреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ storybook-addon-toggle , рдХрд┐ рди рдХреЗрд╡рд▓ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдмрд▓реНрдХрд┐ рд╢реАрд░реНрд╖ рдореЗрдВ рднреА рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдЕрд╕рд▓ рдореЗрдВ, рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЪреБрдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рдПрдбреЙрдиреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рднреАрддрд░ рд░рд╣рдирд╛)ред рд╢рд╛рдпрдж рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ (рдЬреИрд╕реЗ @majapw) рдпрд╛ рдПрдбрдСрди рдкреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдЕрднреА рддрдХ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдкрд░ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди storybook-chapters рдПрдбрдСрди рдореЗрдВ рдЕрдм рдПрдХ рдПрдкреАрдЖрдИ рд╣реИ , рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ:

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>);
    });

рддреЛ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ 3 рд╕реЗрдЯ рд╣реИрдВ: Choose Your Side , Heroes Lightside рдФрд░ Heroes Darkside ред рдЕрдВрддрд┐рдо рджреЛ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдореЗрдВ рдореИрдВ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдРрдбрдСрди рдкреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ

-

рд╕рдХреНрд╖рдо/рдЕрдХреНрд╖рдо рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдЖрдк рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдо рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкреВрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ

рд╣рдо рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЙрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╕рдореБрджрд╛рдп рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

  • рдпреВрдПрдХреНрд╕ рд╡рд╛рд░
  • рд╕рдореВрд╣реЛрдВ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

UX рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ: http://multi-level-push-menu.make.rs/demo/basichtml/basichtml.html

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореИрдВ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ .. рд╣рдо рдлрд╝рд╛рдЗрд▓ рдЕрдиреНрд╡реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдорд┐рд░рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://github.com/sm-react/storybook-chapters/issues/1#issue -215446017

@ndelangen рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреА рд╣реИ (рдХрдо рд╕реЗ рдХрдо рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ?) рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╣рд╛рдиреА рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ (рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреНрд╖реЗрддреНрд░/рдЖрдИрдлреНрд░реЗрдо) рдФрд░ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ (рдкреНрд░рдмрдВрдзрдХ) рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдореЗрдВ рдореВрд▓реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@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 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ: рдЕрднреА, рд╣рдорд╛рд░реА рдмрд╛рддрдЪреАрдд "рд╣рдо рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ" рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд░ рдХреЛрдИ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕реА рддрд░рд╣ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдРрдбрдСрди рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред

рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛:
рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрд╣рд╛рдиреА рдХреЛ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрд╣рд▓рд╛ рдЪрд░рдг рдЬрд╣рд╛рдВ рдПрдХ рд╢реНрд░реЗрдгреА рдЕрд╕рд╛рдЗрди рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЪрд░рдг рдЬрд╣рд╛рдВ рдПрдХ рд╢реАрд░реНрд╖рдХ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд

storiesOf('storyCategory', module).add('storyTitle', () => <Component />)

рдЖрдк рдПрдХ рд╣реА рд╢реНрд░реЗрдгреА рдореЗрдВ рдХрдИ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрд░рдЪрдирд╛ рдПрдХ рд╣рдж рддрдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреА рд╣реИ - рд╕рднреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╢реНрд░реЗрдгреА рдФрд░ рдПрдХ рд╢реАрд░реНрд╖рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╢реАрд░реНрд╖рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ "рдЙрдЪреНрдЪ рд╕реНрддрд░" рд╣реЛрддреА рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд

const storyData = {
  category: "category",
  title: "storyTitle",
}
stories.add(() => <Component />, storyData)

рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдпрдерд╛рд╡рдд рд░рд╣ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рдордЭрджрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рд╣рдо рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред storyData рд╡реИрдХрд▓реНрдкрд┐рдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╢реНрд░реЗрдгреА рдХреЗ рдХрд╣рд╛рдирд┐рдпрд╛рдВ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдмрд┐рдирд╛ рд╢реАрд░реНрд╖рдХ рд╡рд╛рд▓реА рдХрд╣рд╛рдирд┐рдпрд╛рдВ рдШрдЯрдХ рдХреЗ displayName рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╕рдореБрджрд╛рдп рдЕрдкрдиреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдП) рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреЛ stroyData рдЬреЛрдбрд╝рдХрд░ рдФрд░/рдпрд╛ (рдмреА) рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреИрдирд▓ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдХрд░ред

рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:

// 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 рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдЯреЛрд░реАрдмреБрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдпреВрдЖрдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рд╡рд┐рдЬреБрдЕрд▓ рдЯреЗрд╕реНрдЯ рдХреЗрд╕" рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдпреВрдЖрдИ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ add() рдкреНрд░рддрд┐ рд░рд╛рдЬреНрдп рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХрд╣рд╛рдиреА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ 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 рд╕реЗ рд╢реАрд░реНрд╖рдХ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдФрд░ рдЙрдк-рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдпрд╛ рдХрдИ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдШрдЯрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рдореИрдВ рдмрд╕ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдПрдХ рдмрд╛рдд рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рд╢реНрд░реЗрдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рд╢реНрд░реЗрдгреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХрд┐рд╕реА рд╢реНрд░реЗрдгреА рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реЛрдЧрд╛

рдореИрдВ @travi рд╕реЗ рд╕рд╣рдордд

рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЯрд╛рдЗрдкреЛ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

// 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 рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдЖрдЧреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рддрд╛рдХрд┐ рд╣рдо рдСрд░реНрдбрд░рд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВ, рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛! рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ _can_ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рди рдХрд┐ рдЙрдиреНрд╣реЗрдВ _must_ рд╡рд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмрд╛рдд рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдХреЛрдИ рдШрдЯрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░ рдХрд┐ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рд╕рд╣-рд╕реНрдерд┐рдд story.jsx рдлрд╝рд╛рдЗрд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╡рд╣ рдЧрд╛рд░рдВрдЯреА -
рдХрд┐ рдпрджрд┐ story.jsx рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдПрдХ рдХрд╣рд╛рдиреА рдореМрдЬреВрдж рд╣реИ - рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕реЗ рдкреВрд░реНрд╡-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╢реНрд░реЗрдгрд┐рдпреЛрдВ, imo рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡рд╡рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрд╕ рджреГрд╢реНрдп рд╕реЗ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП id рдФрд░ index рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ - рдРрд╕рд╛ рдХреБрдЫ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ

setOptions({
  categoryOrder: [
    "First Category",
    "Second Category",
    "Third Category",
});

рдЬрд╣рд╛рдВ First Category , Second Category , рдФрд░ Third Category рдХреЛ рдкрд╣рд▓реЗ, рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдФрд░ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХреЛрдИ рднреА рдЕрдиреНрдп рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рдЙрди рддреАрдиреЛрдВ рдХреЗ рдмрд╛рдж рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдШреЛрдВрд╕рд▓реЗ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

categoryOrder: [
  {
    "Atoms": [
      {
        "Buttons": []
      }
    ],
  }, {
    "Molecules": [],
}],

"рдмрдЯрди" рд╢реНрд░реЗрдгреА рд╡рд╛рд▓реА рдХрд╣рд╛рдирд┐рдпрд╛рдВ Atoms -> Buttons рдЕрдВрджрд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред "рдкрд░рдорд╛рдгреБ" рд╢реНрд░реЗрдгреА рд╡рд╛рд▓реА рдХрд╣рд╛рдирд┐рдпрд╛рдВ Atoms рдЕрдВрджрд░, Buttons (рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ) рдЖрджрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рдЕрднреА рдХреА рддрд░рд╣) рдХреА рдЧрд╣рд░рд╛рдИ рдХрд╛ рдПрдХ рд╕реНрддрд░ рдорд┐рд▓реЗрдЧрд╛, рдФрд░ рдиреНрдпреВрдирддрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЧрд╣рд░рд╛рдИ рдХрд╛ рдордирдорд╛рдирд╛ рд╕реНрддрд░ рдорд┐рд▓реЗрдЧрд╛ред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдпрд╣ рд╡реЗ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА рдЬрд┐рдирдореЗрдВ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреА рдмрдЬрд╛рдп рдЧрд╣рд░рд╛рдИ (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╕реНрддрд░ рдкрд░ рд╕реЗрдЯ) рд╣реЛрддреА рд╣реИ (рдпрд╛рдиреА рдХрд╣рд╛рдирд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдЙрдирдХреА рд╢реНрд░реЗрдгреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИрдВ - рд╡реЗ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡рд╣ рд╢реНрд░реЗрдгреА рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХрд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ)ред

@theinterned рдореИрдВ рдЖрдкрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ: рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛, рд╢рд╛рдпрдж рдмреА/рд╕реА рдореИрдВ рдиреЙрдмреНрд╕ рдПрдбрдСрди рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП, рдореИрдВ рдШрдЯрдХреЛрдВ рдФрд░ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ 1-1 рд╕рдВрдмрдВрдз рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░реА рдХрд╣рд╛рдиреА рдХреЗ рд╢реАрд░реНрд╖рдХ рдШрдЯрдХ рдХреЗ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реЛрддреЗ рд╣реИрдВ, рди рдХрд┐ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдШрдЯрдХ рд╣реЛрддрд╛ рд╣реИред

рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЬреЛ рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

const storyData = {
  category: "category",
  title: "first item",
}
stories.add(() => <Component />, storyData)
  .add(() => <Component />, {title: "second item"})
  .add(() => <Component />, {title: "third item"})

рдЬрд╣рд╛рдВ (рдП) рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдмрд╛рд╣рд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд) рдФрд░ (рдмреА) 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;
}

рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╢реНрд░реЗрдгреА рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! (рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╢реНрд░реЗрдгреА рдпрд╛ рддреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реЗ рд╕рдХрддреА рд╣реИ, рдПрдХ рд╢реНрд░реЗрдгреА рдкрде рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд░рдгреА рдпрд╛ рдПрдХ рдХреЙрд▓рдмреИрдХ рдЬреЛ рдПрдХ рд╢реНрд░реЗрдгреА рдкрде рджреЗрддрд╛ рд╣реИ)ред

рдЕрдм рдЖрдХрд╛рд╢ рдХреА рд╕реАрдорд╛!

рдЗрд╕реА рддрд░рд╣ рдХреЗ рдиреЛрдЯ рдкрд░, рд╕реЙрд░реНрдЯ рдСрд░реНрдбрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ 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 рд╣рд╛рдБ ... рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд▓реЛрдЧ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рд╕рд┐рд╕реНрдЯрдо рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕ рдЪрд┐рдВрддрд╛ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ "рдЦреБрд╢ рдкрде" рдХреЛ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ:

  1. storydData.category рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рджреЗрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╢реНрд░реЗрдгреА рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рд╢реНрд░реЗрдгреА рд╣реЛрдЧреАред
  2. рдЪрд▓реЛ 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 */
    }
  }
};
  1. рдХрд╣рд╛рдиреА рдбреЗрдЯрд╛ рдХреЛ рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рджреЗрдВ (https://github.com/storybooks/react-storybook/issues/151#issuecomment-292689536)ред
  2. рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рд╢реНрд░реЗрдгреА рд╣реИрдВрдбрд▓рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдВ рдореМрдЬреВрдж рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ (рдкрд░рдорд╛рдгреБ рдбрд┐рдЬрд╛рдЗрди, рдлрд╝реЛрд▓реНрдбрд░-рдЖрдзрд╛рд░рд┐рдд ...);

рдЗрд╕реА рддрд░рд╣ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рдгрдиреАрддрд┐ (рдЕрд▓реНрдлрд╛ рдирд┐рд╕реНрд╕рдВрджреЗрд╣) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рд╣рдо рдЕрдиреНрдп рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рд╕реЙрд░реНрдЯ рд░рдгрдиреАрддрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВ, рдореЗрдЯрд╛ рдбреЗрдЯрд╛ рдЖрджрд┐ рдореЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВ ...);

@ndelangen рдЖрдк рдЗрд╕ рдкрд░ рдЖрдЧреЗ рдХреЗ рдорд╛рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдЗрд╕рдореЗрдВ рджрд░рд╛рд░ рдбрд╛рд▓рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА

рдЬрдм рдореБрдЭреЗ рдиреЛрдЯрд┐рд╕ рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдХрд╛рдо рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рд╕рдорд╛рдзрд╛рди рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИ рддреЛ рдореИрдВ PR needed рд▓реЗрдмрд▓ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВред рддреЛ, рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░реЛрдбрдореИрдк рдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдПрдХ рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЕрддреНрдпрдзрд┐рдХ рд╕реНрд╡рд╛рдЧрдд рд╣реЛрдЧрд╛!

@jackmccloy рдпрджрд┐ рдЖрдк рдмреБрд░рд╛ рди рдорд╛рдиреЗрдВ рддреЛ рдХреНрдпрд╛ рдореИрдВ рднреА рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдБ рдФрд░ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдБ?

@UsulPro 100%, рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдБред рд░рд╡рд┐рд╡рд╛рд░ рджреЛрдкрд╣рд░ (NYC рд╕рдордп) рдкрд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрд╕реА рд╕рдордп рдСрдирд▓рд╛рдЗрди рд╣реЛрдВрдЧреЗ, рддреЛ lmk рдФрд░ рд╣рдо рдХреЙрдирд╡реЛ рдХреЛ рд╕реНрд▓реИрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛ рдореИрдВ рдпрд╣рд╛рдБ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯ рдХрд░реВрдБрдЧрд╛ рдЬрдм рдореИрдВ рдереЛрдбрд╝рд╛ рдЦреЛрджреВрдБрдЧрд╛

@jackmccloy @usulpro рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред

@theinterned рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛! рд╕реНрд▓реИрдХ рдореЗрдВ рдХрдиреЗрдХреНрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИ?

@UsulPro рдХреНрд╖рдорд╛ рдХрд░реЗрдВ - рдореЗрд░реЗ рдШрд░ рдореЗрдВ рдЦрд░рд╛рдм рдкреЗрдЯ рдлреНрд▓реВ рд╣реЛ рдЧрдпрд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреЛ рдХрд╛рдо рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╣реИрдХ рдбреЗ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рд╛ рд╣реИ? рдореБрдЭреЗ рд╕реНрд▓реИрдХ рдХреЗ рд╕рд╛рде рддрд╛рд▓рдореЗрд▓ рдмрд┐рдард╛рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред рдореИрдВ рдПрд╕рдмреА рдЪреИрдирд▓ рдореЗрдВ рд╣реВрдВред

рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрддрд░ рдХреЗ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд░рд┐рдПрдХреНрдЯ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдПрдбрдСрди рдЪреИрдкреНрдЯрд░ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдХрд╣рд╛рдиреА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ @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

рдХрд╣рд╛рдиреА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдмрд╕ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛:
рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдБ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред
рдпрджрд┐ рдЙрдкрджрд┐рд╢рд╛рдПрдВ рд╣реИрдВ рддреЛ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдпрд╣ рдХрд╣рд╛рдиреА рдХреЗ рд╕реНрддрд░ рдкрд░ рдиреАрдЪреЗ рд╣реИ рддреЛ рдХрд╣рд╛рдиреА рд╕реНрд╡рддрдГ рдЪрдпрдирд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреАред
рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрджрд░ рдХреА рдХрд╣рд╛рдиреА рдХрд╛ рдЪрдпрди рдХрд┐рдП рдмрд┐рдирд╛ рдбреАрдЖрдИрдЖрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реИред
autoselectdir

рдЕрджреНрдпрддрди:

react-treebeard рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
https://github.com/alexcurtis/react-treebeard/issues/33
storybooks/react-treebeard рд░реЗрдкреЛ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рдкреАрдЖрд░ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ kind рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреА рдкрд╣рд▓реА рдХрд╣рд╛рдиреА рд╕реНрд╡рддрдГ рдЪреБрдиреА рдЧрдИ рдереАред рддреЛ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореИрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдмрдЧ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

image

рддрд╕реНрд╡реАрд░ рдореЗрдВ Component 5 рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдПрдХ kind ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рднреА рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ ...

рд▓рдВрдмреА рдХрд╣рд╛рдиреА рдХреЗ рдирд╛рдо рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ
image

рд╕рд╛рдЗрдбрдмрд╛рд░ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдлрд▓рдХ рдореЗрдВ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
shrunk

рдХреНрдпрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдХрд╣рд╛рдирд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрдЗрдЯрдо рд╡рд╛рд▓рд╛ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ

storiesOf('Something', module).add('top story');
storiesOf('Something.Chapter', module).add('substory');

рдлрд┐рд░ рдпрд╣ 'рд╕рдордерд┐рдВрдЧ' рдХреЗ рд▓рд┐рдП 2 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рдмрдирд╛рддрд╛ рд╣реИ, рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рдФрд░ рдПрдХ рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде

@TheSisb , рдзрдиреНрдпрд╡рд╛рдж, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬ рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@psimyn , рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ .. рд▓реЗрдХрд┐рди рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ .. @UsulPro рдиреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреАрдЖрд░ рдореЗрдВ рднреА
рдЖрдИрдПрдордУ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рд▓рд╛рддрд╛ рд╣реИ)ред рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдИрдбреАрдИ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдирд╛рдорд╕реНрдерд╛рди (рдбреАрдЖрдИрдЖрд░/рдлрд╝реЛрд▓реНрдбрд░/рдкреИрдХреЗрдЬ) рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ (рдпрд╛ рдирд┐рдХрдЯ) рдореЗрдВ рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓реЗ рдХреБрдЫ рдЖрдЗрдЯрдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ..
рд╡реИрд╕реЗ рднреА, рдЕрдЧрд░ рдпрд╣ рд╕рдореБрджрд╛рдп рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЙрдкрд░ рдирд╣реАрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ =)

рдпрд╣ рд╡рд╣реА рд╕рдЯреАрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА !!! рдзрдиреНрдпрд╡рд╛рдж +1

@psimyn рдХреГрдкрдпрд╛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВ? 3.2.0 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЬрд▓реНрдж рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреА

рдирдП рд╕реАрдПрд╕рдПрдл рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЕрдм рдХрдИ рд╕реНрддрд░ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

@ gaurav5430 рдпрд╣ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ, рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ:

рд╕реАрдПрд╕рдПрдл:

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')} />;

рдЗрд╕ рддрд░рд╣, рджреЛрдиреЛрдВ рдХрд╣рд╛рдирд┐рдпрд╛рдВ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА

@ рдЧреМрд░рд╡ 5430 рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдЙрдкрдпреЛрдЧ рд╣реИ, рди рдХрд┐ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдбред рдореИрдВ

@ рдЧреМрд░рд╡ 5430 рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдЙрдкрдпреЛрдЧ рд╣реИ, рди рдХрд┐ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдбред рдореИрдВ

рд╣рд╛рдВ, рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рд╣реЛ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рдлрд╛рдЗрд▓реЗрдВ рдПрдХ рд╣реА рдШрдЯрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдШрдЯрдХ рдореЗрдВ 2 рдореБрдЦреНрдп рд░рд╛рдЬреНрдп рдФрд░ рдЙрди 2 рдореБрдЦреНрдп рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рдЙрдк рд░рд╛рдЬреНрдп рд╣реИрдВред рдЖрдо рддреМрд░ рдкрд░ рдореИрдВ рдШрдЯрдХ рдХреЗ рд╕рднреА рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рдлрд╛рдЗрд▓ рдореЗрдВ рд░рдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

shilman picture shilman  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

purplecones picture purplecones  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sakulstra picture sakulstra  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tlrobinson picture tlrobinson  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xogeny picture xogeny  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ