breakfast 0.2.1 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11efb650754f43087da4e350873baf2fb161cb65
4
- data.tar.gz: 6bcfdfec76b92931a9df92b394c36881d4ddf3f7
3
+ metadata.gz: b12b97396b07486556ec5d2332c17d328794d430
4
+ data.tar.gz: 61fd4a2a085594668a2e4e7922c15271ad612f20
5
5
  SHA512:
6
- metadata.gz: 0cb2f217105309ed34f7555636cb36e70ea0012d015cfd293d9b0b0da0da0df8f729b60ec9974aa75d3072aa09ed1c36c947fd9542e591712f3b0d575c7b360c
7
- data.tar.gz: 8d86f0849f5b41557654724adfa7124b9bc2074a0af777a089019401f696e4197f64c885db65d86d3b6ef5a7e6981a6ee0daaaf1c5386b13626312ccdd23a0ab
6
+ metadata.gz: 1567fbd110b9e21807a61302acf9fdd2f8a49b4de5063ee1c1ffab0a2df4f907727102873afee5542f0ede6dc983a5a48675fa9bc517042606cc3556c761f9e1
7
+ data.tar.gz: 15c45fba85e50e330f733fc4a0165d2653cc8694cd0ca4d148b43fd1d7248962f87ac0e8c00ab7a4847b497d12a9c1d9a1adeae638a8b29e60db544462f50f0d
@@ -0,0 +1,42 @@
1
+ # CHANGE LOG
2
+
3
+ ## 0.3.0 - 2016-09-28
4
+
5
+ ### Upgrading from `0.2.0`
6
+ - Update gem with `bundle update breakfast`
7
+ - Bump the `breakfast-rails` version in `package.json` to `0.3.1`
8
+ - Run `npm install`
9
+ - If you have modified the `config.breakfast.view_folders` option you will need
10
+ to replace it. The new option is `config.breakfast.source_code_folders` and it
11
+ defaults to `[Rails.root.join("app")]`. If you have view or Ruby files that
12
+ you would like to trigger reloads outside of the `app` folder then append
13
+ those paths by adding:
14
+
15
+ ```
16
+ config.breakfast.source_code_folders << Rails.root.join("lib")
17
+ ```
18
+
19
+ To which ever environment you want `Breakfast` to run in
20
+ (probably `config/environments/development.rb`).
21
+
22
+ ### Added
23
+ - New status bar that allows the user to switch reload strategies on the fly
24
+ - Support for Haml & Slim files (without .html extension)
25
+ - Reloading on ruby file changes.
26
+ - Specify minimum Node & NPM versions when installing (avoid awkward and none
27
+ descriptive error messages)
28
+ - NPM binary path for Capistrano
29
+
30
+ ### Changes
31
+ - config.breakfast.view_folders change to config.breakfast.source_code_folders.
32
+ Change brought about by need to trigger reloads when Ruby source code changes.
33
+
34
+ ### Removed
35
+ - config.breakfast.view_folders is no longer supported. Deprecated in favor of
36
+ source_code_folders option.
37
+
38
+ #### Contributors
39
+ Many many thanks to the contributors for this release!
40
+
41
+ - [@patkoperwas](https://github.com/patkoperwas)
42
+ - [@josh-rosen](https://github.com/Josh-Rosen)
data/README.md CHANGED
@@ -13,6 +13,44 @@ support. Be up and running on the latest frontend framework in minutes.
13
13
  See the official docs at
14
14
  [http://breakfast.devlocker.io](http://breakfast.devlocker.io).
15
15
 
16
+ View updates in the [CHANGELOG](https://github.com/devlocker/breakfast/blob/master/CHANGELOG.md)
17
+
18
+ ### Latest Release `0.3.0`
19
+ #### Added
20
+ - New status bar that allows the user to switch reload strategies on the fly
21
+ - Support for Haml & Slim files (without .html extension)
22
+ - Reloading on ruby file changes.
23
+ - Specify minimum Node & NPM versions when installing (avoid awkward and none
24
+ descriptive error messages)
25
+ - NPM binary path for Capistrano
26
+
27
+ #### Changes
28
+ - config.breakfast.view_folders change to config.breakfast.source_code_folders.
29
+ Change brought about by need to trigger reloads when Ruby source code changes.
30
+
31
+ #### Removed
32
+ - config.breakfast.view_folders is no longer supported. Deprecated in favor of
33
+ source_code_folders option.
34
+
35
+
36
+ ### Upgrading
37
+ #### Upgrading to `0.3.0` from `0.2.0`
38
+ - Update gem with `bundle update breakfast`
39
+ - Bump the `breakfast-rails` version in `package.json` to `0.3.1`
40
+ - Run `npm install`
41
+ - If you have modified the `config.breakfast.view_folders` option you will need
42
+ to replace it. The new option is `config.breakfast.source_code_folders` and it
43
+ defaults to `[Rails.root.join("app")]`. If you have view or Ruby files that
44
+ you would like to trigger reloads outside of the `app` folder then append
45
+ those paths by adding:
46
+
47
+ ```
48
+ config.breakfast.source_code_folders << Rails.root.join("lib")
49
+ ```
50
+
51
+ To which ever environment you want `Breakfast` to run in
52
+ (probably `config/environments/development.rb`).
53
+
16
54
 
17
55
  ### Contributing
18
56
  Bug reports and pull requests are welcome on GitHub at
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
25
  spec.add_dependency "rails", "~> 5.0"
26
- spec.add_dependency "actioncable"
27
- spec.add_dependency "listen"
26
+ spec.add_dependency "actioncable", "~> 5.0"
27
+ spec.add_dependency "listen", "~> 3.1"
28
28
  end
@@ -6,6 +6,8 @@ require "breakfast/brunch_watcher"
6
6
  require "breakfast/compilation_listener"
7
7
 
8
8
  module Breakfast
9
+ STATUS_CHANNEL = "breakfast_status".freeze
10
+ RELOAD_CHANNEL = "breakfast_live_reload".freeze
9
11
  end
10
12
 
11
13
  require "breakfast/railtie" if defined?(Rails)
@@ -2,7 +2,6 @@ require "pty"
2
2
 
3
3
  module Breakfast
4
4
  class BrunchWatcher
5
- CHANNEL = "breakfast_status".freeze
6
5
  BRUNCH_COMMAND = "./node_modules/brunch/bin/brunch watch".freeze
7
6
 
8
7
  def self.spawn(log:)
@@ -26,7 +25,6 @@ module Breakfast
26
25
  log.debug output
27
26
 
28
27
  output = output.gsub(/\e\[([;\d]+)?m/, '')
29
-
30
28
  case output
31
29
  when /compiled/
32
30
  broadcast(status: "success", message: output.split("info: ").last)
@@ -46,7 +44,7 @@ module Breakfast
46
44
  private
47
45
 
48
46
  def broadcast(status:, message:)
49
- ActionCable.server.broadcast(CHANNEL, {
47
+ ActionCable.server.broadcast(STATUS_CHANNEL, {
50
48
  status: status,
51
49
  message: message
52
50
  })
@@ -3,7 +3,7 @@ namespace :breakfast do
3
3
  task :compile do
4
4
  on roles fetch(:breakfast_roles) do |host|
5
5
  within release_path do
6
- execute :npm, "install"
6
+ execute fetch(:breakfast_npm_path).to_sym, "install"
7
7
  execute "node_modules/brunch/bin/brunch", "build --production"
8
8
  end
9
9
  end
@@ -16,5 +16,6 @@ end
16
16
  namespace :load do
17
17
  task :defaults do
18
18
  set :breakfast_roles, -> { :web }
19
+ set :breakfast_npm_path, "/usr/bin/npm"
19
20
  end
20
21
  end
@@ -1,22 +1,51 @@
1
1
  module Breakfast
2
2
  class CompilationListener
3
- EXTENSIONS = ["css", "js", "html"].freeze
4
- CHANNEL = "breakfast_live_reload".freeze
3
+ ASSET_EXTENSIONS = ["css", "js"].freeze
4
+ SOURCE_CODE_EXTENSIONS = ["rb", "html", "haml", "slim"].freeze
5
5
 
6
- def self.start(asset_output_folders:, view_folders:)
7
- listen_to_paths = Array.wrap(asset_output_folders) + Array.wrap(view_folders)
6
+ def self.start(asset_output_folders:, source_code_folders:)
7
+ asset_listener =
8
+ ::Listen.to(*asset_output_folders) do |modified, added, removed|
9
+ files = modified + added + removed
8
10
 
9
- listener = ::Listen.to(*listen_to_paths) do |modified, added, removed|
10
- files = modified + added + removed
11
+ ASSET_EXTENSIONS.each do |extension|
12
+ if files.any? { |file| file.match(/\.#{extension}/) }
13
+ ActionCable.server.broadcast(
14
+ Breakfast::RELOAD_CHANNEL,
15
+ { extension: extension }
16
+ )
17
+ end
18
+ end
19
+ end
20
+
21
+ rails_listener =
22
+ ::Listen.to(*source_code_folders) do |modified, added, removed|
23
+ files = modified + added + removed
24
+
25
+ SOURCE_CODE_EXTENSIONS.each do |extension|
26
+ matched = files.select { |file| file.match(/\.#{extension}/) }
27
+ if matched.present?
28
+ ActionCable.server.broadcast(
29
+ Breakfast::RELOAD_CHANNEL,
30
+ { extension: extension }
31
+ )
32
+
33
+ file_names = matched
34
+ .map { |file| file.split("/").last }
35
+ .join(", ")
36
+ .truncate(60)
11
37
 
12
- EXTENSIONS.each do |extension|
13
- if files.any? { |file| file.match(/\.#{extension}/) }
14
- ActionCable.server.broadcast(CHANNEL, { extension: extension })
38
+ ActionCable.server.broadcast(Breakfast::STATUS_CHANNEL, {
39
+ status: "success",
40
+ message: "saved: #{file_names}",
41
+ extension: extension
42
+ })
43
+ end
15
44
  end
16
45
  end
17
- end
18
46
 
19
- listener.start
47
+ asset_listener.start
48
+ rails_listener.start
20
49
  end
21
50
  end
22
51
  end
@@ -9,9 +9,10 @@ module BrunchRails
9
9
  config.breakfast.html_reload_strategy = :turbolinks
10
10
  config.breakfast.js_reload_strategy = :page
11
11
  config.breakfast.css_reload_strategy = :hot
12
+ config.breakfast.ruby_reload_strategy = :off
12
13
 
13
14
  config.breakfast.asset_output_folders = [Rails.root.join("public")]
14
- config.breakfast.view_folders = [Rails.root.join("app", "views")]
15
+ config.breakfast.source_code_folders = [Rails.root.join("app")]
15
16
  config.breakfast.environments = %w(development)
16
17
  config.breakfast.status_bar_location = :bottom
17
18
  end
@@ -30,7 +31,7 @@ module BrunchRails
30
31
 
31
32
  Breakfast::CompilationListener.start(
32
33
  asset_output_folders: config.breakfast.asset_output_folders,
33
- view_folders: config.breakfast.view_folders
34
+ source_code_folders: config.breakfast.source_code_folders
34
35
  )
35
36
  end
36
37
  end
@@ -1,3 +1,3 @@
1
1
  module Breakfast
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -7,10 +7,11 @@ module Breakfast
7
7
  require("breakfast-rails").init({
8
8
  host: "#{request.host}",
9
9
  port: #{request.port},
10
- reloadStrategies: {
10
+ strategies: {
11
11
  js: "#{Rails.configuration.breakfast.js_reload_strategy}",
12
12
  css: "#{Rails.configuration.breakfast.css_reload_strategy}",
13
- html: "#{Rails.configuration.breakfast.html_reload_strategy}"
13
+ html: "#{Rails.configuration.breakfast.html_reload_strategy}",
14
+ rb: "#{Rails.configuration.breakfast.ruby_reload_strategy}"
14
15
  },
15
16
  statusBarLocation: "#{Rails.configuration.breakfast.status_bar_location}"
16
17
  });
@@ -4,9 +4,11 @@ module Breakfast
4
4
  module Generators
5
5
  class InstallGenerator < Rails::Generators::Base
6
6
  source_root File.expand_path('../templates', __FILE__)
7
+ NODE_VERSION = 'v4.1.1'
8
+ NPM_VERSION = '3.10.6'
7
9
 
8
10
  def install
9
- if prerequisites_installed?
11
+ if node_prerequisites_installed?
10
12
  create_brunch_config
11
13
  create_package_json
12
14
  create_directory_structure
@@ -27,7 +29,7 @@ module Breakfast
27
29
 
28
30
  ---> ERROR - MISSING NODE & NPM
29
31
 
30
- ---> Node & npm are required to run Breakfast.
32
+ ---> Node version >= #{NODE_VERSION} & npm version >= #{NPM_VERSION} are required to run Breakfast.
31
33
  ---> Please install them before attempting to continue.
32
34
  ---> https://nodejs.org
33
35
  ---> https://npmjs.org
@@ -38,8 +40,12 @@ module Breakfast
38
40
 
39
41
  private
40
42
 
41
- def prerequisites_installed?
42
- `which node`.present? && `which npm`.present?
43
+ def node_prerequisites_installed?
44
+ `which node`.present? && `which npm`.present? && node_versions_are_satisfactory?
45
+ end
46
+
47
+ def node_versions_are_satisfactory?
48
+ `node -v` >= NODE_VERSION && `npm -v` >= NPM_VERSION
43
49
  end
44
50
 
45
51
  def create_brunch_config
@@ -2,7 +2,7 @@
2
2
  "repository": {},
3
3
  "dependencies": {
4
4
  "actioncable": "^5.0.0",
5
- "breakfast-rails": "0.2.0",
5
+ "breakfast-rails": "0.3.1",
6
6
  "jquery": "^3.1.0",
7
7
  "jquery-ujs": "^1.2.2",
8
8
  "turbolinks": "^5.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "breakfast-rails",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Assets for the Breakfast Gem",
5
5
  "main": "./lib/breakfast-rails.js",
6
6
  "scripts": {
@@ -1,13 +1,14 @@
1
1
  const LiveReloader = require('./live-reload');
2
2
  const StatusBar = require('./status-bar');
3
- const ActionCable = require('actioncable');
3
+ const Settings = require('./settings');
4
4
 
5
5
  const BreakfastRails = {
6
6
  init(options = {}) {
7
- options.cable = ActionCable.createConsumer(`ws://${options.host}:${options.port}/cable`);
7
+ window.Breakfast = (window.Breakfast || {});
8
8
 
9
- const liveReloader = new LiveReloader(options);
10
- const statusBar = new StatusBar(options);
9
+ const settings = new Settings(options);
10
+ const liveReloader = new LiveReloader(settings);
11
+ const statusBar = new StatusBar(settings);
11
12
 
12
13
  liveReloader.init();
13
14
  statusBar.init();
@@ -1,6 +1,8 @@
1
+ const RELOAD_CHANNEL = 'Breakfast::LiveReloadChannel';
2
+
1
3
  class LiveReloader {
2
- constructor(options = {}) {
3
- this.options = options;
4
+ constructor(settings) {
5
+ this.settings = settings;
4
6
  }
5
7
 
6
8
  buildFreshUrl(url) {
@@ -52,7 +54,26 @@ class LiveReloader {
52
54
  case 'turbolinks':
53
55
  const location = window.top.location;
54
56
 
55
- if (typeof Turbolinks !== 'undefined') {
57
+ if (this.turbolinksAvailable() && !this.onErrorPage()) {
58
+ Turbolinks.visit(location);
59
+ } else {
60
+ location.reload();
61
+ }
62
+ break;
63
+ case 'page':
64
+ window.top.location.reload();
65
+ break;
66
+ case 'off':
67
+ break;
68
+ }
69
+ }
70
+
71
+ rubyReload(strategy) {
72
+ switch (strategy) {
73
+ case 'turbolinks':
74
+ const location = window.top.location;
75
+
76
+ if (this.turbolinksAvailable() && !this.onErrorPage()) {
56
77
  Turbolinks.visit(location);
57
78
  } else {
58
79
  location.reload();
@@ -66,20 +87,31 @@ class LiveReloader {
66
87
  }
67
88
  }
68
89
 
90
+ turbolinksAvailable() {
91
+ return (typeof Turbolinks !== 'undefined');
92
+ }
93
+ // If user is on an error page and they fix the error and re-render using
94
+ // turbolinks than the CSS from the Rails error page will hang around. Will
95
+ // initiate a full refresh to get rid of it.
96
+ onErrorPage() {
97
+ return (document.title.indexOf('Exception caught') !== -1);
98
+ }
99
+
69
100
  init() {
70
101
  const reloaders = {
71
102
  js: this.jsReload.bind(this),
72
103
  css: this.cssReload.bind(this),
73
- html: this.htmlReload.bind(this)
104
+ html: this.htmlReload.bind(this),
105
+ slim: this.htmlReload.bind(this),
106
+ haml: this.htmlReload.bind(this),
107
+ rb: this.rubyReload.bind(this)
74
108
  };
75
109
 
76
110
  document.addEventListener('DOMContentLoaded', () => {
77
- const reloadChannel = 'Breakfast::LiveReloadChannel';
78
-
79
- this.options.cable.subscriptions.create(reloadChannel, {
111
+ this.settings.cable.subscriptions.create(RELOAD_CHANNEL, {
80
112
  received: (data) => {
81
113
  const reloader = reloaders[data.extension];
82
- reloader(this.options.reloadStrategies[data.extension]);
114
+ reloader(this.settings.strategies[data.extension]);
83
115
  }
84
116
  });
85
117
  });
@@ -0,0 +1,48 @@
1
+ const LOCAL_STORAGE_KEY = 'breakfast-rails-settings';
2
+ const ActionCable = require('actioncable');
3
+
4
+ class Settings {
5
+ constructor(options = {}) {
6
+ this.options = options;
7
+ this.host = options.host;
8
+ this.port = options.port;
9
+ this.strategies = this.determineStrategies();
10
+ this.statusBarLocation = options.statusBarLocation;
11
+ this.cable = ActionCable.createConsumer(`ws://${this.host}:${this.port}/cable`);
12
+ this.log = (this.storedSettings().log || {});
13
+
14
+ this.save();
15
+ }
16
+
17
+ save() {
18
+ localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify({
19
+ host: this.host,
20
+ port: this.port,
21
+ strategies: this.strategies,
22
+ log: this.log
23
+ }));
24
+ }
25
+
26
+ determineStrategies() {
27
+ const defaults = this.options.strategies || {};
28
+ const existing = this.storedSettings().strategies || {};
29
+
30
+ return (Object.assign(defaults, existing));
31
+ }
32
+
33
+ updateStrategies(strategy) {
34
+ this.strategies = Object.assign(this.strategies, strategy);
35
+ this.save();
36
+ }
37
+
38
+ updateLog(log) {
39
+ this.log = log;
40
+ this.save();
41
+ }
42
+
43
+ storedSettings() {
44
+ return (JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY)) || {});
45
+ }
46
+ }
47
+
48
+ module.exports = Settings;
@@ -1,52 +1,230 @@
1
- const LOCAL_STORAGE_KEY = 'breakfast-last-log';
2
1
  const STATUS_CHANNEL = 'Breakfast::StatusChannel';
3
2
 
4
3
  class StatusBar {
5
- constructor(options = {}) {
6
- this.options = options;
4
+ constructor(settings = {}) {
5
+ this.settings = settings;
6
+
7
+ this.settings.cable.subscriptions.create(STATUS_CHANNEL, {
8
+ connected: () => {
9
+ this.write(this.settings.log.message, this.settings.log.status);
10
+ },
11
+ received: (log) => {
12
+ if (this.settings.strategies[log.extension] !== 'off') {
13
+ this.settings.updateLog(log);
14
+ this.write(log.message, log.status);
15
+ }
16
+ },
17
+ disconnected: () => {
18
+ this.write('Disconnected from server...', 'error');
19
+ }
20
+ });
7
21
  }
8
22
 
9
23
  init() {
10
- ['DOMContentLoaded', 'turbolinks:load']
11
- .forEach(event => document.addEventListener(event, () => {
12
- const lastLog = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY)) || {};
13
- this.drawStatusBar(lastLog);
14
-
15
- this.options.cable.subscriptions.create(STATUS_CHANNEL, {
16
- received: (statusData) => {
17
- localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(statusData));
18
- this.drawStatusBar(statusData);
19
- }
20
- });
21
- })
22
- );
23
- }
24
-
25
- drawStatusBar(statusData = {}) {
26
- const statusBar = document.getElementById('breakfast-status-bar');
24
+ let eventName;
25
+
26
+ if (typeof Turbolinks !== 'undefined') {
27
+ eventName = 'turbolinks:load';
28
+ } else {
29
+ eventName = 'DOMContentLoaded';
30
+ }
31
+
32
+ document.addEventListener(eventName, () => {
33
+ this.render();
34
+ this.write(this.settings.log.message, this.settings.log.status);
35
+ });
27
36
 
28
- if (statusBar) {
29
- document.body.removeChild(statusBar);
37
+ window.Breakfast.StatusBar = this;
38
+ }
39
+
40
+ write(message, status) {
41
+ const log = document.getElementById('breakfast-message-log');
42
+ if (log) {
43
+ log.innerHTML = message;
44
+ log.className = `breakfast-message-log-${ status }`;
30
45
  }
46
+ }
47
+
48
+ handleClick(option) {
49
+ this.settings.updateStrategies(option);
50
+ const reloaders = document.getElementById('breakfast-reloaders');
51
+ reloaders.innerHTML = this.renderReloaders();
52
+ }
53
+
54
+ render() {
55
+ const statusBar = document.getElementById('breakfast-status-bar');
56
+
57
+ if (statusBar) { document.body.removeChild(statusBar); }
58
+
59
+ const sb = document.createElement('DIV');
60
+ sb.setAttribute('class', 'breakfast-status-bar');
61
+ sb.setAttribute('id', 'breakfast-status-bar');
62
+
63
+ sb.innerHTML = `
64
+ ${ this.stylesheet() }
65
+ <div id="breakfast-reloaders" class="breakfast-reloaders">
66
+ ${ this.renderReloaders() }
67
+ </div>
68
+ <div id="breakfast-message-log">
69
+ </div>
70
+ `;
71
+
72
+ document.body.appendChild(sb);
73
+ }
74
+
75
+ renderReloaders() {
76
+ return (`
77
+ <div class="breakfast-reloader">
78
+ <span>js: </span><span class="breakfast-type">${ this.settings.strategies.js }</span>
79
+ <div class="breakfast-menu">
80
+ ${ this.renderLink('js', 'page', 'Page Reload') }
81
+ ${ this.renderLink('js', 'off', 'Off') }
82
+ </div>
83
+ </div>
84
+
85
+ <div class="breakfast-reloader">
86
+ <span>css: </span><span class="breakfast-type">${ this.settings.strategies.css }</span>
87
+ <div class="breakfast-menu">
88
+ ${ this.renderLink('css', 'page', 'Page Reload') }
89
+ ${ this.renderLink('css', 'hot', 'Hot Reload') }
90
+ ${ this.renderLink('css', 'off', 'Off') }
91
+ </div>
92
+ </div>
93
+ <div class="breakfast-reloader">
94
+ <span>html: </span><span class="breakfast-type">${ this.settings.strategies.html }</span>
95
+ <div class="breakfast-menu">
96
+ ${ this.renderLink('html', 'page', 'Page Reload') }
97
+ ${ this.renderLink('html', 'turbolinks', 'Turbolinks Reload') }
98
+ ${ this.renderLink('html', 'off', 'Off') }
99
+ </div>
100
+ </div>
101
+
102
+ <div class="breakfast-reloader">
103
+ <span>ruby: </span><span class="breakfast-type">${ this.settings.strategies.rb }</span>
104
+ <div class="breakfast-menu">
105
+ ${ this.renderLink('rb', 'page', 'Page Reload') }
106
+ ${ this.renderLink('rb', 'turbolinks', 'Turbolinks Reload') }
107
+ ${ this.renderLink('rb', 'off', 'Off') }
108
+ </div>
109
+ </div>
110
+ `);
111
+ }
112
+
113
+ renderLink(type, strategy, text) {
114
+ const active = this.settings.strategies[type] === strategy;
115
+
116
+ return (`
117
+ <a
118
+ class="breakfast-menu-option ${ active ? 'breakfast-active' : '' }"
119
+ onclick="Breakfast.StatusBar.handleClick({'${ type }': '${ strategy }'}); return false;"
120
+ href="#"
121
+ >
122
+ <div class="breakfast-toggle"></div><div>${ text }</div>
123
+ </a>
124
+ `);
125
+ }
126
+
127
+ stylesheet() {
128
+ return (`
129
+ <style>
130
+ .breakfast-status-bar {
131
+ align-items: center;
132
+ background-color: #1f1f1f;
133
+ ${this.settings.statusBarLocation}: 0;
134
+ color: #999;
135
+ font-family: monospace;
136
+ font-size: 12px;
137
+ display: flex;
138
+ height: 30px;
139
+ position: fixed;
140
+ width: 100%;
141
+ }
142
+
143
+ .breakfast-status-bar .breakfast-reloaders {
144
+ align-items: center;
145
+ display: flex;
146
+ }
147
+
148
+ .breakfast-status-bar .breakfast-reloader {
149
+ border-left: 1px solid #444;
150
+ padding: 4px 8px;
151
+ position: relative;
152
+ }
153
+
154
+ .breakfast-status-bar .breakfast-reloader:hover {
155
+ cursor: pointer;
156
+ }
157
+
158
+ .breakfast-status-bar .breakfast-reloader:hover .breakfast-menu {
159
+ display: block;
160
+ }
161
+
162
+ .breakfast-status-bar .breakfast-type {
163
+ color: #eee;
164
+ }
165
+
166
+ .breakfast-status-bar .breakfast-menu {
167
+ background-color: #1f1f1f;
168
+ border-radius: 2px;
169
+ ${this.settings.statusBarLocation}: 22px;
170
+ display: none;
171
+ left: 0;
172
+ position: absolute;
173
+ width: 225px;
174
+ }
175
+
176
+ .breakfast-status-bar .breakfast-menu-option {
177
+ align-items: center;
178
+ border-bottom: 1px solid #000;
179
+ border-top: 1px solid #333;
180
+ color: #999;
181
+ display: flex;
182
+ padding: 6px 15px;
183
+ z-index: 1000;
184
+ }
185
+
186
+ .breakfast-status-bar .breakfast-menu-option:hover {
187
+ background-color: #333;
188
+ text-decoration: none;
189
+ }
190
+
191
+ .breakfast-status-bar .breakfast-active {
192
+ color: #eee;
193
+ }
194
+
195
+ .breakfast-status-bar .breakfast-active .breakfast-toggle {
196
+ background-color: #539417;
197
+ }
198
+
199
+ .breakfast-status-bar .breakfast-toggle {
200
+ background-color: #000;
201
+ border-radius: 50%;
202
+ height: 8px;
203
+ margin-right: 8px;
204
+ width: 8px;
205
+ }
206
+
207
+ .breakfast-status-bar .breakfast-message-log-success {
208
+ align-items: center;
209
+ background-color: #539417;
210
+ color: #fff;
211
+ display: flex;
212
+ flex-grow: 1;
213
+ height: 30px;
214
+ padding: 8px;
215
+ }
31
216
 
32
- const colors = {
33
- 'success': '#539417',
34
- 'error': '#a93131'
35
- };
36
-
37
- document.body.innerHTML += `
38
- <div id="breakfast-status-bar" style="
39
- font-family: monospace;
40
- font-size: 13px;
41
- position:fixed;
42
- min-width:300px;
43
- padding: 6px;
44
- background: ${colors[statusData.status]};
45
- color: #fff;
46
- white-space: pre-wrap;
47
- ${this.options.statusBarLocation}: 0;"
48
- >Breakfast: ${ statusData.message }</div>
49
- `;
217
+ .breakfast-status-bar .breakfast-message-log-error {
218
+ align-self: ${ this.settings.statusBarLocation === 'bottom' ? 'flex-end' : 'flex-start' };
219
+ background-color: #a93131;
220
+ color: #fff;
221
+ flex-grow: 1;
222
+ min-height: 30px;
223
+ padding: 5px 8px;
224
+ white-space: pre-wrap;
225
+ }
226
+ </style>
227
+ `);
50
228
  }
51
229
  }
52
230
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: breakfast
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Koperwas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-09 00:00:00.000000000 Z
11
+ date: 2016-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,30 +70,30 @@ dependencies:
70
70
  name: actioncable
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '5.0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '5.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: listen
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '3.1'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '3.1'
97
97
  description: Replace the asset pipeline with Brunch. Get CSS, JS and HTML live-reloading
98
98
  out of the box. Full ES6 support with require.
99
99
  email:
@@ -105,6 +105,7 @@ files:
105
105
  - ".gitignore"
106
106
  - ".rspec"
107
107
  - ".travis.yml"
108
+ - CHANGELOG.md
108
109
  - Gemfile
109
110
  - LICENSE.txt
110
111
  - README.md
@@ -132,6 +133,7 @@ files:
132
133
  - node_package/package.json
133
134
  - node_package/src/breakfast-rails.js
134
135
  - node_package/src/live-reload.js
136
+ - node_package/src/settings.js
135
137
  - node_package/src/status-bar.js
136
138
  homepage: https://github.com/devlocker/breakfast
137
139
  licenses: