lookbook 1.2.1 → 1.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +47 -14
  4. data/app/assets/lookbook/css/themes/blue.css +4 -2
  5. data/app/assets/lookbook/css/themes/green.css +66 -0
  6. data/app/assets/lookbook/css/themes/indigo.css +4 -2
  7. data/app/assets/lookbook/css/themes/rose.css +66 -0
  8. data/app/assets/lookbook/css/themes/zinc.css +4 -2
  9. data/app/components/lookbook/base_component.rb +2 -2
  10. data/app/components/lookbook/code/component.css +2 -2
  11. data/app/components/lookbook/code/component.html.erb +3 -2
  12. data/app/components/lookbook/code/component.rb +13 -2
  13. data/app/components/lookbook/code/highlight_github.css +406 -0
  14. data/app/components/lookbook/header/component.html.erb +1 -1
  15. data/app/components/lookbook/inspector_panel/component.rb +4 -6
  16. data/app/components/lookbook/nav/component.rb +8 -15
  17. data/app/components/lookbook/nav/directory/component.html.erb +28 -0
  18. data/app/components/lookbook/nav/directory/component.rb +4 -0
  19. data/app/components/lookbook/nav/{item → entity}/component.html.erb +8 -8
  20. data/app/components/lookbook/nav/entity/component.rb +49 -0
  21. data/app/components/lookbook/nav/item/component.css +15 -0
  22. data/app/components/lookbook/nav/item/component.js +4 -0
  23. data/app/components/lookbook/nav/item/component.rb +13 -56
  24. data/app/components/lookbook/params/editor/component.html.erb +2 -2
  25. data/app/components/lookbook/params/editor/component.rb +3 -10
  26. data/app/components/lookbook/params/field/component.css +3 -3
  27. data/app/components/lookbook/params/field/component.html.erb +8 -8
  28. data/app/components/lookbook/params/field/component.rb +21 -72
  29. data/app/components/lookbook/split_layout/component.html.erb +1 -1
  30. data/app/components/lookbook/tabs/component.html.erb +1 -1
  31. data/app/components/lookbook/tabs/component.js +4 -0
  32. data/app/components/lookbook/tag_component.rb +1 -1
  33. data/app/components/lookbook/viewport/component.css +1 -1
  34. data/app/components/lookbook/viewport/component.html.erb +1 -1
  35. data/app/components/lookbook/viewport/component.rb +1 -1
  36. data/app/controllers/concerns/lookbook/targetable_concern.rb +131 -0
  37. data/app/controllers/concerns/lookbook/with_preview_controller_concern.rb +13 -0
  38. data/app/controllers/lookbook/application_controller.rb +21 -9
  39. data/app/controllers/lookbook/inspector_controller.rb +45 -0
  40. data/app/controllers/lookbook/page_controller.rb +13 -9
  41. data/app/controllers/lookbook/pages_controller.rb +9 -15
  42. data/app/controllers/lookbook/previews_controller.rb +4 -210
  43. data/app/helpers/lookbook/application_helper.rb +2 -2
  44. data/app/helpers/lookbook/output_helper.rb +5 -5
  45. data/app/helpers/lookbook/page_helper.rb +7 -4
  46. data/app/views/layouts/lookbook/application.html.erb +40 -38
  47. data/app/views/layouts/lookbook/page.html.erb +2 -2
  48. data/app/views/layouts/lookbook/shell.html.erb +3 -2
  49. data/app/views/layouts/lookbook/skeleton.html.erb +7 -7
  50. data/app/views/lookbook/index.html.erb +13 -2
  51. data/app/views/lookbook/{previews → inspector}/inputs/_color.html.erb +0 -0
  52. data/app/views/lookbook/{previews → inspector}/inputs/_range.html.erb +0 -0
  53. data/app/views/lookbook/{previews → inspector}/inputs/_select.html.erb +0 -0
  54. data/app/views/lookbook/{previews → inspector}/inputs/_text.html.erb +0 -0
  55. data/app/views/lookbook/{previews → inspector}/inputs/_textarea.html.erb +0 -0
  56. data/app/views/lookbook/{previews → inspector}/inputs/_toggle.html.erb +5 -5
  57. data/app/views/lookbook/{previews → inspector}/panels/_content.html.erb +0 -0
  58. data/app/views/lookbook/{previews → inspector}/panels/_notes.html.erb +2 -2
  59. data/app/views/lookbook/{previews → inspector}/panels/_output.html.erb +0 -0
  60. data/app/views/lookbook/inspector/panels/_params.html.erb +15 -0
  61. data/app/views/lookbook/{previews → inspector}/panels/_preview.html.erb +0 -0
  62. data/app/views/lookbook/{previews → inspector}/panels/_source.html.erb +0 -0
  63. data/app/views/lookbook/{previews → inspector}/show.html.erb +5 -2
  64. data/config/app.yml +11 -1
  65. data/config/inputs.yml +12 -12
  66. data/config/languages.yml +41 -0
  67. data/config/panels.yml +6 -6
  68. data/config/routes.rb +5 -5
  69. data/config/tags.yml +8 -1
  70. data/lib/lookbook/engine.rb +103 -130
  71. data/lib/lookbook/entities/collections/component_collection.rb +4 -0
  72. data/lib/lookbook/entities/collections/concerns/hierarchical_collection.rb +23 -0
  73. data/lib/lookbook/entities/collections/entity_collection.rb +61 -0
  74. data/lib/lookbook/entities/collections/page_collection.rb +30 -0
  75. data/lib/lookbook/entities/collections/preview_collection.rb +41 -0
  76. data/lib/lookbook/entities/collections/preview_example_collection.rb +4 -0
  77. data/lib/lookbook/entities/component.rb +31 -0
  78. data/lib/lookbook/entities/concerns/annotatable.rb +58 -0
  79. data/lib/lookbook/entities/concerns/inspectable.rb +44 -0
  80. data/lib/lookbook/entities/concerns/locatable.rb +73 -0
  81. data/lib/lookbook/entities/concerns/navigable.rb +43 -0
  82. data/lib/lookbook/entities/entity.rb +53 -0
  83. data/lib/lookbook/entities/page.rb +80 -0
  84. data/lib/lookbook/entities/page_section.rb +43 -0
  85. data/lib/lookbook/entities/preview.rb +87 -0
  86. data/lib/lookbook/entities/preview_example.rb +100 -0
  87. data/lib/lookbook/entities/preview_group.rb +48 -0
  88. data/lib/lookbook/file_watcher.rb +47 -0
  89. data/lib/lookbook/lang.rb +12 -35
  90. data/lib/lookbook/param.rb +99 -0
  91. data/lib/lookbook/{preview_controller.rb → preview_actions.rb} +14 -3
  92. data/lib/lookbook/preview_parser.rb +53 -0
  93. data/lib/lookbook/process.rb +21 -0
  94. data/lib/lookbook/rendered_example.rb +37 -0
  95. data/lib/lookbook/services/code/code_beautifier.rb +21 -0
  96. data/lib/lookbook/services/code/code_highlighter.rb +69 -0
  97. data/lib/lookbook/services/code/code_indenter.rb +14 -0
  98. data/lib/lookbook/services/data/parsers/data_parser.rb +22 -0
  99. data/lib/lookbook/services/data/parsers/json_parser.rb +7 -0
  100. data/lib/lookbook/services/data/parsers/yaml_parser.rb +7 -0
  101. data/lib/lookbook/services/data/resolvers/data_resolver.rb +70 -0
  102. data/lib/lookbook/services/data/resolvers/eval_resolver.rb +10 -0
  103. data/lib/lookbook/services/data/resolvers/file_resolver.rb +28 -0
  104. data/lib/lookbook/services/data/resolvers/method_resolver.rb +10 -0
  105. data/lib/lookbook/services/data/resolvers/yaml_resolver.rb +18 -0
  106. data/lib/lookbook/services/entities/entity_tree_builder.rb +45 -0
  107. data/lib/lookbook/services/markdown_renderer.rb +29 -0
  108. data/lib/lookbook/services/position_prefix_parser.rb +16 -0
  109. data/lib/lookbook/services/string_value_caster.rb +60 -0
  110. data/lib/lookbook/services/tags/tag_options_parser.rb +62 -0
  111. data/lib/lookbook/services/templates/action_view_annotations_handler.rb +21 -0
  112. data/lib/lookbook/services/templates/action_view_annotations_stripper.rb +15 -0
  113. data/lib/lookbook/services/templates/frontmatter_extractor.rb +28 -0
  114. data/lib/lookbook/services/templates/styles_extractor.rb +38 -0
  115. data/lib/lookbook/services/{search_param_builder.rb → urls/search_param_builder.rb} +1 -1
  116. data/lib/lookbook/services/{search_param_parser.rb → urls/search_param_parser.rb} +1 -1
  117. data/lib/lookbook/stores/config_store.rb +12 -9
  118. data/lib/lookbook/stores/input_store.rb +7 -3
  119. data/lib/lookbook/stores/panel_store.rb +2 -2
  120. data/lib/lookbook/stores/tag_store.rb +3 -5
  121. data/lib/lookbook/support/null_object.rb +10 -0
  122. data/lib/lookbook/support/service.rb +2 -2
  123. data/lib/lookbook/support/store.rb +2 -35
  124. data/lib/lookbook/support/tree_node.rb +87 -0
  125. data/lib/lookbook/support/utils/path_utils.rb +32 -5
  126. data/lib/lookbook/support/utils/utils.rb +24 -0
  127. data/lib/lookbook/tags/component_tag.rb +13 -0
  128. data/lib/lookbook/tags/custom_tag.rb +61 -0
  129. data/lib/lookbook/tags/display_tag.rb +15 -0
  130. data/lib/lookbook/tags/hidden_tag.rb +13 -0
  131. data/lib/lookbook/tags/id_tag.rb +7 -0
  132. data/lib/lookbook/tags/label_tag.rb +4 -0
  133. data/lib/lookbook/tags/logical_path_tag.rb +7 -0
  134. data/lib/lookbook/tags/param_tag.rb +63 -0
  135. data/lib/lookbook/tags/position_tag.rb +16 -0
  136. data/lib/lookbook/tags/source_tag.rb +7 -0
  137. data/lib/lookbook/tags/tag_provider.rb +18 -0
  138. data/lib/lookbook/tags/yard_tag.rb +90 -0
  139. data/lib/lookbook/theme.rb +8 -0
  140. data/lib/lookbook/version.rb +1 -1
  141. data/lib/lookbook/websocket.rb +60 -0
  142. data/lib/lookbook.rb +13 -8
  143. data/public/lookbook-assets/css/lookbook.css +487 -411
  144. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  145. data/public/lookbook-assets/css/themes/blue.css +3 -1
  146. data/public/lookbook-assets/css/themes/blue.css.map +1 -1
  147. data/public/lookbook-assets/css/themes/green.css +68 -0
  148. data/public/lookbook-assets/css/themes/green.css.map +1 -0
  149. data/public/lookbook-assets/css/themes/indigo.css +3 -1
  150. data/public/lookbook-assets/css/themes/indigo.css.map +1 -1
  151. data/public/lookbook-assets/css/themes/rose.css +68 -0
  152. data/public/lookbook-assets/css/themes/rose.css.map +1 -0
  153. data/public/lookbook-assets/css/themes/zinc.css +3 -1
  154. data/public/lookbook-assets/css/themes/zinc.css.map +1 -1
  155. data/public/lookbook-assets/js/embed.js +10 -1
  156. data/public/lookbook-assets/js/embed.js.map +1 -1
  157. data/public/lookbook-assets/js/lookbook.js +358 -629
  158. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  159. metadata +96 -44
  160. data/app/components/lookbook/code/highlight_github_light.css +0 -217
  161. data/app/views/lookbook/previews/panels/_params.html.erb +0 -15
  162. data/lib/lookbook/code_formatter.rb +0 -68
  163. data/lib/lookbook/collection.rb +0 -161
  164. data/lib/lookbook/component.rb +0 -34
  165. data/lib/lookbook/entity.rb +0 -47
  166. data/lib/lookbook/markdown.rb +0 -22
  167. data/lib/lookbook/page.rb +0 -195
  168. data/lib/lookbook/page_collection.rb +0 -19
  169. data/lib/lookbook/page_section.rb +0 -29
  170. data/lib/lookbook/params.rb +0 -157
  171. data/lib/lookbook/parser.rb +0 -42
  172. data/lib/lookbook/preview.rb +0 -174
  173. data/lib/lookbook/preview_collection.rb +0 -23
  174. data/lib/lookbook/preview_example.rb +0 -93
  175. data/lib/lookbook/preview_group.rb +0 -62
  176. data/lib/lookbook/source_inspector.rb +0 -95
  177. data/lib/lookbook/support/utils/attribute_utils.rb +0 -9
  178. data/lib/lookbook/tag.rb +0 -122
  179. data/lib/lookbook/tag_options.rb +0 -111
  180. data/lib/lookbook/tags.rb +0 -17
  181. data/lib/lookbook/template_parser.rb +0 -72
  182. data/lib/lookbook/utils.rb +0 -105
