vines-web 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/Gemfile +3 -0
  2. data/LICENSE +19 -0
  3. data/README.md +37 -0
  4. data/Rakefile +28 -0
  5. data/app/assets/javascripts/application.coffee +19 -0
  6. data/app/assets/javascripts/chat.coffee +362 -0
  7. data/app/assets/javascripts/lib/button.coffee +25 -0
  8. data/app/assets/javascripts/lib/contact.coffee +32 -0
  9. data/app/assets/javascripts/lib/filter.coffee +49 -0
  10. data/app/assets/javascripts/lib/index.coffee +1 -0
  11. data/app/assets/javascripts/lib/layout.coffee +30 -0
  12. data/app/assets/javascripts/lib/login.coffee +68 -0
  13. data/app/assets/javascripts/lib/logout.coffee +5 -0
  14. data/app/assets/javascripts/lib/navbar.coffee +84 -0
  15. data/app/assets/javascripts/lib/notification.coffee +14 -0
  16. data/app/assets/javascripts/lib/router.coffee +40 -0
  17. data/app/assets/javascripts/lib/session.coffee +229 -0
  18. data/app/assets/javascripts/lib/transfer.coffee +106 -0
  19. data/app/assets/javascripts/vendor/icons.js +110 -0
  20. data/app/assets/javascripts/vendor/index.js +1 -0
  21. data/app/assets/javascripts/vendor/jquery.js +4 -0
  22. data/app/assets/javascripts/vendor/raphael.js +6 -0
  23. data/app/assets/javascripts/vendor/strophe.js +1 -0
  24. data/app/assets/stylesheets/application.css +5 -0
  25. data/app/assets/stylesheets/base.scss +385 -0
  26. data/app/assets/stylesheets/chat.scss +144 -0
  27. data/app/assets/stylesheets/login.scss +68 -0
  28. data/bin/vines-web +63 -0
  29. data/config.ru +10 -0
  30. data/lib/vines/web/command/init.rb +34 -0
  31. data/lib/vines/web/command/install.rb +19 -0
  32. data/lib/vines/web/version.rb +5 -0
  33. data/lib/vines/web.rb +4 -0
  34. data/public/assets/application.css +598 -0
  35. data/public/assets/application.js +9 -0
  36. data/public/assets/lib.js +1 -0
  37. data/public/assets/vendor.js +8 -0
  38. data/public/images/dark-gray.png +0 -0
  39. data/public/images/default-user.png +0 -0
  40. data/public/images/light-gray.png +0 -0
  41. data/public/images/logo-large.png +0 -0
  42. data/public/images/logo-small.png +0 -0
  43. data/public/images/white.png +0 -0
  44. data/public/index.html +13 -0
  45. data/vines-web.gemspec +27 -0
  46. metadata +207 -0
