mailcatcher 0.5.10 → 0.5.11
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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -0
- data/README.md +7 -1
- data/lib/mail_catcher/mail.rb +8 -1
- data/lib/mail_catcher/version.rb +1 -1
- data/lib/mail_catcher/web.rb +11 -1
- data/public/javascripts/application.js +112 -36
- data/public/stylesheets/application.css +261 -349
- data/views/index.haml +1 -0
- metadata +55 -54
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -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
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
@@ -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
|
data/lib/mail_catcher/mail.rb
CHANGED
@@ -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
|
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
|
data/lib/mail_catcher/version.rb
CHANGED
data/lib/mail_catcher/web.rb
CHANGED
@@ -10,7 +10,7 @@ class Sinatra::Request
|
|
10
10
|
end
|
11
11
|
|
12
12
|
class MailCatcher::Web < Sinatra::Base
|
13
|
-
set :root,
|
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
|
-
|
3
|
+
_this = this;
|
4
4
|
|
5
5
|
jQuery.expr[':'].icontains = function(a, i, m) {
|
6
|
-
var _ref,
|
7
|
-
return ((_ref = (
|
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
|
-
|
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
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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
|
-
|
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
|
-
|
118
|
+
_this.loadMessage($('#messages tbody tr[data-message-id]:last').data('message-id'));
|
119
|
+
return false;
|
106
120
|
});
|
107
121
|
key('left', function() {
|
108
|
-
|
122
|
+
_this.openTab(_this.previousTab());
|
123
|
+
return false;
|
109
124
|
});
|
110
125
|
key('right', function() {
|
111
|
-
|
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")
|
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)
|
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)
|
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)
|
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').
|
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
|
217
|
-
|
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
|
-
$(
|
221
|
-
$(
|
222
|
-
|
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',
|
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=\"
|
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…</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))
|
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
|
-
|
20
|
-
}
|
18
|
+
font-size: 100%;
|
19
|
+
vertical-align: baseline; }
|
21
20
|
|
22
|
-
|
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
|
-
|
45
|
-
|
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
|
-
|
77
|
-
|
78
|
-
|
79
|
-
}
|
80
|
-
body
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
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
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
}
|
167
|
-
body > header
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
}
|
176
|
-
body > header nav
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
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
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
#
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
#
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
}
|
260
|
-
#messages table tbody tr
|
261
|
-
|
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
|
-
|
280
|
-
|
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
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
}
|
330
|
-
#message > header .
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
}
|
355
|
-
#message > header .views .tab a {
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
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
|
-
|
403
|
-
|
404
|
-
}
|
405
|
-
.fractal-analysis .report-intro.
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
}
|
422
|
-
.fractal-analysis
|
423
|
-
|
424
|
-
|
425
|
-
}
|
426
|
-
.fractal-analysis
|
427
|
-
|
428
|
-
|
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; }
|