@@ -9,9 +9,9 @@ module Lookbook
9
9
  end
10
10
 
11
11
  def index
12
- landing = Lookbook.pages.find(&:landing) || Lookbook.pages.first
12
+ landing = Lookbook.pages.find(&:landing?) || Lookbook.pages.first
13
13
  if landing.present?
14
- redirect_to lookbook_page_path landing.lookup_path
14
+ redirect_to lookbook_page_path(landing.path)
15
15
  else
16
16
  show_404
17
17
  end
@@ -20,21 +20,15 @@ module Lookbook
20
20
  def show
21
21
  @page = @pages.find_by_path(params[:path])
22
22
  if @page
23
- @next_page = @pages.find_next(@page)
24
- @previous_page = @pages.find_previous(@page)
25
- if @page.errors.any?
23
+ @next_page = @pages.next(@page)
24
+ @previous_page = @pages.previous(@page)
25
+ begin
26
+ @page_content = page_controller.render_page(@page)
27
+ @title = @page.title
28
+ rescue => exception
26
29
  render_in_layout "lookbook/error",
27
30
  layout: "lookbook/page",
28
- error: @page.errors.first
29
- else
30
- begin
31
- @page_content = page_controller.render_page(@page)
32
- @title = @page.title
33
- rescue => exception
34
- render_in_layout "lookbook/error",
35
- layout: "lookbook/page",
36
- error: Lookbook::Error.new(exception, file_path: @page.full_path, source_code: @page.content)
37
- end
31
+ error: Lookbook::Error.new(exception, file_path: @page.file_path, source_code: @page.content)
38
32
  end
