amber-rails 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.rvmrc +4 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +96 -0
- data/LICENSE +7 -0
- data/README.md +13 -0
- data/Rakefile +15 -0
- data/amber-rails.gemspec +21 -0
- data/app/assets/.DS_Store +0 -0
- data/app/assets/javascripts/.DS_Store +0 -0
- data/app/assets/javascripts/codemirror/codemirror.js +2144 -0
- data/app/assets/javascripts/codemirror/overlay.js +51 -0
- data/app/assets/javascripts/codemirror/runmode.js +27 -0
- data/app/assets/javascripts/codemirror/smalltalk/index.html +56 -0
- data/app/assets/javascripts/codemirror/smalltalk/smalltalk.js +134 -0
- data/app/assets/javascripts/html5.js +35 -0
- data/app/assets/javascripts/jquery.js +8981 -0
- data/app/assets/javascripts/jquery.textarea.js +267 -0
- data/app/assets/javascripts/jquery.tmpl.js +503 -0
- data/app/assets/javascripts/jquery.ui.js +272 -0
- data/app/assets/javascripts/json2.js +481 -0
- data/app/assets/javascripts/jtalk-development.js.coffee +4 -0
- data/app/assets/javascripts/jtalk-todos.js.coffee +4 -0
- data/app/assets/javascripts/jtalk.js.coffee +16 -0
- data/app/assets/javascripts/jtalk_core/boot.js +466 -0
- data/app/assets/javascripts/jtalk_core/st/.DS_Store +0 -0
- data/app/assets/javascripts/jtalk_core/st/Benchfib.js +159 -0
- data/app/assets/javascripts/jtalk_core/st/Canvas.js +1479 -0
- data/app/assets/javascripts/jtalk_core/st/Compiler.js +1587 -0
- data/app/assets/javascripts/jtalk_core/st/Examples.js +863 -0
- data/app/assets/javascripts/jtalk_core/st/HTML5.js +54 -0
- data/app/assets/javascripts/jtalk_core/st/IDE.js +3457 -0
- data/app/assets/javascripts/jtalk_core/st/JQuery.js +898 -0
- data/app/assets/javascripts/jtalk_core/st/Kernel.js +6761 -0
- data/app/assets/javascripts/jtalk_core/st/Parser.js +1655 -0
- data/app/assets/javascripts/jtalk_core/st/SUnit.js +1059 -0
- data/app/assets/stylesheets/codemirror.css +67 -0
- data/app/assets/stylesheets/codemirror_jtalk.css +21 -0
- data/app/assets/stylesheets/jtalk.css +369 -0
- data/app/assets/stylesheets/sunit.css +65 -0
- data/config/routes.rb +10 -0
- data/examples/todos/.gitignore +5 -0
- data/examples/todos/.rvmrc +4 -0
- data/examples/todos/Gemfile +12 -0
- data/examples/todos/Gemfile.lock +126 -0
- data/examples/todos/README +261 -0
- data/examples/todos/Rakefile +15 -0
- data/examples/todos/app/assets/images/rails.png +0 -0
- data/examples/todos/app/assets/javascripts/application.js.coffee +5 -0
- data/examples/todos/app/assets/javascripts/jtalk/Examples.deploy.js +863 -0
- data/examples/todos/app/assets/javascripts/jtalk/Examples.js +863 -0
- data/examples/todos/app/assets/smalltalk/Examples.st +397 -0
- data/examples/todos/app/assets/stylesheets/application.css +8 -0
- data/examples/todos/app/assets/stylesheets/jtalk-todos.css +154 -0
- data/examples/todos/app/controllers/application_controller.rb +3 -0
- data/examples/todos/app/controllers/todos_controller.rb +5 -0
- data/examples/todos/app/helpers/application_helper.rb +2 -0
- data/examples/todos/app/models/.gitkeep +0 -0
- data/examples/todos/app/views/todos/index.html.haml +16 -0
- data/examples/todos/config.ru +4 -0
- data/examples/todos/config/application.rb +31 -0
- data/examples/todos/config/boot.rb +6 -0
- data/examples/todos/config/database.yml +25 -0
- data/examples/todos/config/environment.rb +5 -0
- data/examples/todos/config/environments/development.rb +27 -0
- data/examples/todos/config/environments/production.rb +60 -0
- data/examples/todos/config/environments/test.rb +42 -0
- data/examples/todos/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/todos/config/initializers/inflections.rb +10 -0
- data/examples/todos/config/initializers/mime_types.rb +5 -0
- data/examples/todos/config/initializers/secret_token.rb +7 -0
- data/examples/todos/config/initializers/session_store.rb +8 -0
- data/examples/todos/config/initializers/wrap_parameters.rb +14 -0
- data/examples/todos/config/locales/en.yml +5 -0
- data/examples/todos/config/routes.rb +3 -0
- data/examples/todos/log/.gitkeep +0 -0
- data/examples/todos/public/404.html +26 -0
- data/examples/todos/public/422.html +26 -0
- data/examples/todos/public/500.html +26 -0
- data/examples/todos/public/favicon.ico +0 -0
- data/examples/todos/public/robots.txt +5 -0
- data/examples/todos/script/rails +6 -0
- data/examples/todos/vendor/assets/stylesheets/.gitkeep +0 -0
- data/examples/todos/vendor/plugins/.gitkeep +0 -0
- data/lib/amber-rails.rb +1 -0
- data/lib/amber/rails.rb +30 -0
- data/lib/amber/rails/engine.rb +12 -0
- data/lib/amber/rails/version.rb +5 -0
- metadata +167 -0
@@ -0,0 +1,397 @@
|
|
1
|
+
Widget subclass: #Counter
|
2
|
+
instanceVariableNames: 'count header'
|
3
|
+
category: 'Examples'!
|
4
|
+
|
5
|
+
!Counter methodsFor: 'actions'!
|
6
|
+
|
7
|
+
increase
|
8
|
+
count := count + 1.
|
9
|
+
header contents: [:html | html with: count asString]
|
10
|
+
!
|
11
|
+
|
12
|
+
decrease
|
13
|
+
count := count - 1.
|
14
|
+
header contents: [:html | html with: count asString]
|
15
|
+
! !
|
16
|
+
|
17
|
+
!Counter methodsFor: 'initialization'!
|
18
|
+
|
19
|
+
initialize
|
20
|
+
super initialize.
|
21
|
+
count := 0
|
22
|
+
! !
|
23
|
+
|
24
|
+
!Counter methodsFor: 'rendering'!
|
25
|
+
|
26
|
+
renderOn: html
|
27
|
+
header := html h1
|
28
|
+
with: count asString;
|
29
|
+
yourself.
|
30
|
+
html button
|
31
|
+
with: '++';
|
32
|
+
onClick: [self increase].
|
33
|
+
html button
|
34
|
+
with: '--';
|
35
|
+
onClick: [self decrease]
|
36
|
+
! !
|
37
|
+
|
38
|
+
Widget subclass: #Tetris
|
39
|
+
instanceVariableNames: 'renderingContext timer speed score rows movingPiece'
|
40
|
+
category: 'Examples'!
|
41
|
+
|
42
|
+
!Tetris methodsFor: 'accessing'!
|
43
|
+
|
44
|
+
width
|
45
|
+
^self class width
|
46
|
+
!
|
47
|
+
|
48
|
+
height
|
49
|
+
^self class height
|
50
|
+
!
|
51
|
+
|
52
|
+
squares
|
53
|
+
^self class squares
|
54
|
+
!
|
55
|
+
|
56
|
+
gluePiece: aPiece
|
57
|
+
aPiece glueOn: self
|
58
|
+
!
|
59
|
+
|
60
|
+
rows
|
61
|
+
"An array of rows. Each row is a collection of points."
|
62
|
+
^rows
|
63
|
+
!
|
64
|
+
|
65
|
+
addRow: aCollection
|
66
|
+
self rows add: aCollection
|
67
|
+
! !
|
68
|
+
|
69
|
+
!Tetris methodsFor: 'actions'!
|
70
|
+
|
71
|
+
startNewGame
|
72
|
+
self newGame.
|
73
|
+
timer ifNotNil: [timer clearInterval].
|
74
|
+
timer := [self nextStep] valueWithInterval: speed
|
75
|
+
!
|
76
|
+
|
77
|
+
nextStep
|
78
|
+
movingPiece ifNil: [self newPiece].
|
79
|
+
(movingPiece canMoveIn: self)
|
80
|
+
ifTrue: [movingPiece position: movingPiece position + (0@1)]
|
81
|
+
ifFalse: [self newPiece].
|
82
|
+
self redraw
|
83
|
+
!
|
84
|
+
|
85
|
+
redraw
|
86
|
+
renderingContext clearRectFrom: 0@ self width to: 0@ self height.
|
87
|
+
self
|
88
|
+
drawMap;
|
89
|
+
drawPiece
|
90
|
+
!
|
91
|
+
|
92
|
+
drawMap
|
93
|
+
renderingContext
|
94
|
+
fillStyle: '#fafafa';
|
95
|
+
fillRectFrom: 0@0 to: self width@self height.
|
96
|
+
renderingContext
|
97
|
+
lineWidth: 0.5;
|
98
|
+
strokeStyle: '#999'.
|
99
|
+
0 to: self class squares x do: [:each | | x |
|
100
|
+
x := each * self class squareSize.
|
101
|
+
self drawLineFrom: x@0 to: x@self height].
|
102
|
+
0 to: self class squares y do: [:each | | y |
|
103
|
+
y := each * self class squareSize.
|
104
|
+
self drawLineFrom: 0@y to: self width@y].
|
105
|
+
!
|
106
|
+
|
107
|
+
drawLineFrom: aPoint to: anotherPoint
|
108
|
+
renderingContext
|
109
|
+
beginPath;
|
110
|
+
moveTo: aPoint;
|
111
|
+
lineTo: anotherPoint;
|
112
|
+
stroke
|
113
|
+
!
|
114
|
+
|
115
|
+
newGame
|
116
|
+
rows := #().
|
117
|
+
movingPiece := nil.
|
118
|
+
speed := 200.
|
119
|
+
score := 0
|
120
|
+
!
|
121
|
+
|
122
|
+
newPiece
|
123
|
+
movingPiece := TetrisPiece atRandom
|
124
|
+
!
|
125
|
+
|
126
|
+
drawRows
|
127
|
+
self rows do: [:each |].
|
128
|
+
movingPiece ifNotNil: [movingPiece drawOn: renderingContext]
|
129
|
+
!
|
130
|
+
|
131
|
+
drawPiece
|
132
|
+
movingPiece ifNotNil: [
|
133
|
+
movingPiece drawOn: renderingContext]
|
134
|
+
! !
|
135
|
+
|
136
|
+
!Tetris methodsFor: 'initialization'!
|
137
|
+
|
138
|
+
initialize
|
139
|
+
super initialize.
|
140
|
+
self newGame
|
141
|
+
! !
|
142
|
+
|
143
|
+
!Tetris methodsFor: 'rendering'!
|
144
|
+
|
145
|
+
renderOn: html
|
146
|
+
html div
|
147
|
+
class: 'tetris';
|
148
|
+
with: [
|
149
|
+
html h3 with: 'Tetris'.
|
150
|
+
self renderCanvasOn: html.
|
151
|
+
self renderButtonsOn: html]
|
152
|
+
!
|
153
|
+
|
154
|
+
renderCanvasOn: html
|
155
|
+
| canvas |
|
156
|
+
canvas := html canvas.
|
157
|
+
canvas at: 'width' put: self width asString.
|
158
|
+
canvas at: 'height' put: self height asString.
|
159
|
+
renderingContext := CanvasRenderingContext tagBrush: canvas.
|
160
|
+
self redraw
|
161
|
+
!
|
162
|
+
|
163
|
+
renderButtonsOn: html
|
164
|
+
html div
|
165
|
+
class: 'tetris_buttons';
|
166
|
+
with: [
|
167
|
+
html button
|
168
|
+
with: 'New game';
|
169
|
+
onClick: [self startNewGame].
|
170
|
+
html button
|
171
|
+
with: 'play/pause';
|
172
|
+
onClick: [self update]]
|
173
|
+
! !
|
174
|
+
|
175
|
+
!Tetris class methodsFor: 'accessing'!
|
176
|
+
|
177
|
+
squareSize
|
178
|
+
^22
|
179
|
+
!
|
180
|
+
|
181
|
+
width
|
182
|
+
^self squareSize * (self squares x)
|
183
|
+
!
|
184
|
+
|
185
|
+
height
|
186
|
+
^self squareSize * (self squares y)
|
187
|
+
!
|
188
|
+
|
189
|
+
squares
|
190
|
+
^10@15
|
191
|
+
! !
|
192
|
+
|
193
|
+
Widget subclass: #TetrisPiece
|
194
|
+
instanceVariableNames: 'rotation position'
|
195
|
+
category: 'Examples'!
|
196
|
+
|
197
|
+
!TetrisPiece methodsFor: 'accessing'!
|
198
|
+
|
199
|
+
rotation
|
200
|
+
^rotation ifNil: [rotation := 1]
|
201
|
+
!
|
202
|
+
|
203
|
+
rotation: aNumber
|
204
|
+
rotation := aNumber
|
205
|
+
!
|
206
|
+
|
207
|
+
position
|
208
|
+
^position ifNil: [(Tetris squares x / 2) -1 @ 0]
|
209
|
+
!
|
210
|
+
|
211
|
+
position: aPoint
|
212
|
+
^position := aPoint
|
213
|
+
!
|
214
|
+
|
215
|
+
bounds
|
216
|
+
self subclassResponsibility
|
217
|
+
!
|
218
|
+
|
219
|
+
color
|
220
|
+
^'#afa'
|
221
|
+
!
|
222
|
+
|
223
|
+
height
|
224
|
+
^2
|
225
|
+
! !
|
226
|
+
|
227
|
+
!TetrisPiece methodsFor: 'drawing'!
|
228
|
+
|
229
|
+
drawOn: aRenderingContext
|
230
|
+
aRenderingContext fillStyle: self color.
|
231
|
+
self bounds do: [:each |
|
232
|
+
aRenderingContext
|
233
|
+
fillRectFrom: each + self position* Tetris squareSize to: 1@1 * Tetris squareSize;
|
234
|
+
strokeStyle: '#999';
|
235
|
+
lineWidth: 2;
|
236
|
+
strokeRectFrom: each + self position* Tetris squareSize to: 1@1 * Tetris squareSize]
|
237
|
+
! !
|
238
|
+
|
239
|
+
!TetrisPiece methodsFor: 'testing'!
|
240
|
+
|
241
|
+
canMove
|
242
|
+
^self position y < (Tetris squares y - self height)
|
243
|
+
!
|
244
|
+
|
245
|
+
canMoveIn: aTetris
|
246
|
+
^self position y < (aTetris squares y - self height)
|
247
|
+
! !
|
248
|
+
|
249
|
+
!TetrisPiece class methodsFor: 'instance creation'!
|
250
|
+
|
251
|
+
atRandom
|
252
|
+
^(self subclasses at: self subclasses size atRandom) new
|
253
|
+
! !
|
254
|
+
|
255
|
+
TetrisPiece subclass: #TetrisPieceO
|
256
|
+
instanceVariableNames: ''
|
257
|
+
category: 'Examples'!
|
258
|
+
|
259
|
+
!TetrisPieceO methodsFor: 'accessing'!
|
260
|
+
|
261
|
+
bounds
|
262
|
+
^Array new
|
263
|
+
add: 0@0;
|
264
|
+
add: 0@1;
|
265
|
+
add: 1@0;
|
266
|
+
add: 1@1;
|
267
|
+
yourself
|
268
|
+
! !
|
269
|
+
|
270
|
+
TetrisPiece subclass: #TetrisPieceL
|
271
|
+
instanceVariableNames: ''
|
272
|
+
category: 'Examples'!
|
273
|
+
|
274
|
+
!TetrisPieceL methodsFor: 'accessing'!
|
275
|
+
|
276
|
+
bounds
|
277
|
+
^Array new
|
278
|
+
add: 0@0;
|
279
|
+
add: 0@1;
|
280
|
+
add: 0@2;
|
281
|
+
add: 1@2;
|
282
|
+
yourself
|
283
|
+
!
|
284
|
+
|
285
|
+
color
|
286
|
+
^'#ffa'
|
287
|
+
!
|
288
|
+
|
289
|
+
height
|
290
|
+
^3
|
291
|
+
! !
|
292
|
+
|
293
|
+
TetrisPiece subclass: #TetrisPieceJ
|
294
|
+
instanceVariableNames: ''
|
295
|
+
category: 'Examples'!
|
296
|
+
|
297
|
+
!TetrisPieceJ methodsFor: 'accessing'!
|
298
|
+
|
299
|
+
color
|
300
|
+
^'#aaf'
|
301
|
+
!
|
302
|
+
|
303
|
+
bounds
|
304
|
+
^Array new
|
305
|
+
add: 1@0;
|
306
|
+
add: 1@1;
|
307
|
+
add: 1@2;
|
308
|
+
add: 0@2;
|
309
|
+
yourself
|
310
|
+
!
|
311
|
+
|
312
|
+
height
|
313
|
+
^3
|
314
|
+
! !
|
315
|
+
|
316
|
+
TetrisPiece subclass: #TetrisPieceI
|
317
|
+
instanceVariableNames: ''
|
318
|
+
category: 'Examples'!
|
319
|
+
|
320
|
+
!TetrisPieceI methodsFor: 'accessing'!
|
321
|
+
|
322
|
+
color
|
323
|
+
^'#faa'
|
324
|
+
!
|
325
|
+
|
326
|
+
bounds
|
327
|
+
^Array new
|
328
|
+
add: 0@0;
|
329
|
+
add: 0@1;
|
330
|
+
add: 0@2;
|
331
|
+
add: 0@3;
|
332
|
+
yourself
|
333
|
+
!
|
334
|
+
|
335
|
+
height
|
336
|
+
^4
|
337
|
+
! !
|
338
|
+
|
339
|
+
TetrisPiece subclass: #TetrisPieceT
|
340
|
+
instanceVariableNames: ''
|
341
|
+
category: 'Examples'!
|
342
|
+
|
343
|
+
!TetrisPieceT methodsFor: 'accessing'!
|
344
|
+
|
345
|
+
bounds
|
346
|
+
^Array new
|
347
|
+
add: 0@0;
|
348
|
+
add: 1@0;
|
349
|
+
add: 2@0;
|
350
|
+
add: 1@1;
|
351
|
+
yourself
|
352
|
+
!
|
353
|
+
|
354
|
+
color
|
355
|
+
^'#aaf'
|
356
|
+
! !
|
357
|
+
|
358
|
+
Widget subclass: #Todos
|
359
|
+
instanceVariableNames: ''
|
360
|
+
category: 'Examples'!
|
361
|
+
|
362
|
+
!Todos methodsFor: 'not yet classified'!
|
363
|
+
|
364
|
+
renderOn: html
|
365
|
+
html div id: 'views'; with: [
|
366
|
+
html div id: 'tasks'; with: [
|
367
|
+
html h1 with: 'Todos'.
|
368
|
+
self renderFormOn: html.
|
369
|
+
html div class: 'items'.
|
370
|
+
self renderFooterOn: html]]
|
371
|
+
!
|
372
|
+
|
373
|
+
renderFormOn: html
|
374
|
+
html form
|
375
|
+
with: [
|
376
|
+
html input
|
377
|
+
at: 'type' put: 'text';
|
378
|
+
at: 'placeholder' put: 'What needs to be done?' ];
|
379
|
+
onSubmit: [ <alert('hi')> ]
|
380
|
+
!
|
381
|
+
|
382
|
+
renderFooterOn: html
|
383
|
+
html footer with: [
|
384
|
+
html a class: 'clear'; with: 'Clear completed'.
|
385
|
+
html div
|
386
|
+
class: 'count';
|
387
|
+
with: [html span class: 'countVal'];
|
388
|
+
append: ' left']
|
389
|
+
! !
|
390
|
+
|
391
|
+
!Todos class methodsFor: 'not yet classified'!
|
392
|
+
|
393
|
+
renderDefault
|
394
|
+
|
395
|
+
'#todos-app' asJQuery append: self new
|
396
|
+
! !
|
397
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
3
|
+
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
|
4
|
+
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
5
|
+
*= require_self
|
6
|
+
*= require jtalk
|
7
|
+
*= require jtalk-todos
|
8
|
+
*/
|
@@ -0,0 +1,154 @@
|
|
1
|
+
html, body {
|
2
|
+
margin: 0;
|
3
|
+
padding: 0;
|
4
|
+
}
|
5
|
+
|
6
|
+
body {
|
7
|
+
font-family: "Helvetica Neue", helvetica, arial, sans-serif;
|
8
|
+
font-size: 14px;
|
9
|
+
line-height: 1.4em;
|
10
|
+
background: #eeeeee;
|
11
|
+
color: #333333;
|
12
|
+
}
|
13
|
+
|
14
|
+
#views {
|
15
|
+
width: 520px;
|
16
|
+
margin: 0 auto 40px auto;
|
17
|
+
background: white;
|
18
|
+
|
19
|
+
-moz-box-shadow: rgba(0, 0, 0, 0.2) 0 2px 6px 0;
|
20
|
+
-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 2px 6px 0;
|
21
|
+
-o-box-shadow: rgba(0, 0, 0, 0.2) 0 2px 6px 0;
|
22
|
+
box-shadow: rgba(0, 0, 0, 0.2) 0 2px 6px 0;
|
23
|
+
|
24
|
+
-moz-border-radius: 0 0 5px 5px;
|
25
|
+
-o-border-radius: 0 0 5px 5px;
|
26
|
+
-webkit-border-radius: 0 0 5px 5px;
|
27
|
+
border-radius: 0 0 5px 5px;
|
28
|
+
}
|
29
|
+
|
30
|
+
#tasks {
|
31
|
+
padding: 20px;
|
32
|
+
}
|
33
|
+
|
34
|
+
#tasks h1 {
|
35
|
+
font-size: 36px;
|
36
|
+
font-weight: bold;
|
37
|
+
text-align: center;
|
38
|
+
padding: 0 0 10px 0;
|
39
|
+
}
|
40
|
+
|
41
|
+
#tasks input[type="text"] {
|
42
|
+
width: 466px;
|
43
|
+
font-size: 24px;
|
44
|
+
font-family: inherit;
|
45
|
+
line-height: 1.4em;
|
46
|
+
border: 0;
|
47
|
+
outline: none;
|
48
|
+
padding: 6px;
|
49
|
+
border: 1px solid #999999;
|
50
|
+
|
51
|
+
-moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
|
52
|
+
-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
|
53
|
+
-o-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
|
54
|
+
box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
|
55
|
+
}
|
56
|
+
|
57
|
+
#tasks input::-webkit-input-placeholder {
|
58
|
+
font-style: italic;
|
59
|
+
}
|
60
|
+
|
61
|
+
#tasks .items {
|
62
|
+
margin: 10px 0;
|
63
|
+
list-style: none;
|
64
|
+
}
|
65
|
+
|
66
|
+
#tasks .item {
|
67
|
+
padding: 15px 20px 15px 0;
|
68
|
+
position: relative;
|
69
|
+
font-size: 24px;
|
70
|
+
border-bottom: 1px solid #cccccc;
|
71
|
+
}
|
72
|
+
|
73
|
+
#tasks .item.done span {
|
74
|
+
color: #777777;
|
75
|
+
text-decoration: line-through;
|
76
|
+
}
|
77
|
+
|
78
|
+
#tasks .item .destroy {
|
79
|
+
position: absolute;
|
80
|
+
right: 10px;
|
81
|
+
top: 16px;
|
82
|
+
display: none;
|
83
|
+
cursor: pointer;
|
84
|
+
width: 20px;
|
85
|
+
height: 20px;
|
86
|
+
background: url(../images/destroy.png) no-repeat center center;
|
87
|
+
}
|
88
|
+
|
89
|
+
#tasks .item:hover .destroy {
|
90
|
+
display: block;
|
91
|
+
}
|
92
|
+
|
93
|
+
#tasks .item .edit { display: none; }
|
94
|
+
#tasks .item.editing .edit { display: block; }
|
95
|
+
#tasks .item.editing .view { display: none; }
|
96
|
+
|
97
|
+
#tasks footer {
|
98
|
+
display: block;
|
99
|
+
margin: 20px -20px -20px -20px;
|
100
|
+
overflow: hidden;
|
101
|
+
|
102
|
+
color: #555555;
|
103
|
+
background: #f4fce8;
|
104
|
+
border-top: 1px solid #ededed;
|
105
|
+
padding: 0 20px;
|
106
|
+
line-height: 36px;
|
107
|
+
|
108
|
+
-moz-border-radius: 0 0 5px 5px;
|
109
|
+
-o-border-radius: 0 0 5px 5px;
|
110
|
+
-webkit-border-radius: 0 0 5px 5px;
|
111
|
+
border-radius: 0 0 5px 5px;
|
112
|
+
}
|
113
|
+
|
114
|
+
#tasks .clear {
|
115
|
+
display: block;
|
116
|
+
float: right;
|
117
|
+
line-height: 20px;
|
118
|
+
text-decoration: none;
|
119
|
+
|
120
|
+
background: rgba(0, 0, 0, 0.1);
|
121
|
+
color: #555555;
|
122
|
+
font-size: 11px;
|
123
|
+
margin-top: 8px;
|
124
|
+
padding: 0 10px 1px;
|
125
|
+
|
126
|
+
-moz-border-radius: 12px;
|
127
|
+
-webkit-border-radius: 12px;
|
128
|
+
-o-border-radius: 12px;
|
129
|
+
border-radius: 12px;
|
130
|
+
|
131
|
+
-moz-box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 0 0;
|
132
|
+
-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 0 0;
|
133
|
+
-o-box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 0 0;
|
134
|
+
box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 0 0;
|
135
|
+
|
136
|
+
cursor: pointer;
|
137
|
+
}
|
138
|
+
|
139
|
+
#tasks .clear:hover {
|
140
|
+
background: rgba(0, 0, 0, 0.15);
|
141
|
+
-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 -1px 0 0;
|
142
|
+
-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 -1px 0 0;
|
143
|
+
-o-box-shadow: rgba(0, 0, 0, 0.3) 0 -1px 0 0;
|
144
|
+
box-shadow: rgba(0, 0, 0, 0.3) 0 -1px 0 0;
|
145
|
+
}
|
146
|
+
|
147
|
+
#tasks .clear:active {
|
148
|
+
position: relative;
|
149
|
+
top: 1px;
|
150
|
+
}
|
151
|
+
|
152
|
+
#tasks .count span {
|
153
|
+
font-weight: bold;
|
154
|
+
}
|