amber-rails 0.1.0
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.
- 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
|
+
}
|