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.
@@ -4,16 +4,21 @@ class TodoFilters
4
4
  option :presenter
5
5
 
6
6
  markup {
7
- footer(class: 'todo-filters') {
8
- style <= [ presenter, :todos,
9
- on_read: ->(todos) { todos.empty? ? 'display: none;' : '' }
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
- class_name <= [ presenter, :filter,
28
- on_read: -> (presenter_filter) { presenter_filter == filter ? 'selected' : '' }
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
- style <= [ presenter, :can_clear_completed,
41
- on_read: -> (can_clear_completed) { can_clear_completed ? '' : 'display: none;' },
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
- rule('.todo-filters') {
59
+ r(component_element_selector) {
53
60
  border_top '1px solid #e6e6e6'
54
- font_size '15px'
55
- height '20px'
61
+ font_size 15
62
+ height 20
56
63
  padding '10px 15px'
57
- text_align 'center'
64
+ text_align :center
65
+ display :none
58
66
  }
59
67
 
60
- rule('.todo-filters:before') {
61
- bottom '0'
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 '50px'
65
- left '0'
66
- overflow 'hidden'
67
- position 'absolute'
68
- right '0'
72
+ height 50
73
+ left 0
74
+ overflow :hidden
75
+ position :absolute
76
+ right 0
69
77
  }
70
78
 
71
- rule('.todo-count') {
72
- float 'left'
73
- text_align 'left'
79
+ r('.todo-count') {
80
+ float :left
81
+ text_align :left
74
82
  }
75
83
 
76
- rule('.todo-count .strong') {
84
+ r('.todo-count .strong') {
77
85
  font_weight '300'
78
86
  }
79
87
 
80
- rule('.filters') {
81
- left '0'
82
- list_style 'none'
83
- margin '0'
84
- padding '0'
85
- position 'absolute'
86
- right '0'
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
- rule('.filters li') {
90
- display 'inline'
97
+ r('.filters li') {
98
+ display :inline
91
99
  }
92
100
 
93
- rule('.filters li a') {
101
+ r('.filters li a') {
94
102
  border '1px solid transparent'
95
- border_radius '3px'
96
- color 'inherit'
97
- margin '3px'
103
+ border_radius 3
104
+ color :inherit
105
+ margin 3
98
106
  padding '3px 7px'
99
- text_decoration 'none'
100
- cursor 'pointer'
107
+ text_decoration :none
108
+ cursor :pointer
101
109
  }
102
110
 
103
- rule('.filters li a.selected') {
111
+ r('.filters li a.selected') {
104
112
  border_color '#ce4646'
105
113
  }
106
114
 
107
- rule('.clear-completed, html .clear-completed:active') {
108
- cursor 'pointer'
109
- float 'right'
110
- line_height '19px'
111
- position 'relative'
112
- text_decoration 'none'
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
- rule('.todo-filters') {
117
- height '50px'
129
+ r(component_element_selector) {
130
+ height 50
118
131
  }
119
132
 
120
- rule('.filters') {
121
- bottom '10px'
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
- rule(".#{component_element_class}") {
8
- position 'relative'
9
- margin '0'
7
+ r(component_element_selector) {
8
+ position :relative
9
+ margin 0
10
10
  width '100%'
11
- font_size '24px'
12
- font_family 'inherit'
13
- font_weight 'inherit'
14
- line_height '1.4em'
15
- color 'inherit'
16
- padding '6px'
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 'antialiased'
20
+ _webkit_font_smoothing :antialiased
21
21
  }
22
22
 
23
- rule(".#{component_element_class}::selection") {
24
- background 'red'
23
+ r("#{component_element_selector}::selection") {
24
+ background :red
25
25
  }
26
26
 
27
- rule(".#{component_element_class}:focus") {
27
+ r("#{component_element_selector}:focus") {
28
28
  box_shadow '0 0 2px 2px #cf7d7d'
29
- outline '0'
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
- class_name <= [presenter, :filter,
34
- on_read: ->(filter) { "todo-list #{filter}" }
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
- rule('.main') {
41
+ r('.main') {
46
42
  border_top '1px solid #e6e6e6'
47
- position 'relative'
43
+ position :relative
48
44
  z_index '2'
49
45
  }
50
46
 
51
- rule('.toggle-all') {
52
- border 'none'
47
+ r('.toggle-all') {
48
+ border :none
53
49
  bottom '100%'
54
- height '1px'
55
- opacity '0'
56
- position 'absolute'
50
+ height 1
51
+ opacity 0
52
+ position :absolute
57
53
  right '100%'
58
- width '1px'
54
+ width 1
59
55
  }
60
56
 
61
- rule('.toggle-all+label') {
62
- align_items 'center'
63
- display 'flex'
64
- font_size '0'
65
- height '65px'
66
- justify_content 'center'
67
- left '0'
68
- position 'absolute'
69
- top '-65px'
70
- width '45px'
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
- rule('.toggle-all+label:before') {
69
+ r('.toggle-all+label:before') {
74
70
  color '#949494'
75
71
  content '"❯"'
76
72
  display 'inline-block'
77
- font_size '22px'
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
- rule('.toggle-all:focus+label, .toggle:focus+label') {
79
+ r('.toggle-all:focus+label, .toggle:focus+label') {
84
80
  box_shadow '0 0 2px 2px #cf7d7d'
85
- outline '0'
81
+ outline 0
86
82
  }
87
83
 
88
- rule('.todo-list') {
89
- list_style 'none'
90
- margin '0'
91
- padding '0'
84
+ r('.todo-list ul') {
85
+ list_style :none
86
+ margin 0
87
+ padding 0
92
88
  }
93
89
 
94
- rule('.todo-list.active li.completed') {
95
- display 'none'
90
+ r('.todo-list ul.active li.completed') {
91
+ display :none
96
92
  }
97
93
 
98
- rule('.todo-list.completed li.active') {
99
- display 'none'
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
- class_name <= [ todo, :completed,
19
- on_read: -> { li_class_name(todo) }
20
- ]
21
- class_name <= [ todo, :editing,
22
- on_read: -> { li_class_name(todo) }
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
- rule('.todo-list li.completed label') {
65
+ r('.todo-list li.completed label') {
63
66
  color '#949494'
64
67
  text_decoration 'line-through'
65
68
  }
66
69
 
67
- rule('.todo-list li') {
70
+ r('.todo-list li') {
68
71
  border_bottom '1px solid #ededed'
69
- font_size '24px'
70
- position 'relative'
72
+ font_size 24
73
+ position :relative
71
74
  }
72
75
 
73
- rule('.todo-list li .toggle') {
74
- _webkit_appearance 'none'
75
- appearance 'none'
76
- border 'none'
77
- bottom '0'
78
- height 'auto'
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 '0'
81
- position 'absolute'
82
- text_align 'center'
83
- top '0'
84
- width '40px'
83
+ opacity 0
84
+ position :absolute
85
+ text_align :center
86
+ top 0
87
+ width 40
85
88
  }
86
89
 
87
- rule('.todo-list li label') {
90
+ r('.todo-list li label') {
88
91
  color '#484848'
89
- display 'block'
92
+ display :block
90
93
  font_weight '400'
91
94
  line_height '1.2'
92
- min_height '40px'
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
- rule('.todo-list li .toggle+label') {
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 '0'
103
+ background_position 0
101
104
  background_repeat 'no-repeat'
102
105
  }
103
106
 
104
- rule('.todo-list li.completed label') {
107
+ r('.todo-list li.completed label') {
105
108
  color '#949494'
106
109
  text_decoration 'line-through'
107
110
  }
108
111
 
109
- rule('.todo-list li .toggle:checked+label') {
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
- rule('.todo-list li.editing') {
114
- border_bottom 'none'
115
- padding '0'
116
+ r('.todo-list li.editing') {
117
+ border_bottom :none
118
+ padding 0
116
119
  }
117
120
 
118
- rule('.todo-list li.editing input[type=checkbox], .todo-list li.editing label') {
119
- opacity '0'
121
+ r('.todo-list li.editing input[type=checkbox], .todo-list li.editing label') {
122
+ opacity 0
120
123
  }
121
124
 
122
- rule('.todo-list li .destroy') {
123
- bottom '0'
125
+ r('.todo-list li .destroy') {
126
+ bottom 0
124
127
  color '#949494'
125
- display 'none'
126
- font_size '30px'
127
- height '40px'
128
+ display :none
129
+ font_size 30
130
+ height 40
128
131
  margin 'auto 0'
129
- position 'absolute'
130
- right '10px'
131
- top '0'
132
+ position :absolute
133
+ right 10
134
+ top 0
132
135
  transition 'color .2s ease-out'
133
- width '40px'
136
+ width 40
134
137
  }
135
138
 
136
- rule('.todo-list li:focus .destroy, .todo-list li:hover .destroy') {
137
- display 'block'
139
+ r('.todo-list li:focus .destroy, .todo-list li:hover .destroy') {
140
+ display :block
138
141
  }
139
142
 
140
- rule('.todo-list li .destroy:focus, .todo-list li .destroy:hover') {
143
+ r('.todo-list li .destroy:focus, .todo-list li .destroy:hover') {
141
144
  color '#c18585'
142
145
  }
143
146
 
144
- rule('.todo-list li .destroy:after') {
147
+ r('.todo-list li .destroy:after') {
145
148
  content '"×"'
146
- display 'block'
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
- rule('.todo-list li .toggle, .toggle-all') {
153
- background 'none'
155
+ r('.todo-list li .toggle, .toggle-all') {
156
+ background :none
154
157
  }
155
158
 
156
- rule('.todo-list li .toggle') {
157
- height '40px'
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
- rule('footer.info') {
19
+ r('footer.info') {
20
20
  margin '65px auto 0'
21
21
  color '#4d4d4d'
22
- font_size '11px'
22
+ font_size 11
23
23
  text_shadow '0 1px 0 rgba(255, 255, 255, 0.5)'
24
- text_align 'center'
24
+ text_align :center
25
25
  }
26
26
 
27
- rule('footer.info p') {
27
+ r('footer.info p') {
28
28
  line_height '1'
29
29
  }
30
30
 
31
- rule('footer.info a') {
32
- color 'inherit'
33
- text_decoration 'none'
31
+ r('footer.info a') {
32
+ color :inherit
33
+ text_decoration :none
34
34
  font_weight '400'
35
35
  }
36
36
 
37
- rule('footer.info a:hover') {
38
- text_decoration 'underline'
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
- rule('body, button, html') {
41
- margin '0'
42
- padding '0'
40
+ r('body, button, html') {
41
+ margin 0
42
+ padding 0
43
43
  }
44
44
 
45
- rule('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'
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 'inherit'
55
- vertical_align 'baseline'
54
+ font_weight :inherit
55
+ vertical_align :baseline
56
56
  }
57
57
 
58
- rule('.todoapp') {
58
+ r('.todoapp') {
59
59
  background '#fff'
60
60
  margin '130px 0 40px 0'
61
- position 'relative'
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
- rule('body') {
66
+ r('body') {
67
67
  font "14px 'Helvetica Neue', Helvetica, Arial, sans-serif"
68
- line_height '1.4em'
68
+ line_height 1.4.em
69
69
  background '#f5f5f5'
70
70
  color '#111111'
71
- min_width '230px'
72
- max_width '550px'
71
+ min_width 230
72
+ max_width 550
73
73
  margin '0 auto'
74
- _webkit_font_smoothing 'antialiased'
74
+ _webkit_font_smoothing :antialiased
75
75
  font_weight '300'
76
76
  }
77
77
  }