lookbook 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +47 -14
  4. data/app/components/lookbook/code/component.html.erb +1 -1
  5. data/app/components/lookbook/inspector_panel/component.rb +3 -5
  6. data/app/components/lookbook/nav/item/component.html.erb +1 -1
  7. data/app/components/lookbook/params/editor/component.rb +3 -10
  8. data/app/components/lookbook/params/field/component.html.erb +8 -8
  9. data/app/components/lookbook/params/field/component.rb +21 -72
  10. data/app/controllers/concerns/lookbook/targetable_concern.rb +156 -0
  11. data/app/controllers/concerns/lookbook/with_preview_controller_concern.rb +13 -0
  12. data/app/controllers/lookbook/application_controller.rb +13 -3
  13. data/app/controllers/lookbook/inspector_controller.rb +45 -0
  14. data/app/controllers/lookbook/page_controller.rb +11 -7
  15. data/app/controllers/lookbook/previews_controller.rb +4 -210
  16. data/app/helpers/lookbook/output_helper.rb +5 -5
  17. data/app/views/layouts/lookbook/skeleton.html.erb +3 -3
  18. data/app/views/lookbook/index.html.erb +12 -1
  19. data/app/views/lookbook/{previews → inspector}/inputs/_color.html.erb +0 -0
  20. data/app/views/lookbook/{previews → inspector}/inputs/_range.html.erb +0 -0
  21. data/app/views/lookbook/{previews → inspector}/inputs/_select.html.erb +0 -0
  22. data/app/views/lookbook/{previews → inspector}/inputs/_text.html.erb +0 -0
  23. data/app/views/lookbook/{previews → inspector}/inputs/_textarea.html.erb +0 -0
  24. data/app/views/lookbook/{previews → inspector}/inputs/_toggle.html.erb +3 -3
  25. data/app/views/lookbook/{previews → inspector}/panels/_content.html.erb +0 -0
  26. data/app/views/lookbook/{previews → inspector}/panels/_notes.html.erb +0 -0
  27. data/app/views/lookbook/{previews → inspector}/panels/_output.html.erb +0 -0
  28. data/app/views/lookbook/{previews → inspector}/panels/_params.html.erb +4 -4
  29. data/app/views/lookbook/{previews → inspector}/panels/_preview.html.erb +0 -0
  30. data/app/views/lookbook/{previews → inspector}/panels/_source.html.erb +0 -0
  31. data/app/views/lookbook/{previews → inspector}/show.html.erb +4 -1
  32. data/config/app.yml +8 -1
  33. data/config/inputs.yml +12 -12
  34. data/config/panels.yml +5 -5
  35. data/config/routes.rb +5 -5
  36. data/config/tags.yml +4 -1
  37. data/lib/lookbook/engine.rb +101 -150
  38. data/lib/lookbook/file_watcher.rb +47 -0
  39. data/lib/lookbook/page.rb +15 -16
  40. data/lib/lookbook/param.rb +99 -0
  41. data/lib/lookbook/preview.rb +8 -1
  42. data/lib/lookbook/{preview_controller.rb → preview_actions.rb} +14 -3
  43. data/lib/lookbook/preview_example.rb +1 -1
  44. data/lib/lookbook/preview_group.rb +0 -4
  45. data/lib/lookbook/preview_parser.rb +53 -0
  46. data/lib/lookbook/process.rb +21 -0
  47. data/lib/lookbook/services/code/code_beautifier.rb +21 -0
  48. data/lib/lookbook/services/code/code_highlighter.rb +69 -0
  49. data/lib/lookbook/services/data/parsers/data_parser.rb +22 -0
  50. data/lib/lookbook/services/data/parsers/json_parser.rb +7 -0
  51. data/lib/lookbook/services/data/parsers/yaml_parser.rb +7 -0
  52. data/lib/lookbook/services/data/resolvers/data_resolver.rb +70 -0
  53. data/lib/lookbook/services/data/resolvers/eval_resolver.rb +10 -0
  54. data/lib/lookbook/services/data/resolvers/file_resolver.rb +28 -0
  55. data/lib/lookbook/services/data/resolvers/method_resolver.rb +10 -0
  56. data/lib/lookbook/services/data/resolvers/yaml_resolver.rb +18 -0
  57. data/lib/lookbook/services/markdown_renderer.rb +29 -0
  58. data/lib/lookbook/services/string_value_caster.rb +60 -0
  59. data/lib/lookbook/services/tags/tag_options_parser.rb +62 -0
  60. data/lib/lookbook/services/templates/action_view_annotations_handler.rb +21 -0
  61. data/lib/lookbook/services/templates/action_view_annotations_stripper.rb +15 -0
  62. data/lib/lookbook/services/templates/frontmatter_extractor.rb +28 -0
  63. data/lib/lookbook/services/templates/styles_extractor.rb +38 -0
  64. data/lib/lookbook/services/{search_param_builder.rb → urls/search_param_builder.rb} +1 -1
  65. data/lib/lookbook/services/{search_param_parser.rb → urls/search_param_parser.rb} +1 -1
  66. data/lib/lookbook/source_inspector.rb +26 -45
  67. data/lib/lookbook/stores/config_store.rb +7 -8
  68. data/lib/lookbook/stores/input_store.rb +7 -3
  69. data/lib/lookbook/stores/tag_store.rb +3 -5
  70. data/lib/lookbook/support/null_object.rb +10 -0
  71. data/lib/lookbook/support/service.rb +2 -2
  72. data/lib/lookbook/support/store.rb +1 -1
  73. data/lib/lookbook/support/utils/attribute_utils.rb +6 -1
  74. data/lib/lookbook/support/utils/path_utils.rb +6 -3
  75. data/lib/lookbook/tags/component_tag.rb +7 -0
  76. data/lib/lookbook/tags/custom_tag.rb +59 -0
  77. data/lib/lookbook/tags/display_tag.rb +15 -0
  78. data/lib/lookbook/tags/hidden_tag.rb +13 -0
  79. data/lib/lookbook/tags/id_tag.rb +7 -0
  80. data/lib/lookbook/tags/label_tag.rb +4 -0
  81. data/lib/lookbook/tags/logical_path.rb +4 -0
  82. data/lib/lookbook/tags/param_tag.rb +61 -0
  83. data/lib/lookbook/tags/position_tag.rb +16 -0
  84. data/lib/lookbook/tags/tag_provider.rb +18 -0
  85. data/lib/lookbook/tags/yard_tag.rb +62 -0
  86. data/lib/lookbook/utils.rb +0 -40
  87. data/lib/lookbook/version.rb +1 -1
  88. data/lib/lookbook/websocket.rb +60 -0
  89. data/lib/lookbook.rb +2 -1
  90. data/public/lookbook-assets/css/lookbook.css +30 -77
  91. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  92. data/public/lookbook-assets/js/lookbook.js +7 -2
  93. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  94. metadata +55 -26
  95. data/lib/lookbook/code_formatter.rb +0 -68
  96. data/lib/lookbook/markdown.rb +0 -22
  97. data/lib/lookbook/params.rb +0 -157
  98. data/lib/lookbook/parser.rb +0 -42
  99. data/lib/lookbook/tag.rb +0 -122
  100. data/lib/lookbook/tag_options.rb +0 -111
  101. data/lib/lookbook/tags.rb +0 -17
  102. data/lib/lookbook/template_parser.rb +0 -72
