vanilla-snackbar 1.0.1

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: 5e26fc4861855a96d97b37c039d6bcda3201e908
4
+ data.tar.gz: 2492882495cb27d370e837cdf781817f46e3eb5e
5
+ SHA512:
6
+ metadata.gz: dc9d91f77d7f1c05720a7bbbcd4f5dd435385f3e63e9a5b7fa9b68fd3dcf4448e855974221e90ff7187026852392fd05cdaac13bae932935967249d156483413
7
+ data.tar.gz: d97561f2e07daf864671ac22d1765359fa9316e5df861fa32d5aba1f926d9b22f1ef6c644357f4bd1d9bc491fb7db2ae7c01f987ae3721a83d10f6f63acda004
@@ -0,0 +1,137 @@
1
+ # Snackbar.js (Vanilla-Snackbar)
2
+
3
+ A simple implementation of a full width snackbar message using "vanilla js".
4
+ View exmple at http://chrisdimoulis.com/snackbar.js
5
+
6
+ [Changelog](https://github.com/cdimoulis/snackbar.js/blob/master/changelog.md)
7
+
8
+ [![npm][npm]][npm-url]
9
+ [![node][node]][node-url]
10
+ [![deps][deps]][deps-url]
11
+ [![tests][tests]][tests-url]
12
+ [![coverage][cover]][cover-url]
13
+
14
+ ## Production Dependencies
15
+ **None!** (not even jquery)
16
+
17
+ ## Installation
18
+
19
+ ### Node
20
+
21
+ ```
22
+ npm install --save vanilla-snackbar
23
+ ```
24
+
25
+ ### Ruby Gem for Rails
26
+
27
+ ```
28
+ gem install vanilla-snackbar
29
+ ```
30
+
31
+ Or simply add to your Gemfile:
32
+ ```ruby
33
+ gem 'vanilla-snackbar'
34
+ ```
35
+
36
+
37
+ ## Usage
38
+
39
+ ### Importing/Including
40
+
41
+ **Node**
42
+
43
+ Import `vanilla-snackbar` into your module:
44
+ ```js
45
+ import Snackbar from 'vanilla-snackbar';
46
+ ```
47
+
48
+ **Rails**
49
+
50
+ Add to `app/assets/javascripts/application.js`. Note that you should just require snackbar, not vanilla-snackbar.
51
+ ```js
52
+ //= require snackbar
53
+ ```
54
+
55
+ ### Style
56
+ See `src/snackbar.scss` for default style and reference if you desire to override any styles.
57
+
58
+ ### Pre DOM ready
59
+ If you create a snackbar and create a message before the DOM is ready the message will be stored in a queue which which will execute once the DOM is ready.
60
+
61
+ ### Create Snackbar
62
+ ```javascript
63
+ // New snackbar with defaults
64
+ var default_snack = new Snackbar();
65
+
66
+ // New snackbar with custom default time
67
+ var short_snack = new Snackbar({time: 2000});
68
+
69
+ // New snackbar where the default behviour is to manually close
70
+ var manual_snack = new Snackbar({manual_close: true});
71
+ ```
72
+
73
+ All options passed when creating the snackbar object are default. Overrides can be passed in each call to display a message.
74
+
75
+ #### Available Options
76
+ * `manual_close`: Boolean. Provide a close X button (true) vs timed close (false). *Default:* false
77
+ * `time`: ms of time before automatic close. (ignored if `manual_close: true`). *Default:* 5000
78
+ * `class`: String containing desired classes to add to snackbar. *Default:* empty
79
+
80
+ **NOTE: Default Options and Multiple Snackbar Objects**
81
+
82
+ A new Snackbar object will not inject new `#snackbar-wrapper` elements. All Snackbar objects use the same wrapper. It simply creates a new object with a different set of default options for displaying a Snackbar message. See below for overriding default options on a message specific basis as opposed to creating multiple Snackbar objects.
83
+
84
+ ### Displaying Messages
85
+
86
+ Displaying a message is as simple as calling the `.message(msg, opts)` function of the Snackbar. There are also four helper methods for common Snackbar usage. All of these functions take 2 parameters:
87
+
88
+ * `msg`: the message to be displayed.
89
+ * `opts`: the options to override default options.
90
+
91
+ ```javascript
92
+ // Display a message
93
+ snack.message('Hello World');
94
+
95
+ // Helper functions:
96
+ // Display a message that must be removed manually ->
97
+ snack.stickyMessage('Acknowledge me!');
98
+ // Display a message with a green background (adds class 'success') ->
99
+ snack.success('You did it!');
100
+ // Display a message with a red background (adds class 'error') ->
101
+ snack.error("Something didn't work");
102
+ // Display a message with a orangish/yellow background (adds class 'warn') ->
103
+ snack.warn("I'd be careful if I were you...");
104
+ ```
105
+
106
+ Creating a Snackbar message will return a Promise object. This promise object will resolve when the Snackbar has finished fading in.
107
+
108
+ ### Overriding Default Options
109
+
110
+ ```javascript
111
+ // New snackbar with defaults
112
+ var snack = new Snackbar();
113
+ // Require user to close message just this one time
114
+ snack.message('Read this', {manual_close: true})
115
+
116
+ // New snackbar with custom default time
117
+ var snack = new Snackbar({time: 2000});
118
+ // Make this message stick longer than default
119
+ snack.message("A slightly longer message..."), {time: 7500});
120
+ // Add your own classes to the snackbar
121
+ snack.message("My special snackbar", {class: 'my-snackbar your-snackbar'})
122
+ ```
123
+
124
+ [npm]: https://img.shields.io/npm/v/vanilla-snackbar.svg
125
+ [npm-url]: https://npmjs.com/package/vanilla-snackbar
126
+
127
+ [node]: https://img.shields.io/node/v/vanilla-snackbar.svg
128
+ [node-url]: https://nodejs.org
129
+
130
+ [deps]: https://img.shields.io/david/cdimoulis/snackbar.js.svg
131
+ [deps-url]: https://david-dm.org/cdimoulis/snackbar.js
132
+
133
+ [tests]: https://img.shields.io/travis/cdimoulis/snackbar.js/master.svg
134
+ [tests-url]: https://travis-ci.org/cdimoulis/snackbar.js
135
+
136
+ [cover]: https://coveralls.io/repos/github/cdimoulis/snackbar.js/badge.svg?branch=master
137
+ [cover-url]: https://coveralls.io/github/cdimoulis/snackbar.js?branch=master
@@ -0,0 +1,8 @@
1
+ require 'vanilla-snackbar/version'
2
+
3
+ module VanillaSnackbar
4
+ module Rails
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module VanillaSnackbar
2
+ module Rails
3
+ VERSION = "1.0.1"
4
+ end
5
+ end
@@ -0,0 +1,1028 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+ /******/
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+ /******/
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId]) {
10
+ /******/ return installedModules[moduleId].exports;
11
+ /******/ }
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ i: moduleId,
15
+ /******/ l: false,
16
+ /******/ exports: {}
17
+ /******/ };
18
+ /******/
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+ /******/
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.l = true;
24
+ /******/
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+ /******/
29
+ /******/
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+ /******/
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+ /******/
36
+ /******/ // define getter function for harmony exports
37
+ /******/ __webpack_require__.d = function(exports, name, getter) {
38
+ /******/ if(!__webpack_require__.o(exports, name)) {
39
+ /******/ Object.defineProperty(exports, name, {
40
+ /******/ configurable: false,
41
+ /******/ enumerable: true,
42
+ /******/ get: getter
43
+ /******/ });
44
+ /******/ }
45
+ /******/ };
46
+ /******/
47
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
48
+ /******/ __webpack_require__.n = function(module) {
49
+ /******/ var getter = module && module.__esModule ?
50
+ /******/ function getDefault() { return module['default']; } :
51
+ /******/ function getModuleExports() { return module; };
52
+ /******/ __webpack_require__.d(getter, 'a', getter);
53
+ /******/ return getter;
54
+ /******/ };
55
+ /******/
56
+ /******/ // Object.prototype.hasOwnProperty.call
57
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58
+ /******/
59
+ /******/ // __webpack_public_path__
60
+ /******/ __webpack_require__.p = "";
61
+ /******/
62
+ /******/ // Load entry module and return exports
63
+ /******/ return __webpack_require__(__webpack_require__.s = 0);
64
+ /******/ })
65
+ /************************************************************************/
66
+ /******/ ([
67
+ /* 0 */
68
+ /***/ (function(module, exports, __webpack_require__) {
69
+
70
+ "use strict";
71
+
72
+
73
+ Object.defineProperty(exports, "__esModule", {
74
+ value: true
75
+ });
76
+
77
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
78
+
79
+ __webpack_require__(1);
80
+
81
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
82
+
83
+ /***************
84
+ Snackbar.js
85
+ https://github.com/cdimoulis/snackbar.js
86
+
87
+ A simple implementation of the snackbar message pops up at the bottom of the page.
88
+
89
+ view README.md for more in depth documentation
90
+
91
+ All options passed when creating the snackbar object are default. Overrides can
92
+ be passed in each call to display a message.
93
+
94
+ Usage:
95
+ Create a new snackbar ->
96
+ var snack = new Snackbar();
97
+ Display a message ->
98
+ snack.message('Hello World');
99
+
100
+ Helper functions:
101
+ Display a message that must be removed manually ->
102
+ snack.stickyMessage('Acknowledge me!');
103
+ Display a message with a green background (adds class 'success') ->
104
+ snack.success('You did it!');
105
+ Display a message with a red backbround (adds class 'error') ->
106
+ snack.error("Something didn't work");
107
+ Display a message with a orangish/yellow backbround (adds class 'warn') ->
108
+ snack.warn("I'd be careful if I were you...");
109
+
110
+ ****************/
111
+
112
+ var Snackbar = function () {
113
+ /************
114
+ Feature wide options. These options will be set at all time unless
115
+ overridden by options passed in each call
116
+ manual_close: Boolean. Provide a close X button (true) vs timed close (false)
117
+ Default: false
118
+ time: ms of time before automatic close. (ignored if manual_close: true)
119
+ Default: 5000
120
+ class: String containing desired classes.
121
+ Default: null
122
+ ************/
123
+ function Snackbar(options) {
124
+ _classCallCheck(this, Snackbar);
125
+
126
+ this.options = options || { manual_close: false, time: 5000 };
127
+ // If called before DOM is ready then maintain list to execute;
128
+ this.pre_dom_queue = [];
129
+
130
+ // Setup DOM
131
+ this._setDom();
132
+ }
133
+
134
+ /**********
135
+ / PUBLIC FUNCTIONS
136
+ /**********/
137
+
138
+ // Main function to display the snackbar
139
+ // message: text to display
140
+ // opt: default override options to send
141
+ // Returns a promise that will resolve when fully faded in OR
142
+ // null if it cannot be added yet
143
+
144
+
145
+ _createClass(Snackbar, [{
146
+ key: 'message',
147
+ value: function message(_message, opts) {
148
+ var _this2 = this;
149
+
150
+ opts = Object.assign({}, this.options, opts);
151
+ var _snackbar = this._addSnackbar(_message, opts);
152
+ // Show if _snackbar Element is created
153
+ if (_snackbar) {
154
+
155
+ // Fade in and when complete set timeout for fade out if not manual close
156
+ return _fadeIn(_snackbar).then(function () {
157
+ _this2._setClose(_snackbar, opts);
158
+ });
159
+ }
160
+ // Add to queue to show after DOM is ready
161
+ else {
162
+ this.pre_dom_queue.push({ snackbar: this, message: _message, opts: opts });
163
+ }
164
+ }
165
+
166
+ // Helper for message that sticks until manually closed
167
+ // message: text to display
168
+ // opt: default override options to send
169
+ // Returns a promise that will resolve when fully faded in OR
170
+ // null if it cannot be added yet
171
+
172
+ }, {
173
+ key: 'stickyMessage',
174
+ value: function stickyMessage(message, opts) {
175
+ opts = Object.assign({}, this.options, opts);
176
+ opts.manual_close = true;
177
+ return this.message(message, opts);
178
+ }
179
+
180
+ // Helper for success snackbar
181
+ // message: text to display
182
+ // opt: default override options to send
183
+ // Returns a promise that will resolve when fully faded in OR
184
+ // null if it cannot be added yet
185
+
186
+ }, {
187
+ key: 'success',
188
+ value: function success(message, opts) {
189
+ opts = Object.assign({}, this.options, opts);
190
+ opts.class = opts.class || '';
191
+ opts.class += ' success';
192
+ return this.message(message, opts);
193
+ }
194
+
195
+ // Helper for error snackbar
196
+ // message: text to display
197
+ // opt: default override options to send
198
+ // Returns a promise that will resolve when fully faded in OR
199
+ // null if it cannot be added yet
200
+
201
+ }, {
202
+ key: 'error',
203
+ value: function error(message, opts) {
204
+ opts = Object.assign({}, this.options, opts);
205
+ opts.class = opts.class || '';
206
+ opts.class += ' error';
207
+ return this.message(message, opts);
208
+ }
209
+
210
+ // Helper for warn snackbar
211
+ // message: text to display
212
+ // opt: default override options to send
213
+ // Returns a promise that will resolve when fully faded in OR
214
+ // null if it cannot be added yet
215
+
216
+ }, {
217
+ key: 'warn',
218
+ value: function warn(message, opts) {
219
+ opts = Object.assign({}, this.options, opts);
220
+ opts.class = opts.class || '';
221
+ opts.class += ' warn';
222
+ return this.message(message, opts);
223
+ }
224
+
225
+ /********
226
+ / END PUBLIC FUNCTIONS
227
+ *********/
228
+
229
+ /**********
230
+ / PRIVATE FUNCTIONS
231
+ /**********/
232
+
233
+ // Set the timeout for closing the snackbar if not opts.manual_close
234
+
235
+ }, {
236
+ key: '_setClose',
237
+ value: function _setClose(snackbar, opts) {
238
+ var _this3 = this;
239
+
240
+ // If not manual_close then set timeout for removal
241
+ return new Promise(function (resolve, reject) {
242
+ if (!opts.manual_close) {
243
+ setTimeout(function () {
244
+ _this3._removeSnackbar(snackbar).then(function () {
245
+ resolve();
246
+ });
247
+ }, opts.time);
248
+ } else {
249
+ resolve();
250
+ }
251
+ });
252
+ }
253
+
254
+ // Setup the elemends on the DOM
255
+
256
+ }, {
257
+ key: '_setDom',
258
+ value: function _setDom() {
259
+ var _this4 = this;
260
+
261
+ var _body = document.getElementsByTagName('body')[0];
262
+ // If the Body exists
263
+ if (_body) {
264
+ // Add snackbar if not in DOM already
265
+ if (!document.getElementById('snackbar-wrapper')) {
266
+ var _outer_wrapper = document.createElement('div');
267
+ _outer_wrapper.id = 'snackbar-wrapper';
268
+ _body.appendChild(_outer_wrapper);
269
+ }
270
+ if (this.pre_dom_queue.length > 0) this._flushQueue();
271
+ }
272
+ // if body is not available then call when DOM is ready
273
+ else {
274
+ _ready(function () {
275
+ _this4._setDom();
276
+ });
277
+ }
278
+ }
279
+ }, {
280
+ key: '_flushQueue',
281
+
282
+
283
+ // Flush out the pre_dom_queue
284
+ value: function _flushQueue() {
285
+ for (var i = 0; i < this.pre_dom_queue.length; i++) {
286
+ var sb = this.pre_dom_queue[i];
287
+ sb.snackbar.message(sb.message, sb.opts);
288
+ }
289
+ this.pre_dom_queue = [];
290
+ }
291
+ }, {
292
+ key: '_addSnackbar',
293
+
294
+
295
+ // Add the snackbar
296
+ // message: text to display
297
+ // opt: options to send
298
+ value: function _addSnackbar(message, opts) {
299
+ var _this5 = this;
300
+
301
+ var _this = this;
302
+ var _snackbar_wrapper = document.getElementById('snackbar-wrapper');
303
+ // Only create snackbar if snackbar wrapper is in DOM
304
+ if (_snackbar_wrapper) {
305
+ var _snackbar = document.createElement('div');
306
+ // Class names for snackbar element
307
+ var snk_bar_class = 'snackbar';
308
+ // Add option classes to snackbar
309
+ if (opts.class) {
310
+ snk_bar_class += ' ' + opts.class;
311
+ }
312
+ _snackbar.className = snk_bar_class;
313
+
314
+ // Text node
315
+ var _text_wrapper = document.createElement('span');
316
+ _text_wrapper.className = 'snackbar-text';
317
+ _text_wrapper.appendChild(document.createTextNode(message));
318
+ _snackbar.appendChild(_text_wrapper);
319
+ // Add X for manual close
320
+ if (opts.manual_close) {
321
+ var _close = document.createElement('span');
322
+ _close.className = 'snackbar-close';
323
+ var _x = document.createTextNode('X');
324
+ _close.appendChild(_x);
325
+ // Apply click event for X
326
+ _close.onclick = function () {
327
+ // Returns the promise from removing snackbar
328
+ return _this5._removeSnackbar(_snackbar);
329
+ };
330
+ _snackbar.appendChild(_close);
331
+ }
332
+ _snackbar_wrapper.appendChild(_snackbar);
333
+ return _snackbar;
334
+ }
335
+ }
336
+ }, {
337
+ key: '_removeSnackbar',
338
+
339
+
340
+ // Remove a snackbar
341
+ value: function _removeSnackbar(_el) {
342
+ // _fadeOut returns a promise to use for completion
343
+ return _fadeOut(_el).then(function () {
344
+ _el.remove();
345
+ });
346
+ }
347
+ }]);
348
+
349
+ return Snackbar;
350
+ }();
351
+
352
+ /**********
353
+ / END PRIVATE FUNCTIONS
354
+ /**********/
355
+ ;
356
+
357
+ /*******
358
+ * Helper FUNCTIONS
359
+ *******/
360
+
361
+ // Fade in individual snackbar
362
+ // Returns a promise to use for completion
363
+ function _fadeIn(_el) {
364
+ // Change opacity returns a promise so we are passing that up
365
+ return _changeOpacity(_el, 1, 500);
366
+ };
367
+
368
+ // Fade out individual snackbar
369
+ // Returns a promise to use for completion
370
+ function _fadeOut(_el) {
371
+ // Change opacity returns a promise so we are passing that up
372
+ return _changeOpacity(_el, 0, 500);
373
+ };
374
+
375
+ // Change opacity
376
+ // _el: element
377
+ // value: the opacity value
378
+ // time: the amount of time
379
+ // Returns a promise to use for completion
380
+ function _changeOpacity(_el, value, time) {
381
+ // rate of change
382
+ var fps = 24;
383
+ var time_per_frame = time / fps;
384
+ // current opacity
385
+ var current_opacity = parseFloat(_el.style.opacity) || 0;
386
+ // change for opacity
387
+ var diff = value - current_opacity;
388
+ var delta = diff / time_per_frame;
389
+
390
+ // Return a promise so we know when this is done
391
+ return new Promise(function (resolve, reject) {
392
+ var interval = setInterval(change, time_per_frame);
393
+ function change() {
394
+ // Set new opacity
395
+ current_opacity += delta;
396
+ current_opacity = current_opacity < 0 ? 0 : current_opacity;
397
+ current_opacity = current_opacity > 1 ? 1 : current_opacity;
398
+ _el.style.opacity = current_opacity;
399
+ // Check if done
400
+ if (current_opacity === 1 || current_opacity === 0) {
401
+ // End interval and resolve the promise
402
+ clearInterval(interval);
403
+ resolve();
404
+ }
405
+ }
406
+ });
407
+ };
408
+
409
+ // Callback when DOM is ready
410
+ function _ready(cb) {
411
+ // If add event listener is available
412
+ if (document.addEventListener) {
413
+ document.addEventListener('DOMContentLoaded', function () {
414
+ document.removeEventListener('DOMContentLoaded', this.callee);
415
+ cb();
416
+ });
417
+ }
418
+ // Otherwise attach the state change event
419
+ else if (document.attachEvent) {
420
+ document.attachEvent('onreadystatechange', function () {
421
+ if (document.readyState === 'interactive' || document.readyState === 'complete') {
422
+ document.detachEvent('onreadystatechange', this.callee);
423
+ cb();
424
+ }
425
+ });
426
+ }
427
+ };
428
+
429
+ window.Snackbar = Snackbar;
430
+
431
+ exports.default = Snackbar;
432
+
433
+ /***/ }),
434
+ /* 1 */
435
+ /***/ (function(module, exports, __webpack_require__) {
436
+
437
+ // style-loader: Adds some css to the DOM by adding a <style> tag
438
+
439
+ // load the styles
440
+ var content = __webpack_require__(2);
441
+ if(typeof content === 'string') content = [[module.i, content, '']];
442
+ // Prepare cssTransformation
443
+ var transform;
444
+
445
+ var options = {"hmr":true}
446
+ options.transform = transform
447
+ // add the styles to the DOM
448
+ var update = __webpack_require__(4)(content, options);
449
+ if(content.locals) module.exports = content.locals;
450
+ // Hot Module Replacement
451
+ if(false) {
452
+ // When the styles change, update the <style> tags
453
+ if(!content.locals) {
454
+ module.hot.accept("!!../node_modules/css-loader/index.js!../node_modules/sass-loader/lib/loader.js??ref--1-2!./snackbar.scss", function() {
455
+ var newContent = require("!!../node_modules/css-loader/index.js!../node_modules/sass-loader/lib/loader.js??ref--1-2!./snackbar.scss");
456
+ if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
457
+ update(newContent);
458
+ });
459
+ }
460
+ // When the module is disposed, remove the <style> tags
461
+ module.hot.dispose(function() { update(); });
462
+ }
463
+
464
+ /***/ }),
465
+ /* 2 */
466
+ /***/ (function(module, exports, __webpack_require__) {
467
+
468
+ exports = module.exports = __webpack_require__(3)(undefined);
469
+ // imports
470
+
471
+
472
+ // module
473
+ exports.push([module.i, "#snackbar-wrapper {\n width: 100%;\n position: fixed;\n z-index: 999;\n bottom: 0px;\n display: block; }\n #snackbar-wrapper .snackbar {\n opacity: 0;\n width: 105%;\n margin-left: -2.5%;\n background-color: #333;\n color: #fff;\n text-align: center;\n font-size: 17px;\n padding: 16px; }\n #snackbar-wrapper .snackbar-close {\n width: 12%;\n cursor: pointer;\n display: block;\n top: .1em;\n float: right;\n margin-right: 3%; }\n #snackbar-wrapper .snackbar-text {\n width: 85%;\n display: inline-block; }\n #snackbar-wrapper .success {\n background-color: #228822; }\n #snackbar-wrapper .error {\n background-color: #bb2222; }\n #snackbar-wrapper .warn {\n background-color: #f3b300; }\n #snackbar-wrapper span.snackbar-close {\n font-family: sans-serif;\n font-weight: bolder;\n font-size: inherit;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased; }\n", ""]);
474
+
475
+ // exports
476
+
477
+
478
+ /***/ }),
479
+ /* 3 */
480
+ /***/ (function(module, exports) {
481
+
482
+ /*
483
+ MIT License http://www.opensource.org/licenses/mit-license.php
484
+ Author Tobias Koppers @sokra
485
+ */
486
+ // css base code, injected by the css-loader
487
+ module.exports = function(useSourceMap) {
488
+ var list = [];
489
+
490
+ // return the list of modules as css string
491
+ list.toString = function toString() {
492
+ return this.map(function (item) {
493
+ var content = cssWithMappingToString(item, useSourceMap);
494
+ if(item[2]) {
495
+ return "@media " + item[2] + "{" + content + "}";
496
+ } else {
497
+ return content;
498
+ }
499
+ }).join("");
500
+ };
501
+
502
+ // import a list of modules into the list
503
+ list.i = function(modules, mediaQuery) {
504
+ if(typeof modules === "string")
505
+ modules = [[null, modules, ""]];
506
+ var alreadyImportedModules = {};
507
+ for(var i = 0; i < this.length; i++) {
508
+ var id = this[i][0];
509
+ if(typeof id === "number")
510
+ alreadyImportedModules[id] = true;
511
+ }
512
+ for(i = 0; i < modules.length; i++) {
513
+ var item = modules[i];
514
+ // skip already imported module
515
+ // this implementation is not 100% perfect for weird media query combinations
516
+ // when a module is imported multiple times with different media queries.
517
+ // I hope this will never occur (Hey this way we have smaller bundles)
518
+ if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
519
+ if(mediaQuery && !item[2]) {
520
+ item[2] = mediaQuery;
521
+ } else if(mediaQuery) {
522
+ item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
523
+ }
524
+ list.push(item);
525
+ }
526
+ }
527
+ };
528
+ return list;
529
+ };
530
+
531
+ function cssWithMappingToString(item, useSourceMap) {
532
+ var content = item[1] || '';
533
+ var cssMapping = item[3];
534
+ if (!cssMapping) {
535
+ return content;
536
+ }
537
+
538
+ if (useSourceMap && typeof btoa === 'function') {
539
+ var sourceMapping = toComment(cssMapping);
540
+ var sourceURLs = cssMapping.sources.map(function (source) {
541
+ return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'
542
+ });
543
+
544
+ return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
545
+ }
546
+
547
+ return [content].join('\n');
548
+ }
549
+
550
+ // Adapted from convert-source-map (MIT)
551
+ function toComment(sourceMap) {
552
+ // eslint-disable-next-line no-undef
553
+ var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
554
+ var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;
555
+
556
+ return '/*# ' + data + ' */';
557
+ }
558
+
559
+
560
+ /***/ }),
561
+ /* 4 */
562
+ /***/ (function(module, exports, __webpack_require__) {
563
+
564
+ /*
565
+ MIT License http://www.opensource.org/licenses/mit-license.php
566
+ Author Tobias Koppers @sokra
567
+ */
568
+
569
+ var stylesInDom = {};
570
+
571
+ var memoize = function (fn) {
572
+ var memo;
573
+
574
+ return function () {
575
+ if (typeof memo === "undefined") memo = fn.apply(this, arguments);
576
+ return memo;
577
+ };
578
+ };
579
+
580
+ var isOldIE = memoize(function () {
581
+ // Test for IE <= 9 as proposed by Browserhacks
582
+ // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
583
+ // Tests for existence of standard globals is to allow style-loader
584
+ // to operate correctly into non-standard environments
585
+ // @see https://github.com/webpack-contrib/style-loader/issues/177
586
+ return window && document && document.all && !window.atob;
587
+ });
588
+
589
+ var getElement = (function (fn) {
590
+ var memo = {};
591
+
592
+ return function(selector) {
593
+ if (typeof memo[selector] === "undefined") {
594
+ var styleTarget = fn.call(this, selector);
595
+ // Special case to return head of iframe instead of iframe itself
596
+ if (styleTarget instanceof window.HTMLIFrameElement) {
597
+ try {
598
+ // This will throw an exception if access to iframe is blocked
599
+ // due to cross-origin restrictions
600
+ styleTarget = styleTarget.contentDocument.head;
601
+ } catch(e) {
602
+ styleTarget = null;
603
+ }
604
+ }
605
+ memo[selector] = styleTarget;
606
+ }
607
+ return memo[selector]
608
+ };
609
+ })(function (target) {
610
+ return document.querySelector(target)
611
+ });
612
+
613
+ var singleton = null;
614
+ var singletonCounter = 0;
615
+ var stylesInsertedAtTop = [];
616
+
617
+ var fixUrls = __webpack_require__(5);
618
+
619
+ module.exports = function(list, options) {
620
+ if (typeof DEBUG !== "undefined" && DEBUG) {
621
+ if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
622
+ }
623
+
624
+ options = options || {};
625
+
626
+ options.attrs = typeof options.attrs === "object" ? options.attrs : {};
627
+
628
+ // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
629
+ // tags it will allow on a page
630
+ if (!options.singleton) options.singleton = isOldIE();
631
+
632
+ // By default, add <style> tags to the <head> element
633
+ if (!options.insertInto) options.insertInto = "head";
634
+
635
+ // By default, add <style> tags to the bottom of the target
636
+ if (!options.insertAt) options.insertAt = "bottom";
637
+
638
+ var styles = listToStyles(list, options);
639
+
640
+ addStylesToDom(styles, options);
641
+
642
+ return function update (newList) {
643
+ var mayRemove = [];
644
+
645
+ for (var i = 0; i < styles.length; i++) {
646
+ var item = styles[i];
647
+ var domStyle = stylesInDom[item.id];
648
+
649
+ domStyle.refs--;
650
+ mayRemove.push(domStyle);
651
+ }
652
+
653
+ if(newList) {
654
+ var newStyles = listToStyles(newList, options);
655
+ addStylesToDom(newStyles, options);
656
+ }
657
+
658
+ for (var i = 0; i < mayRemove.length; i++) {
659
+ var domStyle = mayRemove[i];
660
+
661
+ if(domStyle.refs === 0) {
662
+ for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();
663
+
664
+ delete stylesInDom[domStyle.id];
665
+ }
666
+ }
667
+ };
668
+ };
669
+
670
+ function addStylesToDom (styles, options) {
671
+ for (var i = 0; i < styles.length; i++) {
672
+ var item = styles[i];
673
+ var domStyle = stylesInDom[item.id];
674
+
675
+ if(domStyle) {
676
+ domStyle.refs++;
677
+
678
+ for(var j = 0; j < domStyle.parts.length; j++) {
679
+ domStyle.parts[j](item.parts[j]);
680
+ }
681
+
682
+ for(; j < item.parts.length; j++) {
683
+ domStyle.parts.push(addStyle(item.parts[j], options));
684
+ }
685
+ } else {
686
+ var parts = [];
687
+
688
+ for(var j = 0; j < item.parts.length; j++) {
689
+ parts.push(addStyle(item.parts[j], options));
690
+ }
691
+
692
+ stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
693
+ }
694
+ }
695
+ }
696
+
697
+ function listToStyles (list, options) {
698
+ var styles = [];
699
+ var newStyles = {};
700
+
701
+ for (var i = 0; i < list.length; i++) {
702
+ var item = list[i];
703
+ var id = options.base ? item[0] + options.base : item[0];
704
+ var css = item[1];
705
+ var media = item[2];
706
+ var sourceMap = item[3];
707
+ var part = {css: css, media: media, sourceMap: sourceMap};
708
+
709
+ if(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});
710
+ else newStyles[id].parts.push(part);
711
+ }
712
+
713
+ return styles;
714
+ }
715
+
716
+ function insertStyleElement (options, style) {
717
+ var target = getElement(options.insertInto)
718
+
719
+ if (!target) {
720
+ throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");
721
+ }
722
+
723
+ var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];
724
+
725
+ if (options.insertAt === "top") {
726
+ if (!lastStyleElementInsertedAtTop) {
727
+ target.insertBefore(style, target.firstChild);
728
+ } else if (lastStyleElementInsertedAtTop.nextSibling) {
729
+ target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);
730
+ } else {
731
+ target.appendChild(style);
732
+ }
733
+ stylesInsertedAtTop.push(style);
734
+ } else if (options.insertAt === "bottom") {
735
+ target.appendChild(style);
736
+ } else if (typeof options.insertAt === "object" && options.insertAt.before) {
737
+ var nextSibling = getElement(options.insertInto + " " + options.insertAt.before);
738
+ target.insertBefore(style, nextSibling);
739
+ } else {
740
+ throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");
741
+ }
742
+ }
743
+
744
+ function removeStyleElement (style) {
745
+ if (style.parentNode === null) return false;
746
+ style.parentNode.removeChild(style);
747
+
748
+ var idx = stylesInsertedAtTop.indexOf(style);
749
+ if(idx >= 0) {
750
+ stylesInsertedAtTop.splice(idx, 1);
751
+ }
752
+ }
753
+
754
+ function createStyleElement (options) {
755
+ var style = document.createElement("style");
756
+
757
+ options.attrs.type = "text/css";
758
+
759
+ addAttrs(style, options.attrs);
760
+ insertStyleElement(options, style);
761
+
762
+ return style;
763
+ }
764
+
765
+ function createLinkElement (options) {
766
+ var link = document.createElement("link");
767
+
768
+ options.attrs.type = "text/css";
769
+ options.attrs.rel = "stylesheet";
770
+
771
+ addAttrs(link, options.attrs);
772
+ insertStyleElement(options, link);
773
+
774
+ return link;
775
+ }
776
+
777
+ function addAttrs (el, attrs) {
778
+ Object.keys(attrs).forEach(function (key) {
779
+ el.setAttribute(key, attrs[key]);
780
+ });
781
+ }
782
+
783
+ function addStyle (obj, options) {
784
+ var style, update, remove, result;
785
+
786
+ // If a transform function was defined, run it on the css
787
+ if (options.transform && obj.css) {
788
+ result = options.transform(obj.css);
789
+
790
+ if (result) {
791
+ // If transform returns a value, use that instead of the original css.
792
+ // This allows running runtime transformations on the css.
793
+ obj.css = result;
794
+ } else {
795
+ // If the transform function returns a falsy value, don't add this css.
796
+ // This allows conditional loading of css
797
+ return function() {
798
+ // noop
799
+ };
800
+ }
801
+ }
802
+
803
+ if (options.singleton) {
804
+ var styleIndex = singletonCounter++;
805
+
806
+ style = singleton || (singleton = createStyleElement(options));
807
+
808
+ update = applyToSingletonTag.bind(null, style, styleIndex, false);
809
+ remove = applyToSingletonTag.bind(null, style, styleIndex, true);
810
+
811
+ } else if (
812
+ obj.sourceMap &&
813
+ typeof URL === "function" &&
814
+ typeof URL.createObjectURL === "function" &&
815
+ typeof URL.revokeObjectURL === "function" &&
816
+ typeof Blob === "function" &&
817
+ typeof btoa === "function"
818
+ ) {
819
+ style = createLinkElement(options);
820
+ update = updateLink.bind(null, style, options);
821
+ remove = function () {
822
+ removeStyleElement(style);
823
+
824
+ if(style.href) URL.revokeObjectURL(style.href);
825
+ };
826
+ } else {
827
+ style = createStyleElement(options);
828
+ update = applyToTag.bind(null, style);
829
+ remove = function () {
830
+ removeStyleElement(style);
831
+ };
832
+ }
833
+
834
+ update(obj);
835
+
836
+ return function updateStyle (newObj) {
837
+ if (newObj) {
838
+ if (
839
+ newObj.css === obj.css &&
840
+ newObj.media === obj.media &&
841
+ newObj.sourceMap === obj.sourceMap
842
+ ) {
843
+ return;
844
+ }
845
+
846
+ update(obj = newObj);
847
+ } else {
848
+ remove();
849
+ }
850
+ };
851
+ }
852
+
853
+ var replaceText = (function () {
854
+ var textStore = [];
855
+
856
+ return function (index, replacement) {
857
+ textStore[index] = replacement;
858
+
859
+ return textStore.filter(Boolean).join('\n');
860
+ };
861
+ })();
862
+
863
+ function applyToSingletonTag (style, index, remove, obj) {
864
+ var css = remove ? "" : obj.css;
865
+
866
+ if (style.styleSheet) {
867
+ style.styleSheet.cssText = replaceText(index, css);
868
+ } else {
869
+ var cssNode = document.createTextNode(css);
870
+ var childNodes = style.childNodes;
871
+
872
+ if (childNodes[index]) style.removeChild(childNodes[index]);
873
+
874
+ if (childNodes.length) {
875
+ style.insertBefore(cssNode, childNodes[index]);
876
+ } else {
877
+ style.appendChild(cssNode);
878
+ }
879
+ }
880
+ }
881
+
882
+ function applyToTag (style, obj) {
883
+ var css = obj.css;
884
+ var media = obj.media;
885
+
886
+ if(media) {
887
+ style.setAttribute("media", media)
888
+ }
889
+
890
+ if(style.styleSheet) {
891
+ style.styleSheet.cssText = css;
892
+ } else {
893
+ while(style.firstChild) {
894
+ style.removeChild(style.firstChild);
895
+ }
896
+
897
+ style.appendChild(document.createTextNode(css));
898
+ }
899
+ }
900
+
901
+ function updateLink (link, options, obj) {
902
+ var css = obj.css;
903
+ var sourceMap = obj.sourceMap;
904
+
905
+ /*
906
+ If convertToAbsoluteUrls isn't defined, but sourcemaps are enabled
907
+ and there is no publicPath defined then lets turn convertToAbsoluteUrls
908
+ on by default. Otherwise default to the convertToAbsoluteUrls option
909
+ directly
910
+ */
911
+ var autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;
912
+
913
+ if (options.convertToAbsoluteUrls || autoFixUrls) {
914
+ css = fixUrls(css);
915
+ }
916
+
917
+ if (sourceMap) {
918
+ // http://stackoverflow.com/a/26603875
919
+ css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
920
+ }
921
+
922
+ var blob = new Blob([css], { type: "text/css" });
923
+
924
+ var oldSrc = link.href;
925
+
926
+ link.href = URL.createObjectURL(blob);
927
+
928
+ if(oldSrc) URL.revokeObjectURL(oldSrc);
929
+ }
930
+
931
+
932
+ /***/ }),
933
+ /* 5 */
934
+ /***/ (function(module, exports) {
935
+
936
+
937
+ /**
938
+ * When source maps are enabled, `style-loader` uses a link element with a data-uri to
939
+ * embed the css on the page. This breaks all relative urls because now they are relative to a
940
+ * bundle instead of the current page.
941
+ *
942
+ * One solution is to only use full urls, but that may be impossible.
943
+ *
944
+ * Instead, this function "fixes" the relative urls to be absolute according to the current page location.
945
+ *
946
+ * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.
947
+ *
948
+ */
949
+
950
+ module.exports = function (css) {
951
+ // get current location
952
+ var location = typeof window !== "undefined" && window.location;
953
+
954
+ if (!location) {
955
+ throw new Error("fixUrls requires window.location");
956
+ }
957
+
958
+ // blank or null?
959
+ if (!css || typeof css !== "string") {
960
+ return css;
961
+ }
962
+
963
+ var baseUrl = location.protocol + "//" + location.host;
964
+ var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/");
965
+
966
+ // convert each url(...)
967
+ /*
968
+ This regular expression is just a way to recursively match brackets within
969
+ a string.
970
+
971
+ /url\s*\( = Match on the word "url" with any whitespace after it and then a parens
972
+ ( = Start a capturing group
973
+ (?: = Start a non-capturing group
974
+ [^)(] = Match anything that isn't a parentheses
975
+ | = OR
976
+ \( = Match a start parentheses
977
+ (?: = Start another non-capturing groups
978
+ [^)(]+ = Match anything that isn't a parentheses
979
+ | = OR
980
+ \( = Match a start parentheses
981
+ [^)(]* = Match anything that isn't a parentheses
982
+ \) = Match a end parentheses
983
+ ) = End Group
984
+ *\) = Match anything and then a close parens
985
+ ) = Close non-capturing group
986
+ * = Match anything
987
+ ) = Close capturing group
988
+ \) = Match a close parens
989
+
990
+ /gi = Get all matches, not the first. Be case insensitive.
991
+ */
992
+ var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function(fullMatch, origUrl) {
993
+ // strip quotes (if they exist)
994
+ var unquotedOrigUrl = origUrl
995
+ .trim()
996
+ .replace(/^"(.*)"$/, function(o, $1){ return $1; })
997
+ .replace(/^'(.*)'$/, function(o, $1){ return $1; });
998
+
999
+ // already a full url? no change
1000
+ if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) {
1001
+ return fullMatch;
1002
+ }
1003
+
1004
+ // convert the url to a full url
1005
+ var newUrl;
1006
+
1007
+ if (unquotedOrigUrl.indexOf("//") === 0) {
1008
+ //TODO: should we add protocol?
1009
+ newUrl = unquotedOrigUrl;
1010
+ } else if (unquotedOrigUrl.indexOf("/") === 0) {
1011
+ // path should be relative to the base url
1012
+ newUrl = baseUrl + unquotedOrigUrl; // already starts with '/'
1013
+ } else {
1014
+ // path should be relative to current directory
1015
+ newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './'
1016
+ }
1017
+
1018
+ // send back the fixed url(...)
1019
+ return "url(" + JSON.stringify(newUrl) + ")";
1020
+ });
1021
+
1022
+ // send back the fixed css
1023
+ return fixedCss;
1024
+ };
1025
+
1026
+
1027
+ /***/ })
1028
+ /******/ ]);
@@ -0,0 +1 @@
1
+ !function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){return s(e,1,500)}function a(e){return s(e,0,500)}function s(e,t,n){var r=n/24,o=parseFloat(e.style.opacity)||0,a=t-o,s=a/r;return new Promise(function(t,n){function a(){o+=s,o=o<0?0:o,o=o>1?1:o,e.style.opacity=o,1!==o&&0!==o||(clearInterval(i),t())}var i=setInterval(a,r)})}function i(e){document.addEventListener?document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",this.callee),e()}):document.attachEvent&&document.attachEvent("onreadystatechange",function(){"interactive"!==document.readyState&&"complete"!==document.readyState||(document.detachEvent("onreadystatechange",this.callee),e())})}Object.defineProperty(t,"__esModule",{value:!0});var c=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();n(1);var u=function(){function e(t){r(this,e),this.options=t||{manual_close:!1,time:5e3},this.pre_dom_queue=[],this._setDom()}return c(e,[{key:"message",value:function(e,t){var n=this;t=Object.assign({},this.options,t);var r=this._addSnackbar(e,t);if(r)return o(r).then(function(){n._setClose(r,t)});this.pre_dom_queue.push({snackbar:this,message:e,opts:t})}},{key:"stickyMessage",value:function(e,t){return t=Object.assign({},this.options,t),t.manual_close=!0,this.message(e,t)}},{key:"success",value:function(e,t){return t=Object.assign({},this.options,t),t.class=t.class||"",t.class+=" success",this.message(e,t)}},{key:"error",value:function(e,t){return t=Object.assign({},this.options,t),t.class=t.class||"",t.class+=" error",this.message(e,t)}},{key:"warn",value:function(e,t){return t=Object.assign({},this.options,t),t.class=t.class||"",t.class+=" warn",this.message(e,t)}},{key:"_setClose",value:function(e,t){var n=this;return new Promise(function(r,o){t.manual_close?r():setTimeout(function(){n._removeSnackbar(e).then(function(){r()})},t.time)})}},{key:"_setDom",value:function(){var e=this,t=document.getElementsByTagName("body")[0];if(t){if(!document.getElementById("snackbar-wrapper")){var n=document.createElement("div");n.id="snackbar-wrapper",t.appendChild(n)}this.pre_dom_queue.length>0&&this._flushQueue()}else i(function(){e._setDom()})}},{key:"_flushQueue",value:function(){for(var e=0;e<this.pre_dom_queue.length;e++){var t=this.pre_dom_queue[e];t.snackbar.message(t.message,t.opts)}this.pre_dom_queue=[]}},{key:"_addSnackbar",value:function(e,t){var n=this,r=document.getElementById("snackbar-wrapper");if(r){var o=document.createElement("div"),a="snackbar";t.class&&(a+=" "+t.class),o.className=a;var s=document.createElement("span");if(s.className="snackbar-text",s.appendChild(document.createTextNode(e)),o.appendChild(s),t.manual_close){var i=document.createElement("span");i.className="snackbar-close";var c=document.createTextNode("X");i.appendChild(c),i.onclick=function(){return n._removeSnackbar(o)},o.appendChild(i)}return r.appendChild(o),o}}},{key:"_removeSnackbar",value:function(e){return a(e).then(function(){e.remove()})}}]),e}();window.Snackbar=u,t.default=u},function(e,t,n){var r=n(2);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0};o.transform=void 0;n(4)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){t=e.exports=n(3)(void 0),t.push([e.i,"#snackbar-wrapper {\n width: 100%;\n position: fixed;\n z-index: 999;\n bottom: 0px;\n display: block; }\n #snackbar-wrapper .snackbar {\n opacity: 0;\n width: 105%;\n margin-left: -2.5%;\n background-color: #333;\n color: #fff;\n text-align: center;\n font-size: 17px;\n padding: 16px; }\n #snackbar-wrapper .snackbar-close {\n width: 12%;\n cursor: pointer;\n display: block;\n top: .1em;\n float: right;\n margin-right: 3%; }\n #snackbar-wrapper .snackbar-text {\n width: 85%;\n display: inline-block; }\n #snackbar-wrapper .success {\n background-color: #228822; }\n #snackbar-wrapper .error {\n background-color: #bb2222; }\n #snackbar-wrapper .warn {\n background-color: #f3b300; }\n #snackbar-wrapper span.snackbar-close {\n font-family: sans-serif;\n font-weight: bolder;\n font-size: inherit;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased; }\n",""])},function(e,t){function n(e,t){var n=e[1]||"",o=e[3];if(!o)return n;if(t&&"function"==typeof btoa){var a=r(o);return[n].concat(o.sources.map(function(e){return"/*# sourceURL="+o.sourceRoot+e+" */"})).concat([a]).join("\n")}return[n].join("\n")}function r(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var r=n(t,e);return t[2]?"@media "+t[2]+"{"+r+"}":r}).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},o=0;o<this.length;o++){var a=this[o][0];"number"==typeof a&&(r[a]=!0)}for(o=0;o<e.length;o++){var s=e[o];"number"==typeof s[0]&&r[s[0]]||(n&&!s[2]?s[2]=n:n&&(s[2]="("+s[2]+") and ("+n+")"),t.push(s))}},t}},function(e,t,n){function r(e,t){for(var n=0;n<e.length;n++){var r=e[n],o=h[r.id];if(o){o.refs++;for(var a=0;a<o.parts.length;a++)o.parts[a](r.parts[a]);for(;a<r.parts.length;a++)o.parts.push(l(r.parts[a],t))}else{for(var s=[],a=0;a<r.parts.length;a++)s.push(l(r.parts[a],t));h[r.id]={id:r.id,refs:1,parts:s}}}}function o(e,t){for(var n=[],r={},o=0;o<e.length;o++){var a=e[o],s=t.base?a[0]+t.base:a[0],i=a[1],c=a[2],u=a[3],l={css:i,media:c,sourceMap:u};r[s]?r[s].parts.push(l):n.push(r[s]={id:s,parts:[l]})}return n}function a(e,t){var n=v(e.insertInto);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var r=g[g.length-1];if("top"===e.insertAt)r?r.nextSibling?n.insertBefore(t,r.nextSibling):n.appendChild(t):n.insertBefore(t,n.firstChild),g.push(t);else if("bottom"===e.insertAt)n.appendChild(t);else{if("object"!=typeof e.insertAt||!e.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var o=v(e.insertInto+" "+e.insertAt.before);n.insertBefore(t,o)}}function s(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e);var t=g.indexOf(e);t>=0&&g.splice(t,1)}function i(e){var t=document.createElement("style");return e.attrs.type="text/css",u(t,e.attrs),a(e,t),t}function c(e){var t=document.createElement("link");return e.attrs.type="text/css",e.attrs.rel="stylesheet",u(t,e.attrs),a(e,t),t}function u(e,t){Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])})}function l(e,t){var n,r,o,a;if(t.transform&&e.css){if(!(a=t.transform(e.css)))return function(){};e.css=a}if(t.singleton){var u=y++;n=b||(b=i(t)),r=f.bind(null,n,u,!1),o=f.bind(null,n,u,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=c(t),r=d.bind(null,n,t),o=function(){s(n),n.href&&URL.revokeObjectURL(n.href)}):(n=i(t),r=p.bind(null,n),o=function(){s(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}function f(e,t,n,r){var o=n?"":r.css;if(e.styleSheet)e.styleSheet.cssText=w(t,o);else{var a=document.createTextNode(o),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(a,s[t]):e.appendChild(a)}}function p(e,t){var n=t.css,r=t.media;if(r&&e.setAttribute("media",r),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}function d(e,t,n){var r=n.css,o=n.sourceMap,a=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||a)&&(r=k(r)),o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var s=new Blob([r],{type:"text/css"}),i=e.href;e.href=URL.createObjectURL(s),i&&URL.revokeObjectURL(i)}var h={},m=function(e){var t;return function(){return void 0===t&&(t=e.apply(this,arguments)),t}}(function(){return window&&document&&document.all&&!window.atob}),v=function(e){var t={};return function(n){if(void 0===t[n]){var r=e.call(this,n);if(r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}t[n]=r}return t[n]}}(function(e){return document.querySelector(e)}),b=null,y=0,g=[],k=n(5);e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");t=t||{},t.attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||(t.singleton=m()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=o(e,t);return r(n,t),function(e){for(var a=[],s=0;s<n.length;s++){var i=n[s],c=h[i.id];c.refs--,a.push(c)}if(e){r(o(e,t),t)}for(var s=0;s<a.length;s++){var c=a[s];if(0===c.refs){for(var u=0;u<c.parts.length;u++)c.parts[u]();delete h[c.id]}}}};var w=function(){var e=[];return function(t,n){return e[t]=n,e.filter(Boolean).join("\n")}}()},function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,r=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(e,t){var o=t.trim().replace(/^"(.*)"$/,function(e,t){return t}).replace(/^'(.*)'$/,function(e,t){return t});if(/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(o))return e;var a;return a=0===o.indexOf("//")?o:0===o.indexOf("/")?n+o:r+o.replace(/^\.\//,""),"url("+JSON.stringify(a)+")"})}}]);
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vanilla-snackbar
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Christopher Dimoulis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A full width snackbar using "vanilla js".
14
+ email: christopherjamesd@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - README.md
20
+ - lib/vanilla-snackbar.rb
21
+ - lib/vanilla-snackbar/version.rb
22
+ - vendor/assets/javascripts/snackbar.js
23
+ - vendor/assets/javascripts/snackbar.min.js
24
+ homepage: https://github.com/cdimoulis/snackbar.js
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.4.5.1
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: No dependency snackbar notification.
48
+ test_files: []