Feliz: v2 рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдкрдХреА рд░рд╛рдп?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдорд╛рд░реНрдЪ 2021  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Zaid-Ajaj/Feliz

рд╣реИрд▓реЛ рджреЛрд╕реНрдд,
Feliz (рдФрд░ Feliz.Bulma рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ) рдХреЗ рджреИрдирд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рд╣рдореЗрд╢рд╛ prop.children рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрджрд╕реВрд░рдд рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ v2 рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЖрдкрдХреА рд░рд╛рдп рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реЛрдЧрд╛:

Html.div [
    prop.className "myClass"
    Html.div "Nested"
]

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рд╕рдВрднрд╡ рднреА рди рд╣реЛ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдлреЗрд▓рд┐рдЬ.рдЗрдВрдЬрд┐рди рдкрд░ @alfonsogarciacaro рдХрд╛ рдХрд╛рдо рджреЗрдЦрд╛ рдФрд░ рдПрдХ рд╣реА рд╕реНрддрд░ рдкрд░ рдкреНрд░реЙрдкреНрд╕ рдФрд░ рдмрдЪреНрдЪреЛрдВ рдХрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рд▓реБрднрд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ

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

рдЪрд░реНрдЪрд╛ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖рдХ рдмрджрд▓рдиреЗ рдХреА рдпрд╛рдЪрд┐рдХрд╛? рдореИрдВ

@Dzoukr рдЗрд╕ рдкрд░ рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рд╣реЛ рдЪреБрдХреА рд╣реИ - рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред

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

@ рдЬрд╝реИрдж-рдЕрдЬрд╛рдЬ рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд░рд╣реЗрдВрдЧреЗ? рдлреЗрд▓рд┐рдЬ рдХреА рддрд░рд╣редрдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдпрд╛ рдХреБрдЫ рдФрд░? рддреЛ рдореБрдЦреНрдп рдлрд╝реЗрд▓рд┐рдЬрд╝ рдиреЗрдорд╕реНрдкреЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкрддрд▓реА рдкрд░рдд рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдзрд┐рдХ рд░рд╛рдп рд╡рд╛рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рдкреНрд░реЛрдк рдЧреНрд░реБрдкрд┐рдВрдЧ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рдкрд╕рдВрдж рд╣реИ:

Html.div [
    props [
        prop.className "myClass"
    ]
    Html.div "Nested"
]

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

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

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

рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрдореЗрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдореИрдВ рдЗрд╕реЗ рдмреЗрдХрд╛рд░ рднреА рдХрд╣реВрдВрдЧрд╛) рдХреНрдпреЛрдВрдХрд┐ рддрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Attribute = Properties = ReactElement ред рдореВрд▓ рд░реВрдк рд╕реЗ, рд╕рдм рдХреБрдЫ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ...

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

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реВрдВред

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

рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╕реБрдирддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди _only_ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдФрд░ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд╕рд╛рде div рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВред рдЬрд┐рд╕ рдкрд░ рдореЗрд░реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд▓рд┐рдЦ тАЛтАЛрд░рд╣рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреБрдЫ рдпрд╛ рдЗрд╕реА рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рджреЗрддрд╛ рд╣реИ

div [ "myClass" ] [
  Html.div "nested"
]

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рд╡реЗ рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рдЕрдиреНрдп рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд╕рд╛рдордЧреНрд░реА рдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдФрд░ рднреНрд░рдорд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдХрдо рдХрд┐рдП рдмрд┐рдирд╛ рдПрдл # рдХреЗ рд╕рд╛рде рдХрдВрдкреЛрдЬрд┐рдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдореГрдд рдЖрд╕рд╛рди рд╣реИред

[<AutoOpen>]
module MuiExtensions

open Feliz
open Feliz.MaterialUI

type Mui 
    with
    static member gridItem (children:seq<ReactElement>):ReactElement = 
        Mui.grid [
            grid.item true
            grid.children children
        ]

    static member gridItem (props:seq<IReactProperty>):ReactElement = 
        Mui.grid [
            grid.item true
            yield! props
        ]

рд╕рднреА рд░рд╛рдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рд╕рд┐рд░реНрдл рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред ЁЯСН рдореЗрд░реЗ рдЕрдкрдиреЗ рд╕рд╣рд╛рдпрдХ рднреА рд╣реИрдВ рдЬреИрд╕реЗ divClassed "myClass" [ children ] рдпрд╛ рддреЛ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдЯрд╛рдЗрдк рдкреНрд░рддрд┐рдмрдВрдз рд░рдЦрддреЗ рд╣реБрдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╣рдордиреЗ рд░рд┐рдПрдХреНрдЯ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рд╕реЗ рдЕрднрд┐рдХрд▓рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ:

div {
    className "myClass"

    div { ... }
}

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

// Would probably need to make the base builder generic so we can use a type restriction and define this DU for
// each element so we can properly restrict what types are valid as primatives
type ReactBuilderChild =
    | Child of ReactElement
    | Children of ReactElement list
    | Float of float
    | Int of int
    | String of string
    | None

    member this.GetChildren () =
        match this with
        | ReactBuilderChild.Children children -> children
        | _ -> failwith "Cannot combine children with primitive values."

