mailcatcher 0.5.10 → 0.5.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d1002ba05aff5bda4c54a9f7774597a3ce3e8206
4
+ data.tar.gz: c5386fa748ad8c71e1ecd63891d7a366f5d6a315
5
+ SHA512:
6
+ metadata.gz: f79c58f17bc6be85d8c0773f86ca68c501b4a4c39445ac12db510cd0ffc0f885a89a90c06ba527296f4ef2acf37767970219e08a1826cb08d42245e82f988eb1
7
+ data.tar.gz: 75de25484f92e27a8d8688217157479099f44c96b88d42ec244aa9ac4b07280d93a3bca78c9ed60a4e5050d0e1f24710a90cfdf95b8cd75bee4f6b06c10ac509
Binary file
@@ -0,0 +1 @@
1
+ �+�zJ� mS� g�ǎ��( �8� /�!*D�ŝ����)����3�\[�{��Ɗj�U����S��sO�x�"b�ʵċ;��1��HbT�q��b%��Fنy�:ưI�,���*��\��ڎ?5��Q1��˜Ʀ�m.��m�H���9&��S���Y��,~��״<<ʂ�[��0�iN��m����a��
data/README.md CHANGED
@@ -31,11 +31,17 @@ MailCatcher runs a super simple SMTP server which catches any message sent to it
31
31
 
32
32
  The brave can get the source from [the GitHub repository][mailcatcher-github].
33
33
 
34
+ ### Bundler
35
+
36
+ Please don't put mailcatcher into your Gemfile. It will conflict with your applications gems at some point.
37
+
38
+ Instead, pop a note in your README stating you use mailcatcher. Simply run `gem install mailcatcher` then `mailcatcher` to get started.
39
+
34
40
  ### RVM
35
41
 
36
42
  Under RVM your mailcatcher command may only be available under the ruby you install mailcatcher into. To prevent this, and to prevent gem conflicts, install mailcatcher into a dedicated gemset and create wrapper scripts:
37
43
 
38
- rvm default@mailcatcher --create gem install mailcatcher
44
+ rvm default@mailcatcher --create do gem install mailcatcher
39
45
  rvm wrapper default@mailcatcher --no-prefix mailcatcher catchmail
40
46
 
41
47
  ### Rails
@@ -69,7 +69,7 @@ module MailCatcher::Mail extend self
69
69
  end
70
70
 
71
71
  def messages
72
- @messages_query ||= db.prepare "SELECT id, sender, recipients, subject, size, created_at FROM message ORDER BY created_at ASC"
72
+ @messages_query ||= db.prepare "SELECT id, sender, recipients, subject, size, created_at FROM message ORDER BY created_at DESC"
73
73
  @messages_query.execute.map do |row|
74
74
  Hash[row.fields.zip(row)].tap do |message|
75
75
  message["recipients"] &&= ActiveSupport::JSON.decode message["recipients"]
@@ -150,4 +150,11 @@ module MailCatcher::Mail extend self
150
150
  @delete_messages_query.execute and
151
151
  @delete_message_parts_query.execute
152
152
  end
153
+
154
+ def delete_message!(message_id)
155
+ @delete_messages_query ||= db.prepare 'DELETE FROM message WHERE id = ?'
156
+ @delete_message_parts_query ||= db.prepare 'DELETE FROM message_part WHERE message_id = ?'
157
+ @delete_messages_query.execute(message_id) and
158
+ @delete_message_parts_query.execute(message_id)
159
+ end
153
160
  end
@@ -1,3 +1,3 @@
1
1
  module MailCatcher
2
- VERSION = "0.5.10"
2
+ VERSION = "0.5.11"
3
3
  end
@@ -10,7 +10,7 @@ class Sinatra::Request
10
10
  end
11
11
 
12
12
  class MailCatcher::Web < Sinatra::Base
13
- set :root, Pathname.new(__FILE__).dirname.parent.parent
13
+ set :root, File.expand_path("#{__FILE__}/../../..")
14
14
  set :haml, :format => :html5
15
15
 
16
16
  get '/' do
@@ -132,6 +132,16 @@ class MailCatcher::Web < Sinatra::Base
132
132
  end
133
133
  end
134
134
 
135
+ delete '/messages/:id' do
136
+ id = params[:id].to_i
137
+ if message = MailCatcher::Mail.message(id)
138
+ MailCatcher::Mail.delete_message!(id)
139
+ status 204
140
+ else
141
+ not_found
142
+ end
143
+ end
144
+
135
145
  not_found do
136
146
  "<html><body><h1>No Dice</h1><p>The message you were looking for does not exist, or doesn't have content of this type.</p></body></html>"
137
147
  end
@@ -1,21 +1,31 @@
1
1
  (function() {
2
2
  var MailCatcher,
3
- __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
3
+ _this = this;
4
4
 
5
5
  jQuery.expr[':'].icontains = function(a, i, m) {
6
- var _ref, _ref2;
7
- return ((_ref = (_ref2 = a.textContent) != null ? _ref2 : a.innerText) != null ? _ref : "").toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
6
+ var _ref, _ref1;
7
+ return ((_ref = (_ref1 = a.textContent) != null ? _ref1 : a.innerText) != null ? _ref : "").toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
8
8
  };
9
9
 
10
10
  MailCatcher = (function() {
11
11
 
12
12
  function MailCatcher() {
13
- this.nextTab = __bind(this.nextTab, this);
14
- this.previousTab = __bind(this.previousTab, this);
15
- this.openTab = __bind(this.openTab, this);
16
- this.selectedTab = __bind(this.selectedTab, this);
17
- this.getTab = __bind(this.getTab, this);
18
13
  var _this = this;
14
+ this.nextTab = function(tab) {
15
+ return MailCatcher.prototype.nextTab.apply(_this, arguments);
16
+ };
17
+ this.previousTab = function(tab) {
18
+ return MailCatcher.prototype.previousTab.apply(_this, arguments);
19
+ };
20
+ this.openTab = function(i) {
21
+ return MailCatcher.prototype.openTab.apply(_this, arguments);
22
+ };
23
+ this.selectedTab = function() {
24
+ return MailCatcher.prototype.selectedTab.apply(_this, arguments);
25
+ };
26
+ this.getTab = function(i) {
27
+ return MailCatcher.prototype.getTab.apply(_this, arguments);
28
+ };
19
29
  $('#messages tr').live('click', function(e) {
20
30
  e.preventDefault();
21
31
  return _this.loadMessage($(e.currentTarget).attr('data-message-id'));
@@ -62,9 +72,7 @@
62
72
  url: '/messages',
63
73
  type: 'DELETE',
64
74
  success: function() {
65
- $('#messages tbody, #message .metadata dd').empty();
66
- $('#message .metadata .attachments').hide();
67
- return $('#message iframe').attr('src', 'about:blank');
75
+ return this.unselectMessage();
68
76
  },
69
77
  error: function() {
70
78
  return alert('Error while quitting.');
@@ -87,28 +95,61 @@
87
95
  }
88
96
  });
89
97
  key('up', function() {
90
- var id;
91
- id = _this.selectedMessage() || 1;
92
- if (id > 1) id -= 1;
93
- return _this.loadMessage(id);
98
+ if (_this.selectedMessage()) {
99
+ _this.loadMessage($('#messages tr.selected').prev().data('message-id'));
100
+ } else {
101
+ _this.loadMessage($('#messages tbody tr[data-message-id]:first').data('message-id'));
102
+ }
103
+ return false;
94
104
  });
95
105
  key('down', function() {
96
- var id;
97
- id = _this.selectedMessage() || _this.messagesCount();
98
- if (id < _this.messagesCount()) id += 1;
99
- return _this.loadMessage(id);
106
+ if (_this.selectedMessage()) {
107
+ _this.loadMessage($('#messages tr.selected').next().data('message-id'));
108
+ } else {
109
+ _this.loadMessage($('#messages tbody tr[data-message-id]:first').data('message-id'));
110
+ }
111
+ return false;
100
112
  });
101
113
  key('⌘+up, ctrl+up', function() {
102
- return _this.loadMessage(1);
114
+ _this.loadMessage($('#messages tbody tr[data-message-id]:first').data('message-id'));
115
+ return false;
103
116
  });
104
117
  key('⌘+down, ctrl+down', function() {
105
- return _this.loadMessage(_this.messagesCount());
118
+ _this.loadMessage($('#messages tbody tr[data-message-id]:last').data('message-id'));
119
+ return false;
106
120
  });
107
121
  key('left', function() {
108
- return _this.openTab(_this.previousTab());
122
+ _this.openTab(_this.previousTab());
123
+ return false;
109
124
  });
110
125
  key('right', function() {
111
- return _this.openTab(_this.nextTab());
126
+ _this.openTab(_this.nextTab());
127
+ return false;
128
+ });
129
+ key('backspace, delete', function() {
130
+ var id;
131
+ id = _this.selectedMessage();
132
+ if (id != null) {
133
+ $.ajax({
134
+ url: '/messages/' + id,
135
+ type: 'DELETE',
136
+ success: function() {
137
+ var messageRow, switchTo;
138
+ messageRow = $("#messages tbody tr[data-message-id='" + id + "']");
139
+ switchTo = messageRow.next().data('message-id') || messageRow.prev().data('message-id');
140
+ messageRow.remove();
141
+ if (switchTo) {
142
+ return _this.loadMessage(switchTo);
143
+ } else {
144
+ return _this.unselectMessage();
145
+ }
146
+ },
147
+ error: function() {
148
+ return alert('Error while removing message.');
149
+ }
150
+ });
151
+ }
152
+ return false;
112
153
  });
113
154
  this.refresh();
114
155
  this.subscribe();
@@ -131,7 +172,9 @@
131
172
  };
132
173
 
133
174
  MailCatcher.prototype.formatDate = function(date) {
134
- if (typeof date === "string") date && (date = this.parseDate(date));
175
+ if (typeof date === "string") {
176
+ date && (date = this.parseDate(date));
177
+ }
135
178
  date && (date = this.offsetTimeZone(date));
136
179
  return date && (date = date.toString("dddd, d MMM yyyy h:mm:ss tt"));
137
180
  };
@@ -159,7 +202,9 @@
159
202
  MailCatcher.prototype.previousTab = function(tab) {
160
203
  var i;
161
204
  i = tab || tab === 0 ? tab : this.selectedTab() - 1;
162
- if (i < 0) i = this.tabs().length - 1;
205
+ if (i < 0) {
206
+ i = this.tabs().length - 1;
207
+ }
163
208
  if (this.getTab(i).is(":visible")) {
164
209
  return i;
165
210
  } else {
@@ -170,7 +215,9 @@
170
215
  MailCatcher.prototype.nextTab = function(tab) {
171
216
  var i;
172
217
  i = tab ? tab : this.selectedTab() + 1;
173
- if (i > this.tabs().length - 1) i = 0;
218
+ if (i > this.tabs().length - 1) {
219
+ i = 0;
220
+ }
174
221
  if (this.getTab(i).is(":visible")) {
175
222
  return i;
176
223
  } else {
@@ -179,7 +226,9 @@
179
226
  };
180
227
 
181
228
  MailCatcher.prototype.haveMessage = function(message) {
182
- if (message.id != null) message = message.id;
229
+ if (message.id != null) {
230
+ message = message.id;
231
+ }
183
232
  return $("#messages tbody tr[data-message-id=\"" + message + "\"]").length > 0;
184
233
  };
185
234
 
@@ -209,17 +258,42 @@
209
258
  };
210
259
 
211
260
  MailCatcher.prototype.addMessage = function(message) {
212
- return $('#messages tbody').append($('<tr />').attr('data-message-id', message.id.toString()).append($('<td/>').text(message.sender || "No sender").toggleClass("blank", !message.sender)).append($('<td/>').text((message.recipients || []).join(', ') || "No receipients").toggleClass("blank", !message.recipients.length)).append($('<td/>').text(message.subject || "No subject").toggleClass("blank", !message.subject)).append($('<td/>').text(this.formatDate(message.created_at))));
261
+ return $('#messages tbody').prepend($('<tr />').attr('data-message-id', message.id.toString()).append($('<td/>').text(message.sender || "No sender").toggleClass("blank", !message.sender)).append($('<td/>').text((message.recipients || []).join(', ') || "No receipients").toggleClass("blank", !message.recipients.length)).append($('<td/>').text(message.subject || "No subject").toggleClass("blank", !message.subject)).append($('<td/>').text(this.formatDate(message.created_at))));
262
+ };
263
+
264
+ MailCatcher.prototype.scrollToRow = function(row) {
265
+ var overflow, relativePosition;
266
+ relativePosition = row.offset().top - $('#messages').offset().top;
267
+ if (relativePosition < 0) {
268
+ return $('#messages').scrollTop($('#messages').scrollTop() + relativePosition - 20);
269
+ } else {
270
+ overflow = relativePosition + row.height() - $('#messages').height();
271
+ if (overflow > 0) {
272
+ return $('#messages').scrollTop($('#messages').scrollTop() + overflow + 20);
273
+ }
274
+ }
275
+ };
276
+
277
+ MailCatcher.prototype.unselectMessage = function() {
278
+ $('#messages tbody, #message .metadata dd').empty();
279
+ $('#message .metadata .attachments').hide();
280
+ $('#message iframe').attr('src', 'about:blank');
281
+ return null;
213
282
  };
214
283
 
215
284
  MailCatcher.prototype.loadMessage = function(id) {
216
- var _this = this;
217
- if ((id != null ? id.id : void 0) != null) id = id.id;
285
+ var messageRow,
286
+ _this = this;
287
+ if ((id != null ? id.id : void 0) != null) {
288
+ id = id.id;
289
+ }
218
290
  id || (id = $('#messages tr.selected').attr('data-message-id'));
219
291
  if (id != null) {
220
- $('#messages tbody tr:not([data-message-id="' + id + '"])').removeClass('selected');
221
- $('#messages tbody tr[data-message-id="' + id + '"]').addClass('selected');
222
- return $.getJSON('/messages/' + id + '.json', function(message) {
292
+ $("#messages tbody tr:not([data-message-id='" + id + "'])").removeClass('selected');
293
+ messageRow = $("#messages tbody tr[data-message-id='" + id + "']");
294
+ messageRow.addClass('selected');
295
+ this.scrollToRow(messageRow);
296
+ return $.getJSON("/messages/" + id + ".json", function(message) {
223
297
  var $ul;
224
298
  $('#message .metadata dd.created_at').text(_this.formatDate(message.created_at));
225
299
  $('#message .metadata dd.from').text(message.sender);
@@ -230,7 +304,7 @@
230
304
  $el = $(el);
231
305
  format = $el.attr('data-message-format');
232
306
  if ($.inArray(format, message.formats) >= 0) {
233
- $el.find('a').attr('href', '/messages/' + id + '.' + format);
307
+ $el.find('a').attr('href', "/messages/" + id + "." + format);
234
308
  return $el.show();
235
309
  } else {
236
310
  return $el.hide();
@@ -276,7 +350,7 @@
276
350
  $("#message .views .analysis.tab:not(.selected)").addClass('selected');
277
351
  $("#message .views :not(.analysis).tab.selected").removeClass('selected');
278
352
  if (id != null) {
279
- $iframe = $('#message iframe').contents().children().html("<html>\n<head>\n<title>Analysis</title>\n" + ($('link[rel="stylesheet"]')[0].outerHTML) + "\n</head>\n<body class=\"iframe\">\n<h1>Analyse your email with Fractal</h1>\n<p><a href=\"http://getfractal.com/\" target=\"_blank\">Fractal</a> is a really neat service that applies common email design and development knowledge from <a href=\"http://www.email-standards.org/\" target=\"_blank\">Email Standards Project</a> to your HTML email and tells you what you've done wrong or what you should do instead.</p>\n<p>Please note that this <strong>sends your email to the Fractal service</strong> for analysis. Read their <a href=\"http://getfractal.com/terms\" target=\"_blank\">terms of service</a> if you're paranoid.</p>\n<form>\n<input type=\"submit\" value=\"Analyse\" /><span class=\"loading\" style=\"color: #999; display: none\">Analysing&hellip;</span>\n</form>\n</body>\n</html>");
353
+ $iframe = $('#message iframe').contents().children().html("<html>\n<head>\n<title>Analysis</title>\n" + ($('link[rel="stylesheet"]')[0].outerHTML) + "\n</head>\n<body class=\"iframe\">\n<h1>Analyse your email with Fractal</h1>\n<p><a href=\"http://getfractal.com/\" target=\"_blank\">Fractal</a> is a really neat service that applies common email design and development knowledge from <a href=\"http://www.email-standards.org/\" target=\"_blank\">Email Standards Project</a> to your HTML email and tells you what you've done wrong or what you should do instead.</p>\n<p>Please note that this <strong>sends your email to the Fractal service</strong> for analysis. Read their <a href=\"https://www.getfractal.com/page/terms\" target=\"_blank\">terms of service</a> if you're paranoid.</p>\n<form>\n<input type=\"submit\" value=\"Analyse\" /><span class=\"loading\" style=\"color: #999; display: none\">Analysing&hellip;</span>\n</form>\n</body>\n</html>");
280
354
  return $form = $iframe.find('form').submit(function(e) {
281
355
  e.preventDefault();
282
356
  $(this).find('input[type="submit"]').attr('disabled', 'disabled').end().find('.loading').show();
@@ -289,7 +363,9 @@
289
363
  var _this = this;
290
364
  return $.getJSON('/messages', function(messages) {
291
365
  return $.each(messages, function(i, message) {
292
- if (!_this.haveMessage(message)) return _this.addMessage(message);
366
+ if (!_this.haveMessage(message)) {
367
+ return _this.addMessage(message);
368
+ }
293
369
  });
294
370
  });
295
371
  };
@@ -14,50 +14,40 @@ time, mark, audio, video {
14
14
  margin: 0;
15
15
  padding: 0;
16
16
  border: 0;
17
- font-size: 100%;
18
17
  font: inherit;
19
- vertical-align: baseline;
20
- }
18
+ font-size: 100%;
19
+ vertical-align: baseline; }
21
20
 
22
- body {
23
- line-height: 1;
24
- }
21
+ html {
22
+ line-height: 1; }
25
23
 
26
24
  ol, ul {
27
- list-style: none;
28
- }
25
+ list-style: none; }
29
26
 
30
27
  table {
31
28
  border-collapse: collapse;
32
- border-spacing: 0;
33
- }
29
+ border-spacing: 0; }
34
30
 
35
31
  caption, th, td {
36
32
  text-align: left;
37
33
  font-weight: normal;
38
- vertical-align: middle;
39
- }
34
+ vertical-align: middle; }
40
35
 
41
36
  q, blockquote {
42
- quotes: none;
43
- }
44
- q:before, q:after, blockquote:before, blockquote:after {
45
- content: "";
46
- content: none;
47
- }
37
+ quotes: none; }
38
+ q:before, q:after, blockquote:before, blockquote:after {
39
+ content: "";
40
+ content: none; }
48
41
 
49
42
  a img {
50
- border: none;
51
- }
43
+ border: none; }
52
44
 
53
45
  article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary {
54
- display: block;
55
- }
46
+ display: block; }
56
47
 
57
48
  html, body {
58
49
  width: 100%;
59
- height: 100%;
60
- }
50
+ height: 100%; }
61
51
 
62
52
  body {
63
53
  display: -webkit-box;
@@ -71,30 +61,23 @@ body {
71
61
  background: #eeeeee;
72
62
  color: black;
73
63
  font-size: 12px;
74
- font-family: Helvetica, sans-serif;
75
- }
76
- body body {
77
- font-size: 75%;
78
- line-height: 2em;
79
- }
80
- body html > body {
81
- font-size: 12px;
82
- }
83
- body.iframe {
84
- background: white;
85
- }
86
- body.iframe h1 {
87
- font-size: 1.3em;
88
- margin: 12px;
89
- }
90
- body.iframe p, body.iframe form {
91
- margin: 0 12px 12px 12px;
92
- line-height: 1.25;
93
- }
94
- body.iframe .loading {
95
- color: #666666;
96
- margin-left: 0.5em;
97
- }
64
+ font-family: Helvetica, sans-serif; }
65
+ body * html {
66
+ font-size: 75%; }
67
+ body html {
68
+ font-size: 12px;
69
+ line-height: 2em; }
70
+ body.iframe {
71
+ background: white; }
72
+ body.iframe h1 {
73
+ font-size: 1.3em;
74
+ margin: 12px; }
75
+ body.iframe p, body.iframe form {
76
+ margin: 0 12px 12px 12px;
77
+ line-height: 1.25; }
78
+ body.iframe .loading {
79
+ color: #666666;
80
+ margin-left: 0.5em; }
98
81
 
99
82
  .button {
100
83
  padding: 0.5em 1em;
@@ -108,119 +91,97 @@ body.iframe .loading {
108
91
  background: -webkit-linear-gradient(#f4f4f4, #ececec), #ececec;
109
92
  background: -moz-linear-gradient(#f4f4f4, #ececec), #ececec;
110
93
  background: -o-linear-gradient(#f4f4f4, #ececec), #ececec;
111
- background: -ms-linear-gradient(#f4f4f4, #ececec), #ececec;
112
94
  background: linear-gradient(#f4f4f4, #ececec), #ececec;
113
95
  color: #666666;
114
96
  text-shadow: 1px 1px 0 white;
115
- text-decoration: none;
116
- }
117
- .button:hover, .button:focus {
118
- border-color: #999999;
119
- border-bottom-color: #666666;
120
- background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(100%, #dddddd)), #dddddd;
121
- background: -webkit-linear-gradient(#eeeeee, #dddddd), #dddddd;
122
- background: -moz-linear-gradient(#eeeeee, #dddddd), #dddddd;
123
- background: -o-linear-gradient(#eeeeee, #dddddd), #dddddd;
124
- background: -ms-linear-gradient(#eeeeee, #dddddd), #dddddd;
125
- background: linear-gradient(#eeeeee, #dddddd), #dddddd;
126
- color: #333333;
127
- text-decoration: none;
128
- }
129
- .button:active, .button.active {
130
- border-color: #666666;
131
- border-bottom-color: #999999;
132
- background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dddddd), color-stop(100%, #eeeeee)), #eeeeee;
133
- background: -webkit-linear-gradient(#dddddd, #eeeeee), #eeeeee;
134
- background: -moz-linear-gradient(#dddddd, #eeeeee), #eeeeee;
135
- background: -o-linear-gradient(#dddddd, #eeeeee), #eeeeee;
136
- background: -ms-linear-gradient(#dddddd, #eeeeee), #eeeeee;
137
- background: linear-gradient(#dddddd, #eeeeee), #eeeeee;
138
- color: #333333;
139
- text-decoration: none;
140
- text-shadow: -1px -1px 0 #eeeeee;
141
- }
97
+ text-decoration: none; }
98
+ .button:hover, .button:focus {
99
+ border-color: #999999;
100
+ border-bottom-color: #666666;
101
+ background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(100%, #dddddd)), #dddddd;
102
+ background: -webkit-linear-gradient(#eeeeee, #dddddd), #dddddd;
103
+ background: -moz-linear-gradient(#eeeeee, #dddddd), #dddddd;
104
+ background: -o-linear-gradient(#eeeeee, #dddddd), #dddddd;
105
+ background: linear-gradient(#eeeeee, #dddddd), #dddddd;
106
+ color: #333333;
107
+ text-decoration: none; }
108
+ .button:active, .button.active {
109
+ border-color: #666666;
110
+ border-bottom-color: #999999;
111
+ background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dddddd), color-stop(100%, #eeeeee)), #eeeeee;
112
+ background: -webkit-linear-gradient(#dddddd, #eeeeee), #eeeeee;
113
+ background: -moz-linear-gradient(#dddddd, #eeeeee), #eeeeee;
114
+ background: -o-linear-gradient(#dddddd, #eeeeee), #eeeeee;
115
+ background: linear-gradient(#dddddd, #eeeeee), #eeeeee;
116
+ color: #333333;
117
+ text-decoration: none;
118
+ text-shadow: -1px -1px 0 #eeeeee; }
142
119
 
143
120
  body > header {
144
121
  overflow: hidden;
145
122
  *zoom: 1;
146
- border-bottom: 1px solid #cccccc;
147
- }
148
- body > header h1 {
149
- float: left;
150
- margin-left: 6px;
151
- padding: 6px;
152
- padding-left: 30px;
153
- background: url(/images/logo.png) left no-repeat;
154
- font-size: 18px;
155
- font-weight: bold;
156
- }
157
- body > header h1 a {
158
- color: black;
159
- text-decoration: none;
160
- text-shadow: 0 1px 0 white;
161
- -webkit-transition: 0.1s ease;
162
- -moz-transition: 0.1s ease;
163
- -ms-transition: 0.1s ease;
164
- -o-transition: 0.1s ease;
165
- transition: 0.1s ease;
166
- }
167
- body > header h1 a:hover {
168
- color: #4183c4;
169
- }
170
- body > header nav {
171
- border-left: 1px solid #cccccc;
172
- }
173
- body > header nav.project {
174
- float: left;
175
- }
176
- body > header nav.app {
177
- float: right;
178
- }
179
- body > header nav li {
180
- display: block;
181
- float: left;
182
- border-left: 1px solid white;
183
- border-right: 1px solid #cccccc;
184
- }
185
- body > header nav li input {
186
- margin: 6px;
187
- }
188
- body > header nav li a {
189
- display: block;
190
- padding: 10px;
191
- text-decoration: none;
192
- text-shadow: 0 1px 0 white;
193
- background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f4f4f4), color-stop(100%, #ececec)), #ececec;
194
- background: -webkit-linear-gradient(#f4f4f4, #ececec), #ececec;
195
- background: -moz-linear-gradient(#f4f4f4, #ececec), #ececec;
196
- background: -o-linear-gradient(#f4f4f4, #ececec), #ececec;
197
- background: -ms-linear-gradient(#f4f4f4, #ececec), #ececec;
198
- background: linear-gradient(#f4f4f4, #ececec), #ececec;
199
- color: #666666;
200
- text-shadow: 1px 1px 0 white;
201
- text-decoration: none;
202
- }
203
- body > header nav li a:hover, body > header nav li a:focus {
204
- background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(100%, #dddddd)), #dddddd;
205
- background: -webkit-linear-gradient(#eeeeee, #dddddd), #dddddd;
206
- background: -moz-linear-gradient(#eeeeee, #dddddd), #dddddd;
207
- background: -o-linear-gradient(#eeeeee, #dddddd), #dddddd;
208
- background: -ms-linear-gradient(#eeeeee, #dddddd), #dddddd;
209
- background: linear-gradient(#eeeeee, #dddddd), #dddddd;
210
- color: #333333;
211
- text-decoration: none;
212
- }
213
- body > header nav li a:active, body > header nav li a.active {
214
- background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dddddd), color-stop(100%, #eeeeee)), #eeeeee;
215
- background: -webkit-linear-gradient(#dddddd, #eeeeee), #eeeeee;
216
- background: -moz-linear-gradient(#dddddd, #eeeeee), #eeeeee;
217
- background: -o-linear-gradient(#dddddd, #eeeeee), #eeeeee;
218
- background: -ms-linear-gradient(#dddddd, #eeeeee), #eeeeee;
219
- background: linear-gradient(#dddddd, #eeeeee), #eeeeee;
220
- color: #333333;
221
- text-decoration: none;
222
- text-shadow: -1px -1px 0 #eeeeee;
223
- }
123
+ border-bottom: 1px solid #cccccc; }
124
+ body > header h1 {
125
+ float: left;
126
+ margin-left: 6px;
127
+ padding: 6px;
128
+ padding-left: 30px;
129
+ background: url(/images/logo.png) left no-repeat;
130
+ font-size: 18px;
131
+ font-weight: bold; }
132
+ body > header h1 a {
133
+ color: black;
134
+ text-decoration: none;
135
+ text-shadow: 0 1px 0 white;
136
+ -webkit-transition: 0.1s ease;
137
+ -moz-transition: 0.1s ease;
138
+ -o-transition: 0.1s ease;
139
+ transition: 0.1s ease; }
140
+ body > header h1 a:hover {
141
+ color: #4183c4; }
142
+ body > header nav {
143
+ border-left: 1px solid #cccccc; }
144
+ body > header nav.project {
145
+ float: left; }
146
+ body > header nav.app {
147
+ float: right; }
148
+ body > header nav li {
149
+ display: block;
150
+ float: left;
151
+ border-left: 1px solid white;
152
+ border-right: 1px solid #cccccc; }
153
+ body > header nav li input {
154
+ margin: 6px; }
155
+ body > header nav li a {
156
+ display: block;
157
+ padding: 10px;
158
+ text-decoration: none;
159
+ text-shadow: 0 1px 0 white;
160
+ background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f4f4f4), color-stop(100%, #ececec)), #ececec;
161
+ background: -webkit-linear-gradient(#f4f4f4, #ececec), #ececec;
162
+ background: -moz-linear-gradient(#f4f4f4, #ececec), #ececec;
163
+ background: -o-linear-gradient(#f4f4f4, #ececec), #ececec;
164
+ background: linear-gradient(#f4f4f4, #ececec), #ececec;
165
+ color: #666666;
166
+ text-shadow: 1px 1px 0 white;
167
+ text-decoration: none; }
168
+ body > header nav li a:hover, body > header nav li a:focus {
169
+ background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(100%, #dddddd)), #dddddd;
170
+ background: -webkit-linear-gradient(#eeeeee, #dddddd), #dddddd;
171
+ background: -moz-linear-gradient(#eeeeee, #dddddd), #dddddd;
172
+ background: -o-linear-gradient(#eeeeee, #dddddd), #dddddd;
173
+ background: linear-gradient(#eeeeee, #dddddd), #dddddd;
174
+ color: #333333;
175
+ text-decoration: none; }
176
+ body > header nav li a:active, body > header nav li a.active {
177
+ background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dddddd), color-stop(100%, #eeeeee)), #eeeeee;
178
+ background: -webkit-linear-gradient(#dddddd, #eeeeee), #eeeeee;
179
+ background: -moz-linear-gradient(#dddddd, #eeeeee), #eeeeee;
180
+ background: -o-linear-gradient(#dddddd, #eeeeee), #eeeeee;
181
+ background: linear-gradient(#dddddd, #eeeeee), #eeeeee;
182
+ color: #333333;
183
+ text-decoration: none;
184
+ text-shadow: -1px -1px 0 #eeeeee; }
224
185
 
225
186
  #messages {
226
187
  width: 100%;
@@ -228,58 +189,45 @@ body > header nav li a:active, body > header nav li a.active {
228
189
  min-height: 3em;
229
190
  overflow: auto;
230
191
  background: white;
231
- border-top: 1px solid white;
232
- }
233
- #messages table {
234
- overflow: hidden;
235
- *zoom: 1;
236
- width: 100%;
237
- }
238
- #messages table thead tr {
239
- background: #eeeeee;
240
- color: #333333;
241
- }
242
- #messages table thead tr th {
243
- padding: 0.25em;
244
- font-weight: bold;
245
- color: #666666;
246
- text-shadow: 0 1px 0 white;
247
- }
248
- #messages table tbody tr {
249
- cursor: pointer;
250
- -webkit-transition: 0.1s ease;
251
- -moz-transition: 0.1s ease;
252
- -ms-transition: 0.1s ease;
253
- -o-transition: 0.1s ease;
254
- transition: 0.1s ease;
255
- color: #333333;
256
- }
257
- #messages table tbody tr:hover {
258
- color: black;
259
- }
260
- #messages table tbody tr:nth-child(even) {
261
- background: #f0f0f0;
262
- }
263
- #messages table tbody tr.selected {
264
- background: Highlight;
265
- color: HighlightText;
266
- }
267
- #messages table tbody tr td {
268
- padding: 0.25em;
269
- }
270
- #messages table tbody tr td.blank {
271
- color: #666666;
272
- font-style: italic;
273
- }
192
+ border-top: 1px solid white; }
193
+ #messages table {
194
+ overflow: hidden;
195
+ *zoom: 1;
196
+ width: 100%; }
197
+ #messages table thead tr {
198
+ background: #eeeeee;
199
+ color: #333333; }
200
+ #messages table thead tr th {
201
+ padding: 0.25em;
202
+ font-weight: bold;
203
+ color: #666666;
204
+ text-shadow: 0 1px 0 white; }
205
+ #messages table tbody tr {
206
+ cursor: pointer;
207
+ -webkit-transition: 0.1s ease;
208
+ -moz-transition: 0.1s ease;
209
+ -o-transition: 0.1s ease;
210
+ transition: 0.1s ease;
211
+ color: #333333; }
212
+ #messages table tbody tr:hover {
213
+ color: black; }
214
+ #messages table tbody tr:nth-child(even) {
215
+ background: #f0f0f0; }
216
+ #messages table tbody tr.selected {
217
+ background: Highlight;
218
+ color: HighlightText; }
219
+ #messages table tbody tr td {
220
+ padding: 0.25em; }
221
+ #messages table tbody tr td.blank {
222
+ color: #666666;
223
+ font-style: italic; }
274
224
 
275
225
  #resizer {
276
226
  padding-bottom: 5px;
277
- cursor: ns-resize;
278
- }
279
- #resizer .ruler {
280
- border-top: 1px solid #cccccc;
281
- border-bottom: 1px solid white;
282
- }
227
+ cursor: ns-resize; }
228
+ #resizer .ruler {
229
+ border-top: 1px solid #cccccc;
230
+ border-bottom: 1px solid white; }
283
231
 
284
232
  #message {
285
233
  display: -webkit-box;
@@ -293,152 +241,117 @@ body > header nav li a:active, body > header nav li a.active {
293
241
  -webkit-box-flex: 1;
294
242
  -moz-box-flex: 1;
295
243
  -ms-box-flex: 1;
296
- box-flex: 1;
297
- }
298
- #message > header {
299
- overflow: hidden;
300
- *zoom: 1;
301
- }
302
- #message > header .metadata {
303
- overflow: hidden;
304
- *zoom: 1;
305
- padding: 0.5em;
306
- padding-top: 0;
307
- }
308
- #message > header .metadata dt, #message > header .metadata dd {
309
- padding: 0.25em;
310
- }
311
- #message > header .metadata dt {
312
- float: left;
313
- clear: left;
314
- width: 8em;
315
- margin-right: 0.5em;
316
- text-align: right;
317
- font-weight: bold;
318
- color: #666666;
319
- text-shadow: 0 1px 0 white;
320
- }
321
- #message > header .metadata dd.subject {
322
- font-weight: bold;
323
- }
324
- #message > header .metadata .attachments {
325
- display: none;
326
- }
327
- #message > header .metadata .attachments ul {
328
- display: inline;
329
- }
330
- #message > header .metadata .attachments ul li {
331
- display: -moz-inline-box;
332
- -moz-box-orient: vertical;
333
- display: inline-block;
334
- vertical-align: middle;
335
- *vertical-align: auto;
336
- margin-right: 0.5em;
337
- }
338
- #message > header .metadata .attachments ul li {
339
- *display: inline;
340
- }
341
- #message > header .views ul {
342
- padding: 0 0.5em;
343
- border-bottom: 1px solid #cccccc;
344
- }
345
- #message > header .views .tab {
346
- display: -moz-inline-box;
347
- -moz-box-orient: vertical;
348
- display: inline-block;
349
- vertical-align: middle;
350
- *vertical-align: auto;
351
- }
352
- #message > header .views .tab {
353
- *display: inline;
354
- }
355
- #message > header .views .tab a {
356
- display: -moz-inline-box;
357
- -moz-box-orient: vertical;
358
- display: inline-block;
359
- vertical-align: middle;
360
- *vertical-align: auto;
361
- padding: 0.5em;
362
- border: 1px solid #cccccc;
363
- background: #dddddd;
364
- color: #333333;
365
- border-width: 1px 1px 0 1px;
366
- cursor: pointer;
367
- text-shadow: 0 1px 0 #eeeeee;
368
- text-decoration: none;
369
- }
370
- #message > header .views .tab a {
371
- *display: inline;
372
- }
373
- #message > header .views .tab:not(.selected):hover a {
374
- background-color: #eeeeee;
375
- }
376
- #message > header .views .tab.selected a {
377
- background: white;
378
- color: black;
379
- height: 13px;
380
- -webkit-box-shadow: 1px 1px 0 #cccccc;
381
- -moz-box-shadow: 1px 1px 0 #cccccc;
382
- box-shadow: 1px 1px 0 #cccccc;
383
- margin-bottom: -2px;
384
- cursor: default;
385
- }
386
- #message > header .views .action {
387
- display: -moz-inline-box;
388
- -moz-box-orient: vertical;
389
- display: inline-block;
390
- vertical-align: middle;
391
- *vertical-align: auto;
392
- float: right;
393
- margin: 0 0.25em;
394
- }
395
- #message > header .views .action {
396
- *display: inline;
397
- }
244
+ box-flex: 1; }
245
+ #message > header {
246
+ overflow: hidden;
247
+ *zoom: 1; }
248
+ #message > header .metadata {
249
+ overflow: hidden;
250
+ *zoom: 1;
251
+ padding: 0.5em;
252
+ padding-top: 0; }
253
+ #message > header .metadata dt, #message > header .metadata dd {
254
+ padding: 0.25em; }
255
+ #message > header .metadata dt {
256
+ float: left;
257
+ clear: left;
258
+ width: 8em;
259
+ margin-right: 0.5em;
260
+ text-align: right;
261
+ font-weight: bold;
262
+ color: #666666;
263
+ text-shadow: 0 1px 0 white; }
264
+ #message > header .metadata dd.subject {
265
+ font-weight: bold; }
266
+ #message > header .metadata .attachments {
267
+ display: none; }
268
+ #message > header .metadata .attachments ul {
269
+ display: inline; }
270
+ #message > header .metadata .attachments ul li {
271
+ display: -moz-inline-stack;
272
+ display: inline-block;
273
+ vertical-align: middle;
274
+ *vertical-align: auto;
275
+ zoom: 1;
276
+ *display: inline;
277
+ margin-right: 0.5em; }
278
+ #message > header .views ul {
279
+ padding: 0 0.5em;
280
+ border-bottom: 1px solid #cccccc; }
281
+ #message > header .views .tab {
282
+ display: -moz-inline-stack;
283
+ display: inline-block;
284
+ vertical-align: middle;
285
+ *vertical-align: auto;
286
+ zoom: 1;
287
+ *display: inline; }
288
+ #message > header .views .tab a {
289
+ display: -moz-inline-stack;
290
+ display: inline-block;
291
+ vertical-align: middle;
292
+ *vertical-align: auto;
293
+ zoom: 1;
294
+ *display: inline;
295
+ padding: 0.5em;
296
+ border: 1px solid #cccccc;
297
+ background: #dddddd;
298
+ color: #333333;
299
+ border-width: 1px 1px 0 1px;
300
+ cursor: pointer;
301
+ text-shadow: 0 1px 0 #eeeeee;
302
+ text-decoration: none; }
303
+ #message > header .views .tab:not(.selected):hover a {
304
+ background-color: #eeeeee; }
305
+ #message > header .views .tab.selected a {
306
+ background: white;
307
+ color: black;
308
+ height: 13px;
309
+ -webkit-box-shadow: 1px 1px 0 #cccccc;
310
+ -moz-box-shadow: 1px 1px 0 #cccccc;
311
+ box-shadow: 1px 1px 0 #cccccc;
312
+ margin-bottom: -2px;
313
+ cursor: default; }
314
+ #message > header .views .action {
315
+ display: -moz-inline-stack;
316
+ display: inline-block;
317
+ vertical-align: middle;
318
+ *vertical-align: auto;
319
+ zoom: 1;
320
+ *display: inline;
321
+ float: right;
322
+ margin: 0 0.25em; }
398
323
 
399
324
  .fractal-analysis {
400
- margin: 12px 0;
401
- }
402
- .fractal-analysis .report-intro {
403
- font-weight: bold;
404
- }
405
- .fractal-analysis .report-intro.valid {
406
- color: #009900;
407
- }
408
- .fractal-analysis .report-intro.invalid {
409
- color: #cc3333;
410
- }
411
- .fractal-analysis code {
412
- font-family: Monaco, "Courier New", Courier, monospace;
413
- background-color: #f8f8ff;
414
- color: #444444;
415
- padding: 0 0.2em;
416
- border: 1px solid #dedede;
417
- }
418
- .fractal-analysis ul {
419
- margin: 1em 0 1em 1em;
420
- list-style-type: square;
421
- }
422
- .fractal-analysis ol {
423
- margin: 1em 0 1em 2em;
424
- list-style-type: decimal;
425
- }
426
- .fractal-analysis ul li, .fractal-analysis ol li {
427
- display: list-item;
428
- margin: 0.5em 0 0.5em 1em;
429
- }
430
- .fractal-analysis .error-intro strong {
431
- font-weight: bold;
432
- }
433
- .fractal-analysis .unsupported-clients dt {
434
- padding-left: 1em;
435
- }
436
- .fractal-analysis .unsupported-clients dd {
437
- padding-left: 2em;
438
- }
439
- .fractal-analysis .unsupported-clients dd ul li {
440
- display: list-item;
441
- }
325
+ margin: 12px 0; }
326
+ .fractal-analysis .report-intro {
327
+ font-weight: bold; }
328
+ .fractal-analysis .report-intro.valid {
329
+ color: #009900; }
330
+ .fractal-analysis .report-intro.invalid {
331
+ color: #cc3333; }
332
+ .fractal-analysis code {
333
+ font-family: Monaco, "Courier New", Courier, monospace;
334
+ background-color: ghostwhite;
335
+ color: #444444;
336
+ padding: 0 0.2em;
337
+ border: 1px solid #dedede; }
338
+ .fractal-analysis ul {
339
+ margin: 1em 0 1em 1em;
340
+ list-style-type: square; }
341
+ .fractal-analysis ol {
342
+ margin: 1em 0 1em 2em;
343
+ list-style-type: decimal; }
344
+ .fractal-analysis ul li, .fractal-analysis ol li {
345
+ display: list-item;
346
+ margin: 0.5em 0 0.5em 1em; }
347
+ .fractal-analysis .error-intro strong {
348
+ font-weight: bold; }
349
+ .fractal-analysis .unsupported-clients dt {
350
+ padding-left: 1em; }
351
+ .fractal-analysis .unsupported-clients dd {
352
+ padding-left: 2em; }
353
+ .fractal-analysis .unsupported-clients dd ul li {
354
+ display: list-item; }
442
355
 
443
356
  iframe {
444
357
  display: -webkit-box;
@@ -449,5 +362,4 @@ iframe {
449
362
  -moz-box-flex: 1;
450
363
  -ms-box-flex: 1;
451
364
  box-flex: 1;
452
- background: white;
453
- }
365
+ background: white; }