lookbook 1.0.8 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/lookbook/css/lookbook.css +76 -2
  3. data/app/assets/lookbook/js/app.js +20 -2
  4. data/app/{components/lookbook/params_editor/field/component.js → assets/lookbook/js/components/params_input.js} +1 -14
  5. data/app/assets/lookbook/js/lookbook.js +2 -1
  6. data/app/components/lookbook/base_component.rb +2 -3
  7. data/app/components/lookbook/button/component.html.erb +2 -2
  8. data/app/components/lookbook/button/component.rb +6 -1
  9. data/app/components/lookbook/button_group/component.rb +3 -4
  10. data/app/components/lookbook/copy_button/component.html.erb +1 -1
  11. data/app/components/lookbook/debug_menu/component.html.erb +51 -0
  12. data/app/components/lookbook/debug_menu/component.rb +18 -0
  13. data/app/components/lookbook/embed/component.html.erb +3 -3
  14. data/app/components/lookbook/header/component.html.erb +19 -44
  15. data/app/components/lookbook/inspector_panel/component.html.erb +5 -3
  16. data/app/components/lookbook/inspector_panel/component.rb +6 -18
  17. data/app/components/lookbook/nav/component.js +4 -0
  18. data/app/components/lookbook/nav/component.rb +1 -1
  19. data/app/components/lookbook/nav/item/component.html.erb +4 -4
  20. data/app/components/lookbook/nav/item/component.rb +1 -1
  21. data/app/components/lookbook/page_tabs/component.html.erb +4 -4
  22. data/app/components/lookbook/page_tabs/component.rb +1 -1
  23. data/app/components/lookbook/params/editor/component.html.erb +21 -0
  24. data/app/components/lookbook/{params_editor → params/editor}/component.js +1 -1
  25. data/app/components/lookbook/params/editor/component.rb +40 -0
  26. data/app/components/lookbook/params/field/component.css +76 -0
  27. data/app/components/lookbook/params/field/component.html.erb +27 -0
  28. data/app/components/lookbook/params/field/component.js +7 -0
  29. data/app/components/lookbook/params/field/component.rb +101 -0
  30. data/app/components/lookbook/tabs/component.html.erb +2 -2
  31. data/app/components/lookbook/tag_component.rb +1 -0
  32. data/app/components/lookbook/viewport/component.css +1 -1
  33. data/app/components/lookbook/viewport/component.html.erb +11 -0
  34. data/app/controllers/lookbook/previews_controller.rb +1 -1
  35. data/app/helpers/lookbook/component_helper.rb +45 -26
  36. data/app/helpers/lookbook/page_helper.rb +1 -1
  37. data/app/helpers/lookbook/preview_helper.rb +1 -1
  38. data/app/views/layouts/lookbook/application.html.erb +18 -4
  39. data/app/views/layouts/lookbook/page.html.erb +4 -4
  40. data/app/views/layouts/lookbook/shell.html.erb +4 -4
  41. data/app/views/layouts/lookbook/skeleton.html.erb +0 -6
  42. data/app/views/lookbook/error.html.erb +1 -1
  43. data/app/views/lookbook/pages/show.html.erb +2 -2
  44. data/app/views/lookbook/preview.html.erb +1 -1
  45. data/app/views/lookbook/previews/inputs/_color.html.erb +5 -0
  46. data/app/views/lookbook/previews/inputs/_range.html.erb +15 -0
  47. data/app/views/lookbook/previews/inputs/_select.html.erb +5 -0
  48. data/app/views/lookbook/previews/inputs/_text.html.erb +5 -0
  49. data/app/views/lookbook/previews/inputs/_textarea.html.erb +5 -0
  50. data/app/views/lookbook/previews/inputs/_toggle.html.erb +20 -0
  51. data/app/views/lookbook/previews/panels/_content.html.erb +2 -2
  52. data/app/views/lookbook/previews/panels/_notes.html.erb +2 -2
  53. data/app/views/lookbook/previews/panels/_output.html.erb +1 -1
  54. data/app/views/lookbook/previews/panels/_params.html.erb +3 -3
  55. data/app/views/lookbook/previews/panels/_preview.html.erb +1 -1
  56. data/app/views/lookbook/previews/panels/_source.html.erb +2 -2
  57. data/app/views/lookbook/previews/show.html.erb +13 -19
  58. data/lib/lookbook/config.rb +111 -100
  59. data/lib/lookbook/engine.rb +3 -60
  60. data/lib/lookbook/markdown.rb +1 -1
  61. data/lib/lookbook/panels.rb +14 -4
  62. data/lib/lookbook/params.rb +66 -35
  63. data/lib/lookbook/parser.rb +1 -0
  64. data/lib/lookbook/preview.rb +10 -4
  65. data/lib/lookbook/preview_controller.rb +7 -19
  66. data/lib/lookbook/preview_example.rb +1 -1
  67. data/lib/lookbook/source_inspector.rb +10 -4
  68. data/lib/lookbook/store.rb +14 -28
  69. data/lib/lookbook/tag.rb +13 -3
  70. data/lib/lookbook/tag_options.rb +111 -0
  71. data/lib/lookbook/tags.rb +6 -2
  72. data/lib/lookbook/template_parser.rb +72 -0
  73. data/lib/lookbook/theme.rb +1 -1
  74. data/lib/lookbook/utils.rb +23 -0
  75. data/lib/lookbook/version.rb +1 -1
  76. data/lib/lookbook.rb +75 -28
  77. data/public/lookbook-assets/css/lookbook.css +369 -126
  78. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  79. data/public/lookbook-assets/js/embed.js +13 -13
  80. data/public/lookbook-assets/js/embed.js.map +1 -1
  81. data/public/lookbook-assets/js/lookbook.js +701 -612
  82. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  83. metadata +56 -11
  84. data/app/components/lookbook/params_editor/component.html.erb +0 -3
  85. data/app/components/lookbook/params_editor/component.rb +0 -11
  86. data/app/components/lookbook/params_editor/field/component.html.erb +0 -49
  87. data/app/components/lookbook/params_editor/field/component.rb +0 -44
  88. data/lib/lookbook/data.rb +0 -11