type ReactBuilderState =
    { Children: ReactElement list
      Props: IReactProperty list } 

[<AbstractClass;NoEquality;NoComparison>]
type ReactBuilder () =
    [<EditorBrowsable(EditorBrowsableState.Never)>]
    member _.Yield (x: ReactElement) = { Children = ReactBuilderChild.Child x; Props = [] }
    [<EditorBrowsable(EditorBrowsableState.Never)>]
    member _.Yield (x: ReactElement list) = { Children = ReactBuilderChild.Children x; Props = [] }
    [<EditorBrowsable(EditorBrowsableState.Never)>]
    member _.Yield (x: float) = { Children = ReactBuilderChild.Float x; Props = [] }
    ...
    [<EditorBrowsable(EditorBrowsableState.Never)>]
    member _.Yield (x: unit) = { Children = ReactBuilderChild.None; Props = [] }

    [<EditorBrowsable(EditorBrowsableState.Never)>]
    member _.Combine (state: ReactBuilderState, x: ReactBuilderState) = 
        { Children = (state.Children.GetChildren()) @ (x.Children.GetChildren()); Props = state.Props @ x.Props }

    [<EditorBrowsable(EditorBrowsableState.Never)>]
    member _.Zero () = { Children = ReactBuilderChild.None; Props = [] }

    [<EditorBrowsable(EditorBrowsableState.Never)>]
    member this.For (state: ReactBuilderState, f: unit -> ReactBuilderState) = this.Combine(state, f())

    [<CustomOperation("className")>]
    member _.className (state: ReactBuilderState, value: string) =
        { state with Props = (Interop.mkAttr "className" value)::state.Props }

    [<CustomOperation("children")>]
    member _.children (state: ReactBuilderState, value: ReactElement list) =
        { state with Children = state.Children @ value }

    abstract Run : ReactBuilderState -> ReactElement

[<NoEquality;NoComparison>]
type DivBuilder () =
    inherit ReactBuilder()

    [<EditorBrowsable(EditorBrowsableState.Never)>]
    member _.Run (state: ReactBuilderState) = 
        match state with
        | { Children = ReactBuilderChild.None; Props = props } -> Interop.createElement "div" props
        | { Children = ReactBuilderChild.Children children } -> Interop.reactElementWithChildren "div" children
        | { Children = ReactBuilderChild.Float f } -> Interop.reactElementWithChild "div" f
        | _ -> ...

let div = DivBuilder()

рдореИрдВ рдЬрд┐рд╕ рдЪреАрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдлреИрдмрд▓ рдХреЛ рдХрд┐рд╕реА рднреА/рд╕рднреА рд╕реАрдИ рдкреНрд▓рдВрдмрд┐рдВрдЧ рдХреЛ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╕рд╛рде рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЦреЛрдЬрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдпрд╛ рдЬрд╛рдП (рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ prop рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реИ)ред

рдЪрд░реНрдЪрд╛ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖рдХ рдмрджрд▓рдиреЗ рдХреА рдпрд╛рдЪрд┐рдХрд╛? рдореИрдВ

@Dzoukr рдЗрд╕ рдкрд░ рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рд╣реЛ рдЪреБрдХреА рд╣реИ - рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред

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

@ рдЬрд╝реИрдж-рдЕрдЬрд╛рдЬ рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд░рд╣реЗрдВрдЧреЗ? рдлреЗрд▓рд┐рдЬ рдХреА рддрд░рд╣редрдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдпрд╛ рдХреБрдЫ рдФрд░? рддреЛ рдореБрдЦреНрдп рдлрд╝реЗрд▓рд┐рдЬрд╝ рдиреЗрдорд╕реНрдкреЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкрддрд▓реА рдкрд░рдд рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдзрд┐рдХ рд░рд╛рдп рд╡рд╛рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдореБрдЭреЗ рдкреНрд░реЛрдк рдЧреНрд░реБрдкрд┐рдВрдЧ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреБрдЫ рдкрд╕рдВрдж рд╣реИ:

Html.div [
    props [
        prop.className "myClass"
    ]
    Html.div "Nested"
]

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

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

@zanaptak рдореБрдЭреЗ рд╡рд╣ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рдкрд╕рдВрдж рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдкреНрд░реЙрдкреНрд╕ рдмрдЪреНрдЪреЛрдВ рдХреА рддрд░рд╣ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдШреЛрдВрд╕рд▓рд╛ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред


рд╣реЗрд▓реНрдкрд░реНрд╕ рдФрд░ рдбрдмрд▓ рд▓рд┐рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╡рд┐рд╖рдп рдкрд░

рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрдк рдЙрдкрдпреЛрдЧ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рд╕рд┐рд░реНрдл div+class . рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИ

