glimmer-dsl-web 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +293 -56
- data/VERSION +1 -1
- data/glimmer-dsl-web.gemspec +8 -5
- data/lib/glimmer/data_binding/element_binding.rb +35 -13
- data/lib/glimmer/dsl/web/class_name_inclusion_data_binding.rb +21 -0
- data/lib/glimmer/dsl/web/dsl.rb +6 -2
- data/lib/glimmer/dsl/web/element_expression.rb +12 -1
- data/lib/glimmer/dsl/web/inline_style_data_binding_expression.rb +21 -0
- data/lib/glimmer/dsl/web/{style_expression.rb → style_element_expression.rb} +1 -1
- data/lib/glimmer/web/component.rb +8 -2
- data/lib/glimmer/web/element_proxy.rb +95 -8
- data/lib/glimmer-dsl-web/samples/hello/hello_style.rb +30 -42
- data/lib/glimmer-dsl-web/samples/hello/hello_svg.rb +45 -0
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc/views/edit_todo_input.rb +19 -10
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc/views/new_todo_form.rb +8 -8
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc/views/new_todo_input.rb +8 -5
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc/views/todo_filters.rb +64 -51
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc/views/todo_input.rb +14 -14
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc/views/todo_list.rb +33 -37
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc/views/todo_list_item.rb +62 -59
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc/views/todo_mvc_footer.rb +9 -9
- data/lib/glimmer-dsl-web/samples/regular/todo_mvc.rb +20 -20
- metadata +8 -5
@@ -4,16 +4,21 @@ class TodoFilters
|
|
4
4
|
option :presenter
|
5
5
|
|
6
6
|
markup {
|
7
|
-
footer
|
8
|
-
style
|
9
|
-
|
10
|
-
|
7
|
+
footer {
|
8
|
+
# Data-bind `footer` `style` `display` unidirectionally to presenter todos,
|
9
|
+
# and on read, convert todos based on whether they are empty to 'none' or 'block'
|
10
|
+
style(:display) <= [ presenter, :todos,
|
11
|
+
on_read: ->(todos) { todos.empty? ? 'none' : 'block' }
|
12
|
+
]
|
11
13
|
|
12
14
|
span(class: 'todo-count') {
|
13
15
|
span('.strong') {
|
16
|
+
# Data-bind `span` `inner_text` unidirectionally to presenter active_todo_count
|
14
17
|
inner_text <= [presenter, :active_todo_count]
|
15
18
|
}
|
16
19
|
span {
|
20
|
+
# Data-bind `span` `inner_text` unidirectionally to presenter active_todo_count,
|
21
|
+
# and on read, convert active_todo_count to string that follows count number
|
17
22
|
inner_text <= [presenter, :active_todo_count,
|
18
23
|
on_read: -> (active_todo_count) { " item#{'s' if active_todo_count != 1} left" }
|
19
24
|
]
|
@@ -24,9 +29,11 @@ class TodoFilters
|
|
24
29
|
TodoPresenter::FILTERS.each do |filter|
|
25
30
|
li {
|
26
31
|
a(filter.to_s.capitalize, href: "#/#{filter unless filter == :all}") {
|
27
|
-
|
28
|
-
|
29
|
-
|
32
|
+
# Data-bind inclusion of `a` `class` `selected` unidirectionally to presenter filter attribute,
|
33
|
+
# and on read of presenter filter, convert to boolean value of whether selected class is included
|
34
|
+
class_name(:selected) <= [ presenter, :filter,
|
35
|
+
on_read: -> (presenter_filter) { presenter_filter == filter }
|
36
|
+
]
|
30
37
|
|
31
38
|
onclick do |event|
|
32
39
|
presenter.filter = filter
|
@@ -37,9 +44,9 @@ class TodoFilters
|
|
37
44
|
}
|
38
45
|
|
39
46
|
button('Clear completed', class: 'clear-completed') {
|
40
|
-
|
41
|
-
|
42
|
-
|
47
|
+
# Data-bind inclusion of `button` `class` `can-clear-completed` unidirectionally to presenter can_clear_completed attribute,
|
48
|
+
# meaning inclusion of can-clear-completed class is determined by presenter can_clear_completed boolean attribute.
|
49
|
+
class_name('can-clear-completed') <= [presenter, :can_clear_completed]
|
43
50
|
|
44
51
|
onclick do |event|
|
45
52
|
presenter.clear_completed
|
@@ -49,76 +56,82 @@ class TodoFilters
|
|
49
56
|
}
|
50
57
|
|
51
58
|
style {
|
52
|
-
|
59
|
+
r(component_element_selector) {
|
53
60
|
border_top '1px solid #e6e6e6'
|
54
|
-
font_size
|
55
|
-
height
|
61
|
+
font_size 15
|
62
|
+
height 20
|
56
63
|
padding '10px 15px'
|
57
|
-
text_align
|
64
|
+
text_align :center
|
65
|
+
display :none
|
58
66
|
}
|
59
67
|
|
60
|
-
|
61
|
-
bottom
|
68
|
+
r("#{component_element_selector}:before") {
|
69
|
+
bottom 0
|
62
70
|
box_shadow '0 1px 1px rgba(0,0,0,.2), 0 8px 0 -3px #f6f6f6, 0 9px 1px -3px rgba(0,0,0,.2), 0 16px 0 -6px #f6f6f6, 0 17px 2px -6px rgba(0,0,0,.2)'
|
63
71
|
content '""'
|
64
|
-
height
|
65
|
-
left
|
66
|
-
overflow
|
67
|
-
position
|
68
|
-
right
|
72
|
+
height 50
|
73
|
+
left 0
|
74
|
+
overflow :hidden
|
75
|
+
position :absolute
|
76
|
+
right 0
|
69
77
|
}
|
70
78
|
|
71
|
-
|
72
|
-
float
|
73
|
-
text_align
|
79
|
+
r('.todo-count') {
|
80
|
+
float :left
|
81
|
+
text_align :left
|
74
82
|
}
|
75
83
|
|
76
|
-
|
84
|
+
r('.todo-count .strong') {
|
77
85
|
font_weight '300'
|
78
86
|
}
|
79
87
|
|
80
|
-
|
81
|
-
left
|
82
|
-
list_style
|
83
|
-
margin
|
84
|
-
padding
|
85
|
-
position
|
86
|
-
right
|
88
|
+
r('.filters') {
|
89
|
+
left 0
|
90
|
+
list_style :none
|
91
|
+
margin 0
|
92
|
+
padding 0
|
93
|
+
position :absolute
|
94
|
+
right 0
|
87
95
|
}
|
88
96
|
|
89
|
-
|
90
|
-
display
|
97
|
+
r('.filters li') {
|
98
|
+
display :inline
|
91
99
|
}
|
92
100
|
|
93
|
-
|
101
|
+
r('.filters li a') {
|
94
102
|
border '1px solid transparent'
|
95
|
-
border_radius
|
96
|
-
color
|
97
|
-
margin
|
103
|
+
border_radius 3
|
104
|
+
color :inherit
|
105
|
+
margin 3
|
98
106
|
padding '3px 7px'
|
99
|
-
text_decoration
|
100
|
-
cursor
|
107
|
+
text_decoration :none
|
108
|
+
cursor :pointer
|
101
109
|
}
|
102
110
|
|
103
|
-
|
111
|
+
r('.filters li a.selected') {
|
104
112
|
border_color '#ce4646'
|
105
113
|
}
|
106
114
|
|
107
|
-
|
108
|
-
cursor
|
109
|
-
float
|
110
|
-
line_height
|
111
|
-
position
|
112
|
-
text_decoration
|
115
|
+
r('.clear-completed, html .clear-completed:active') {
|
116
|
+
cursor :pointer
|
117
|
+
float :right
|
118
|
+
line_height 19
|
119
|
+
position :relative
|
120
|
+
text_decoration :none
|
121
|
+
display :none
|
122
|
+
}
|
123
|
+
|
124
|
+
r('.clear-completed.can-clear-completed, html .clear-completed.can-clear-completed:active') {
|
125
|
+
display :block
|
113
126
|
}
|
114
127
|
|
115
128
|
media('(max-width: 430px)') {
|
116
|
-
|
117
|
-
height
|
129
|
+
r(component_element_selector) {
|
130
|
+
height 50
|
118
131
|
}
|
119
132
|
|
120
|
-
|
121
|
-
bottom
|
133
|
+
r('.filters') {
|
134
|
+
bottom 10
|
122
135
|
}
|
123
136
|
}
|
124
137
|
}
|
@@ -4,29 +4,29 @@ class TodoInput
|
|
4
4
|
|
5
5
|
class << self
|
6
6
|
def todo_input_styles
|
7
|
-
|
8
|
-
position
|
9
|
-
margin
|
7
|
+
r(component_element_selector) {
|
8
|
+
position :relative
|
9
|
+
margin 0
|
10
10
|
width '100%'
|
11
|
-
font_size
|
12
|
-
font_family
|
13
|
-
font_weight
|
14
|
-
line_height
|
15
|
-
color
|
16
|
-
padding
|
11
|
+
font_size 24
|
12
|
+
font_family :inherit
|
13
|
+
font_weight :inherit
|
14
|
+
line_height 1.4.em
|
15
|
+
color :inherit
|
16
|
+
padding 6
|
17
17
|
border '1px solid #999'
|
18
18
|
box_shadow 'inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2)'
|
19
19
|
box_sizing 'border-box'
|
20
|
-
_webkit_font_smoothing
|
20
|
+
_webkit_font_smoothing :antialiased
|
21
21
|
}
|
22
22
|
|
23
|
-
|
24
|
-
background
|
23
|
+
r("#{component_element_selector}::selection") {
|
24
|
+
background :red
|
25
25
|
}
|
26
26
|
|
27
|
-
|
27
|
+
r("#{component_element_selector}:focus") {
|
28
28
|
box_shadow '0 0 2px 2px #cf7d7d'
|
29
|
-
outline
|
29
|
+
outline 0
|
30
30
|
}
|
31
31
|
end
|
32
32
|
end
|
@@ -15,10 +15,6 @@ class TodoList
|
|
15
15
|
|
16
16
|
markup {
|
17
17
|
main(class: 'main') {
|
18
|
-
style <= [ presenter, :todos,
|
19
|
-
on_read: ->(todos) { todos.empty? ? 'display: none;' : '' }
|
20
|
-
]
|
21
|
-
|
22
18
|
div(class: 'toggle-all-container') {
|
23
19
|
input(class: 'toggle-all', type: 'checkbox')
|
24
20
|
|
@@ -30,9 +26,9 @@ class TodoList
|
|
30
26
|
}
|
31
27
|
|
32
28
|
@todo_ul = ul {
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
# class name is data-bound unidirectionally to the presenter filter attribute,
|
30
|
+
# meaning it would automatically get set to its value whenever presenter.filter changes
|
31
|
+
class_name <= [presenter, :filter]
|
36
32
|
|
37
33
|
presenter.todos.each do |todo|
|
38
34
|
todo_list_item(presenter:, todo:)
|
@@ -42,61 +38,61 @@ class TodoList
|
|
42
38
|
}
|
43
39
|
|
44
40
|
style {
|
45
|
-
|
41
|
+
r('.main') {
|
46
42
|
border_top '1px solid #e6e6e6'
|
47
|
-
position
|
43
|
+
position :relative
|
48
44
|
z_index '2'
|
49
45
|
}
|
50
46
|
|
51
|
-
|
52
|
-
border
|
47
|
+
r('.toggle-all') {
|
48
|
+
border :none
|
53
49
|
bottom '100%'
|
54
|
-
height
|
55
|
-
opacity
|
56
|
-
position
|
50
|
+
height 1
|
51
|
+
opacity 0
|
52
|
+
position :absolute
|
57
53
|
right '100%'
|
58
|
-
width
|
54
|
+
width 1
|
59
55
|
}
|
60
56
|
|
61
|
-
|
62
|
-
align_items
|
63
|
-
display
|
64
|
-
font_size
|
65
|
-
height
|
66
|
-
justify_content
|
67
|
-
left
|
68
|
-
position
|
69
|
-
top
|
70
|
-
width
|
57
|
+
r('.toggle-all+label') {
|
58
|
+
align_items :center
|
59
|
+
display :flex
|
60
|
+
font_size 0
|
61
|
+
height 65
|
62
|
+
justify_content :center
|
63
|
+
left 0
|
64
|
+
position :absolute
|
65
|
+
top -65
|
66
|
+
width 45
|
71
67
|
}
|
72
68
|
|
73
|
-
|
69
|
+
r('.toggle-all+label:before') {
|
74
70
|
color '#949494'
|
75
71
|
content '"❯"'
|
76
72
|
display 'inline-block'
|
77
|
-
font_size
|
73
|
+
font_size 22
|
78
74
|
padding '10px 27px'
|
79
75
|
_webkit_transform 'rotate(90deg)'
|
80
76
|
transform 'rotate(90deg)'
|
81
77
|
}
|
82
78
|
|
83
|
-
|
79
|
+
r('.toggle-all:focus+label, .toggle:focus+label') {
|
84
80
|
box_shadow '0 0 2px 2px #cf7d7d'
|
85
|
-
outline
|
81
|
+
outline 0
|
86
82
|
}
|
87
83
|
|
88
|
-
|
89
|
-
list_style
|
90
|
-
margin
|
91
|
-
padding
|
84
|
+
r('.todo-list ul') {
|
85
|
+
list_style :none
|
86
|
+
margin 0
|
87
|
+
padding 0
|
92
88
|
}
|
93
89
|
|
94
|
-
|
95
|
-
display
|
90
|
+
r('.todo-list ul.active li.completed') {
|
91
|
+
display :none
|
96
92
|
}
|
97
93
|
|
98
|
-
|
99
|
-
display
|
94
|
+
r('.todo-list ul.completed li.active') {
|
95
|
+
display :none
|
100
96
|
}
|
101
97
|
}
|
102
98
|
end
|
@@ -15,19 +15,30 @@ class TodoListItem
|
|
15
15
|
|
16
16
|
markup {
|
17
17
|
li {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
# Data-bind inclusion of `li` `class` `completed` unidirectionally to todo completed attribute,
|
19
|
+
# meaning inclusion of completed class is determined by todo completed boolean attribute.
|
20
|
+
class_name(:completed) <= [todo, :completed]
|
21
|
+
|
22
|
+
# Data-bind inclusion of `li` `class` `active` unidirectionally to todo completed attribute, negated,
|
23
|
+
# meaning inclusion of active class is determined by todo completed boolean attribute, negated.
|
24
|
+
class_name(:active) <= [todo, :completed, on_read: :!]
|
25
|
+
|
26
|
+
# Data-bind inclusion of `li` `class` `editing` unidirectionally to todo editing attribute,
|
27
|
+
# meaning inclusion of editing class is determined by todo editing boolean attribute.
|
28
|
+
class_name(:editing) <= [todo, :editing]
|
24
29
|
|
25
30
|
div(class: 'view') {
|
26
31
|
input(class: 'toggle', type: 'checkbox') {
|
32
|
+
# Data-bind `input` `checked` property bidirectionally to `todo` `completed` attribute
|
33
|
+
# meaning make any changes to the `todo` `completed` attribute value automatically update the `input` `checked` property
|
34
|
+
# and any changes to the `input` `checked` property by the user automatically update the `todo` `completed` attribute value.
|
35
|
+
# `after_write` hook is invoked after writing a new value to the model attribute (`todo` `completed` attribute)
|
27
36
|
checked <=> [todo, :completed]
|
28
37
|
}
|
29
38
|
|
30
39
|
label {
|
40
|
+
# Data-bind `label` inner HTML unidirectionally to `todo.task` (`String` value),
|
41
|
+
# meaning make changes to `todo` `task` attribute automatically update `label` inner HTML.
|
31
42
|
inner_html <= [todo, :task]
|
32
43
|
|
33
44
|
ondblclick do |event|
|
@@ -50,111 +61,103 @@ class TodoListItem
|
|
50
61
|
}
|
51
62
|
}
|
52
63
|
|
53
|
-
def li_class_name(todo)
|
54
|
-
classes = []
|
55
|
-
classes << 'completed' if todo.completed?
|
56
|
-
classes << 'active' if !todo.completed?
|
57
|
-
classes << 'editing' if todo.editing?
|
58
|
-
classes.join(' ')
|
59
|
-
end
|
60
|
-
|
61
64
|
style {
|
62
|
-
|
65
|
+
r('.todo-list li.completed label') {
|
63
66
|
color '#949494'
|
64
67
|
text_decoration 'line-through'
|
65
68
|
}
|
66
69
|
|
67
|
-
|
70
|
+
r('.todo-list li') {
|
68
71
|
border_bottom '1px solid #ededed'
|
69
|
-
font_size
|
70
|
-
position
|
72
|
+
font_size 24
|
73
|
+
position :relative
|
71
74
|
}
|
72
75
|
|
73
|
-
|
74
|
-
_webkit_appearance
|
75
|
-
appearance
|
76
|
-
border
|
77
|
-
bottom
|
78
|
-
height
|
76
|
+
r('.todo-list li .toggle') {
|
77
|
+
_webkit_appearance :none
|
78
|
+
appearance :none
|
79
|
+
border :none
|
80
|
+
bottom 0
|
81
|
+
height :auto
|
79
82
|
margin 'auto 0'
|
80
|
-
opacity
|
81
|
-
position
|
82
|
-
text_align
|
83
|
-
top
|
84
|
-
width
|
83
|
+
opacity 0
|
84
|
+
position :absolute
|
85
|
+
text_align :center
|
86
|
+
top 0
|
87
|
+
width 40
|
85
88
|
}
|
86
89
|
|
87
|
-
|
90
|
+
r('.todo-list li label') {
|
88
91
|
color '#484848'
|
89
|
-
display
|
92
|
+
display :block
|
90
93
|
font_weight '400'
|
91
94
|
line_height '1.2'
|
92
|
-
min_height
|
95
|
+
min_height 40
|
93
96
|
padding '15px 15px 15px 60px'
|
94
97
|
transition 'color .4s'
|
95
98
|
word_break 'break-all'
|
96
99
|
}
|
97
100
|
|
98
|
-
|
101
|
+
r('.todo-list li .toggle+label') {
|
99
102
|
background_image 'url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23949494%22%20stroke-width%3D%223%22/%3E%3C/svg%3E)'
|
100
|
-
background_position
|
103
|
+
background_position 0
|
101
104
|
background_repeat 'no-repeat'
|
102
105
|
}
|
103
106
|
|
104
|
-
|
107
|
+
r('.todo-list li.completed label') {
|
105
108
|
color '#949494'
|
106
109
|
text_decoration 'line-through'
|
107
110
|
}
|
108
111
|
|
109
|
-
|
112
|
+
r('.todo-list li .toggle:checked+label') {
|
110
113
|
background_image 'url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%2359A193%22%20stroke-width%3D%223%22%2F%3E%3Cpath%20fill%3D%22%233EA390%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22%2F%3E%3C%2Fsvg%3E)'
|
111
114
|
}
|
112
115
|
|
113
|
-
|
114
|
-
border_bottom
|
115
|
-
padding
|
116
|
+
r('.todo-list li.editing') {
|
117
|
+
border_bottom :none
|
118
|
+
padding 0
|
116
119
|
}
|
117
120
|
|
118
|
-
|
119
|
-
opacity
|
121
|
+
r('.todo-list li.editing input[type=checkbox], .todo-list li.editing label') {
|
122
|
+
opacity 0
|
120
123
|
}
|
121
124
|
|
122
|
-
|
123
|
-
bottom
|
125
|
+
r('.todo-list li .destroy') {
|
126
|
+
bottom 0
|
124
127
|
color '#949494'
|
125
|
-
display
|
126
|
-
font_size
|
127
|
-
height
|
128
|
+
display :none
|
129
|
+
font_size 30
|
130
|
+
height 40
|
128
131
|
margin 'auto 0'
|
129
|
-
position
|
130
|
-
right
|
131
|
-
top
|
132
|
+
position :absolute
|
133
|
+
right 10
|
134
|
+
top 0
|
132
135
|
transition 'color .2s ease-out'
|
133
|
-
width
|
136
|
+
width 40
|
134
137
|
}
|
135
138
|
|
136
|
-
|
137
|
-
display
|
139
|
+
r('.todo-list li:focus .destroy, .todo-list li:hover .destroy') {
|
140
|
+
display :block
|
138
141
|
}
|
139
142
|
|
140
|
-
|
143
|
+
r('.todo-list li .destroy:focus, .todo-list li .destroy:hover') {
|
141
144
|
color '#c18585'
|
142
145
|
}
|
143
146
|
|
144
|
-
|
147
|
+
r('.todo-list li .destroy:after') {
|
145
148
|
content '"×"'
|
146
|
-
display
|
149
|
+
display :block
|
147
150
|
height '100%'
|
148
151
|
line_height '1.1'
|
149
152
|
}
|
150
153
|
|
151
154
|
media ('screen and (-webkit-min-device-pixel-ratio: 0)') {
|
152
|
-
|
153
|
-
background
|
155
|
+
r('.todo-list li .toggle, .toggle-all') {
|
156
|
+
background :none
|
154
157
|
}
|
155
158
|
|
156
|
-
|
157
|
-
height
|
159
|
+
r('.todo-list li .toggle') {
|
160
|
+
height 40
|
158
161
|
}
|
159
162
|
}
|
160
163
|
}
|
@@ -16,26 +16,26 @@ class TodoMvcFooter
|
|
16
16
|
}
|
17
17
|
|
18
18
|
style {
|
19
|
-
|
19
|
+
r('footer.info') {
|
20
20
|
margin '65px auto 0'
|
21
21
|
color '#4d4d4d'
|
22
|
-
font_size
|
22
|
+
font_size 11
|
23
23
|
text_shadow '0 1px 0 rgba(255, 255, 255, 0.5)'
|
24
|
-
text_align
|
24
|
+
text_align :center
|
25
25
|
}
|
26
26
|
|
27
|
-
|
27
|
+
r('footer.info p') {
|
28
28
|
line_height '1'
|
29
29
|
}
|
30
30
|
|
31
|
-
|
32
|
-
color
|
33
|
-
text_decoration
|
31
|
+
r('footer.info a') {
|
32
|
+
color :inherit
|
33
|
+
text_decoration :none
|
34
34
|
font_weight '400'
|
35
35
|
}
|
36
36
|
|
37
|
-
|
38
|
-
text_decoration
|
37
|
+
r('footer.info a:hover') {
|
38
|
+
text_decoration :underline
|
39
39
|
}
|
40
40
|
}
|
41
41
|
end
|
@@ -37,41 +37,41 @@ class TodoMvc
|
|
37
37
|
}
|
38
38
|
|
39
39
|
style {
|
40
|
-
|
41
|
-
margin
|
42
|
-
padding
|
40
|
+
r('body, button, html') {
|
41
|
+
margin 0
|
42
|
+
padding 0
|
43
43
|
}
|
44
44
|
|
45
|
-
|
46
|
-
_webkit_font_smoothing
|
47
|
-
_webkit_appearance
|
48
|
-
appearance
|
49
|
-
background
|
50
|
-
border
|
51
|
-
color
|
52
|
-
font_family
|
45
|
+
r('button') {
|
46
|
+
_webkit_font_smoothing :antialiased
|
47
|
+
_webkit_appearance :none
|
48
|
+
appearance :none
|
49
|
+
background :none
|
50
|
+
border 0
|
51
|
+
color :inherit
|
52
|
+
font_family :inherit
|
53
53
|
font_size '100%'
|
54
|
-
font_weight
|
55
|
-
vertical_align
|
54
|
+
font_weight :inherit
|
55
|
+
vertical_align :baseline
|
56
56
|
}
|
57
57
|
|
58
|
-
|
58
|
+
r('.todoapp') {
|
59
59
|
background '#fff'
|
60
60
|
margin '130px 0 40px 0'
|
61
|
-
position
|
61
|
+
position :relative
|
62
62
|
box_shadow '0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1)'
|
63
63
|
}
|
64
64
|
|
65
65
|
media('screen and (-webkit-min-device-pixel-ratio:0)') {
|
66
|
-
|
66
|
+
r('body') {
|
67
67
|
font "14px 'Helvetica Neue', Helvetica, Arial, sans-serif"
|
68
|
-
line_height
|
68
|
+
line_height 1.4.em
|
69
69
|
background '#f5f5f5'
|
70
70
|
color '#111111'
|
71
|
-
min_width
|
72
|
-
max_width
|
71
|
+
min_width 230
|
72
|
+
max_width 550
|
73
73
|
margin '0 auto'
|
74
|
-
_webkit_font_smoothing
|
74
|
+
_webkit_font_smoothing :antialiased
|
75
75
|
font_weight '300'
|
76
76
|
}
|
77
77
|
}
|