39
33
  else
40
34
  show_404
@@ -1,19 +1,16 @@
1
1
  module Lookbook
2
2
  class PreviewsController < ApplicationController
3
- layout "lookbook/inspector"
3
+ include TargetableConcern
4
+ include WithPreviewControllerConcern
4
5
 
6
+ layout "lookbook/inspector"
5
7
  helper Lookbook::PreviewHelper
6
8
 
7
9
  def self.controller_path
8
10
  "lookbook/previews"
9
11
  end
10
12
 
11
- before_action :lookup_entities, only: [:preview, :show]
12
- before_action :set_title
13
- before_action :set_display_options
14
- before_action :set_params
15
-
16
- def preview
13
+ def show
17
14
  if @target
18
15
  begin
19
16
  opts = {layout: @preview.layout}
@@ -31,208 +28,5 @@ module Lookbook
31
28
  show_404 layout: "lookbook/standalone"
32
29
  end
33
30
  end
34
-
35
- def show
36
- if @target
37
- begin
38
- @main_panels = main_panels
39
- @drawer_panels = drawer_panels
40
- rescue => exception
41
- render_in_layout "lookbook/error", layout: "lookbook/inspector", error: prettify_error(exception)
42
- end
43
- else
44
- show_404
45
- end
46
- end
47
-
48
- def show_legacy
49
- Lookbook.logger.warn("Legacy URL path detected. These paths are deprecated and will be removed in a future version")
50
- redirect_to lookbook_inspect_path params[:path]
51
- end
52
-
53
- private
54
-
55
- def lookup_entities
56
- @target = Lookbook.previews.find_example(params[:path])
57
- if @target.present?
58
- @preview = @target.preview
59
- if params[:path] == @preview&.lookup_path
60
- redirect_to lookbook_inspect_path "#{params[:path]}/#{@preview.default_example.name}"
61
- end
62
- else
63
- @preview = Lookbook.previews.find(params[:path])
64
- if @preview.present?
65
- first_example = @preview.examples.first
66
- redirect_to lookbook_inspect_path(first_example.lookup_path) if first_example
67
- else
68
- @preview = Lookbook.previews.find(path_segments.slice(0, path_segments.size - 1).join("/"))
69
- end
70
- end
71
- end
72
-
73
- def show_404(layout: nil)
74
- locals = if @preview
75
- {
76
- message: "Example not found",
77
- description: "The '#{@preview.label}' preview does not have an example named '#{path_segments.last}'."
78
- }
79
- else
80
- {
81
- message: "Not found",
82
- description: "Looked for '#{params[:path]}'.<br>The preview may have been renamed or deleted."
83
- }
84
- end
85
- render_in_layout "lookbook/404", layout: layout, **locals
86
- end
87
-
88
- def target_examples
89
- @target.type == :group ? @target.examples : [@target]
90
- end
91
-
92
- def set_title
93
- @title = @target.present? ? [@target&.label, @preview&.label].compact.join(" :: ") : "Not found"
94
- end
95
-
96
- def set_display_options
97
- @dynamic_display_options = []
98
- @static_display_options = []
99
-
100
- if @target.present?
101
- opts = @target.display_options
102
- @dynamic_display_options = opts.select { _2.is_a?(Array) || _2.is_a?(Hash) }
103
- @static_display_options = opts.except(*@dynamic_display_options.keys)
104
-
105
- if params[:_display]
106
- display_params = SearchParamParser.call(params[:_display])
107
- display_params.each do |name, value|
108
- if @dynamic_display_options.key?(name)
109
- cookies["lookbook-display-#{name}"] = value
110
- end
111
- end
112
- end
113
-
114
- @dynamic_display_options.each do |name, opts|
115
- choices = opts.is_a?(Hash) ? opts[:choices].to_a : opts
116
- @static_display_options[name] ||= cookies.fetch("lookbook-display-#{name}", choices.first)
117
- end
118
-
119
- unless params[:_display]
120
- display_params = @dynamic_display_options.map do |name, opts|
121
- [name, @static_display_options[name]]
122
- end.to_h
123
- request.query_parameters[:_display] = SearchParamBuilder.call(display_params)
124
- end
125
- end
126
- end
127
-
128
- def set_params
129
- if @target
130
- # cast known params to type
131
- @target.params.each do |param|
132
- if preview_controller.params.key?(param[:name])
133
- preview_controller.params[param[:name]] = Lookbook::Params.cast(preview_controller.params[param[:name]], param[:value_type])
134
- end
135
- end
136
- # set display and data params
137
- preview_controller.params.merge!({
138
- lookbook: {
139
- display: @static_display_options,
140
- data: Lookbook.data
141
- }
142
- })
143
- end
144
- end
145
-
146
- def preview_params
147
- preview_controller.params.permit!
148
- preview_controller.params.to_h.select do |key, value|
149
- !!@target.params.find { |param| param[:name] == key }
150
- end
151
- end
152
-
153
- def inspector_data
154
- return @inspector_data if @inspector_data.present?
155
-
156
- context_data = {
157
- preview_params: preview_params,
158
- path: params[:path]
159
- }
160
-
161
- preview = @preview
162
- examples = target_examples.map do |example|
163
- render_args = @preview.render_args(example.name, params: preview_controller.params)
164
- has_template = render_args[:template] != "view_components/preview"
165
- output = preview_controller.process(:render_example_to_string, @preview, example.name)
166
- source = has_template ? example.template_source(render_args[:template]) : example.method_source
167
- source_lang = has_template ? example.template_lang(render_args[:template]) : example.lang
168
-
169
- example.define_singleton_method(:output, proc { output })
170
- example.define_singleton_method(:source, proc { source })
171
- example.define_singleton_method(:source_lang, proc { source_lang })
172
- example
173
- end
174
-
175
- target = @target.type == :group ? @target : examples.find { |e| e.lookup_path == @target.lookup_path }
176
-
177
- preview.define_singleton_method(:params, proc {
178
- target.params
179
- })
180
-
181
- @inspector_data ||= Lookbook::Store.new({
182
- context: context_data,
183
- preview: preview,
184
- examples: examples,
185
- example: examples.first,
186
- target: target,
187
- data: Lookbook.data,
188
- app: Lookbook
189
- })
190
- end
191
-
192
- def main_panels
193
- Engine.panels.in_group(:main).map do |config|
194
- PanelStore.resolve_config(config, inspector_data)
195
- end
196
- end
197
-
198
- def drawer_panels
199
- Engine.panels.in_group(:drawer).map do |config|
200
- PanelStore.resolve_config(config, inspector_data)
201
- end
202
- end
203
-
204
- def preview_controller
205
- return @preview_controller if @preview_controller
206
- controller = Lookbook::Engine.preview_controller.new
207
- controller.request = request
208
- controller.response = response
209
- @preview_controller ||= controller
210
- end
211
-
212
- def prettify_error(exception)
213
- error_params = if exception.is_a?(ViewComponent::PreviewTemplateError)
214
- {
215
- file_path: @preview&.full_path,
216
- line_number: 0,
217
- source_code: @target&.source
218
- }
219
- elsif exception.is_a?(ActionView::Template::Error) & exception.message.include?("implements a reserved method")
220
- message_parts = exception.message.split("\n").first.split
221
- component_class = message_parts.first.constantize
222
- naughty_method = message_parts.last.delete("#").delete("`").delete(".")
223
- method = component_class.instance_method(naughty_method.to_sym)
224
- if method
225
- {
226
- file_path: method.source_location.first,
227
- line_number: method.source_location[1]
228
- }
229
- end
230
- end
231
- Lookbook::Error.new(exception, **(error_params || {}))
232
- end
233
-
234
- def path_segments
235
- params[:path].split("/")
236
- end
237
31
  end
