lookbook 1.0.0.beta.6 → 1.0.0.beta.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0be6f1f0dc2e74e64585f664af67c7a3b05b8de3cd875cfa4732d2cecb37465
4
- data.tar.gz: a315fa37ed07664a06096709b8bc88b81011e0f8f54b438362b8e6803eee6e3d
3
+ metadata.gz: 52925967015a9d02a18dfcde3e185d7d1dcd1917ea03fdf63276743b3ce18e66
4
+ data.tar.gz: a8523484936828701e3775603996c8477bb14830ad2b18b5ca5ef1bc55d58117
5
5
  SHA512:
6
- metadata.gz: 87214ff5e7f0292276b5ddbd3ff4b1b41f8ae685e9fa28de92043af5f6a5736c51b8729a5432e3fe2c0ff7fe75dd6f7ee145796d36c0d08528d20c37e6886d06
7
- data.tar.gz: c615b04dd5ee26613fd3ea804473727114cd8acc97aa6b0aeb4f280255adf56cd645228e45dd40e0e864915a328eb8c2a1adde198256bdf4b7923dbb4009a714
6
+ metadata.gz: 104d5b01cc83a5bd4440e64e7da9a551e46b5f583e2a1209bc391bb75facf1c2633453a3b9d15f1a9e351269aa07b5d6e83783768301570346e111076c9511bf
7
+ data.tar.gz: 5b86248682b5105de0a56ba9e3832cfa243ed8307ac2215d1331ed7915386728db479ada8d8c9ab05a0fa0e00e98ed338416827ca7bfe613533e4c41795f2301
data/README.md CHANGED
@@ -14,7 +14,7 @@ _For code and documentation for the current stable release see the [main branch]
14
14
 
15
15
  The new (work-in-progress) **documentation site** for Lookbook v1.0 is available here:
16
16
 
17
- 👉 **https://lookbook-docs-v1-beta.netlify.app/** 👈
17
+ 👉 **https://beta.lookbook.build/** 👈
18
18
 
