Material-ui: рдХреНрдпрд╛ рдХреАрдлрд╝реНрд░реЗрдо рдПрдирд┐рдореЗрд╢рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рджрд┐рд╕ре░ 2018  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mui-org/material-ui

рдореИрдВ рдЬреЗрдПрд╕рдПрд╕ рдкрд░ рдмрддрд╛рдП рдЧрдП

const MyComponentWithStyles = withStyles(() => ({
  "<strong i="7">@keyframes</strong> fadeAnimation": {
    from: {opacity: 0},
    to: {opacity: 1},
  },
  container: {
    width: "100px",
    height: "100px",
    background: "red",
    animation: "1s fadeAnimation",
  }
}))(MyComponent)

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

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

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

рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП: makeStyles рдЕрдВрджрд░ рдПрдХ рдХреАрдлрд╝реНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдЙрддреНрдкрдиреНрди рдПрдиреАрдореЗрд╢рди рдирд╛рдо makeStyles-keyframes-glowIcon-187 рдЬреИрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬрдмрдХрд┐ CSS рдирд┐рдпрдо рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рдПрдиреАрдореЗрд╢рди рдирд╛рдо рдХреЗрд╡рд▓ glowIcon (JS рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд╛рдо) рдерд╛ред

рдореЗрд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ @bjrn рджреНрд╡рд╛рд░рд╛ рдЙрджреНрдзреГрдд $ рдбрд╛рд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ:

animation: '$glowIcon 2000ms infinite',

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

рд╣рд╛рдВ, рдХреАрдлреНрд░реЗрдо рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрдирдХрд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: https://github.com/mui-org/material-ui/blob/353c0aedc50de8bb2c09626e520d7cc16ac461dc/packages/material-ui/src/ButtonBase/TouchRipple.js#L84

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

@bjrn рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЬреЗрдПрд╕рдПрд╕ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП: makeStyles рдЕрдВрджрд░ рдПрдХ рдХреАрдлрд╝реНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдЙрддреНрдкрдиреНрди рдПрдиреАрдореЗрд╢рди рдирд╛рдо makeStyles-keyframes-glowIcon-187 рдЬреИрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬрдмрдХрд┐ CSS рдирд┐рдпрдо рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рдПрдиреАрдореЗрд╢рди рдирд╛рдо рдХреЗрд╡рд▓ glowIcon (JS рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд╛рдо) рдерд╛ред

рдореЗрд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ @bjrn рджреНрд╡рд╛рд░рд╛ рдЙрджреНрдзреГрдд $ рдбрд╛рд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ:

animation: '$glowIcon 2000ms infinite',

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП:
https://cssinjs.org/jss-syntax/?v=v10.0.0-alpha.10#keyframes -animation

рдореБрдЭреЗ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА: рдореЗрдХ рд╕реНрдЯрд╛рдЗрд▓ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд) + рд╢реИрд▓реА рдирд┐рдпрдо рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдп

  1. рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЬрдм рдореИрдВ JSS $ref , animation рдЬрдирд░реЗрд╢рди рдХреНрд░реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯрд╛рдЗрд▓ рдирд┐рдпрдо рд╕реНрддрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ:
animation: ({ duration }) =>  `$glitch ${duration}s infinite`

рдЖрдЙрдЯрдкреБрдЯ:

.makeStyles-root-470::before {}
  1. рдЬрдм рдореИрдВ рд░реЗрдлрд░реА рдЪрд╛рд░ ( $ ) рдХреЗ рдмрд┐рдирд╛ animation-name рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдирд┐рдпрдо animation рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди animation-name @keyframe рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
animation: ({ duration }) =>  `glitch ${duration}s infinite`

рдЖрдЙрдЯрдкреБрдЯ:

.makeStyles-root-477::before {
    animation: 1s ease 0s infinite normal none running glitch;
}
  1. рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИ:
animation: `$glitch 5s infinite`,

рдЖрдЙрдЯрдкреБрдЯ:

.makeStyles-root-482:before {
    animation: makeStyles-keyframes-glitch-483 5s infinite;
}
  1. рд╕рдорд╛рдзрд╛рди/рд╕рдорд╛рдзрд╛рди:
 animationDuration: ({ duration }) => `${duration}s`,
 animationIterationCount: 'infinite',
 animationName: `$glitch`,
"@material-ui/core": "^4.1.3",
"@material-ui/icons": "^4.4.1",
"@material-ui/styles": "^4.1.1",

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЯреАрдПрд╕ рд╕реНрдЯрд╛рдЗрд▓ рдирд┐рдпрдо рд╕реНрддрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ :(

makeStyles() рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

sslider:  ({urls}) => ({
      background: `url(${urls[0]})`,
      backgroundRepeat: "no-repeat",
      animation: `$slidingBackgroundAnimation 10s`,
     ...
}),
"<strong i="7">@keyframes</strong> slidingBackgroundAnimation": {
      from: {
        backgroundPositionX: "0px",
      },
      to: {
        backgroundPositionX: "-100px",
      },
},

рдпрд╣рд╛рдВ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдирд╛рдо keyframes рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕реЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдирд┐рдореЗрд╢рди рдХреАрдлрд╝реНрд░реЗрдо slidingBackgroundAnimation рдХреЛ <head> > <style> рдореЗрдВ @-webkit-keyframes makeStyles-keyframes-slidingBackgroundAnimation-108 рд▓реЗрдХрд┐рди sslider css рдЗрд╕реЗ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ @-webkit-keyframes makeStyles-keyframes-slidingBackgroundAnimation-109 (рдХреЗ рд╕рд╛рде) рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛)ред

рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

sslider: {
      background: ({ urls }) => `url(${urls[0]})`,
      backgroundRepeat: "no-repeat",
      animation: `$slidingBackgroundAnimation 10s`,
     ....
},
"<strong i="18">@keyframes</strong> slidingBackgroundAnimation" : { ... }

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рджрд░реНрдж рдерд╛ <strong i="22">@keyframes</strong> animationName рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣рд╛рд░рд╛ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ makeStyles({}) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рдВрдЧрдордВрдЪ рдХреА рд╕рд╛рдордЧреНрд░реА рдЧреБрдЬрд░ useStyles({}) ред

рдпрд╣ рд╡рд╣ рдХреЛрдб рдерд╛ рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред

const imageSliderAlgo = (urls) => {
 // a function that accepts urls and dynamically create object to be consumed by the keyframes
 // return example for two images

 return {
  "0%": { backgroundImage: `url(${urls[0]})` },
  "50%": { backgroundImage: `url(${urls[1]})` }
 }
};

const useStyles = makeStyles(theme => ({
 "<strong i="28">@keyframes</strong> slidingBackgroundImageAnimation": ({ urls }) =>
      imageSliderAlgo(urls),
 sslider: { ... }
});

рдпрд╣ рдкреНрд░реЙрдкреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░реЙрдкреНрд╕ рдХреЛ classNames рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдкрд░ рдареАрдХ рд╕реЗ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАрдПрд╕рдПрд╕ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░рддреЗ рд╕рдордп рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЙрдкрд░реЛрдХреНрдд рдЦрдВрдб рдореЗрдВ)ред

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдФрд░ рдмрд╣реБрдд рд╕рдордп рдЬрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕реАрдПрд╕рдПрд╕-рдЗрди-рдЬреЗрдПрд╕ рд╢реИрд▓реА рдореЗрдВ рдХреАрдлреНрд░реЗрдо рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд┐рдХрд╛рд▓рд╛ рдФрд░ рдХрд╕реНрдЯрдо рд╣реБрдХ рдореЗрдВ useStyles() рд▓рдкреЗрдЯ рд░рд╣рд╛ рдерд╛ рдФрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯ рд░рд╣рд╛ рдерд╛ рд╡рд╣рд╛рдВ рд╕реЗ makeStyles() ред

const useMyStyles = props => {
  const useStyles = makeStyles(theme => ({
    sslider: {
      background: ({ urls }) => `url(${urls[0]})`,
      animation: `$slidingBackgroundAnimation 30s ease 2s infinite forwards, $slidingBackgroundImageAnimation 20s ease 2s infinite forwards`,
      ...
    },

    // animation 1
    // dynamically rendering keyframes in css-in-js
    // using the props property passed in custom useMyStyles hook while invoking it in main component
    "<strong i="36">@keyframes</strong> slidingBackgroundImageAnimation": imageSliderAlgo(props.urls),

    // animation 2
    // static keyframes in css-in-jss
    "<strong i="37">@keyframes</strong> slidingBackgroundAnimation": {
      "0%": {
        backgroundPositionX: "0px",
      },
      "50%": {
        backgroundPositionX: "-120px",
      }
    },
  })); // useStyles closed

  // returning useStyle function with the props passed in the higher order/parent function
  return useStyles(props); 
} // useMyStyles custom hook closed

// Component
export default function SlidingBackground({ children, urls }) {

  // non-working way
  // const classes = useStyles({ urls });

  // working way
  const classes = useMyStyles({ urls });

  return (
    <>
      <div className={classes.sslider}>{children}</div>
    </>
  );
}

рдХрднреА-рдХрднреА рдХреЗрд╡рд▓ рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдпрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП: makeStyles рдЕрдВрджрд░ рдПрдХ рдХреАрдлрд╝реНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдЙрддреНрдкрдиреНрди рдПрдиреАрдореЗрд╢рди рдирд╛рдо makeStyles-keyframes-glowIcon-187 рдЬреИрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬрдмрдХрд┐ CSS рдирд┐рдпрдо рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рдПрдиреАрдореЗрд╢рди рдирд╛рдо рдХреЗрд╡рд▓ glowIcon (JS рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд╛рдо) рдерд╛ред

рдореЗрд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ @bjrn рджреНрд╡рд╛рд░рд╛ рдЙрджреНрдзреГрдд $ рдбрд╛рд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдареАрдХ рд╣реЛ рдЧрдИ:

animation: '$glowIcon 2000ms infinite',

рддреБрдо рдореЗрд░рд╛ рджрд┐рди рдмрдЪрд╛рдУ

рдХрднреА-рдХрднреА рдХреЗрд╡рд▓ рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдпрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рд╛

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

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

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

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

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

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

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