@@ -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
@@ -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 preview_class
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
- else
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
- with_optional_annotations do
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
- res
39
- else
40
- yield
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
- code_object&.tags("param")&.map do |param|
78
- Lookbook::Params.build_param(param, default: parameter_defaults[param.name])
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)
@@ -1,48 +1,34 @@
1
1
  module Lookbook
2
2
  class Store < ActiveSupport::OrderedOptions
3
- def initialize(data = {}, deep = false)
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(normalize_key(key), normalize_value(value))
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 get(key, fallback = nil)
25
- if key?(normalize_key(key))
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
- super(normalize_key(name), *args.map { |arg| normalize_value(arg) })
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
- key?(name)
24
+ def respond_to_missing?(name, include_private)
25
+ true
38
26
  end
39
27
 
40
- def normalize_key(key)
41
- key.to_s.downcase.tr("-", "_").to_sym
42
- end
28
+ private
43
29
 
44
30
  def normalize_value(value)
45
- @deep && !value.is_a?(Store) && value.is_a?(Hash) ? Store.new(value, @deep) : value
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
- parsed_opts = parse_yaml(opts_str)
47
- @opts = parsed_opts.is_a?(Hash) ? parsed_opts.with_indifferent_access : {}
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, opts[:args], **opts.except(:args))
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
@@ -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.select { |key| !key.start_with?("favicon") }.map do |key, value|
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 "}"
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module Lookbook
2
- VERSION = "1.0.8"
2
+ VERSION = "1.1.1"
3
3
  end
data/lib/lookbook.rb CHANGED
@@ -1,32 +1,79 @@
1
- require "active_support/dependencies/autoload"
2
- require "lookbook/engine"
1
+ require "zeitwerk"
2
+ require "ostruct"
3
3
  require "lookbook/version"
4
- require "view_component/engine"
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
- extend ActiveSupport::Autoload
8
-
9
- autoload :Error, "lookbook/error"
10
- autoload :Utils, "lookbook/utils"
11
- autoload :Lang, "lookbook/lang"
12
- autoload :Params, "lookbook/params"
13
- autoload :Page, "lookbook/page"
14
- autoload :Tag, "lookbook/tag"
15
- autoload :PageSection, "lookbook/page_section"
16
- autoload :PageCollection, "lookbook/page_collection"
17
- autoload :Features, "lookbook/features"
18
- autoload :Collection, "lookbook/collection"
19
- autoload :Entity, "lookbook/entity"
20
- autoload :Parser, "lookbook/parser"
21
- autoload :Preview, "lookbook/preview"
22
- autoload :PreviewCollection, "lookbook/preview_collection"
23
- autoload :PreviewController, "lookbook/preview_controller"
24
- autoload :PreviewExample, "lookbook/preview_example"
25
- autoload :PreviewGroup, "lookbook/preview_group"
26
- autoload :SourceInspector, "lookbook/source_inspector"
27
- autoload :CodeFormatter, "lookbook/code_formatter"
28
- autoload :Markdown, "lookbook/markdown"
29
- autoload :Theme, "lookbook/theme"
30
- autoload :Store, "lookbook/store"
31
- autoload :Component, "lookbook/component"
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"