19
19
  > Documentation source files are located in the `/docs` directory within this repository. The docs are built using [Bridgetown](https://www.bridgetownrb.com/).
20
20
 
@@ -31,7 +31,8 @@ module Lookbook
31
31
  protected
32
32
 
33
33
  def alpine_data
34
- "{name: '#{@name}', value: #{value.to_json}}"
34
+ escaped_value = value.is_a?(String) ? helpers.j(value) : value
35
+ "{name: '#{@name}', value: '#{escaped_value}'}"
35
36
  end
36
37
 
37
38
  def alpine_component
@@ -24,7 +24,7 @@ module Lookbook
24
24
  protected
25
25
 
26
26
  def generate_theme_overrides
27
- @theme_overrides ||= Lookbook::Theme.new(Lookbook.config.ui_theme_overrides).to_css
27
+ @theme_overrides ||= Lookbook.theme.to_css
28
28
  end
29
29
 
30
30
  def feature_enabled?(feature)
@@ -4,6 +4,15 @@ module Lookbook
4
4
  Lookbook::Engine.config.lookbook
5
5
  end
6
6
 
7
+ def theme
8
+ Lookbook.theme
9
+ end
10
+
11
+ def asset_path(file, version: true)
12
+ path = "/lookbook-assets/#{file}".gsub("//", "/")
13
+ version ? "#{path}?v=#{Lookbook::VERSION}" : path
14
+ end
15
+
7
16
  def feature_enabled?(name)
8
17
  Lookbook::Features.enabled?(name)
9
18
  end
@@ -5,16 +5,24 @@
5
5
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
7
7
 
8
- <link href="/lookbook-assets/css/lookbook.css?v=<%= Lookbook::VERSION %>" rel="stylesheet">
9
- <link href="/lookbook-assets/css/themes/<%= config.ui_theme %>.css?v=<%= Lookbook::VERSION %>" rel="stylesheet">
10
- <% if @theme_overrides.present? %>
8
+ <link href="<%= asset_path("/css/lookbook.css") %>" rel="stylesheet">
9
+ <link href="<%= asset_path("/css/themes/#{config.ui_theme}.css") %>" rel="stylesheet">
10
+
11
+ <%- if @theme_overrides.present? %>
11
12
  <style media="all">
12
13
  <%== @theme_overrides %>
13
14
  </style>
14
15
  <% end %>
15
16
 
16
- <% if config.ui_favicon != false %>
17
- <link rel="icon" href="<%= config.ui_favicon || "data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>👀</text></svg>" %>">
17
+ <% if config.ui_favicon == true %>
18
+ <link
19
+ rel="icon"
20
+ href="data:image/svg+xml,%3Csvg width='96' height='84' viewBox='0 0 96 84' xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3CclipPath id='a'%3E%3Cpath d='M96 0v84H0V0h96Z'/%3E%3C/clipPath%3E%3CclipPath id='b'%3E%3Cpath d='M71.897 0a1.5 1.5 0 0 1 1.31.769l22.605 40.5a1.5 1.5 0 0 1 0 1.462l-22.605 40.5a1.5 1.5 0 0 1-1.31.769H49.481a1 1 0 0 1-.873-1.487L70.812 42.73a1.5 1.5 0 0 0 0-1.462L48.608 1.487A1 1 0 0 1 49.481 0ZM24.655.564l22.72 40.705a1.5 1.5 0 0 1 0 1.462l-22.72 40.705a1 1 0 0 1-1.746 0L.19 42.73a1.5 1.5 0 0 1 0-1.462L22.91.564a1 1 0 0 1 1.746 0Z'/%3E%3C/clipPath%3E%3C/defs%3E%3Cg clip-path='url(%23a)'%3E%3Cg clip-path='url(%23b)'%3E%3Cpath fill='<%= url_encode theme.favicon_dark_mode %>' d='M0 0h96v84H0V0z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"
21
+ media="(prefers-color-scheme: dark)">
22
+ <link
23
+ rel="icon"
24
+ href="data:image/svg+xml,%3Csvg width='96' height='84' viewBox='0 0 96 84' xmlns='http://www.w3.org/2000/svg'%3E%3Cdefs%3E%3CclipPath id='a'%3E%3Cpath d='M96 0v84H0V0h96Z'/%3E%3C/clipPath%3E%3CclipPath id='b'%3E%3Cpath d='M71.897 0a1.5 1.5 0 0 1 1.31.769l22.605 40.5a1.5 1.5 0 0 1 0 1.462l-22.605 40.5a1.5 1.5 0 0 1-1.31.769H49.481a1 1 0 0 1-.873-1.487L70.812 42.73a1.5 1.5 0 0 0 0-1.462L48.608 1.487A1 1 0 0 1 49.481 0ZM24.655.564l22.72 40.705a1.5 1.5 0 0 1 0 1.462l-22.72 40.705a1 1 0 0 1-1.746 0L.19 42.73a1.5 1.5 0 0 1 0-1.462L22.91.564a1 1 0 0 1 1.746 0Z'/%3E%3C/clipPath%3E%3C/defs%3E%3Cg clip-path='url(%23a)'%3E%3Cg clip-path='url(%23b)'%3E%3Cpath fill='<%= url_encode theme.favicon_light_mode %>' d='M0 0h96v84H0V0z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"
25
+ media="(prefers-color-scheme: light)">
18
26
  <% end %>
19
27
 
20
28
  <script>
@@ -25,15 +33,14 @@
25
33
  <% end %>
26
34
  </script>
27
35
 
28
- <script src="/lookbook-assets/js/lookbook.js?v=<%= Lookbook::VERSION %>" defer></script>
36
+ <script src="<%= asset_path("/js/lookbook.js") %>" defer></script>
29
37
  <% if params[:lookbook_embed] %>
30
- <script src="/lookbook-assets/js/embed.js?v=<%= Lookbook::VERSION %>" defer></script>
38
+ <script src="<%= asset_path("/js/embed.js") %>" defer></script>
31
39
  <% end %>
32
40
 
33
41
  <title><%= [@title, config.project_name || "Lookbook"].compact.join(" :: ") %></title>
34
42
  </head>
35
43
  <body>
36
-
37
44
  <%= yield :body %>
38
45
 
39
46
  <% if Rails.env.development? %>
@@ -23,6 +23,7 @@ module Lookbook
23
23
  preview_paths: [],
24
24
  preview_display_params: {},
25
25
  preview_srcdoc: nil,
26
+ preview_tags: {},
26
27
  sort_examples: false,
27
28
 
28
29
  listen: Rails.env.development?,
@@ -38,6 +39,7 @@ module Lookbook
38
39
 
39
40
  ui_theme: "indigo",
40
41
  ui_theme_overrides: {},
42
+ ui_favicon: true,
41
43
 
42
44
  hooks: {
43
45
  after_initialize: [],
@@ -0,0 +1,11 @@
1
+ module Lookbook
2
+ module Data
3
+ def data
4
+ @data ||= Store.new
5
+ end
6
+
7
+ def data=(props)
8
+ @data = Store.new(props)
9
+ end
10
+ end
11
+ end
@@ -2,12 +2,22 @@ require "rails"
2
2
  require "view_component"
3
3
  require "action_cable/engine"
4
4
  require "listen"
5
+ require "rake"
5
6
 
6
7
  module Lookbook
7
8
 
8
9
  autoload :Config, "lookbook/config"
9
-
10
+ autoload :Data, "lookbook/data"
11
+ autoload :Hooks, "lookbook/hooks"
12
+ autoload :Panels, "lookbook/panels"
13
+ autoload :Tags, "lookbook/tags"
14
+
10
15
  class << self
16
+ include Lookbook::Data
17
+ include Lookbook::Hooks
18
+ include Lookbook::Panels
19
+ include Lookbook::Tags
20
+
11
21
  def version
12
22
  Lookbook::VERSION
13
23
  end
@@ -48,46 +58,12 @@ module Lookbook
48
58
  Page.any?
49
59
  end
50
60
 
51
- def data
52
- @data ||= Store.new
53
- end
54
-
55
- def data=(props)
56
- @data = Store.new(props)
57
- end
58
-
59
- def after_initialize(&block)
60
- add_hook(:after_initialize, block)
61
- end
62
-
63
- def before_exit(&block)
64
- add_hook(:before_exit, block)
65
- end
66
-
67
- def after_change(&block)
68
- add_hook(:after_change, block)
69
- end
70
-
71
- def define_panel(name, opts = {})
72
- config.define_inspector_panel(name, opts)
73
- end
74
-
75
- def amend_panel(name, opts = {})
76
- config.amend_inspector_panel(name, opts)
77
- end
78
-
79
- def remove_panel(name)
80
- config.remove_inspector_panel(name)
81
- end
82
-
83
61
  def broadcast(event_name, data = {})
84
62
  Engine.websocket&.broadcast(event_name.to_s, data)
85
63
  end
86
64
 
87
- protected
88
-
89
- def add_hook(event_name, block)
90
- config.hooks[event_name] << block
65
+ def theme
66
+ @theme ||= Lookbook::Theme.new(config.ui_theme, config.ui_theme_overrides)
91
67
  end
92
68
  end
93
69
 
@@ -112,7 +88,7 @@ module Lookbook
112
88
  end
113
89
 
114
90
  initializer "lookbook.parser.tags" do
115
- Lookbook::Parser.define_tags
91
+ Lookbook::Parser.define_tags(Lookbook.config.preview_tags)
116
92
  end
117
93
 
118
94
  initializer "lookbook.assets.serve" do
@@ -126,39 +102,20 @@ module Lookbook
126
102
  @preview_controller = Lookbook.config.preview_controller.constantize
127
103
  @preview_controller.include(Lookbook::PreviewController)
128
104
 
129
- if config.lookbook.listen
130
- Listen.logger = Lookbook.logger
131
-
132
- preview_listener = Listen.to(
133
- *config.lookbook.listen_paths,
134
- only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
135
- force_polling: config.lookbook.listen_use_polling
136
- ) do |modified, added, removed|
137
- changes = { modified: modified, added: added, removed: removed }
138
- begin
139
- parser.parse
140
- rescue
141
- end
142
- Lookbook::Preview.clear_cache
143
- Lookbook::Engine.reload_ui(changes)
144
- Lookbook::Engine.run_hooks(:after_change, changes)
105
+ if Gem::Version.new(Rails.version) >= Gem::Version.new("6.1.3.1")
106
+ # Rails.application.server is only available for newer Rails versions
107
+ Rails.application.server do
108
+ init_listeners
145
109
  end
146
- Lookbook::Engine.register_listener(preview_listener)
147
-
148
- page_listener = Listen.to(
149
- *config.lookbook.page_paths,
150
- only: /\.(html.*|md.*)$/,
151
- force_polling: config.lookbook.listen_use_polling
152
- ) do |modified, added, removed|
153
- changes = { modified: modified, added: added, removed: removed }
154
- Lookbook::Engine.reload_ui(changes)
155
- Lookbook::Engine.run_hooks(:after_change, changes)
110
+ else
111
+ # Fallback for older Rails versions - don't start listeners if running in a rake task.
112
+ unless File.basename($0) == "rake" || Rake.application.top_level_tasks.any?
113
+ init_listeners
156
114
  end
157
- Lookbook::Engine.register_listener(page_listener)
158
115
  end
159
116
 
160
117
  if config.lookbook.runtime_parsing
161
- parser.parse
118
+ Lookbook::Engine.parser.parse
162
119
  else
163
120
  unless File.exist?(config.lookbook.parser_registry_path)
164
121
  Lookbook.logger.warn "
@@ -172,8 +129,41 @@ module Lookbook
172
129
  Lookbook::Engine.run_hooks(:after_initialize)
173
130
  end
174
131
 
132
+ def init_listeners
133
+ return unless config.lookbook.listen == true
134
+ Listen.logger = Lookbook.logger
135
+ Lookbook.logger.info "Initializing listeners"
136
+
137
+ preview_listener = Listen.to(
138
+ *config.lookbook.listen_paths,
139
+ only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
140
+ force_polling: config.lookbook.listen_use_polling
141
+ ) do |modified, added, removed|
142
+ changes = { modified: modified, added: added, removed: removed }
143
+ begin
144
+ Lookbook::Engine.parser.parse
145
+ rescue
146
+ end
147
+ Lookbook::Preview.clear_cache
148
+ Lookbook::Engine.reload_ui(changes)
149
+ Lookbook::Engine.run_hooks(:after_change, changes)
150
+ end
151
+ Lookbook::Engine.register_listener(preview_listener)
152
+
153
+ page_listener = Listen.to(
154
+ *config.lookbook.page_paths,
155
+ only: /\.(html.*|md.*)$/,
156
+ force_polling: config.lookbook.listen_use_polling
157
+ ) do |modified, added, removed|
158
+ changes = { modified: modified, added: added, removed: removed }
159
+ Lookbook::Engine.reload_ui(changes)
160
+ Lookbook::Engine.run_hooks(:after_change, changes)
161
+ end
162
+ Lookbook::Engine.register_listener(page_listener)
163
+ end
164
+
175
165
  at_exit do
176
- if config.lookbook.listen
166
+ if Lookbook::Engine.listeners.any?
177
167
  Lookbook.logger.debug "Stopping listeners"
178
168
  Lookbook::Engine.listeners.each { |listener| listener.stop }
179
169
  end
@@ -194,9 +184,9 @@ module Lookbook
194
184
  @websocket ||= if Rails.version.to_f >= 6.0
195
185
  ActionCable::Server::Base.new(config: cable)
196
186
  else
197
- @websocket ||= ActionCable::Server::Base.new
198
- @websocket.config = cable
199
- @websocket
187
+ ws = ActionCable::Server::Base.new
188
+ ws.config = cable
189
+ ws
200
190
  end
201
191
  end
202
192
  end
@@ -231,7 +221,7 @@ module Lookbook
231
221
  end
232
222
 
233
223
  def run_hooks(event_name, *args)
234
- Lookbook.config.hooks[event_name].each do |hook|
224
+ config.lookbook.hooks[event_name].each do |hook|
235
225
  hook.call(Lookbook, *args)
236
226
  end
237
227
  end
@@ -0,0 +1,21 @@
1
+ module Lookbook
2
+ module Hooks
3
+ def after_initialize(&block)
4
+ add_hook(:after_initialize, block)
5
+ end
6
+
7
+ def before_exit(&block)
8
+ add_hook(:before_exit, block)
9
+ end
10
+
11
+ def after_change(&block)
12
+ add_hook(:after_change, block)
13
+ end
14
+
15
+ protected
16
+
17
+ def add_hook(event_name, block)
18
+ Lookbook.config.hooks[event_name] << block
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Lookbook
2
+ module Panels
3
+ def define_panel(name, opts = {})
4
+ Lookbook.config.define_inspector_panel(name, opts)
5
+ end
6
+
7
+ def amend_panel(name, opts = {})
8
+ Lookbook.amend_inspector_panel(name, opts)
9
+ end
10
+
11
+ def remove_panel(name)
12
+ Lookbook.remove_inspector_panel(name)
13
+ end
14
+ end
15
+ end
@@ -24,13 +24,16 @@ module Lookbook
24
24
  end
25
25
 
26
26
  class << self
27
- def define_tags
27
+ def define_tags(custom = {})
28
28
  YARD::Tags::Library.define_tag("Hidden status", :hidden)
29
29
  YARD::Tags::Library.define_tag("Label", :label)
30
30
  YARD::Tags::Library.define_tag("Display", :display)
31
31
  YARD::Tags::Library.define_tag("Position", :position)
32
32
  YARD::Tags::Library.define_tag("ID", :id)
33
33
  YARD::Tags::Library.define_tag("Component", :component)
34
+ custom.each do |name, opts|
35
+ YARD::Tags::Library.define_tag(name.to_s.titleize, name)
36
+ end
34
37
  end
35
38
  end
36
39
  end
@@ -3,7 +3,7 @@ module Lookbook
3
3
  include Utils
4
4
 
5
5
  delegate :name, :render_args, to: :@preview
6
- delegate :position, :group, :notes, :hidden?, to: :@preview_inspector
6
+ delegate :position, :group, :notes, :hidden?, :tags, :tag, to: :@preview_inspector
7
7
 
8
8
  def initialize(preview)
9
9
  @preview = preview
@@ -1,7 +1,7 @@
1
1
  module Lookbook
2
2
  class PreviewExample < Entity
3
3
  attr_reader :name, :preview
4
- delegate :params, :position, :group, :notes, :hidden?, :source, to: :@example_inspector
4
+ delegate :params, :position, :group, :notes, :hidden?, :source, :tags, :tag, to: :@example_inspector
5
5
 
6
6
  def initialize(name, preview)
7
7
  @name = name
@@ -49,6 +49,14 @@ module Lookbook
49
49
  @preview.hierarchy_depth + 1
50
50
  end
51
51
 
52
+ def tags(name = nil)
53
+ examples.map { |example| example.tags(name) }.flatten
54
+ end
55
+
56
+ def tag(name = nil)
57
+ tags(name).first
58
+ end
59
+
52
60
  alias_method :lookup_path, :path
53
61
  end
54
62
  end
@@ -79,5 +79,14 @@ module Lookbook
79
79
  def methods
80
80
  code_object&.meths
81
81
  end
82
+
83
+ def tags(name = nil)
84
+ tag_objects = code_object&.tags(name).presence || []
85
+ Lookbook::Tags.process_tags(tag_objects)
86
+ end
87
+
88
+ def tag(name = nil)
89
+ tags(name).first
90
+ end
82
91
  end
83
92
  end
@@ -0,0 +1,108 @@
1
+ require "shellwords"
2
+
3
+ module Lookbook
4
+ class Tag
5
+ attr_reader :data, :arg_names
6
+ attr_accessor :args, :opts
7
+
8
+ def initialize(tag_object, arg_names = nil, parser: nil, **options)
9
+ @tag_object = tag_object
10
+ @arg_names = arg_names
11
+ @args = {}
12
+ @opts = {}
13
+ @options = options
14
+ @parser = parser
15
+ @data = Store.new
16
+ run_parser
17
+ end
18
+
19
+ def tag_name
20
+ @name ||= @tag_object.tag_name.to_sym
21
+ end
22
+
23
+ def tag_body
24
+ @tag_object.text
25
+ end
26
+
27
+ def get_opt(key, fallback = nil)
28
+ opts[key] || fallback
29
+ end
30
+
31
+ def opts_str
32
+ @opts_str ||= text_tokens.size > args_count ? text_tokens.slice(args_count, text_tokens.size).join(" ") : ""
33
+ end
34
+
35
+ protected
36
+
37
+ def parse_args
38
+ unless arg_names.nil?
39
+ values = text_tokens.slice(0, args_count)
40
+ @args = build_args(values)
41
+ end
42
+ end
43
+
44
+ def parse_opts
45
+ return @opts if @options[:parse_options] == false
46
+ parsed_opts = parse_yaml(opts_str)
47
+ @opts = parsed_opts.is_a?(Hash) ? parsed_opts.with_indifferent_access : {}
48
+ end
49
+
50
+ def run_parser
51
+ parse_args
52
+ parse_opts
53
+ @parser.call(self) if @parser.respond_to?(:call)
54
+ end
55
+
56
+ def arg_options
57
+ return [] if arg_names.nil?
58
+ @arg_options ||= arg_names.map do |arg|
59
+ unless arg.is_a? Hash
60
+ name = arg
61
+ arg = {
62
+ name: name.to_sym,
63
+ }
64
+ end
65
+ arg[:parse] = false unless arg.key? :parse
66
+ arg
67
+ end
68
+ end
69
+
70
+ def validate_arg_names
71
+ if arg_names.present?
72
+ arg_names.each do |name|
73
+ if methods.include? name.to_sym
74
+ raise ArgumentError, "'#{name}' is a reserved word and cannot be used as an argument name."
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ def args_count
81
+ arg_options.size
82
+ end
83
+
84
+ def parse_yaml(str, fallback = "~")
85
+ YAML.safe_load(str || fallback)
86
+ end
87
+
88
+ def text_tokens
89
+ @tokens ||= Shellwords.split(@tag_object.text)
90
+ end
91
+
92
+ def build_args(values)
93
+ arg_options.map.with_index do |arg, i|
94
+ value = values[i]
95
+ value = parse_arg(value) if arg[:parse] == true && value.present?
96
+ [arg[:name].to_sym, value]
97
+ end.to_h
98
+ end
99
+
100
+ def method_missing(name, *method_args)
101
+ if name.end_with? "="
102
+ data[name.to_s.chomp("=").to_sym] = method_args.first
103
+ else
104
+ data[name] || args[name]
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,22 @@
1
+ module Lookbook
2
+ module Tags
3
+ def define_tag(name, args = nil, opts = {}, &block)
4
+ name = name.to_s.downcase.underscore.to_sym
5
+ if args.is_a? Hash
6
+ opts = args
7
+ args = nil
8
+ end
9
+ opts[:args] = args
10
+ opts[:parser] = block if block_given?
11
+ Lookbook.config.preview_tags[name] = opts
12
+ end
13
+
14
+ def self.process_tags(tag_objects)
15
+ return [] if tag_objects.none?
16
+ tag_objects.map do |tag_object|
17
+ opts = Lookbook.config.preview_tags[tag_object.tag_name] || {}
18
+ Lookbook::Tag.new(tag_object, opts[:args], opts.except(:args))
19
+ end.compact
20
+ end
21
+ end
22
+ end
@@ -1,18 +1,47 @@
1
1
  module Lookbook
2
2
  class Theme
3
+ BASE_THEMES = {
4
+ indigo: {
5
+ favicon_light_mode: "#4F46E5",
6
+ favicon_dark_mode: "#818CF8"
7
+ },
8
+ zinc: {
9
+ favicon_light_mode: "#52525b",
10
+ favicon_dark_mode: "#E4E4E7"
11
+ },
12
+ blue: {
13
+ favicon_light_mode: "#2563EB",
14
+ favicon_dark_mode: "#60A5FA"
15
+ }
16
+ }
3
17
 
4
- BASE_THEMES = [:indigo, :zinc, :blue]
5
-
6
- def initialize(config = {})
7
- @config = config
18
+ def initialize(base_theme, overrides = {})
19
+ @base_theme = base_theme
20
+ @overrides = overrides
8
21
  @css = nil
9
22
  end
10
23
 
24
+ def favicon_light_mode
25
+ (
26
+ @overrides[:favicon_light_mode].presence ||
27
+ @overrides[:favicon].presence ||
28
+ BASE_THEMES[@base_theme.to_sym][:favicon_light_mode]
29
+ )
30
+ end
31
+
32
+ def favicon_dark_mode
33
+ (
34
+ @overrides[:favicon_dark_mode].presence ||
35
+ @overrides[:favicon].presence ||
36
+ BASE_THEMES[@base_theme.to_sym][:favicon_dark_mode]
37
+ )
38
+ end
39
+
11
40
  def to_css
12
41
  return @css unless @css.nil?
13
- @css ||= if @config.present?
42
+ @css ||= if @overrides.present?
14
43
  styles = [":root {"]
15
- styles << @config.map do |key, value|
44
+ styles << @overrides.select { |key| !key.start_with?("favicon") }.map do |key, value|
16
45
  " --lookbook-#{key.to_s.underscore.gsub("_","-")}: #{value};"
17
46
  end
18
47
  styles.push "}"
@@ -23,7 +52,7 @@ module Lookbook
23
52
  end
24
53
 
25
54
  def self.valid_theme?(name)
26
- BASE_THEMES.include? name.to_sym
55
+ BASE_THEMES.key? name.to_sym
27
56
  end
28
57
  end
29
58
  end
@@ -1,3 +1,3 @@
1
1
  module Lookbook
2
- VERSION = "1.0.0.beta.6"
2
+ VERSION = "1.0.0.beta.7"
3
3
  end
data/lib/lookbook.rb CHANGED
@@ -11,6 +11,7 @@ module Lookbook
11
11
  autoload :Lang, "lookbook/lang"
12
12
  autoload :Params, "lookbook/params"
13
13
  autoload :Page, "lookbook/page"
14
+ autoload :Tag, "lookbook/tag"
14
15
  autoload :PageSection, "lookbook/page_section"
15
16
  autoload :PageCollection, "lookbook/page_collection"
16
17
  autoload :Features, "lookbook/features"