238
32
  end
@@ -18,7 +18,7 @@ module Lookbook
18
18
  end
19
19
 
20
20
  def landing_path
21
- landing = Lookbook.pages.find(&:landing) || Lookbook.pages.first
21
+ landing = Lookbook.pages.find(&:landing?) || Lookbook.pages.first
22
22
  if landing.present?
23
23
  lookbook_page_path landing.lookup_path
24
24
  else
@@ -27,7 +27,7 @@ module Lookbook
27
27
  end
28
28
 
29
29
  def generate_id(*args)
30
- args.map { |args| args.delete_prefix("/").tr("&?=/_\-", "-") }.join("-")
30
+ args.map { |args| args.delete_prefix("/").tr("&?=/_-", "-") }.join("-")
31
31
  end
32
32
  end
33
33
  end
@@ -1,15 +1,15 @@
1
1
  module Lookbook
2
2
  module OutputHelper
3
3
  def markdown(text = nil, &block)
4
- Lookbook::Markdown.render(block ? capture(&block) : text)
4
+ MarkdownRenderer.call(block ? capture(&block) : text, Lookbook.config.markdown_options)
5
5
  end
6
6
 
7
- def highlight(source, **opts)
8
- Lookbook::CodeFormatter.highlight(source, **opts)
7
+ def highlight(*args, **opts)
8
+ CodeHighlighter.call(*args, **opts)
9
9
  end
10
10
 
11
- def beautify(source, **opts)
12
- Lookbook::CodeFormatter.beautify(source, **opts)
11
+ def beautify(*args, **opts)
12
+ CodeBeautifier.call(*args, **opts)
13
13
  end
