bpm 1.0.0.beta.4 → 1.0.0.beta.5

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.
Files changed (82) hide show
  1. data/CHANGELOG.md +11 -0
  2. data/TODO.md +4 -10
  3. data/backbone/LICENSE +22 -0
  4. data/backbone/README +25 -0
  5. data/backbone/Rakefile +42 -0
  6. data/backbone/backbone-0.5.1.bpkg +0 -0
  7. data/backbone/examples/backbone-localstorage.js +84 -0
  8. data/backbone/examples/todos/destroy.png +0 -0
  9. data/backbone/examples/todos/index.html +87 -0
  10. data/backbone/examples/todos/todos.css +311 -0
  11. data/backbone/examples/todos/todos.js +258 -0
  12. data/backbone/index.html +2606 -0
  13. data/backbone/index.js +1 -0
  14. data/backbone/lib/backbone.js +1149 -0
  15. data/backbone/lib/index.js +1 -0
  16. data/backbone/package.json +14 -0
  17. data/backbone/test/collection.js +345 -0
  18. data/backbone/test/events.js +70 -0
  19. data/backbone/test/model.coffee +43 -0
  20. data/backbone/test/model.js +424 -0
  21. data/backbone/test/noconflict.js +12 -0
  22. data/backbone/test/router.js +116 -0
  23. data/backbone/test/speed.js +45 -0
  24. data/backbone/test/sync.js +133 -0
  25. data/backbone/test/test-zepto.html +30 -0
  26. data/backbone/test/test.html +31 -0
  27. data/backbone/test/vendor/jquery-1.5.js +8176 -0
  28. data/backbone/test/vendor/jslitmus.js +649 -0
  29. data/backbone/test/vendor/json2.js +481 -0
  30. data/backbone/test/vendor/qunit.css +196 -0
  31. data/backbone/test/vendor/qunit.js +1364 -0
  32. data/backbone/test/vendor/underscore-1.1.6.js +807 -0
  33. data/backbone/test/vendor/zepto-0.6.js +692 -0
  34. data/backbone/test/view.js +137 -0
  35. data/lib/bpm/cli/base.rb +22 -7
  36. data/lib/bpm/package.rb +17 -5
  37. data/lib/bpm/project.rb +49 -32
  38. data/lib/bpm/version.rb +1 -1
  39. data/spec/cli/add_spec.rb +22 -4
  40. data/spec/cli/fetch_spec.rb +0 -1
  41. data/spec/cli/init_spec.rb +25 -10
  42. data/spec/cli/list_spec.rb +103 -62
  43. data/spec/cli/pack_spec.rb +36 -4
  44. data/spec/fixtures/packages/backbone/LICENSE +22 -0
  45. data/spec/fixtures/packages/backbone/README +25 -0
  46. data/spec/fixtures/packages/backbone/Rakefile +42 -0
  47. data/spec/fixtures/packages/backbone/examples/backbone-localstorage.js +84 -0
  48. data/spec/fixtures/packages/backbone/examples/todos/destroy.png +0 -0
  49. data/spec/fixtures/packages/backbone/examples/todos/index.html +87 -0
  50. data/spec/fixtures/packages/backbone/examples/todos/todos.css +311 -0
  51. data/spec/fixtures/packages/backbone/examples/todos/todos.js +258 -0
  52. data/spec/fixtures/packages/backbone/index.html +2606 -0
  53. data/spec/fixtures/packages/backbone/lib/backbone.js +1149 -0
  54. data/spec/fixtures/packages/backbone/lib/index.js +1 -0
  55. data/spec/fixtures/packages/backbone/package.json +14 -0
  56. data/spec/fixtures/packages/backbone/test/collection.js +345 -0
  57. data/spec/fixtures/packages/backbone/test/events.js +70 -0
  58. data/spec/fixtures/packages/backbone/test/model.coffee +43 -0
  59. data/spec/fixtures/packages/backbone/test/model.js +424 -0
  60. data/spec/fixtures/packages/backbone/test/noconflict.js +12 -0
  61. data/spec/fixtures/packages/backbone/test/router.js +116 -0
  62. data/spec/fixtures/packages/backbone/test/speed.js +45 -0
  63. data/spec/fixtures/packages/backbone/test/sync.js +133 -0
  64. data/spec/fixtures/packages/backbone/test/test-zepto.html +30 -0
  65. data/spec/fixtures/packages/backbone/test/test.html +31 -0
  66. data/spec/fixtures/packages/backbone/test/vendor/jquery-1.5.js +8176 -0
  67. data/spec/fixtures/packages/backbone/test/vendor/jslitmus.js +649 -0
  68. data/spec/fixtures/packages/backbone/test/vendor/json2.js +481 -0
  69. data/spec/fixtures/packages/backbone/test/vendor/qunit.css +196 -0
  70. data/spec/fixtures/packages/backbone/test/vendor/qunit.js +1364 -0
  71. data/spec/fixtures/packages/backbone/test/vendor/underscore-1.1.6.js +807 -0
  72. data/spec/fixtures/packages/backbone/test/vendor/zepto-0.6.js +692 -0
  73. data/spec/fixtures/packages/backbone/test/view.js +137 -0
  74. data/spec/fixtures/projects/init_app/assets/bpm_libs.js +1 -1
  75. data/spec/fixtures/projects/init_app/assets/bpm_styles.css +1 -1
  76. data/spec/fixtures/projects/init_app/new_project.json +1 -10
  77. data/spec/pipeline_spec.rb +5 -5
  78. data/spec/plugins/minifier_spec.rb +1 -1
  79. data/spec/plugins/transport_spec.rb +1 -1
  80. metadata +116 -28
  81. data/spec/fixtures/projects/init_app/assets/new_project/bpm_libs.js +0 -6
  82. data/spec/fixtures/projects/init_app/assets/new_project/bpm_styles.css +0 -5
