lookbook 1.0.8 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/lookbook/css/lookbook.css +76 -2
- data/app/assets/lookbook/js/app.js +20 -2
- data/app/{components/lookbook/params_editor/field/component.js → assets/lookbook/js/components/params_input.js} +1 -14
- data/app/assets/lookbook/js/lookbook.js +2 -1
- data/app/components/lookbook/base_component.rb +2 -3
- data/app/components/lookbook/button/component.html.erb +2 -2
- data/app/components/lookbook/button/component.rb +6 -1
- data/app/components/lookbook/button_group/component.rb +3 -4
- data/app/components/lookbook/copy_button/component.html.erb +1 -1
- data/app/components/lookbook/debug_menu/component.html.erb +51 -0
- data/app/components/lookbook/debug_menu/component.rb +18 -0
- data/app/components/lookbook/embed/component.html.erb +3 -3
- data/app/components/lookbook/header/component.html.erb +19 -44
- data/app/components/lookbook/inspector_panel/component.html.erb +5 -3
- data/app/components/lookbook/inspector_panel/component.rb +6 -18
- data/app/components/lookbook/nav/component.js +4 -0
- data/app/components/lookbook/nav/component.rb +1 -1
- data/app/components/lookbook/nav/item/component.html.erb +4 -4
- data/app/components/lookbook/nav/item/component.rb +1 -1
- data/app/components/lookbook/page_tabs/component.html.erb +4 -4
- data/app/components/lookbook/page_tabs/component.rb +1 -1
- data/app/components/lookbook/params/editor/component.html.erb +21 -0
- data/app/components/lookbook/{params_editor → params/editor}/component.js +1 -1
- data/app/components/lookbook/params/editor/component.rb +40 -0
- data/app/components/lookbook/params/field/component.css +76 -0
- data/app/components/lookbook/params/field/component.html.erb +27 -0
- data/app/components/lookbook/params/field/component.js +7 -0
- data/app/components/lookbook/params/field/component.rb +101 -0
- data/app/components/lookbook/tabs/component.html.erb +2 -2
- data/app/components/lookbook/tag_component.rb +1 -0
- data/app/components/lookbook/viewport/component.css +1 -1
- data/app/components/lookbook/viewport/component.html.erb +11 -0
- data/app/controllers/lookbook/previews_controller.rb +1 -1
- data/app/helpers/lookbook/component_helper.rb +45 -26
- data/app/helpers/lookbook/page_helper.rb +1 -1
- data/app/helpers/lookbook/preview_helper.rb +1 -1
- data/app/views/layouts/lookbook/application.html.erb +18 -4
- data/app/views/layouts/lookbook/page.html.erb +4 -4
- data/app/views/layouts/lookbook/shell.html.erb +4 -4
- data/app/views/layouts/lookbook/skeleton.html.erb +0 -6
- data/app/views/lookbook/error.html.erb +1 -1
- data/app/views/lookbook/pages/show.html.erb +2 -2
- data/app/views/lookbook/preview.html.erb +1 -1
- data/app/views/lookbook/previews/inputs/_color.html.erb +5 -0
- data/app/views/lookbook/previews/inputs/_range.html.erb +15 -0
- data/app/views/lookbook/previews/inputs/_select.html.erb +5 -0
- data/app/views/lookbook/previews/inputs/_text.html.erb +5 -0
- data/app/views/lookbook/previews/inputs/_textarea.html.erb +5 -0
- data/app/views/lookbook/previews/inputs/_toggle.html.erb +20 -0
- data/app/views/lookbook/previews/panels/_content.html.erb +2 -2
- data/app/views/lookbook/previews/panels/_notes.html.erb +2 -2
- data/app/views/lookbook/previews/panels/_output.html.erb +1 -1
- data/app/views/lookbook/previews/panels/_params.html.erb +3 -3
- data/app/views/lookbook/previews/panels/_preview.html.erb +1 -1
- data/app/views/lookbook/previews/panels/_source.html.erb +2 -2
- data/app/views/lookbook/previews/show.html.erb +13 -19
- data/lib/lookbook/config.rb +111 -100
- data/lib/lookbook/engine.rb +3 -60
- data/lib/lookbook/markdown.rb +1 -1
- data/lib/lookbook/panels.rb +14 -4
- data/lib/lookbook/params.rb +66 -35
- data/lib/lookbook/parser.rb +1 -0
- data/lib/lookbook/preview.rb +10 -4
- data/lib/lookbook/preview_controller.rb +7 -19
- data/lib/lookbook/preview_example.rb +1 -1
- data/lib/lookbook/source_inspector.rb +10 -4
- data/lib/lookbook/store.rb +14 -28
- data/lib/lookbook/tag.rb +13 -3
- data/lib/lookbook/tag_options.rb +111 -0
- data/lib/lookbook/tags.rb +6 -2
- data/lib/lookbook/template_parser.rb +72 -0
- data/lib/lookbook/theme.rb +1 -1
- data/lib/lookbook/utils.rb +23 -0
- data/lib/lookbook/version.rb +1 -1
- data/lib/lookbook.rb +75 -28
- data/public/lookbook-assets/css/lookbook.css +369 -126
- data/public/lookbook-assets/css/lookbook.css.map +1 -1
- data/public/lookbook-assets/js/embed.js +13 -13
- data/public/lookbook-assets/js/embed.js.map +1 -1
- data/public/lookbook-assets/js/lookbook.js +701 -612
- data/public/lookbook-assets/js/lookbook.js.map +1 -1
- metadata +56 -11
- data/app/components/lookbook/params_editor/component.html.erb +0 -3
- data/app/components/lookbook/params_editor/component.rb +0 -11
- data/app/components/lookbook/params_editor/field/component.html.erb +0 -49
- data/app/components/lookbook/params_editor/field/component.rb +0 -44
- data/lib/lookbook/data.rb +0 -11
data/lib/lookbook/parser.rb
CHANGED
@@ -39,6 +39,7 @@ module Lookbook
|
|
39
39
|
YARD::Tags::Library.define_tag("Position", :position)
|
40
40
|
YARD::Tags::Library.define_tag("ID", :id)
|
41
41
|
YARD::Tags::Library.define_tag("Component", :component)
|
42
|
+
YARD::Tags::Library.define_tag("Param", :param, :with_name)
|
42
43
|
custom.each do |name, opts|
|
43
44
|
YARD::Tags::Library.define_tag(name.to_s.titleize, name)
|
44
45
|
end
|
data/lib/lookbook/preview.rb
CHANGED
@@ -7,7 +7,7 @@ module Lookbook
|
|
7
7
|
|
8
8
|
def initialize(preview, code_object)
|
9
9
|
@preview = preview
|
10
|
-
@preview_inspector = SourceInspector.new(code_object)
|
10
|
+
@preview_inspector = SourceInspector.new(code_object, eval_scope: preview_class.new)
|
11
11
|
super(preview_class_path(@preview.name))
|
12
12
|
end
|
13
13
|
|
@@ -15,10 +15,14 @@ module Lookbook
|
|
15
15
|
@preview_inspector&.id || generate_id(lookup_path)
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def preview_class_name
|
19
19
|
@preview.name
|
20
20
|
end
|
21
21
|
|
22
|
+
def preview_class
|
23
|
+
@preview
|
24
|
+
end
|
25
|
+
|
22
26
|
def label
|
23
27
|
@preview_inspector&.label&.presence || lookup_path.split("/").last.titleize
|
24
28
|
end
|
@@ -143,10 +147,12 @@ module Lookbook
|
|
143
147
|
|
144
148
|
sorted_previews = previews.compact.sort_by { |preview| [preview.position, preview.label] }
|
145
149
|
@previews = PreviewCollection.new(sorted_previews)
|
146
|
-
|
150
|
+
@previews
|
151
|
+
elsif !@preview_objects.present?
|
147
152
|
PreviewCollection.new([])
|
153
|
+
else
|
154
|
+
@previews
|
148
155
|
end
|
149
|
-
@previews
|
150
156
|
end
|
151
157
|
|
152
158
|
def errors
|
@@ -12,32 +12,20 @@ module Lookbook
|
|
12
12
|
opts[:layout] = nil
|
13
13
|
opts[:locals] = locals if locals.present?
|
14
14
|
|
15
|
-
|
15
|
+
Utils.with_optional_action_view_annotations do
|
16
16
|
render html: render_to_string(template, **opts)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
def render_in_layout_to_string(template, locals, opts = {})
|
21
21
|
append_view_path Lookbook::Engine.root.join("app/views")
|
22
|
-
html = render_to_string(template, locals: locals, **determine_layout(opts[:layout]))
|
23
|
-
if opts[:append_html].present?
|
24
|
-
html += opts[:append_html]
|
25
|
-
end
|
26
|
-
render html: html
|
27
|
-
end
|
28
|
-
|
29
|
-
def with_optional_annotations
|
30
|
-
if ActionView::Base.respond_to?(:annotate_rendered_view_with_filenames) && Lookbook.config.preview_disable_action_view_annotations
|
31
|
-
original_value = ActionView::Base.annotate_rendered_view_with_filenames
|
32
|
-
ActionView::Base.annotate_rendered_view_with_filenames = false
|
33
|
-
|
34
|
-
res = yield
|
35
|
-
|
36
|
-
ActionView::Base.annotate_rendered_view_with_filenames = original_value
|
37
22
|
|
38
|
-
|
39
|
-
|
40
|
-
|
23
|
+
Utils.with_optional_action_view_annotations do
|
24
|
+
html = render_to_string(template, locals: locals, **determine_layout(opts[:layout]))
|
25
|
+
if opts[:append_html].present?
|
26
|
+
html += opts[:append_html]
|
27
|
+
end
|
28
|
+
render html: html
|
41
29
|
end
|
42
30
|
end
|
43
31
|
end
|
@@ -6,7 +6,7 @@ module Lookbook
|
|
6
6
|
def initialize(name, preview, code_object)
|
7
7
|
@name = name
|
8
8
|
@preview = preview
|
9
|
-
@example_inspector = SourceInspector.new(code_object)
|
9
|
+
@example_inspector = SourceInspector.new(code_object, eval_scope: @preview.preview_class.new)
|
10
10
|
super("#{@preview.path}/#{name}")
|
11
11
|
end
|
12
12
|
|
@@ -5,8 +5,9 @@ module Lookbook
|
|
5
5
|
attr_reader :code_object
|
6
6
|
delegate :groups, :source, to: :@code_object, allow_nil: true
|
7
7
|
|
8
|
-
def initialize(code_object)
|
8
|
+
def initialize(code_object, eval_scope: nil)
|
9
9
|
@code_object = code_object
|
10
|
+
@eval_scope = eval_scope
|
10
11
|
end
|
11
12
|
|
12
13
|
def hidden?
|
@@ -74,8 +75,11 @@ module Lookbook
|
|
74
75
|
end
|
75
76
|
|
76
77
|
def params
|
77
|
-
|
78
|
-
|
78
|
+
@params ||= {}
|
79
|
+
@params[:param] ||= code_object&.tags("param")&.map do |param|
|
80
|
+
Lookbook::Params.build_param(param,
|
81
|
+
default: parameter_defaults[param.name],
|
82
|
+
eval_scope: @eval_scope)
|
79
83
|
end
|
80
84
|
end
|
81
85
|
|
@@ -85,7 +89,9 @@ module Lookbook
|
|
85
89
|
|
86
90
|
def tags(name = nil)
|
87
91
|
tag_objects = code_object&.tags(name).presence || []
|
88
|
-
Lookbook::Tags.process_tags(tag_objects
|
92
|
+
Lookbook::Tags.process_tags(tag_objects,
|
93
|
+
eval_scope: @eval_scope,
|
94
|
+
file: (code_object.files.first[0] if code_object.files.any?))
|
89
95
|
end
|
90
96
|
|
91
97
|
def tag(name = nil)
|
data/lib/lookbook/store.rb
CHANGED
@@ -1,48 +1,34 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class Store < ActiveSupport::OrderedOptions
|
3
|
-
def initialize(data = {},
|
3
|
+
def initialize(data = {}, opts = {})
|
4
|
+
@recursive = opts[:recursive] || false
|
5
|
+
data.each { |key, value| self[key] = value }
|
4
6
|
super()
|
5
|
-
@deep = deep
|
6
|
-
set(data) if data.present?
|
7
|
-
end
|
8
|
-
|
9
|
-
def [](key)
|
10
|
-
super(normalize_key(key))
|
11
7
|
end
|
12
8
|
|
13
9
|
def []=(key, value)
|
14
|
-
super(
|
15
|
-
end
|
16
|
-
|
17
|
-
def set(data)
|
18
|
-
data.keys.each do |key|
|
19
|
-
self[normalize_key(key)] = normalize_value(data[key])
|
20
|
-
end
|
21
|
-
self
|
10
|
+
super(key, normalize_value(value))
|
22
11
|
end
|
23
12
|
|
24
|
-
def
|
25
|
-
|
26
|
-
self[normalize_key(key)]
|
27
|
-
else
|
28
|
-
fallback
|
29
|
-
end
|
13
|
+
def fetch(name, *args)
|
14
|
+
super(name.to_sym, *args)
|
30
15
|
end
|
31
16
|
|
32
17
|
def method_missing(name, *args)
|
33
|
-
|
18
|
+
if name.to_s.end_with?("=")
|
19
|
+
args[0] = normalize_value(args[0])
|
20
|
+
end
|
21
|
+
super(name, *args)
|
34
22
|
end
|
35
23
|
|
36
|
-
def respond_to_missing?(name,
|
37
|
-
|
24
|
+
def respond_to_missing?(name, include_private)
|
25
|
+
true
|
38
26
|
end
|
39
27
|
|
40
|
-
|
41
|
-
key.to_s.downcase.tr("-", "_").to_sym
|
42
|
-
end
|
28
|
+
private
|
43
29
|
|
44
30
|
def normalize_value(value)
|
45
|
-
@
|
31
|
+
@recursive && !value.is_a?(Store) && value.is_a?(Hash) ? Store.new(value, recursive: @recursive) : value
|
46
32
|
end
|
47
33
|
end
|
48
34
|
end
|
data/lib/lookbook/tag.rb
CHANGED
@@ -5,13 +5,15 @@ module Lookbook
|
|
5
5
|
attr_reader :data, :arg_names
|
6
6
|
attr_accessor :args, :opts
|
7
7
|
|
8
|
-
def initialize(tag_object, arg_names = nil, parser: nil, **options)
|
8
|
+
def initialize(tag_object, arg_names = nil, parser: nil, eval_scope: nil, file: nil, **options)
|
9
9
|
@tag_object = tag_object
|
10
10
|
@arg_names = arg_names
|
11
11
|
@args = {}
|
12
12
|
@opts = {}
|
13
13
|
@options = options
|
14
14
|
@parser = parser
|
15
|
+
@eval_scope = eval_scope
|
16
|
+
@file = file
|
15
17
|
@data = Store.new
|
16
18
|
run_parser
|
17
19
|
end
|
@@ -43,8 +45,16 @@ module Lookbook
|
|
43
45
|
|
44
46
|
def parse_opts
|
45
47
|
return @opts if @options[:parse_options] == false
|
46
|
-
|
47
|
-
|
48
|
+
tag_opts = Lookbook::TagOptions.new(opts_str,
|
49
|
+
eval_scope: @eval_scope,
|
50
|
+
base_dir: File.dirname(@file))
|
51
|
+
options = tag_opts.resolve || {}
|
52
|
+
@opts = if options.is_a?(Hash)
|
53
|
+
options.with_indifferent_access
|
54
|
+
else
|
55
|
+
Lookbook.logger.warn "'@#{tag_name}' tag options should resolve to a Hash"
|
56
|
+
options
|
57
|
+
end
|
48
58
|
end
|
49
59
|
|
50
60
|
def run_parser
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module Lookbook
|
2
|
+
class TagOptions
|
3
|
+
SYMBOL_MATCH = /(:([a-zA-Z_\d]+))$/
|
4
|
+
EVAL_OPTION_MATCH = /(\{\{\s?(.*)\s?\}\})$/
|
5
|
+
YAML_HASH_MATCH = /(\{(.*?)\})$/m
|
6
|
+
YAML_ARRAY_MATCH = /(\[(.*?)\])$/m
|
7
|
+
FILE_PATH_MATCH = /(\S+\.(json|yml))$/
|
8
|
+
|
9
|
+
MATCHERS = [YAML_ARRAY_MATCH, YAML_HASH_MATCH, SYMBOL_MATCH, EVAL_OPTION_MATCH, FILE_PATH_MATCH]
|
10
|
+
|
11
|
+
def initialize(options_str, eval_scope: nil, base_dir: nil)
|
12
|
+
@options_str = options_str.is_a?(String) ? options_str.strip : ""
|
13
|
+
@eval_scope = eval_scope
|
14
|
+
@base_dir = base_dir
|
15
|
+
end
|
16
|
+
|
17
|
+
def options
|
18
|
+
resolve.is_a?(Hash) ? resolve.symbolize_keys : resolve
|
19
|
+
end
|
20
|
+
|
21
|
+
def resolve
|
22
|
+
@resolved_options ||= begin
|
23
|
+
if @options_str.present?
|
24
|
+
if @options_str.end_with?(".json", ".yml")
|
25
|
+
file_path = resolve_file_path
|
26
|
+
if file_path
|
27
|
+
options_file_content = File.read(file_path)
|
28
|
+
else
|
29
|
+
raise "Tag options data file not found"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
if file_path&.extname == ".json"
|
33
|
+
JSON.parse(options_file_content)
|
34
|
+
elsif file_path&.extname == ".yml"
|
35
|
+
YAML.safe_load(options_file_content)
|
36
|
+
elsif evaluatable?
|
37
|
+
evaluate
|
38
|
+
else
|
39
|
+
YAML.safe_load(@options_str || "{}")
|
40
|
+
end
|
41
|
+
else
|
42
|
+
{}
|
43
|
+
end
|
44
|
+
rescue => exception
|
45
|
+
Lookbook.logger.warn Lookbook::Error.new(exception)
|
46
|
+
{}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def resolve_file_path
|
51
|
+
path = if @options_str.start_with?(".") && @base_dir.present?
|
52
|
+
File.expand_path(@options_str, @base_dir)
|
53
|
+
else
|
54
|
+
Rails.root.join(@options_str)
|
55
|
+
end
|
56
|
+
Pathname.new path
|
57
|
+
end
|
58
|
+
|
59
|
+
def evaluate
|
60
|
+
if Lookbook.config.preview_params_options_eval == true
|
61
|
+
if @eval_scope.nil?
|
62
|
+
raise "Preview params eval must be scoped to an object"
|
63
|
+
else
|
64
|
+
@eval_scope.instance_eval(statement)
|
65
|
+
end
|
66
|
+
else
|
67
|
+
raise "The config option `preview_params_options_eval` must be set to `true` before param options can be evaluated at runtime"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.extract_options(str)
|
72
|
+
str ||= ""
|
73
|
+
str.strip!
|
74
|
+
opts_str = ""
|
75
|
+
|
76
|
+
MATCHERS.each do |regexp|
|
77
|
+
match_data = str.match(regexp)
|
78
|
+
unless match_data.nil?
|
79
|
+
str.gsub!(regexp, "").strip!
|
80
|
+
opts_str = match_data[1]
|
81
|
+
break
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
[str, opts_str]
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.resolveable?(str)
|
89
|
+
return unless str.is_a?(String)
|
90
|
+
str.strip!
|
91
|
+
MATCHERS.each do |regexp|
|
92
|
+
return true if str.match?(regexp)
|
93
|
+
end
|
94
|
+
false
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def statement
|
100
|
+
evaluatable? ? eval_match_data[2].strip : "{}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def evaluatable?
|
104
|
+
eval_match_data.present?
|
105
|
+
end
|
106
|
+
|
107
|
+
def eval_match_data
|
108
|
+
@eval_match_data ||= @options_str.match(EVAL_OPTION_MATCH) || @options_str.match(SYMBOL_MATCH)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/lib/lookbook/tags.rb
CHANGED
@@ -11,11 +11,15 @@ module Lookbook
|
|
11
11
|
Lookbook.config.preview_tags[name] = opts
|
12
12
|
end
|
13
13
|
|
14
|
-
def self.process_tags(tag_objects)
|
14
|
+
def self.process_tags(tag_objects, file: nil, eval_scope: nil)
|
15
15
|
return [] if tag_objects.none?
|
16
16
|
tag_objects.map do |tag_object|
|
17
17
|
opts = Lookbook.config.preview_tags[tag_object.tag_name] || {}
|
18
|
-
Lookbook::Tag.new(tag_object,
|
18
|
+
Lookbook::Tag.new(tag_object,
|
19
|
+
opts[:args],
|
20
|
+
**opts.except(:args),
|
21
|
+
file: file,
|
22
|
+
eval_scope: eval_scope)
|
19
23
|
end.compact
|
20
24
|
end
|
21
25
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require "css_parser"
|
2
|
+
|
3
|
+
module Lookbook
|
4
|
+
class TemplateParser
|
5
|
+
STYLE_TAGS_REGEX = /<style(?:\s[^>]*)?>((?:(?!<\/style>).)*)<\/style>/m
|
6
|
+
FRONTMATTER_REGEX = /\A---(.|\n)*?---/
|
7
|
+
|
8
|
+
def initialize(content)
|
9
|
+
@raw_content = content.strip
|
10
|
+
@parsed_content = nil
|
11
|
+
@styles = nil
|
12
|
+
@frontmatter = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def content
|
16
|
+
parse
|
17
|
+
@parsed_content.strip.html_safe
|
18
|
+
end
|
19
|
+
|
20
|
+
def styles
|
21
|
+
parse
|
22
|
+
@styles
|
23
|
+
end
|
24
|
+
|
25
|
+
def frontmatter
|
26
|
+
parse
|
27
|
+
@frontmatter
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def parse
|
33
|
+
if @parsed_content.nil?
|
34
|
+
@styles = extract_styles(@raw_content)
|
35
|
+
content = strip_styles(@raw_content)
|
36
|
+
|
37
|
+
@frontmatter = extract_frontmatter(content)
|
38
|
+
content = strip_frontmatter(content)
|
39
|
+
|
40
|
+
@parsed_content = content
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def extract_styles(text)
|
45
|
+
styles = []
|
46
|
+
css_parser = ::CssParser::Parser.new
|
47
|
+
text.scan(STYLE_TAGS_REGEX).flatten.map(&:strip).each do |css|
|
48
|
+
css_parser.load_string! css.strip
|
49
|
+
end
|
50
|
+
css_parser.each_selector do |selector, declarations, specificity|
|
51
|
+
styles << "#{selector} { #{declarations} }"
|
52
|
+
end
|
53
|
+
styles
|
54
|
+
end
|
55
|
+
|
56
|
+
def strip_styles(text)
|
57
|
+
text.gsub(STYLE_TAGS_REGEX, "")
|
58
|
+
end
|
59
|
+
|
60
|
+
def extract_frontmatter(text)
|
61
|
+
frontmatter = {}
|
62
|
+
text.match(FRONTMATTER_REGEX) do |m|
|
63
|
+
frontmatter = YAML.safe_load(m[0])
|
64
|
+
end
|
65
|
+
frontmatter.deep_symbolize_keys
|
66
|
+
end
|
67
|
+
|
68
|
+
def strip_frontmatter(text)
|
69
|
+
text.gsub(FRONTMATTER_REGEX, "")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/lookbook/theme.rb
CHANGED
@@ -41,7 +41,7 @@ module Lookbook
|
|
41
41
|
return @css unless @css.nil?
|
42
42
|
@css ||= if @overrides.present?
|
43
43
|
styles = [":root {"]
|
44
|
-
styles << @overrides.
|
44
|
+
styles << @overrides.reject { |key| key.to_s.start_with?("favicon") }.map do |key, value|
|
45
45
|
" --lookbook-#{key.to_s.underscore.tr("_", "-")}: #{value};"
|
46
46
|
end
|
47
47
|
styles.push "}"
|
data/lib/lookbook/utils.rb
CHANGED
@@ -4,6 +4,29 @@ module Lookbook
|
|
4
4
|
|
5
5
|
POSITION_PREFIX_REGEX = /^(\d+?)[-_]/
|
6
6
|
FRONTMATTER_REGEX = /\A---(.|\n)*?---/
|
7
|
+
ACTION_VIEW_ANNOTATIONS_REGEX = /<!-- (BEGIN|END) (.*) -->/
|
8
|
+
|
9
|
+
def self.strip_action_view_annotations!(text)
|
10
|
+
text&.gsub!(ACTION_VIEW_ANNOTATIONS_REGEX, "")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.without_action_view_annotations
|
14
|
+
original_value = ActionView::Base.annotate_rendered_view_with_filenames
|
15
|
+
ActionView::Base.annotate_rendered_view_with_filenames = false
|
16
|
+
res = yield
|
17
|
+
ActionView::Base.annotate_rendered_view_with_filenames = original_value
|
18
|
+
res
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.with_optional_action_view_annotations
|
22
|
+
if ActionView::Base.respond_to?(:annotate_rendered_view_with_filenames) && Lookbook.config.preview_disable_action_view_annotations
|
23
|
+
without_action_view_annotations do
|
24
|
+
yield
|
25
|
+
end
|
26
|
+
else
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
end
|
7
30
|
|
8
31
|
protected
|
9
32
|
|
data/lib/lookbook/version.rb
CHANGED
data/lib/lookbook.rb
CHANGED
@@ -1,32 +1,79 @@
|
|
1
|
-
require "
|
2
|
-
require "
|
1
|
+
require "zeitwerk"
|
2
|
+
require "ostruct"
|
3
3
|
require "lookbook/version"
|
4
|
-
|
4
|
+
|
5
|
+
loader = Zeitwerk::Loader.for_gem
|
6
|
+
loader.ignore("#{__dir__}/lookbook.rb")
|
7
|
+
loader.push_dir("#{__dir__}/lookbook", namespace: Lookbook)
|
8
|
+
loader.setup
|
5
9
|
|
6
10
|
module Lookbook
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
11
|
+
class << self
|
12
|
+
include Lookbook::Hooks
|
13
|
+
include Lookbook::Panels
|
14
|
+
include Lookbook::Tags
|
15
|
+
|
16
|
+
def version
|
17
|
+
Lookbook::VERSION
|
18
|
+
end
|
19
|
+
|
20
|
+
def config
|
21
|
+
@config ||= Config.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def configure
|
25
|
+
yield(config)
|
26
|
+
end
|
27
|
+
|
28
|
+
def data
|
29
|
+
@data ||= Store.new
|
30
|
+
end
|
31
|
+
|
32
|
+
def data=(new_data)
|
33
|
+
@data = Store.new(new_data)
|
34
|
+
end
|
35
|
+
|
36
|
+
def logger
|
37
|
+
@logger ||= if Rails.logger.present? && config.log_use_rails_logger
|
38
|
+
Rails.logger
|
39
|
+
else
|
40
|
+
logger = Logger.new($stdout)
|
41
|
+
logger.level = config.log_level
|
42
|
+
logger
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def debug_data
|
47
|
+
{
|
48
|
+
version: version,
|
49
|
+
env: Rails.env.to_s,
|
50
|
+
config: config.to_h
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def previews
|
55
|
+
Preview.all
|
56
|
+
end
|
57
|
+
|
58
|
+
def pages
|
59
|
+
Page.all
|
60
|
+
end
|
61
|
+
|
62
|
+
def broadcast(event_name, data = {})
|
63
|
+
Engine.websocket&.broadcast(event_name.to_s, data)
|
64
|
+
end
|
65
|
+
|
66
|
+
def theme
|
67
|
+
@theme ||= Lookbook::Theme.new(config.ui_theme, config.ui_theme_overrides)
|
68
|
+
end
|
69
|
+
|
70
|
+
def define_param_input(input, partial, input_options = nil)
|
71
|
+
config.preview_param_inputs[input.to_sym] = {
|
72
|
+
partial: partial,
|
73
|
+
input_options: input_options || {}
|
74
|
+
}
|
75
|
+
end
|
76
|
+
end
|
32
77
|
end
|
78
|
+
|
79
|
+
require "lookbook/engine"
|