14
14
 
15
15
  def pretty_json(obj)
@@ -3,7 +3,7 @@ module Lookbook
3
3
  include Utils
4
4
 
5
5
  def page_path(id)
6
- page = id.is_a?(Page) ? id : Lookbook.pages.find(id)
6
+ page = id.is_a?(Page) ? id : Lookbook.pages.find_by_id(id)
7
7
  if page.present?
8
8
  lookbook_page_path page.lookup_path
9
9
  else
@@ -16,10 +16,13 @@ module Lookbook
16
16
 
17
17
  @embed_counter ||= 0
18
18
 
19
- preview_lookup = args.first.is_a?(Symbol) ? args.first : preview_class_path(args.first)
20
- preview = Lookbook.previews.find(preview_lookup)
21
- example = args[1] ? preview&.example(args[1]) : preview&.default_example
19
+ preview = if args.first.is_a?(Symbol)
20
+ Lookbook.previews.find_by_path(args.first)
21
+ else
22
+ Lookbook.previews.find_by_preview_class(args.first)
23
+ end
22
24
 
25
+ example = args[1] ? preview&.example(args[1]) : preview&.default_example
23
26
  embed_id = "#{url_for}/embed/#{example.lookup_path}".delete_prefix("/").tr("/", "-")
24
27
 
25
28
  lookbook_render :embed,
@@ -1,5 +1,6 @@
1
1
  <% content_for :shell do %>
2
2
  <% if @previews.any? || @pages.any? %>
3
+
3
4
  <%= lookbook_render :split_layout,
4
5
  alpine_data: "$store.layout.main",
5
6
  ":class": "$store.layout.mobile && '!block'" do |layout| %>
@@ -12,50 +13,50 @@
12
13
  }",
13
14
  "@click.outside": "closeMobileSidebar",
14
15
  cloak: true do %>
16
+ <% cache do %>
17
+ <%= lookbook_render :split_layout,
18
+ alpine_data: "$store.layout.#{@pages.any? && @previews.any? ? "sidebar" : "singleSectionSidebar"}",
19
+ style: "height: calc(100vh - 2.5rem);" do |layout| %>
15
20
 
16
- <%= lookbook_render :split_layout,
17
- alpine_data: "$store.layout.#{@pages.any? && @previews.any? ? "sidebar" : "singleSectionSidebar"}",
18
- style: "height: calc(100vh - 2.5rem);" do |layout| %>
19
-
20
- <% if @previews.any? %>
21
- <% layout.pane class: "overflow-hidden" do %>
22
- <%= lookbook_render :nav,
23
- id: "previews-nav",
24
- collection: @previews,
25
- alpine_data: "$store.nav.previews",
26
- collapse_singles: true do |nav| %>
27
- <%= nav.toolbar do |toolbar| %>
28
- <% toolbar.section padded: true do %>
29
- <h4 class="pt-1">Previews</h4>
30
- <% end %>
31
- <% toolbar.section align: :right, padded: false do %>
32
- <%= lookbook_render :button_group, size: :xs do |group| %>
33
- <% group.button icon: :minus_square,
34
- tooltip: "Collapse all",
35
- "@click": "closeAll" %>
21
+ <% if @previews.any? %>
22
+ <% layout.pane class: "overflow-hidden" do %>
23
+ <%= lookbook_render :nav,
24
+ id: "previews-nav",
25
+ tree: @previews.to_tree,
26
+ alpine_data: "$store.nav.previews" do |nav| %>
27
+ <%= nav.toolbar do |toolbar| %>
28
+ <% toolbar.section padded: true do %>
29
+ <h4 class="pt-1">Previews</h4>
30
+ <% end %>
31
+ <% toolbar.section align: :right, padded: false do %>
32
+ <%= lookbook_render :button_group, size: :xs do |group| %>
33
+ <% group.button icon: :minus_square,
34
+ tooltip: "Collapse all",
35
+ "@click": "closeAll" %>
36
+ <% end %>
36
37
  <% end %>
37
38
  <% end %>
39
+ <% nav.filter store: "$store.nav.previews.filter", placeholder: "Filter previews by name&hellip;" %>
38
40
  <% end %>
39
- <% nav.filter store: "$store.nav.previews.filter", placeholder: "Filter previews by name&hellip;" %>
40
41
  <% end %>
41
42
  <% end %>
42
- <% end %>
43
43
 
44
- <% if @pages.any? %>
45
- <% layout.pane class: "overflow-hidden" do %>
46
- <%= lookbook_render :nav,
47
- id: "pages-nav",
48
- collection: @pages,
49
- alpine_data: "$store.nav.pages" do |nav| %>
50
- <%= nav.toolbar do |toolbar| %>
51
- <% toolbar.section padded: true do %>
52
- <h4 class="pt-1">Pages</h4>
53
- <% end %>
54
- <% toolbar.section align: :right, padded: false do %>
55
- <%= lookbook_render :button_group, size: :xs do |group| %>
56
- <% group.button icon: :minus_square,
57
- tooltip: "Collapse all",
58
- "@click": "closeAll" %>
44
+ <% if @pages.any? %>
45
+ <% layout.pane class: "overflow-hidden" do %>
46
+ <%= lookbook_render :nav,
47
+ id: "pages-nav",
48
+ tree: @pages.to_tree,
49
+ alpine_data: "$store.nav.pages" do |nav| %>
50
+ <%= nav.toolbar do |toolbar| %>
51
+ <% toolbar.section padded: true do %>
52
+ <h4 class="pt-1">Pages</h4>
53
+ <% end %>
54
+ <% toolbar.section align: :right, padded: false do %>
55
+ <%= lookbook_render :button_group, size: :xs do |group| %>
56
+ <% group.button icon: :minus_square,
57
+ tooltip: "Collapse all",
58
+ "@click": "closeAll" %>
59
+ <% end %>
59
60
  <% end %>
60
61
  <% end %>
61
62
  <% end %>