data/CHANGELOG.md CHANGED
@@ -1,4 +1,15 @@
1
1
 
2
+ * bpm list now shows local dependencies by default. Use bpm list --remote
3
+ to get remote.
4
+ * better compatibility with npm - "summary" field is optional and "url" is
5
+ mapped to "homepage"
6
+ * fixed some failing unit tests
7
+ * you can now place other projects into a vendor directory and have their
8
+ packages appear in the local package. This is useful if you want to
9
+ import another project which holds multiple packages for development.
10
+
11
+ # 1.0.0.beta.4
12
+
2
13
  * Fixed issue with compile that would cause exceptions if you deleted the
3
14
  global .bpm directory
4
15
  * BPM now complains if you load a package whose directory name does not
data/TODO.md CHANGED
@@ -1,7 +1,4 @@
1
1
 
2
- * you should be able to place other projects into a vendor directory and
3
- have their packages appear.
4
-
5
2
  * Multiple format support. Format processors supplied by dependencies should
6
3
  be used to resolve formats.
7
4
 
@@ -13,15 +10,14 @@
13
10
 
14
11
  * HTML files should be able to process as templates using a template plugin
15
12
 
16
- * Should log clearly when fetching from remotes
17
-
18
13
  * Can we use YAML instead of JSON?
19
14
 
20
15
  * Changing a dependency in a package.json should rebuild all files in preview mode (in case the transport was modified)
21
16
 
22
- * Need to run bpm update before bpm preview for the first time
17
+ * make work with JS that is placed at the root of the package. (i.e. lib = .)
18
+
19
+ * figure out why requiring LibGems takes so long; really slows down launch
23
20
 
24
- * "directories" should be optional in package.json - we can infer it.
25
21
 
26
22
  ----------------
27
23
 
@@ -51,11 +47,9 @@
51
47
  # also we could publish a rails plugin that bakes in to
52
48
  # rails app
53
49
 
54
- bpm compile # generates a built app when you are ready to go to prod
50
+ bpm rebuild # generates a built app when you are ready to go to prod
55
51
  # maybe should build the entire thing into a different