@@ -0,0 +1,598 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0; }
4
+
5
+ html, body {
6
+ height: 100%;
7
+ overflow: hidden; }
8
+
9
+ body {
10
+ color: #222;
11
+ font-family: "Helvetica Neue", Helvetica, sans-serif;
12
+ font-size: 10pt;
13
+ line-height: 20pt; }
14
+
15
+ input[type="text"],
16
+ input[type="email"],
17
+ input[type="password"],
18
+ textarea {
19
+ border-radius: 2px;
20
+ border: none;
21
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.2);
22
+ font-family: "Helvetica Neue", Helvetica, sans-serif;
23
+ font-size: 10pt;
24
+ outline: none;
25
+ padding: 6px; }
26
+
27
+ /* ipad */
28
+ @media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
29
+ input[type="text"],
30
+ input[type="email"],
31
+ input[type="password"],
32
+ textarea {
33
+ border: 1px solid #eee; } }
34
+ input[type="text"]:focus,
35
+ input[type="email"]:focus,
36
+ input[type="password"]:focus,
37
+ textarea:focus {
38
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.6); }
39
+
40
+ input[type="button"],
41
+ input[type="submit"] {
42
+ background: -moz-linear-gradient(#ececec, gainsboro);
43
+ background: -ms-linear-gradient(#ececec, gainsboro);
44
+ background: -o-linear-gradient(#ececec, gainsboro);
45
+ background: -webkit-linear-gradient(#ececec, gainsboro);
46
+ border: 1px solid #ccc;
47
+ border-radius: 3px;
48
+ box-shadow: 0 1px 1px white, inset 0 1px 1px rgba(255, 255, 255, 0.5);
49
+ color: #222;
50
+ cursor: pointer;
51
+ font-family: "Helvetica Neue", Helvetica, sans-serif;
52
+ font-size: 13px;
53
+ font-weight: bold;
54
+ height: 27px;
55
+ line-height: 1;
56
+ padding: 0 20px;
57
+ margin-bottom: 10px;
58
+ margin-left: 7px;
59
+ text-shadow: 0 1px 1px #fff; }
60
+
61
+ input[type="submit"] {
62
+ background: #8dd2f7;
63
+ background: -moz-linear-gradient(#8dd2f7, #58b8f4);
64
+ background: -ms-linear-gradient(#8dd2f7, #58b8f4);
65
+ background: -o-linear-gradient(#8dd2f7, #58b8f4);
66
+ background: -webkit-linear-gradient(#8dd2f7, #58b8f4);
67
+ border: 1px solid #448ccd;
68
+ border-top: 1px solid #5da8db;
69
+ color: #0d4078;
70
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.4); }
71
+
72
+ input[type="button"]:active,
73
+ input[type="submit"]:active {
74
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.8);
75
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.8); }
76
+
77
+ input[type="button"].cancel,
78
+ input[type="submit"].cancel {
79
+ background: #ff3137;
80
+ background: -moz-linear-gradient(#ff3137, #dd2828);
81
+ background: -ms-linear-gradient(#ff3137, #dd2828);
82
+ background: -o-linear-gradient(#ff3137, #dd2828);
83
+ background: -webkit-linear-gradient(#ff3137, #dd2828);
84
+ border: 1px solid #981a1a;
85
+ border-top: 1px solid #ac1f23;
86
+ color: #4a0f11; }
87
+
88
+ fieldset {
89
+ border: none; }
90
+
91
+ optgroup {
92
+ font-style: normal; }
93
+
94
+ optgroup option {
95
+ padding-left: 20px; }
96
+
97
+ #container {
98
+ position: relative; }
99
+
100
+ #navbar {
101
+ background: #0c1a2d;
102
+ background: -moz-linear-gradient(#1e4171, #0c1a2d);
103
+ background: -ms-linear-gradient(#1e4171, #0c1a2d);
104
+ background: -o-linear-gradient(#1e4171, #0c1a2d);
105
+ background: -webkit-linear-gradient(#1e4171, #0c1a2d);
106
+ border-bottom: 1px solid rgba(255, 255, 255, 0.3);
107
+ box-shadow: 0 0 3px 1px #222;
108
+ color: #bdd5ff;
109
+ height: 60px;
110
+ position: relative;
111
+ text-shadow: 0 1px 1px #000, 0 0 1px #fff;
112
+ z-index: 10; }
113
+
114
+ #navbar #logo {
115
+ background: url(../images/logo-small.png) no-repeat;
116
+ color: transparent;
117
+ height: 40px;
118
+ opacity: 0.2;
119
+ position: absolute;
120
+ top: 10px;
121
+ right: 10px;
122
+ width: 125px;
123
+ text-shadow: none; }
124
+
125
+ #navbar #current-user {
126
+ height: 50px;
127
+ width: 240px;
128
+ position: relative;
129
+ top: 5px;
130
+ left: 10px; }
131
+
132
+ #navbar #current-user-avatar {
133
+ border: 1px solid rgba(255, 255, 255, 0.1);
134
+ box-shadow: 0 0 1px 0px #bdd5ff;
135
+ height: 48px;
136
+ width: 48px; }
137
+
138
+ #navbar #current-user-info {
139
+ position: relative;
140
+ top: -60px;
141
+ left: 58px; }
142
+
143
+ #navbar #current-user-name {
144
+ font-size: 10pt;
145
+ font-weight: normal;
146
+ line-height: 1.7;
147
+ overflow: hidden;
148
+ text-overflow: ellipsis;
149
+ width: 180px; }
150
+
151
+ #navbar #current-user-presence-form .select {
152
+ background: rgba(255, 255, 255, 0.2);
153
+ border: 1px solid rgba(255, 255, 255, 0.1);
154
+ border-radius: 30px;
155
+ color: rgba(255, 255, 255, 0.8);
156
+ line-height: 16px; }
157
+
158
+ #navbar #current-user-presence {
159
+ border: 1px solid; }
160
+
161
+ #navbar #app-nav {
162
+ height: 100%;
163
+ overflow: hidden;
164
+ position: absolute;
165
+ left: 260px;
166
+ top: 0;
167
+ width: 600px; }
168
+
169
+ #navbar #nav-links {
170
+ height: 100%; }
171
+
172
+ #navbar #nav-links li {
173
+ border-left: 1px solid transparent;
174
+ border-right: 1px solid transparent;
175
+ color: rgba(255, 255, 255, 0.8);
176
+ display: inline-block;
177
+ font-family: "Trebuchet MS", "Helvetica Neue", Helvetica, sans-serif;
178
+ font-weight: bold;
179
+ font-size: 11px;
180
+ height: 100%;
181
+ min-width: 100px;
182
+ line-height: 1;
183
+ list-style: none;
184
+ text-align: center;
185
+ text-transform: uppercase; }
186
+
187
+ #navbar #nav-links li:hover,
188
+ #navbar #nav-links li.selected {
189
+ background: rgba(255, 255, 255, 0.1);
190
+ border-left: 1px solid rgba(255, 255, 255, 0.15);
191
+ border-right: 1px solid rgba(255, 255, 255, 0.15); }
192
+
193
+ #navbar #nav-links li a {
194
+ color: inherit;
195
+ display: inline-block;
196
+ height: 100%;
197
+ line-height: 60px;
198
+ position: relative;
199
+ text-decoration: none;
200
+ width: 100%; }
201
+
202
+ #navbar #nav-links li a svg {
203
+ height: 32px;
204
+ width: 32px;
205
+ position: absolute !important;
206
+ left: 33px;
207
+ top: 4px; }
208
+
209
+ #navbar #nav-links li a span {
210
+ position: relative;
211
+ top: 15px; }
212
+
213
+ .select {
214
+ background: #f0f0f0;
215
+ border-radius: 3px;
216
+ display: inline-block;
217
+ font-size: 11px;
218
+ line-height: 18px;
219
+ padding: 0 5px;
220
+ position: relative; }
221
+
222
+ .select span::after {
223
+ margin-left: 3px;
224
+ content: '\25be'; }
225
+
226
+ .select select {
227
+ cursor: pointer;
228
+ opacity: 0;
229
+ position: absolute;
230
+ top: 0;
231
+ bottom: 0;
232
+ left: 0;
233
+ right: 0; }
234
+
235
+ .filter-button {
236
+ cursor: pointer;
237
+ display: inline-block;
238
+ line-height: 1;
239
+ position: absolute;
240
+ right: 10px;
241
+ top: 6px; }
242
+
243
+ .filter-button svg {
244
+ height: 16px;
245
+ width: 16px; }
246
+
247
+ .filter-form {
248
+ border-bottom: 1px solid #ddd;
249
+ padding: 5px 10px; }
250
+
251
+ .filter-text {
252
+ width: 100%; }
253
+
254
+ .scroll {
255
+ overflow-y: auto; }
256
+
257
+ .scroll::-webkit-scrollbar {
258
+ width: 6px; }
259
+
260
+ .scroll::-webkit-scrollbar-thumb {
261
+ border-radius: 10px; }
262
+
263
+ .scroll::-webkit-scrollbar-thumb:vertical {
264
+ background: rgba(0, 0, 0, 0.2); }
265
+
266
+ ul.selectable li.selected {
267
+ background: #319be7;
268
+ background: -moz-linear-gradient(#319be7, #1b78d9);
269
+ background: -ms-linear-gradient(#319be7, #1b78d9);
270
+ background: -o-linear-gradient(#319be7, #1b78d9);
271
+ background: -webkit-linear-gradient(#319be7, #1b78d9);
272
+ border-top: 1px solid #148ddf;
273
+ border-bottom: 1px solid #095bba;
274
+ color: #fff;
275
+ text-shadow: -1px 1px 1px #3873ad, 0px -1px 1px #3d7dbd; }
276
+
277
+ ul.selectable li.selected.secondary {
278
+ background: #bdc7db;
279
+ background: -moz-linear-gradient(#bdc7db, #9cabc4);
280
+ background: -ms-linear-gradient(#bdc7db, #9cabc4);
281
+ background: -o-linear-gradient(#bdc7db, #9cabc4);
282
+ background: -webkit-linear-gradient(#bdc7db, #9cabc4);
283
+ border-top: 1px solid #bdc6d6;
284
+ border-bottom: 1px solid #94a1b8;
285
+ color: #fff;
286
+ text-shadow: -1px 1px 1px #94a1b8; }
287
+
288
+ .column {
289
+ height: 100%;
290
+ position: absolute; }
291
+
292
+ .column h2 {
293
+ border-bottom: 1px solid #ddd;
294
+ font-size: 10pt;
295
+ padding-left: 10px;
296
+ position: relative;
297
+ text-shadow: 0 -1px 1px #fff; }
298
+
299
+ .column .controls {
300
+ background: rgba(255, 255, 255, 0.05);
301
+ border-top: 1px solid #ddd;
302
+ height: 50px;
303
+ position: absolute;
304
+ bottom: 0;
305
+ width: 260px; }
306
+
307
+ .column .controls > div {
308
+ cursor: pointer;
309
+ display: inline-block;
310
+ height: 27px;
311
+ margin: 0 10px;
312
+ position: relative;
313
+ top: 10px;
314
+ width: 27px; }
315
+
316
+ .column .controls > div > svg {
317
+ height: 27px;
318
+ width: 27px; }
319
+
320
+ .primary {
321
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.5), 0 0 40px rgba(0, 0, 0, 0.1) inset;
322
+ width: 460px;
323
+ left: 260px;
324
+ z-index: 1; }
325
+
326
+ .sidebar {
327
+ background: url(../images/light-gray.png);
328
+ box-shadow: 0 0 40px rgba(0, 0, 0, 0.1) inset;
329
+ width: 260px; }
330
+
331
+ form.overlay {
332
+ background: rgba(255, 255, 255, 0.95);
333
+ border-bottom: 1px solid #ddd;
334
+ border-top: 1px solid #fff;
335
+ box-shadow: 0px -3px 5px rgba(0, 0, 0, 0.1);
336
+ padding-top: 10px;
337
+ position: absolute;
338
+ bottom: 50px;
339
+ left: 0;
340
+ width: 260px; }
341
+
342
+ form.overlay h2,
343
+ form.inset h2 {
344
+ border: none !important;
345
+ line-height: 1;
346
+ margin-bottom: 10px; }
347
+
348
+ form.overlay p,
349
+ form.inset p {
350
+ line-height: 1.5;
351
+ margin: 0 10px 10px 10px;
352
+ text-shadow: 0 1px 1px #fff; }
353
+
354
+ form.inset p {
355
+ margin-top: -5px; }
356
+
357
+ form.overlay .buttons,
358
+ form.inset .buttons {
359
+ padding-right: 10px;
360
+ text-align: right; }
361
+
362
+ form.overlay input[type="text"],
363
+ form.overlay input[type="password"],
364
+ form.overlay input[type="email"] {
365
+ margin-bottom: 10px;
366
+ width: 228px;
367
+ position: relative;
368
+ left: 10px; }
369
+
370
+ .notification {
371
+ background: rgba(12, 26, 45, 0.75);
372
+ border-radius: 30px;
373
+ color: #fff;
374
+ font-size: 10pt;
375
+ font-weight: bold;
376
+ padding: 5px 100px;
377
+ position: absolute;
378
+ top: 50%;
379
+ left: 50%;
380
+ text-align: center;
381
+ text-shadow: 0 1px 1px #000;
382
+ z-index: 2; }
383
+ #login-page {
384
+ background: -moz-radial-gradient(rgba(26, 55, 98, 0.8), rgba(12, 26, 45, 0.8)), url(../images/dark-gray.png);
385
+ background: -ms-radial-gradient(center, 500px 500px, rgba(26, 55, 98, 0.8), rgba(12, 26, 45, 0.8)), url(../images/dark-gray.png);
386
+ background: -o-radial-gradient(rgba(26, 55, 98, 0.8), rgba(12, 26, 45, 0.8)), url(../images/dark-gray.png);
387
+ background: -webkit-radial-gradient(center, 500px 500px, rgba(26, 55, 98, 0.8), rgba(12, 26, 45, 0.8)), url(../images/dark-gray.png); }
388
+
389
+ #login-page #container {
390
+ height: 100%;
391
+ width: 100%;
392
+ text-align: center; }
393
+
394
+ #login-page #login-form {
395
+ margin: 0 auto;
396
+ position: relative;
397
+ width: 640px; }
398
+
399
+ #login-page #login-form h1 {
400
+ background: url(../images/logo-large.png) no-repeat;
401
+ color: transparent;
402
+ height: 82px;
403
+ line-height: 1;
404
+ margin: 0 auto 40px auto;
405
+ text-shadow: none;
406
+ width: 245px; }
407
+
408
+ #login-page #jid,
409
+ #login-page #password {
410
+ margin: 0 auto;
411
+ margin-bottom: 10px;
412
+ width: 240px;
413
+ display: block; }
414
+
415
+ #login-page #icon {
416
+ position: absolute;
417
+ left: 90px;
418
+ top: 0px;
419
+ width: 100px;
420
+ height: 80px; }
421
+
422
+ #login-page #login-form-controls {
423
+ background: rgba(0, 0, 0, 0.2);
424
+ border: 1px solid rgba(0, 0, 0, 0.1);
425
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
426
+ border-radius: 5px;
427
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.1) inset;
428
+ margin: 0 auto;
429
+ padding: 20px; }
430
+
431
+ #login-page #start {
432
+ width: 100px;
433
+ margin-left: 0;
434
+ margin-bottom: 0; }
435
+
436
+ #login-page #start:active {
437
+ box-shadow: inset 0 1px 7px #0c1a2d; }
438
+
439
+ #login-page input[type="submit"] {
440
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.8), inset 0 1px 1px rgba(255, 255, 255, 0.5); }
441
+
442
+ #login-page #error {
443
+ background: rgba(255, 255, 255, 0.05);
444
+ border-radius: 3px;
445
+ color: #4693FF;
446
+ font-size: 10pt;
447
+ margin: 20px auto;
448
+ text-shadow: 0 1px 1px #000;
449
+ width: 250px; }
450
+ #chat-page #container {
451
+ height: 100%; }
452
+
453
+ #chat-page #chat-title {
454
+ background: #f8f8f8; }
455
+
456
+ #chat-page #messages {
457
+ background: #fff;
458
+ height: 100%;
459
+ list-style: none;
460
+ text-shadow: 0 1px 1px #ddd;
461
+ width: 100%; }
462
+
463
+ #chat-page #messages li {
464
+ border-bottom: 1px solid #f0f0f0;
465
+ min-height: 40px;
466
+ padding: 10px;
467
+ position: relative; }
468
+
469
+ #chat-page #messages li:hover > span .time {
470
+ opacity: 0.3; }
471
+
472
+ #chat-page #messages li img {
473
+ border: 3px solid #fff;
474
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 0 40px rgba(0, 0, 0, 0.06) inset;
475
+ position: absolute;
476
+ top: 7px;
477
+ right: 7px;
478
+ height: 40px;
479
+ width: 40px; }
480
+
481
+ #chat-page #messages li p {
482
+ line-height: 1.5;
483
+ width: 90%; }
484
+
485
+ #chat-page #messages li footer {
486
+ font-size: 9pt;
487
+ padding-right: 50px;
488
+ text-align: right; }
489
+
490
+ #chat-page #messages li footer span {
491
+ color: #d8d8d8;
492
+ margin-right: 0.5em;
493
+ text-shadow: none; }
494
+
495
+ #chat-page #messages li footer .author::before {
496
+ content: '\2014 '; }
497
+
498
+ #chat-page #message-form {
499
+ background: #f8f8f8 -moz-linear-gradient(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.05));
500
+ background: #f8f8f8 -ms-linear-gradient(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.05));
501
+ background: #f8f8f8 -o-linear-gradient(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.05));
502
+ background: #f8f8f8 -webkit-linear-gradient(rgba(255, 255, 255, 0.1), rgba(0, 0, 0, 0.05));
503
+ border-top: 1px solid #dfdfdf;
504
+ height: 50px;
505
+ position: absolute;
506
+ bottom: 0;
507
+ width: 100%; }
508
+
509
+ #chat-page #message {
510
+ display: block;
511
+ position: relative;
512
+ left: 10px;
513
+ top: 10px;
514
+ width: 428px; }
515
+
516
+ #chat-page #roster,
517
+ #chat-page #notifications {
518
+ height: 100%;
519
+ list-style: none;
520
+ text-shadow: 0 1px 1px #fff;
521
+ width: 260px; }
522
+
523
+ #chat-page #roster li,
524
+ #chat-page #notifications li {
525
+ cursor: pointer;
526
+ border-bottom: 1px solid #ddd;
527
+ font-weight: bold;
528
+ min-height: 42px;
529
+ padding: 0 10px;
530
+ position: relative;
531
+ -moz-transition: background 0.3s;
532
+ -o-transition: background 0.3s;
533
+ -webkit-transition: background 0.3s;
534
+ transition: background 0.3s; }
535
+
536
+ #chat-page #notifications li {
537
+ font-weight: normal;
538
+ padding: 10px 0 0 0; }
539
+
540
+ #chat-page #roster li:hover:not(.selected),
541
+ #chat-page #notifications li:hover {
542
+ background: white; }
543
+
544
+ #chat-page #roster li.offline > * {
545
+ opacity: 0.4; }
546
+
547
+ #chat-page #roster li.selected > * {
548
+ opacity: 1.0; }
549
+
550
+ #chat-page #roster li.selected .status-msg {
551
+ color: rgba(255, 255, 255, 0.85); }
552
+
553
+ #chat-page #roster .status-msg {
554
+ display: block;
555
+ font-size: 11px;
556
+ font-weight: normal;
557
+ line-height: 11px; }
558
+
559
+ #chat-page #roster .unread {
560
+ background: #319be7;
561
+ background: -moz-linear-gradient(#319be7, #1b78d9);
562
+ background: -ms-linear-gradient(#319be7, #1b78d9);
563
+ background: -o-linear-gradient(#319be7, #1b78d9);
564
+ background: -webkit-linear-gradient(#319be7, #1b78d9);
565
+ border-radius: 30px;
566
+ color: #fff;
567
+ display: inline-block;
568
+ font-size: 11px;
569
+ font-weight: normal;
570
+ line-height: 15px;
571
+ padding: 0px 6px;
572
+ position: absolute;
573
+ right: 50px;
574
+ top: 14px;
575
+ text-shadow: none; }
576
+
577
+ #chat-page #roster .vcard-img {
578
+ background: #fff;
579
+ border: 1px solid #fff;
580
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 0 40px rgba(0, 0, 0, 0.06) inset;
581
+ height: 32px;
582
+ width: 32px;
583
+ position: absolute;
584
+ top: 4px;
585
+ right: 10px; }
586
+
587
+ #chat-page #charlie-controls {
588
+ text-align: right; }
589
+
590
+ #chat-page #edit-contact-jid {
591
+ color: #444;
592
+ margin-top: -5px; }
593
+ /*
594
+
595
+
596
+
597
+ */
598
+