@@ -69,6 +70,7 @@
69
70
  <%= content_for?(:main) ? yield(:main) : yield %>
70
71
  <% end %>
71
72
  <% end %>
73
+
72
74
  <% else %>
73
75
  <div id="app-main" class="w-screen h-full overflow-hidden">
74
76
  <%= content_for?(:main) ? yield(:main) : yield %>
@@ -77,4 +79,4 @@
77
79
  <div class="absolute opacity-0 bg-black inset-0 top-[39px] z-[-1] transition-opacity" :class="($store.layout.mobile && !sidebarHidden) && '!opacity-30 !z-40'" data-cloak></div>
78
80
  <% end %>
79
81
 
80
- <%= render template: "layouts/lookbook/shell" %>
82
+ <%= render template: "layouts/lookbook/shell" %>
@@ -16,7 +16,7 @@
16
16
  size: :lg,
17
17
  icon: :chevron_left,
18
18
  tooltip: "Previous page",
19
- href: lookbook_page_path(@previous_page.lookup_path),
19
+ href: lookbook_page_path(@previous_page.path),
20
20
  class: "pr-0.5 bg-transparent" %>
21
21
  <% else %>
22
22
  <%= lookbook_render :button,
@@ -31,7 +31,7 @@
31
31
  size: :lg,
32
32
  icon: :chevron_right,
33
33
  tooltip: "Next page",
34
- href: lookbook_page_path(@next_page.lookup_path),
34
+ href: lookbook_page_path(@next_page.path),
35
35
  class: "pl-0.5 bg-transparent" %>
36
36
  <% else %>
37
37
  <%= lookbook_render :button,
@@ -2,6 +2,7 @@
2
2
  <div
3
3
  id="app"
4
4
  x-data="app"
5
+ x-cloak
5
6
  @popstate.window="handleNavigation"
6
7
  @click.document="hijax"
7
8
  @navigation:start="closeMobileSidebar"
@@ -13,8 +14,8 @@
13
14
  </style>
14
15
  <% end %>
15
16
 
16
- <%= lookbook_render :header, id: "app-header", debug_menu: config.debug_menu do |header| %>
17
- <% header.branding { config.project_name } %>
17
+ <%= lookbook_render :header, id: "app-header", debug_menu: @config.debug_menu do |header| %>
18
+ <% header.branding { @config.project_name } %>
18
19
  <% end %>
19
20
 
20
21
  <%= content_for?(:shell) ? yield(:shell) : yield %>
@@ -6,7 +6,7 @@
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
7
7
 
8
8
  <link href="<%= asset_path("/css/lookbook.css") %>" rel="stylesheet">
9
- <link href="<%= asset_path("/css/themes/#{config.ui_theme}.css") %>" rel="stylesheet">
9
+ <link href="<%= asset_path("/css/themes/#{@config.ui_theme}.css") %>" rel="stylesheet">
10
10
 
11
11
  <%- if @theme_overrides.present? %>
12
12
  <style media="all">
@@ -14,7 +14,7 @@
14
14
  </style>
15
15
  <% end %>
16
16
 
17
- <% if config.ui_favicon == true %>
17
+ <% if @config.ui_favicon == true %>
18
18
  <link
19
19
  rel="icon"
20
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"
@@ -26,10 +26,10 @@
26
26
  <% end %>
27
27
 
28
28
  <script>
29
- window.LOG_LEVEL = <%= Lookbook::Engine.log_level %>;
30
- window.APP_NAME = "<%= Lookbook::Engine.app_name %>";
31
- <% if Lookbook::Engine.websocket %>
32
- window.SOCKET_PATH = "<%= Lookbook::Engine.websocket_mount_path %>";
29
+ window.LOG_LEVEL = <%= @config.log_level %>;
30
+ window.APP_NAME = "<%= @engine.app_name %>";
31
+ <% if @engine.websocket.mounted? %>
32
+ window.SOCKET_PATH = "<%= @engine.websocket.full_mount_path %>";
33
33
  <% end %>
34
34
  </script>
35
35
 
@@ -38,7 +38,7 @@
38
38
  <script src="<%= asset_path("/js/embed.js") %>" defer></script>
39
39
  <% end %>
40
40
 
41
- <title><%= [@title, config.project_name || "Lookbook"].compact.join(" :: ") %></title>
41
+ <title><%= [@title, @config.project_name || "Lookbook"].compact.join(" :: ") %></title>
42
42
  </head>
43
43
  <body>
44
44
  <%= yield :body %>
@@ -1,8 +1,19 @@
1
1
  <div id="landing" class="flex flex-col items-center justify-center h-full w-full">
2
2
  <div class="text-center" id="landing-<%= @previews.any? ? "with" : "no" %>-content">