56
52
  # loc?
57
-
58
- bpm update # invoke if you modify the bpm.json to update settings
59
53
 
60
54
  ## User working with unit tests in their app
61
55
 
data/backbone/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2010 Jeremy Ashkenas, DocumentCloud
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/backbone/README ADDED
@@ -0,0 +1,25 @@
1
+ ____ _ _ _
2
+ | _ \ | | | | (_)
3
+ | |_) | __ _ ___| | __| |__ ___ _ __ ___ _ ___
4
+ | _ < / _` |/ __| |/ /| '_ \ / _ \| '_ \ / _ \ | / __|
5
+ | |_) | (_| | (__| < | |_) | (_) | | | | __/_| \__ \
6
+ |____/ \__,_|\___|_|\_\|_.__/ \___/|_| |_|\___(_) |___/
7
+ _/ |
8
+ |__/
9
+ (_'___________________________________________________'_)
10
+ (_.———————————————————————————————————————————————————._)
11
+
12
+
13
+ Backbone supplies structure to JavaScript-heavy applications by providing models key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing application over a RESTful JSON interface.
14
+
15
+ For Docs, License, Tests, and pre-packed downloads, see:
16
+ http://documentcloud.github.com/backbone/
17
+
18
+ To suggest a feature, report a bug, or general discussion:
19
+ http://github.com/documentcloud/backbone/issues/
20
+
21
+ All contributors are listed here:
22
+ http://github.com/documentcloud/backbone/contributors
23
+
24
+ Special thanks to Robert Kieffer for the original philosophy behind Backbone.
25
+ http://github.com/broofa
data/backbone/Rakefile ADDED
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+
3
+ HEADER = /((^\s*\/\/.*\n)+)/
4
+
5
+ desc "rebuild the backbone-min.js files for distribution"
6
+ task :build do
7
+ begin
8
+ require 'closure-compiler'
9
+ rescue LoadError
10
+ puts "closure-compiler not found.\nInstall it by running 'gem install closure-compiler"
11
+ exit
12
+ end
13
+ source = File.read 'backbone.js'
14
+ header = source.match(HEADER)
15
+ File.open('backbone-min.js', 'w+') do |file|
16
+ file.write header[1].squeeze(' ') + Closure::Compiler.new.compress(source)
17
+ end
18
+ end
19
+
20
+ desc "build the docco documentation"
21
+ task :doc do
22
+ check 'docco', 'docco', 'https://github.com/jashkenas/docco'
23
+ system 'docco backbone.js && docco examples/todos/todos.js examples/backbone-localstorage.js'
24
+ end
25
+
26
+ desc "run JavaScriptLint on the source"
27
+ task :lint do
28
+ system "jsl -nofilelisting -nologo -conf docs/jsl.conf -process backbone.js"
29
+ end
30
+
31
+ desc "test the CoffeeScript integration"
32
+ task :test do
33
+ check 'coffee', 'CoffeeScript', 'https://github.com/jashkenas/coffee-script.git'
34
+ system "coffee test/*.coffee"
35
+ end
36
+
37
+ # Check for the existence of an executable.
38
+ def check(exec, name, url)
39
+ return unless `which #{exec}`.empty?
40
+ puts "#{name} not found.\nInstall it from #{url}"
41
+ exit
42
+ end
Binary file
@@ -0,0 +1,84 @@
1
+ // A simple module to replace `Backbone.sync` with *localStorage*-based
2
+ // persistence. Models are given GUIDS, and saved into a JSON object. Simple
3
+ // as that.
4
+
5
+ // Generate four random hex digits.
6
+ function S4() {
7
+ return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
8
+ };
9
+
10
+ // Generate a pseudo-GUID by concatenating random hexadecimal.
11
+ function guid() {
12
+ return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
13
+ };
14
+
15
+ // Our Store is represented by a single JS object in *localStorage*. Create it
16
+ // with a meaningful name, like the name you'd give a table.
17
+ var Store = function(name) {
18
+ this.name = name;
19
+ var store = localStorage.getItem(this.name);
20
+ this.data = (store && JSON.parse(store)) || {};
21
+ };
22
+
23
+ _.extend(Store.prototype, {
24
+
25
+ // Save the current state of the **Store** to *localStorage*.
26
+ save: function() {
27
+ localStorage.setItem(this.name, JSON.stringify(this.data));
28
+ },
29
+
30
+ // Add a model, giving it a (hopefully)-unique GUID, if it doesn't already
31
+ // have an id of it's own.
32
+ create: function(model) {
33
+ if (!model.id) model.id = model.attributes.id = guid();
34
+ this.data[model.id] = model;
35
+ this.save();
36
+ return model;
37
+ },
38
+
39
+ // Update a model by replacing its copy in `this.data`.
40
+ update: function(model) {
41
+ this.data[model.id] = model;
42
+ this.save();
43
+ return model;
44
+ },
45
+
46
+ // Retrieve a model from `this.data` by id.
47
+ find: function(model) {
48
+ return this.data[model.id];
49
+ },
50
+
51
+ // Return the array of all models currently in storage.
52
+ findAll: function() {
53
+ return _.values(this.data);
54
+ },
55
+
56
+ // Delete a model from `this.data`, returning it.
57
+ destroy: function(model) {
58
+ delete this.data[model.id];
59
+ this.save();
60
+ return model;
61
+ }
62
+
63
+ });
64
+
65
+ // Override `Backbone.sync` to use delegate to the model or collection's
66
+ // *localStorage* property, which should be an instance of `Store`.
67
+ Backbone.sync = function(method, model, options) {
68
+
69
+ var resp;
70
+ var store = model.localStorage || model.collection.localStorage;
71
+
72
+ switch (method) {
73
+ case "read": resp = model.id ? store.find(model) : store.findAll(); break;
74
+ case "create": resp = store.create(model); break;
75
+ case "update": resp = store.update(model); break;
76
+ case "delete": resp = store.destroy(model); break;
77
+ }
78
+
79
+ if (resp) {
80
+ options.success(resp);
81
+ } else {
82
+ options.error("Record not found");
83
+ }
84
+ };
Binary file
@@ -0,0 +1,87 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <title>Backbone Demo: Todos</title>
6
+ <link href="todos.css" media="all" rel="stylesheet" type="text/css"/>
7
+ <script src="../../test/vendor/json2.js"></script>
8
+ <script src="../../test/vendor/jquery-1.5.js"></script>
9
+ <script src="../../test/vendor/underscore-1.1.6.js"></script>
10
+ <script src="../../backbone.js"></script>
11
+ <script src="../backbone-localstorage.js"></script>
12
+ <script src="todos.js"></script>
13
+ </head>
14
+
15
+ <body>
16
+
17
+ <!-- Todo App Interface -->
18
+
19
+ <div id="todoapp">
20
+
21
+ <div class="title">
22
+ <h1>Todos</h1>
23
+ </div>
24
+
25
+ <div class="content">
26
+
27
+ <div id="create-todo">
28
+ <input id="new-todo" placeholder="What needs to be done?" type="text" />
29
+ <span class="ui-tooltip-top" style="display:none;">Press Enter to save this task</span>
30
+ </div>
31
+
32
+ <div id="todos">
33
+ <ul id="todo-list"></ul>
34
+ </div>
35
+
36
+ <div id="todo-stats"></div>
37
+
38
+ </div>
39
+
40
+ </div>
41
+
42
+ <ul id="instructions">
43
+ <li>Double-click to edit a todo.</li>
44
+ <li><a href="../../docs/todos.html">View the annotated source.</a></li>
45
+ </ul>
46
+
47
+ <div id="credits">
48
+ Created by
49
+ <br />
50
+ <a href="http://jgn.me/">J&eacute;r&ocirc;me Gravel-Niquet</a>
51
+ </div>
52
+
53
+ <!-- Templates -->
54
+
55
+ <script type="text/template" id="item-template">
56
+ <div class="todo <%= done ? 'done' : '' %>">
57
+ <div class="display">
58
+ <input class="check" type="checkbox" <%= done ? 'checked="checked"' : '' %> />
59
+ <div class="todo-content"></div>
60
+ <span class="todo-destroy"></span>
61
+ </div>
62
+ <div class="edit">
63
+ <input class="todo-input" type="text" value="" />
64
+ </div>
65
+ </div>
66
+ </script>
67
+
68
+ <script type="text/template" id="stats-template">
69
+ <% if (total) { %>
70
+ <span class="todo-count">
71
+ <span class="number"><%= remaining %></span>
72
+ <span class="word"><%= remaining == 1 ? 'item' : 'items' %></span> left.
73
+ </span>
74
+ <% } %>
75
+ <% if (done) { %>
76
+ <span class="todo-clear">
77
+ <a href="#">
78
+ Clear <span class="number-done"><%= done %></span>
79
+ completed <span class="word-done"><%= done == 1 ? 'item' : 'items' %></span>
80
+ </a>
81
+ </span>
82
+ <% } %>
83
+ </script>
84
+
85
+ </body>
86
+
87
+ </html>
@@ -0,0 +1,311 @@
1
+ html, body, div, span, applet, object, iframe,
2
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
3
+ a, abbr, acronym, address, big, cite, code,
4
+ del, dfn, em, font, img, ins, kbd, q, s, samp,
5
+ small, strike, strong, sub, sup, tt, var,
6
+ dl, dt, dd, ol, ul, li,
7
+ fieldset, form, label, legend,
8
+ table, caption, tbody, tfoot, thead, tr, th, td {
9
+ margin: 0;
10
+ padding: 0;
11
+ border: 0;
12
+ outline: 0;
13
+ font-weight: inherit;
14
+ font-style: inherit;
15
+ font-size: 100%;
16
+ font-family: inherit;
17
+ vertical-align: baseline;
18
+ }
19
+ body {
20
+ line-height: 1;
21
+ color: black;
22
+ background: white;
23
+ }
24
+ ol, ul {
25
+ list-style: none;
26
+ }
27
+ a img {
28
+ border: none;
29
+ }
30
+
31
+ html {
32
+ background: #eeeeee;
33
+ }
34
+ body {
35
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
36
+ font-size: 14px;
37
+ line-height: 1.4em;
38
+ background: #eeeeee;
39
+ color: #333333;
40
+ }
41
+
42
+ #todoapp {
43
+ width: 480px;
44
+ margin: 0 auto 40px;
45
+ background: white;
46
+ padding: 20px;
47
+ -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 5px 6px 0;
48
+ -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 5px 6px 0;
49
+ -o-box-shadow: rgba(0, 0, 0, 0.2) 0 5px 6px 0;
50
+ box-shadow: rgba(0, 0, 0, 0.2) 0 5px 6px 0;
51
+ }
52
+ #todoapp h1 {
53
+ font-size: 36px;
54
+ font-weight: bold;
55
+ text-align: center;
56
+ padding: 20px 0 30px 0;
57
+ line-height: 1;
58
+ }
59
+
60
+ #create-todo {
61
+ position: relative;
62
+ }
63
+ #create-todo input {
64
+ width: 466px;
65
+ font-size: 24px;
66
+ font-family: inherit;
67
+ line-height: 1.4em;
68
+ border: 0;
69
+ outline: none;
70
+ padding: 6px;
71
+ border: 1px solid #999999;
72
+ -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
73
+ -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
74
+ -o-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
75
+ box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
76
+ }
77
+ #create-todo input::-webkit-input-placeholder {
78
+ font-style: italic;
79
+ }
80
+ #create-todo span {
81
+ position: absolute;
82
+ z-index: 999;
83
+ width: 170px;
84
+ left: 50%;
85
+ margin-left: -85px;
86
+ }
87
+
88
+ #todo-list {
89
+ margin-top: 10px;
90
+ }
91
+ #todo-list li {
92
+ padding: 12px 20px 11px 0;
93
+ position: relative;
94
+ font-size: 24px;
95
+ line-height: 1.1em;
96
+ border-bottom: 1px solid #cccccc;
97
+ }
98
+ #todo-list li:after {
99
+ content: "\0020";
100
+ display: block;
101
+ height: 0;
102
+ clear: both;
103
+ overflow: hidden;
104
+ visibility: hidden;
105
+ }
106
+ #todo-list li.editing {
107
+ padding: 0;
108
+ border-bottom: 0;
109
+ }
110
+ #todo-list .editing .display,
111
+ #todo-list .edit {
112
+ display: none;
113
+ }
114
+ #todo-list .editing .edit {
115
+ display: block;
116
+ }
117
+ #todo-list .editing input {
118
+ width: 444px;
119
+ font-size: 24px;
120
+ font-family: inherit;
121
+ margin: 0;
122
+ line-height: 1.6em;
123
+ border: 0;
124
+ outline: none;
125
+ padding: 10px 7px 0px 27px;
126
+ border: 1px solid #999999;
127
+ -moz-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
128
+ -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
129
+ -o-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
130
+ box-shadow: rgba(0, 0, 0, 0.2) 0 1px 2px 0 inset;
131
+ }
132
+ #todo-list .check {
133
+ position: relative;
134
+ top: 9px;
135
+ margin: 0 10px 0 7px;
136
+ float: left;
137
+ }
138
+ #todo-list .done .todo-content {
139
+ text-decoration: line-through;
140
+ color: #777777;
141
+ }
142
+ #todo-list .todo-destroy {
143
+ position: absolute;
144
+ right: 5px;
145
+ top: 14px;
146
+ display: none;
147
+ cursor: pointer;
148
+ width: 20px;
149
+ height: 20px;
150
+ background: url(destroy.png) no-repeat 0 0;
151
+ }
152
+ #todo-list li:hover .todo-destroy {
153
+ display: block;
154
+ }
155
+ #todo-list .todo-destroy:hover {
156
+ background-position: 0 -20px;
157
+ }
158
+
159
+ #todo-stats {
160
+ *zoom: 1;
161
+ margin-top: 10px;
162
+ color: #777777;
163
+ }
164
+ #todo-stats:after {
165
+ content: "\0020";
166
+ display: block;
167
+ height: 0;
168
+ clear: both;
169
+ overflow: hidden;
170
+ visibility: hidden;
171
+ }
172
+ #todo-stats .todo-count {
173
+ float: left;
174
+ }
175
+ #todo-stats .todo-count .number {
176
+ font-weight: bold;
177
+ color: #333333;
178
+ }
179
+ #todo-stats .todo-clear {
180
+ float: right;
181
+ }
182
+ #todo-stats .todo-clear a {
183
+ color: #777777;
184
+ font-size: 12px;
185
+ }
186
+ #todo-stats .todo-clear a:visited {
187
+ color: #777777;
188
+ }
189
+ #todo-stats .todo-clear a:hover {
190
+ color: #336699;
191
+ }
192
+
193
+ #instructions {
194
+ width: 520px;
195
+ margin: 10px auto;
196
+ color: #777777;
197
+ text-shadow: rgba(255, 255, 255, 0.8) 0 1px 0;
198
+ text-align: center;
199
+ }
200
+ #instructions a {
201
+ color: #336699;
202
+ }
203
+
204
+ #credits {
205
+ width: 520px;
206
+ margin: 30px auto;
207
+ color: #999;
208
+ text-shadow: rgba(255, 255, 255, 0.8) 0 1px 0;
209
+ text-align: center;
210
+ }
211
+ #credits a {
212
+ color: #888;
213
+ }
214
+
215
+
216
+ /*
217
+ * François 'cahnory' Germain
218
+ */
219
+ .ui-tooltip, .ui-tooltip-top, .ui-tooltip-right, .ui-tooltip-bottom, .ui-tooltip-left {
220
+ color:#ffffff;
221
+ cursor:normal;
222
+ display:-moz-inline-stack;
223
+ display:inline-block;
224
+ font-size:12px;
225
+ font-family:arial;
226
+ padding:.5em 1em;
227
+ position:relative;
228
+ text-align:center;
229
+ text-shadow:0 -1px 1px #111111;
230
+ -webkit-border-top-left-radius:4px ;
231
+ -webkit-border-top-right-radius:4px ;
232
+ -webkit-border-bottom-right-radius:4px ;
233
+ -webkit-border-bottom-left-radius:4px ;
234
+ -khtml-border-top-left-radius:4px ;
235
+ -khtml-border-top-right-radius:4px ;
236
+ -khtml-border-bottom-right-radius:4px ;
237
+ -khtml-border-bottom-left-radius:4px ;
238
+ -moz-border-radius-topleft:4px ;
239
+ -moz-border-radius-topright:4px ;
240
+ -moz-border-radius-bottomright:4px ;
241
+ -moz-border-radius-bottomleft:4px ;
242
+ border-top-left-radius:4px ;
243
+ border-top-right-radius:4px ;
244
+ border-bottom-right-radius:4px ;
245
+ border-bottom-left-radius:4px ;
246
+ -o-box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
247
+ -moz-box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
248
+ -khtml-box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
249
+ -webkit-box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
250
+ box-shadow:0 1px 2px #000000, inset 0 0 0 1px #222222, inset 0 2px #666666, inset 0 -2px 2px #444444;
251
+ background-color:#3b3b3b;
252
+ background-image:-moz-linear-gradient(top,#555555,#222222);
253
+ background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#555555),color-stop(1,#222222));
254
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#555555,EndColorStr=#222222);
255
+ -ms-filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#555555,EndColorStr=#222222);
256
+ }
257
+ .ui-tooltip:after, .ui-tooltip-top:after, .ui-tooltip-right:after, .ui-tooltip-bottom:after, .ui-tooltip-left:after {
258
+ content:"\25B8";
259
+ display:block;
260
+ font-size:2em;
261
+ height:0;
262
+ line-height:0;
263
+ position:absolute;
264
+ }
265
+ .ui-tooltip:after, .ui-tooltip-bottom:after {
266
+ color:#2a2a2a;
267
+ bottom:0;
268
+ left:1px;
269
+ text-align:center;
270
+ text-shadow:1px 0 2px #000000;
271
+ -o-transform:rotate(90deg);
272
+ -moz-transform:rotate(90deg);
273
+ -khtml-transform:rotate(90deg);
274
+ -webkit-transform:rotate(90deg);
275
+ width:100%;
276
+ }
277
+ .ui-tooltip-top:after {
278
+ bottom:auto;
279
+ color:#4f4f4f;
280
+ left:-2px;
281
+ top:0;
282
+ text-align:center;
283
+ text-shadow:none;
284
+ -o-transform:rotate(-90deg);
285
+ -moz-transform:rotate(-90deg);
286
+ -khtml-transform:rotate(-90deg);
287
+ -webkit-transform:rotate(-90deg);
288
+ width:100%;
289
+ }
290
+ .ui-tooltip-right:after {
291
+ color:#222222;
292
+ right:-0.375em;
293
+ top:50%;
294
+ margin-top:-.05em;
295
+ text-shadow:0 1px 2px #000000;
296
+ -o-transform:rotate(0);
297
+ -moz-transform:rotate(0);
298
+ -khtml-transform:rotate(0);
299
+ -webkit-transform:rotate(0);
300
+ }
301
+ .ui-tooltip-left:after {
302
+ color:#222222;
303
+ left:-0.375em;
304
+ top:50%;
305
+ margin-top:.1em;
306
+ text-shadow:0 -1px 2px #000000;
307
+ -o-transform:rotate(180deg);
308
+ -moz-transform:rotate(180deg);
309
+ -khtml-transform:rotate(180deg);
310
+ -webkit-transform:rotate(180deg);
311
+ }