@@ -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
@@ -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)
@@ -26,10 +26,10 @@
26
26
  <% end %>
27
27
 
28
28
  <script>
29
- window.LOG_LEVEL = <%= Lookbook::Engine.log_level %>;
29
+ window.LOG_LEVEL = <%= config.log_level %>;
30
30
  window.APP_NAME = "<%= Lookbook::Engine.app_name %>";
31
- <% if Lookbook::Engine.websocket %>
32
- window.SOCKET_PATH = "<%= Lookbook::Engine.websocket_mount_path %>";
31
+ <% if Lookbook::Engine.websocket.mounted? %>
32
+ window.SOCKET_PATH = "<%= Lookbook::Engine.websocket.full_mount_path %>";
33
33
  <% end %>
34
34
  </script>
35
35
 
@@ -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">
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">
4
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,11 +3,11 @@ 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
 
@@ -15,6 +15,6 @@ span_classes = [
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'" do %>
19
19
  <%= tag.span "aria-hidden": true, class: class_names(span_classes) %>
20
20
  <% end %>
@@ -1,4 +1,4 @@
1
- <% if preview.params.none? %>
1
+ <% if @params.none? %>
2
2
  <div class="p-4 w-full h-full bg-lookbook-prose-bg">
3
3
  <%= lookbook_render :prose do %>
4
4
  <em class='opacity-50'>No params configured.</em>
@@ -6,9 +6,9 @@
6
6
  </div>
7
7
  <% else %>
8
8
  <div class="h-full overflow-x-hidden">
9
- <%= lookbook_render "params/editor", inputs: Lookbook::Engine.inputs do |editor| %>
10
- <% preview.params.each do |param| %>
11
- <% editor.field **param, value: params[param[:name]] %>
9
+ <%= lookbook_render "params/editor" do |editor| %>
10
+ <% @params.each do |param| %>
11
+ <% editor.field param: param %>
12
12
  <% end %>
13
13
  <% end %>
14
14
  </div>
@@ -1,6 +1,9 @@
1
1
  <%= lookbook_render :split_layout,
2
2
  alpine_data: "$store.layout.inspector",
3
- ":class": "($store.inspector.drawer.hidden || #{@drawer_panels.none?}) && '!grid-rows-[1fr] !grid-cols-[1fr]'" do |layout| %>
3
+ ":class": "($store.inspector.drawer.hidden || #{@drawer_panels.none?}) && '!grid-rows-[1fr] !grid-cols-[1fr]'",
4
+ data: {
5
+ "preview-target": @target.id
6
+ } do |layout| %>
4
7
 
5
8
  <%= layout.pane class: "flex flex-col h-full overflow-hidden",
6
9
  "x-effect": "forceOrientation = (layoutWidth < $store.inspector.minVerticalSplitWidth) ? 'horizontal' : null" do %>
data/config/app.yml CHANGED
@@ -2,11 +2,12 @@ shared:
2
2
  project_name: Lookbook
3
3
  log_level: 2
4
4
  log_use_rails_logger: true
5
- auto_refresh: true
5
+ auto_refresh: false
6
6
  components_path: app/components
7
7
  page_controller: Lookbook::PageController
8
8
  page_route: pages
9
9
  page_paths: [test/components/docs]
10
+ page_extensions: [html.*, md.*]
10
11
  page_options: {}
11
12
  markdown_options:
12
13
  tables: true
@@ -33,4 +34,10 @@ shared:
33
34
 
34
35
  development:
35
36
  listen: true
37
+ auto_refresh: true
38
+ debug_menu: true
39
+
40
+ test:
41
+ listen: false
42
+ auto_refresh: false
36
43
  debug_menu: true
data/config/inputs.yml CHANGED
@@ -1,48 +1,48 @@
1
1
  shared:
2
2
  select:
3
- partial: lookbook/previews/inputs/select
3
+ partial: lookbook/inspector/inputs/select
4
4
  opts: {}
5
5
 
6
6
  textarea:
7
- partial: lookbook/previews/inputs/textarea
7
+ partial: lookbook/inspector/inputs/textarea
8
8
  opts: {}
9
9
 
10
10
  toggle:
11
- partial: lookbook/previews/inputs/toggle
11
+ partial: lookbook/inspector/inputs/toggle
12
12
  opts: {}
13
13
 
14
14
  color:
15
- partial: lookbook/previews/inputs/color
15
+ partial: lookbook/inspector/inputs/color
16
16
  opts: {}
17
17
 
18
18
  range:
19
- partial: lookbook/previews/inputs/range
19
+ partial: lookbook/inspector/inputs/range
20
20
  opts: {}
21
21
 
22
22
  text:
23
- partial: lookbook/previews/inputs/text
23
+ partial: lookbook/inspector/inputs/text
24
24
  opts: {}
25
25
 
26
26
  email:
27
- partial: lookbook/previews/inputs/text
27
+ partial: lookbook/inspector/inputs/text
28
28
  opts: {}
29
29
 
30
30
  number:
31
- partial: lookbook/previews/inputs/text
31
+ partial: lookbook/inspector/inputs/text
32
32
  opts: {}
33
33
 
34
34
  tel:
35
- partial: lookbook/previews/inputs/text
35
+ partial: lookbook/inspector/inputs/text
36
36
  opts: {}
37
37
 
38
38
  url:
39
- partial: lookbook/previews/inputs/text
39
+ partial: lookbook/inspector/inputs/text
40
40
  opts: {}
41
41
 
42
42
  date:
43
- partial: lookbook/previews/inputs/text
43
+ partial: lookbook/inspector/inputs/text
44
44
  opts: {}
45
45
 
46
46
  datetime_local:
47
- partial: lookbook/previews/inputs/text
47
+ partial: lookbook/inspector/inputs/text
48
48
  opts: {}
data/config/panels.yml CHANGED
@@ -1,30 +1,30 @@
1
1
  shared:
2
2
  main:
3
3
  - name: preview
4
- partial: lookbook/previews/panels/preview
4
+ partial: lookbook/inspector/panels/preview
5
5
  label: Preview
6
6
  hotkey: v
7
7
 
8
8
  - name: output
9
- partial: lookbook/previews/panels/output
9
+ partial: lookbook/inspector/panels/output
10
10
  label: HTML
11
11
  hotkey: h
12
12
 
13
13
  drawer:
14
14
  - name: source
15
- partial: lookbook/previews/panels/source
15
+ partial: lookbook/inspector/panels/source
16
16
  label: Source
17
17
  hotkey: s
18
18
  copy: "->(data) { data.examples.map { |e| e.source }.join(\n) }"
19
19
 
20
20
  - name: notes
21
- partial: lookbook/previews/panels/notes
21
+ partial: lookbook/inspector/panels/notes
22
22
  label: Notes
23
23
  hotkey: n
24
24
  disabled: ->(data) { data.examples.select { |e| e.notes.present? }.none? }
25
25
 
26
26
  - name: params
27
- partial: lookbook/previews/panels/params
27
+ partial: lookbook/inspector/panels/params
28
28
  label: Params
29
29
  hotkey: p
30
30
  disabled: ->(data) { data.preview.params.none? }
data/config/routes.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  Lookbook::Engine.routes.draw do
2
- if Lookbook::Engine.websocket?
3
- mount Lookbook::Engine.websocket => "/cable", :as => :cable
2
+ if Lookbook::Engine.websocket.mountable?
3
+ mount Lookbook::Engine.websocket.server => "/cable", :as => :cable
4
4
  end
5
5
 
6
6
  root to: "application#index", as: :lookbook_home
@@ -8,8 +8,8 @@ Lookbook::Engine.routes.draw do
8
8
  get "/#{Lookbook.config.page_route}", to: "pages#index", as: :lookbook_page_index
9
9
  get "/#{Lookbook.config.page_route}/*path", to: "pages#show", as: :lookbook_page
10
10
 
11
- get "/preview/*path", to: "previews#preview", as: :lookbook_preview
12
- get "/inspect/*path", to: "previews#show", as: :lookbook_inspect
11
+ get "/preview/*path", to: "previews#show", as: :lookbook_preview
12
+ get "/inspect/*path", to: "inspector#show", as: :lookbook_inspect
13
13
 
14
- get "/*path", to: "previews#show_legacy", as: :lookbook_inspect_legacy
14
+ get "/*path", to: "inspector#show_legacy", as: :lookbook_inspect_legacy
15
15
  end
data/config/tags.yml CHANGED
@@ -25,5 +25,8 @@ shared:
25
25
 
26
26
  param:
27
27
  label: Param
28
- yard_parser: with_name
28
+ opts: {}
29
+
30
+ logical_path:
31
+ label: Logical Path
29
32
  opts: {}