let inline withProps elementFunction props (children: #seq<ReactElement>) =
    (prop.children (children :> ReactElement seq))
    :: props
    |> elementFunction

let myDiv = withProps Html.div

myDiv [ prop.className "myClass" ] [
    Html.div "Nested"
]

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдХреЗ рд╕рд╛рде "рдбрдмрд▓ рд▓рд┐рд╕реНрдЯ"-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

let inline (@+) elementFunction props =
    fun children -> withProps elementFunction props children

let inline (@++) elementFunction prop =
    fun children -> withProps elementFunction [ prop ] children

Html.div @+ [ prop.className "myClass" ]
<| [ Html.div "nested" ]

Html.div @++ prop.className "myClass"
<| [ Html.div "nested" ]

рдпрд╣ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╡рд┐рд╖рдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ "рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ" рд╡рд╣ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП Feliz.Engine рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ Feliz.Engine.React рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЛ рд╕рдорд╛рди "рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА" рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рдПрдХ рд╣реА рд╕реНрддрд░ рдкрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реВрдЪреА рдореЗрдВ рднреА рдкреНрд░реЙрдкреНрд╕ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛):

// Dependencies:
// - Fable.React
// - Feliz.Engine.Event dependencies

open Fable.Core
open Fable.Core.JsInterop
open Feliz
open Fable.React

type Node =
    | El of ReactElement
    | Style of string * string
    | Prop of string * obj
    member this.AsReactEl =
        match this with
        | El el -> el
        | _ -> failwith "not an element"

let private makeNode tag nodes =
    let props = obj()
    let style = obj()
    let children = ResizeArray()
    nodes |> Seq.iter (function
        | El el -> children.Add(el)
        | Style(k, v) -> style?(k) <- v
        | Prop(k, v) -> props?(k) <- v
    )
    if JS.Constructors.Object.keys(style).Count > 0 then
        props?style <- style
    ReactBindings.React.createElement(tag, props, children) |> El

let Html = HtmlEngine(makeNode, str >> El, fun () -> El nothing)

let Svg = SvgEngine(makeNode, str >> El, fun () -> El nothing)

let prop = AttrEngine((fun k v -> Prop(k, v)), (fun k v -> Prop(k, v)))

let style = CssEngine(fun k v -> Style(k, v))

let ev = EventEngine(fun k f -> Prop("on" + k.[0].ToString().ToUpper() + k.[1..], f))

рдкрд░реАрдХреНрд╖рдг:

let myEl = // Node
    Html.div [
        prop.className "myClass"
        Html.div "Nested"
    ]

let myElAsReactEl = myEl.AsReactEl // ReactElement 

рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдЬреАрдм рдбрдмрд▓ рд▓рд┐рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рддреЗ рд╣реИрдВред

@zanaptak рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рд╕реВрдЪрд┐рдпрд╛рдБ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, div [ "class" ] [ ] рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдерд╛ рдЬреЛ рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ рдерд╛ред рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдРрд╕реЗ рдШрдЯрдХ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ

Todo.List [ for item in items -> Todo.Item item ]

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рддреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХреЗ рдЙрддрдирд╛ рдкрдардиреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд╕реЗ рдХрднреА-рдХрднреА _flow_ рджреВрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред Fable.React рдХреЗ DSL рдХреЗ рд╕рд╛рде рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдЪреАрдЬреЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ _рдерд┐рдВрдХ_ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ред рдлрд╝реЗрд▓рд┐рдЬрд╝ рдЗрд╕реЗ children рдХреЗ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рджреЛ рд╕реНрддрд░реЛрдВ рдХреА рдХреАрдордд рдкрд░ рдареАрдХ рдХрд░рддрд╛ рд╣реИред

рд╕рдЪ рдХрд╣реВрдВ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЪрд╛рдВрджреА рдХреА рдЧреЛрд▓реА рдХреНрдпрд╛ рд╣реИред рдЬреИрд╕реЗ @alfonsogarciacaro рдиреЗ рдХрд╣рд╛

рдпрд╣ рдПрдХ рдкреЗрдЪреАрджрд╛ рд╡рд┐рд╖рдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ "рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ" рд╡рд╣ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░:

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдо рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗ? рдлреЗрд▓рд┐рдЬ рдХреА рддрд░рд╣редрдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдпрд╛ рдХреБрдЫ рдФрд░? рддреЛ рдореБрдЦреНрдп рдлрд╝реЗрд▓рд┐рдЬрд╝ рдиреЗрдорд╕реНрдкреЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкрддрд▓реА рдкрд░рдд рдХрд╛ рд▓рдХреНрд╖реНрдп рд░рдЦрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдзрд┐рдХ рд░рд╛рдп рд╡рд╛рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

рдЙрд╕ рдиреЗ рдХрд╣рд╛, @alfonsogarciacaro рджреНрд╡рд╛рд░рд╛ Feliz.Engine рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдФрд░ DSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рд▓рдЧреЗред

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

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

Dzoukr picture Dzoukr  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cmeeren picture cmeeren  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

theimowski picture theimowski  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

7sharp9 picture 7sharp9  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

l3m picture l3m  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