2
3
4
5
6
— Легко поддерживать




  7
— Легко поддерживать
— Легко добавлять темы




  8
— Легко поддерживать
— Легко добавлять темы
— Дешево добавлять темы




  9
Независимые блоки

10
/css
       /blocks
             /messages
             ...



 11
/css
       /blocks
             /messages
             ...
       /pages
             main.css
 12
Тема:




 13
Тема:
    — фоны




 14
Тема:
    — фоны
    — цвета




 15
Тема:
    — фоны
    — цвета
    — шрифты



 16
Тема:
    — фоны
    — цвета
    — шрифты
    — отступы, границы


 17
Геометрия отдельно
       от оформления
18
/css
       /blocks
             /messages
       /themes
             /theme


 19
/default
     /messages




 20
/default
     /messages
     default.scss




 21
/default
     /messages
     default.scss
     default.vars.scss



  22
/default
     /messages
     default.scss
     default.vars.scss
/theme
     theme.scss
  23
/default
      /messages
      default.scss
      default.vars.scss
/theme
      theme.scss
   24
      theme.vars.scss
SASS

25
/css/blocks/messages/messages.scss
.messages{
      padding:20px;
}



 26
/css/blocks/messages/messages.scss
.messages{
      padding:20px;
}
/css/pages/mail.scss
@import url(../messages/messages.scss);
 27
/css/themes/default/messages/messages.scss
.messages{
      background:$messages-background;
}



 28
/css/themes/default/messages/messages.scss
.messages{background:$messages-background;}

/css/blocks/default/default.scss
@import url(messages/messages.scss);


 29
/css/themes/default/messages/messages.scss
.messages{background:$messages-background;}

/css/blocks/default/default.scss
@import url(messages/messages.scss);


 30
/css/themes/theme/theme.vars.scss
$messages-background: #FFF;




 31
/css/themes/theme/theme.vars.scss
$messages-background: #FFF;

/css/themes/theme/theme.scss
@import url(theme.vars.scss);


 32
/css/themes/theme/theme.vars.scss
$messages-background: #FFF;

/css/themes/theme/theme.scss
@import url(theme.vars.scss);
@import url(../default/default.scss);
  33
/css/pages/mail.css

/css/themes/theme/theme.css



 34
mixin

35
36
url("data:image/…") repeat-x scroll 0 top,
url("data:image/…") repeat-x scroll 0 bottom,
url("data:image/…") repeat-y scroll right top,
url("data:image/…") repeat-y scroll 0 top,
none repeat scroll 0 0 white


  37
38
none repeat scroll 0 0 white




  39
background: url(...), url(..), color url(datauri)




  40
background: color url(datauri);
background: url(...), url(..), color url(datauri)




  41
background: color url(datauri);
background: url(...), url(..), color url(datauri)
*background: color url(link)




  42
.block {
      background: $block--bg1, $block--bg2;
}




 43
.block {
      background: $block--background;
}




 44
Список

color url() no-repeat left top




  45
Двухуровневый список

url() no-repeat left top,
url() no-repeat left top,
color url() no-repeat left top


  46
Ключ

47
фон как есть




 48
фон как есть
+ фолбэк на старые браузеры




 49
фон как есть
+ фолбэк на старые браузеры
+ фолбэк на старых ИЕ




 50
url(), color, <key>

51
нет ключа




 52
нет ключа
--multiback




  53
нет ключа
--multiback
--multiback-ie




  54
@mixin multibackground($bgs){




}
    55
@mixin multibackground($bgs){
    $flag: nth($bgs, length($bgs));




}
    56
@mixin multibackground($bgs){
    $flag: nth($bgs, length($bgs));
    @if $flag == "--multiback" {}



}
    57
@mixin multibackground($bgs){
    $flag: nth($bgs, length($bgs));
    @if $flag == "--multiback" {}
    @else if $flag == "--multiback-ie" {}

}
    58
@mixin multibackground($bgs){
    $flag: nth($bgs, length($bgs));
    @if $flag == "--multiback" {}
    @else if $flag == "--multiback-ie" {}
    @else {}
}
  59
@mixin multibackground($bgs){
    $flag: nth($bgs, length($bgs));
    @if $flag == "--multiback" {…}
    @else if $flag == "--multiback-ie" {}
    @else {}
}
  60
background: nth($bgs,length($bgs) - 1);
@include _multiback($bgs, 1);




  61
@mixin multibackground($bgs){
    $flag: nth($bgs, length($bgs));
    @if $flag == "--multiback" {}
    @else if $flag == "--multiback-ie" {…}
    @else {}
}
  62
background: nth($bgs, length($bgs) - 2);
@include _multiback($bgs, 2);

*background: nth($bgs, length($bgs) - 1);



  63
@mixin multibackground($bgs){
    $flag: nth($bgs, length($bgs));
    @if $flag == "--multiback" {}
    @else if $flag == "--multiback-ie" {}
    @else {…}
}
  64
background: $bgs;




 65
16

66
Переключение тем

67
deferred

68
$.when(
    AJAX.post(...),
    switchThemeCss(themeId)
);



 69
Проверка загрузки

70
jquery.getCSS

71
id темы

72
content font-family

73
IE:
content: undefined
font-family: 'some_data'
css data: 'some_data'



  74
content + font-family

75
OPERA
content: "some_data"
font-family: "Times New Roman"
css data: "some_data"



 76
content + font-family

77
function switchThemeCss (themeId){

         var url = getThemeCssUrl(themeId);



}
    78
function switchThemeCss (themeId){

         var url = getThemeCssUrl(themeId);
         $.getCSS(url, function(link){ … });

}
    79
function switchThemeCss (themeId){
      var deferred = $.Deferred();
      var url = getThemeCssUrl(themeId);
      $.getCSS(url, function(link){ … });
      return deferred;
}
  80
function switchThemeCss (themeId){
      var deferred = $.Deferred();
      var url = getThemeCssUrl(themeId);
      $.getCSS(url, function(link){ … });
      return deferred.promise();
}
  81
if (getApplyedThemeId() !== oldThemeId){
       $Theme.remove(); $Theme = $(link);
       deferred.resolve();
} else {
       $(link).remove();
       deferred.reject();
}
 82
Config

83
t1026 : {
     title : 'Роботы',
     text : 'Поздравляем!'
}



 84
t1036 : {
     title : 'Легенда',
     link : {
              href: 'http://link.mail.ru/',
              title: 'Играть!',
              target: '_blank'
     }
}
  85
Динамика

86
setTimeout

87
function chooseTheme(themeId){
      var themeVariant = 'all',
      switch (themeId) {…}

         return themeVariant
}
    88
function chooseTheme(themeId){
      var themeVariant = 'all',
      switch (themeId) {…}

         return themeVariant
}
    89
case 't1032':
     if (time >= 7 && time < 19){
            themeVariant = "day";
     } else {
            themeVariant = "night";
     }
  90
var themeChoosed = chooseTheme('t1032');
document.write(
      '<link href="t1032.' + themeChoosed + '.css"/>'
);



  91
92
СПАСИБО!
             Андрей Сумин
Руководитель разработки клиентской части
           sumin@corp.mail.ru

сумин андрей