3
- <h5 class="text-base text-lookbook-blank-slate-title truncate uppercase font-black tracking-wider mb-2">
4
- <%= config.project_name %>
3
+ <% if @config.project_name.downcase == "lookbook" %>
4
+ <div class="flex justify-center pb-4">
5
+ <svg class="flex-none mx-auto w-[140px]" viewBox="0 0 275 36">
6
+ <g fill-rule="nonzero" fill="none">
7
+ <path d="M4.536 35c-1.408 0-2.504-.392-3.288-1.176-.784-.784-1.176-1.88-1.176-3.288V5.576c0-1.44.384-2.544 1.152-3.312.768-.768 1.856-1.152 3.264-1.152 1.44 0 2.536.384 3.288 1.152.752.768 1.128 1.872 1.128 3.312v22.08h11.712c1.216 0 2.152.312 2.808.936.656.624.984 1.528.984 2.712 0 1.184-.328 2.096-.984 2.736-.656.64-1.592.96-2.808.96H4.536ZM42.066.632c3.425 0 6.425.72 9 2.16 2.577 1.44 4.585 3.464 6.025 6.072 1.44 2.608 2.16 5.672 2.16 9.192 0 2.624-.408 5.008-1.224 7.152-.816 2.144-1.984 3.992-3.504 5.544-1.52 1.552-3.336 2.736-5.448 3.552-2.112.816-4.448 1.224-7.008 1.224-3.424 0-6.432-.728-9.024-2.184-2.592-1.456-4.6-3.496-6.024-6.12-1.424-2.624-2.136-5.68-2.136-9.168 0-2.624.408-5.008 1.224-7.152.816-2.144 1.984-3.984 3.504-5.52 1.52-1.536 3.336-2.712 5.448-3.528C37.17 1.04 39.507.632 42.067.632Zm0 7.392c-1.663 0-3.095.392-4.295 1.176-1.2.784-2.12 1.92-2.76 3.408-.64 1.488-.96 3.304-.96 5.448 0 3.168.704 5.64 2.112 7.416 1.408 1.776 3.376 2.664 5.904 2.664 1.696 0 3.136-.4 4.32-1.2 1.07-.723 1.917-1.733 2.543-3.031-.39-1.314-.934-2.855-2.087-5.286-.07-.147-.07-.233 0-.38l2.187-5.84a8.262 8.262 0 0 0-1.06-1.735c-1.407-1.76-3.375-2.64-5.903-2.64ZM80.27.632c3.424 0 6.424.72 9 2.16 2.576 1.44 4.584 3.464 6.024 6.072 1.44 2.608 2.16 5.672 2.16 9.192 0 2.624-.408 5.008-1.224 7.152-.816 2.144-1.984 3.992-3.504 5.544-1.52 1.552-3.336 2.736-5.448 3.552-2.112.816-4.448 1.224-7.008 1.224-3.424 0-6.432-.728-9.024-2.184-2.592-1.456-4.6-3.496-6.024-6.12-1.424-2.624-2.136-5.68-2.136-9.168 0-2.624.408-5.008 1.224-7.152.816-2.144 1.984-3.984 3.504-5.52 1.52-1.536 3.336-2.712 5.448-3.528C75.373 1.04 77.71.632 80.27.632Zm0 7.392c-1.664 0-3.096.392-4.296 1.176-1.2.784-2.12 1.92-2.76 3.408-.64 1.488-.96 3.304-.96 5.448 0 3.168.704 5.64 2.112 7.416 1.408 1.776 3.376 2.664 5.904 2.664 1.696 0 3.136-.4 4.32-1.2.999-.675 1.804-1.6 2.416-2.775-.395-1.37-.933-2.95-2.162-5.542-.07-.147-.07-.233 0-.38l2.276-6.08a8.166 8.166 0 0 0-.946-1.495c-1.408-1.76-3.376-2.64-5.904-2.64Zm26.299 27.408c-1.408 0-2.496-.392-3.264-1.176-.768-.784-1.152-1.88-1.152-3.288V5.192c0-1.472.384-2.584 1.152-3.336.768-.752 1.856-1.128 3.264-1.128 1.44 0 2.536.376 3.288 1.128.752.752 1.128 1.864 1.128 3.336v10.464h.096l11.664-12.864a7.705 7.705 0 0 1 1.944-1.512c.688-.368 1.464-.552 2.328-.552 1.344 0 2.312.344 2.904 1.032.592.688.864 1.488.816 2.4-.048.912-.424 1.752-1.128 2.52l-11.616 12.336v-3.6l12.192 13.776c.832.928 1.248 1.88 1.248 2.856s-.328 1.784-.984 2.424c-.656.64-1.624.96-2.904.96-1.088 0-1.96-.216-2.616-.648-.656-.432-1.368-1.08-2.136-1.944L111.08 19.736h-.096v11.232c0 1.408-.368 2.504-1.104 3.288-.736.784-1.84 1.176-3.312 1.176Z" fill="#919191"/>
8
+ <path d="M140.403 35c-1.504 0-2.648-.392-3.432-1.176-.784-.784-1.176-1.912-1.176-3.384V5.72c0-1.472.392-2.6 1.176-3.384.784-.784 1.928-1.176 3.432-1.176h11.712c2.432 0 4.504.36 6.216 1.08 1.712.72 3.016 1.736 3.912 3.048.896 1.312 1.344 2.848 1.344 4.608 0 1.984-.568 3.68-1.704 5.088-1.136 1.408-2.68 2.368-4.632 2.88v-.768c2.304.416 4.088 1.344 5.352 2.784 1.264 1.44 1.896 3.28 1.896 5.52 0 2.976-1.064 5.32-3.192 7.032-2.128 1.712-5.032 2.568-8.712 2.568h-12.192Zm3.84-6.48h7.152c1.632 0 2.824-.312 3.576-.936.752-.624 1.128-1.56 1.128-2.808 0-1.248-.376-2.176-1.128-2.784-.752-.608-1.944-.912-3.576-.912h-7.152v7.44Zm0-13.92h6.288c1.6 0 2.776-.288 3.528-.864.752-.576 1.128-1.456 1.128-2.64 0-1.184-.376-2.056-1.128-2.616-.752-.56-1.928-.84-3.528-.84h-6.288v6.96Zm41.034 20.928c-3.424 0-6.432-.728-9.024-2.184-2.592-1.456-4.6-3.496-6.024-6.12-1.424-2.624-2.136-5.68-2.136-9.168 0-2.624.408-5.008 1.224-7.152.816-2.144 1.984-3.984 3.504-5.52 1.52-1.536 3.336-2.712 5.448-3.528 2.112-.816 4.448-1.224 7.008-1.224 3.424 0 6.424.72 9 2.16 2.576 1.44 4.584 3.464 6.024 6.072 1.44 2.608 2.16 5.672 2.16 9.192 0 2.624-.408 5.008-1.224 7.152-.816 2.144-1.984 3.992-3.504 5.544-1.52 1.552-3.336 2.736-5.448 3.552-2.112.816-4.448 1.224-7.008 1.224Zm0-7.392c1.696 0 3.136-.4 4.32-1.2 1.184-.8 2.096-1.952 2.736-3.456.64-1.504.96-3.312.96-5.424 0-3.168-.704-5.632-2.112-7.392-1.408-1.76-3.376-2.64-5.904-2.64-1.664 0-3.096.392-4.296 1.176-1.2.784-2.12 1.92-2.76 3.408-.64 1.488-.96 3.304-.96 5.448 0 3.168.704 5.64 2.112 7.416 1.408 1.776 3.376 2.664 5.904 2.664Zm38.203 7.392c-3.424 0-6.432-.728-9.024-2.184-2.592-1.456-4.6-3.496-6.024-6.12-1.424-2.624-2.136-5.68-2.136-9.168 0-2.624.408-5.008 1.224-7.152.816-2.144 1.984-3.984 3.504-5.52 1.52-1.536 3.336-2.712 5.448-3.528 2.112-.816 4.448-1.224 7.008-1.224 3.424 0 6.424.72 9 2.16 2.576 1.44 4.584 3.464 6.024 6.072 1.44 2.608 2.16 5.672 2.16 9.192 0 2.624-.408 5.008-1.224 7.152-.816 2.144-1.984 3.992-3.504 5.544-1.52 1.552-3.336 2.736-5.448 3.552-2.112.816-4.448 1.224-7.008 1.224Zm0-7.392c1.696 0 3.136-.4 4.32-1.2 1.184-.8 2.096-1.952 2.736-3.456.64-1.504.96-3.312.96-5.424 0-3.168-.704-5.632-2.112-7.392-1.408-1.76-3.376-2.64-5.904-2.64-1.664 0-3.096.392-4.296 1.176-1.2.784-2.12 1.92-2.76 3.408-.64 1.488-.96 3.304-.96 5.448 0 3.168.704 5.64 2.112 7.416 1.408 1.776 3.376 2.664 5.904 2.664Zm26.299 7.296c-1.408 0-2.496-.392-3.264-1.176-.768-.784-1.152-1.88-1.152-3.288V5.192c0-1.472.384-2.584 1.152-3.336.768-.752 1.856-1.128 3.264-1.128 1.44 0 2.536.376 3.288 1.128.752.752 1.128 1.864 1.128 3.336v10.464h.096l11.664-12.864a7.705 7.705 0 0 1 1.944-1.512c.688-.368 1.464-.552 2.328-.552 1.344 0 2.312.344 2.904 1.032.592.688.864 1.488.816 2.4-.048.912-.424 1.752-1.128 2.52l-11.616 12.336v-3.6l12.192 13.776c.832.928 1.248 1.88 1.248 2.856s-.328 1.784-.984 2.424c-.656.64-1.624.96-2.904.96-1.088 0-1.96-.216-2.616-.648-.656-.432-1.368-1.08-2.136-1.944L254.29 19.736h-.096v11.232c0 1.408-.368 2.504-1.104 3.288-.736.784-1.84 1.176-3.312 1.176Z" fill="#ABABAB"/>
9
+ </g>
10
+ </svg>
11
+ </div>
12
+ <% elsif @config.project_name != false %>
13
+ <h5 class="text-base text-lookbook-blank-slate-title truncate uppercase font-black tracking-wide mb-2">
14
+ <%= @config.project_name %>
5
15
  </h5>
16
+ <% end %>
6
17
  <div class="opacity-60">
7
18
  <% if @previews.any? %>
8
19
  <p>Select a preview from the nav to get started.</p>
@@ -3,18 +3,18 @@ button_classes = [
3
3
  "relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full
4
4
  cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2
5
5
  focus:ring-offset-2 focus:ring-input-border-focus",
6
- value == true ? "bg-lookbook-input-toggle-active" : "bg-lookbook-input-toggle"
6
+ value == "true" ? "bg-lookbook-input-toggle-active" : "bg-lookbook-input-toggle"
7
7
  ]
8
8
  span_classes = [
9
9
  "pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow ring-0 transition ease-in-out duration-200",
10
- value == true ? "translate-x-5" : "translate-x-0"
10
+ value == "true" ? "translate-x-5" : "translate-x-0"
11
11
  ]
12
12
  %>
13
13
 
14
- <%= button_tag **input_options,
14
+ <%= tag.button **input_options,
15
15
  class: class_names(button_classes),
16
16
  role: "switch",
17
17
  type: "button",
18
- "@click.stop": "value = !value" do %>
18
+ "@click.stop": "value = value == 'true' ? 'false' : 'true'", escape: false do %>
19
19
  <%= tag.span "aria-hidden": true, class: class_names(span_classes) %>
20
- <% end %>
20
+ <% end %>
@@ -2,7 +2,7 @@
2
2
  <% if items.many? %>
3
3
  <div class="divide-y divide-dashed divide-lookbook-divider bg-lookbook-prose-bg h-full w-full">
4
4
  <% items.each do |item| %>
5
- <div class="px-4 py-6 relative">
5
+ <div class="p-4 relative">
6
6
  <h6 class="italic font-mono mb-4 opacity-40">
7
7
  # <%= item.label %>
8
8
  </h6>
@@ -11,7 +11,7 @@
11
11
  <% end %>
12
12
  </div>
13
13
  <% else %>
14
- <div class="px-4 py-6 bg-lookbook-prose-bg w-full h-full">
14
+ <div class="p-4 w-full h-full bg-lookbook-prose-bg">
15
15
  <%= lookbook_render :prose do %>
16
16
  <%== items.any? ? items.first.notes : "<em class='opacity-50'>No notes provided.</em>" %>
17
17
  <% end %>
@@ -0,0 +1,15 @@
1
+ <% if @params.none? %>
2
+ <div class="p-4 w-full h-full bg-lookbook-prose-bg" id="params-editor-blank-slate">
3
+ <%= lookbook_render :prose do %>
4
+ <em class='opacity-50'>No params configured.</em>
5
+ <% end %>
6
+ </div>
7
+ <% else %>
8
+ <div class="p-4 w-full h-full overflow-x-hidden" id="params-editor-<%= @target.id %>">
9
+ <%= lookbook_render "params/editor" do |editor| %>
10
+ <% @params.each do |param| %>
11
+ <% editor.field param: param %>
12
+ <% end %>
13
+ <% end %>
14
+ </div>
15
+ <% end %>