lookbook 1.0.0.beta.1 → 1.0.0.beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +180 -40
  3. data/app/components/lookbook/{component.rb → base_component.rb} +1 -1
  4. data/app/components/lookbook/button/component.rb +1 -1
  5. data/app/components/lookbook/button_group/component.rb +1 -1
  6. data/app/components/lookbook/code/component.rb +1 -1
  7. data/app/components/lookbook/copy_button/component.html.erb +1 -1
  8. data/app/components/lookbook/copy_button/component.rb +1 -1
  9. data/app/components/lookbook/dimensions_display/component.rb +1 -1
  10. data/app/components/lookbook/embed/component.html.erb +6 -5
  11. data/app/components/lookbook/embed/component.rb +1 -1
  12. data/app/components/lookbook/filter/component.html.erb +1 -1
  13. data/app/components/lookbook/filter/component.rb +1 -1
  14. data/app/components/lookbook/header/component.html.erb +6 -11
  15. data/app/components/lookbook/header/component.rb +6 -1
  16. data/app/components/lookbook/icon/component.rb +1 -1
  17. data/app/components/lookbook/nav/component.rb +1 -1
  18. data/app/components/lookbook/nav/item/component.html.erb +2 -2
  19. data/app/components/lookbook/nav/item/component.rb +1 -1
  20. data/app/components/lookbook/page_tabs/component.rb +1 -1
  21. data/app/components/lookbook/params_editor/component.rb +1 -1
  22. data/app/components/lookbook/params_editor/field/component.rb +1 -1
  23. data/app/components/lookbook/prose/component.rb +1 -1
  24. data/app/components/lookbook/split_layout/component.rb +1 -1
  25. data/app/components/lookbook/tab_panels/component.rb +1 -1
  26. data/app/components/lookbook/tab_panels/panel/component.rb +2 -2
  27. data/app/components/lookbook/tabs/component.js +6 -6
  28. data/app/components/lookbook/tabs/component.rb +1 -1
  29. data/app/components/lookbook/tabs/dropdown_tab/component.rb +1 -1
  30. data/app/components/lookbook/tabs/tab/component.rb +1 -1
  31. data/app/components/lookbook/toolbar/component.rb +1 -1
  32. data/app/components/lookbook/viewport/component.rb +1 -1
  33. data/app/controllers/lookbook/application_controller.rb +1 -1
  34. data/app/controllers/lookbook/pages_controller.rb +1 -1
  35. data/app/controllers/lookbook/previews_controller.rb +27 -32
  36. data/app/helpers/lookbook/application_helper.rb +8 -2
  37. data/app/helpers/lookbook/component_helper.rb +4 -0
  38. data/app/helpers/lookbook/page_helper.rb +2 -2
  39. data/app/views/layouts/lookbook/application.html.erb +5 -3
  40. data/app/views/layouts/lookbook/page.html.erb +2 -2
  41. data/app/views/layouts/lookbook/shell.html.erb +2 -48
  42. data/app/views/layouts/lookbook/skeleton.html.erb +7 -1
  43. data/app/views/lookbook/404.html.erb +1 -1
  44. data/app/views/lookbook/index.html.erb +1 -1
  45. data/app/views/lookbook/pages/show.html.erb +8 -8
  46. data/app/views/lookbook/previews/panels/_notes.html.erb +1 -1
  47. data/app/views/lookbook/previews/panels/_preview.html.erb +1 -1
  48. data/app/views/lookbook/previews/show.html.erb +4 -4
  49. data/config/routes.rb +6 -6
  50. data/lib/lookbook/collection.rb +1 -1
  51. data/lib/lookbook/component.rb +31 -0
  52. data/lib/lookbook/config.rb +94 -41
  53. data/lib/lookbook/engine.rb +72 -12
  54. data/lib/lookbook/page.rb +3 -3
  55. data/lib/lookbook/parser.rb +1 -4
  56. data/lib/lookbook/preview.rb +25 -8
  57. data/lib/lookbook/preview_example.rb +2 -2
  58. data/lib/lookbook/preview_group.rb +1 -1
  59. data/lib/lookbook/source_inspector.rb +10 -0
  60. data/lib/lookbook/utils.rb +2 -2
  61. data/lib/lookbook/version.rb +1 -1
  62. data/lib/lookbook.rb +1 -12
  63. data/public/lookbook-assets/css/lookbook.css +24 -28
  64. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  65. data/public/lookbook-assets/js/lookbook.js +50 -49
  66. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  67. metadata +3 -2
@@ -1,5 +1,5 @@
1
1
  module Lookbook
2
- class Tabs::Tab::Component < Lookbook::Component
2
+ class Tabs::Tab::Component < Lookbook::BaseComponent
3
3
  def initialize(name:, label: nil, hotkey: nil, disabled: nil, position: 0, theme: :toolbar, **html_attrs)
4
4
  @name = name
5
5
  @label = label
@@ -1,5 +1,5 @@
1
1
  module Lookbook
2
- class Toolbar::Component < Lookbook::Component
2
+ class Toolbar::Component < Lookbook::BaseComponent
3
3
  DIVIDE_CLASSES = {
4
4
  left: "border-l",
5
5
  right: "border-r"
@@ -1,5 +1,5 @@
1
1
  module Lookbook
2
- class Viewport::Component < Lookbook::Component
2
+ class Viewport::Component < Lookbook::BaseComponent
3
3
  def initialize(src:, resize_height: true, resize_width: true, max_height: nil, **html_attrs)
4
4
  @src = src
5
5
  @resize_height = resize_height
@@ -15,7 +15,7 @@ module Lookbook
15
15
  def index
16
16
  landing = Lookbook.pages.find(&:landing) || Lookbook.pages.first
17
17
  if landing.present?
18
- redirect_to page_path(landing.lookup_path)
18
+ redirect_to lookbook_page_path(landing.lookup_path)
19
19
  else
20
20
  render "lookbook/index", layout: Lookbook.previews.any? ? "lookbook/application" : "lookbook/shell"
21
21
  end
@@ -10,7 +10,7 @@ module Lookbook
10
10
  def index
11
11
  landing = Lookbook.pages.find(&:landing) || Lookbook.pages.first
12
12
  if landing.present?
13
- redirect_to page_path landing.lookup_path
13
+ redirect_to lookbook_page_path landing.lookup_path
14
14
  else
15
15
  show_404
16
16
  end
@@ -44,7 +44,7 @@ module Lookbook
44
44
 
45
45
  def show_legacy
46
46
  Lookbook.logger.warn("Legacy URL path detected. These paths are deprecated and will be removed in a future version")
47
- redirect_to inspect_path params[:path]
47
+ redirect_to lookbook_inspect_path params[:path]
48
48
  end
49
49
 
50
50
  private
@@ -54,13 +54,13 @@ module Lookbook
54
54
  if @example.present?
55
55
  @preview = @example.preview
56
56
  if params[:path] == @preview&.lookup_path
57
- redirect_to inspect_path "#{params[:path]}/#{@preview.default_example.name}"
57
+ redirect_to lookbook_inspect_path "#{params[:path]}/#{@preview.default_example.name}"
58
58
  end
59
59
  else
60
60
  @preview = Lookbook.previews.find(params[:path])
61
61
  if @preview.present?
62
62
  first_example = @preview.examples.first
63
- redirect_to inspect_path(first_example.lookup_path) if first_example
63
+ redirect_to lookbook_inspect_path(first_example.lookup_path) if first_example
64
64
  else
65
65
  @preview = Lookbook.previews.find(path_segments.slice(0, path_segments.size - 1).join("/"))
66
66
  end
@@ -117,41 +117,36 @@ module Lookbook
117
117
  def inspector_data
118
118
  return @inspector_data if @inspector_data.present?
119
119
 
120
- request_data = {
120
+ context_data = {
121
121
  preview_params: preview_params,
122
122
  path: params[:path],
123
- query_parameters: request.query_parameters,
124
- original: request
125
123
  }
126
124
 
127
- preview_data = {
128
- relative_path: @preview.full_path.relative_path_from(Rails.root.to_s),
129
- full_path: @preview.full_path,
130
- example_label: @example.label,
131
- params: @example.params,
132
- }
133
- [:id, :label, :notes, :lookup_path, :full_path].each do |prop|
134
- preview_data[prop] = @preview.public_send(prop)
135
- end
125
+ example = @example
126
+ preview = @preview
127
+ preview.define_singleton_method(:params, proc {
128
+ example.params
129
+ })
136
130
 
137
- examples_data = target_examples.map do |example|
131
+ examples = target_examples.map do |example|
138
132
  render_args = @preview.render_args(example.name, params: preview_controller.params)
139
133
  has_template = render_args[:template] != "view_components/preview"
140
- example_data = Lookbook::Store.new({
141
- output: preview_controller.process(:render_example_to_string, @preview, example.name),
142
- source: has_template ? example.template_source(render_args[:template]) : example.method_source,
143
- source_lang: has_template ? example.template_lang(render_args[:template]) : example.source_lang,
144
- })
145
- [:id, :label, :notes, :lookup_path, :params, :display_params].each do |prop|
146
- example_data[prop] = example.public_send(prop)
147
- end
148
- example_data
134
+ output = preview_controller.process(:render_example_to_string, @preview, example.name)
135
+ source = has_template ? example.template_source(render_args[:template]) : example.method_source
136
+ source_lang = has_template ? example.template_lang(render_args[:template]) : example.lang
137
+
138
+ example.define_singleton_method(:output, proc { output })
139
+ example.define_singleton_method(:source, proc { source })
140
+ example.define_singleton_method(:source_lang, proc { source_lang })
141
+ example
149
142
  end
150
143
 
151
144
  @inspector_data ||= Lookbook::Store.new({
152
- request: request_data,
153
- preview: preview_data,
154
- examples: examples_data
145
+ context: context_data,
146
+ preview: preview,
147
+ examples: examples,
148
+ components: preview.components,
149
+ app: Lookbook
155
150
  })
156
151
  end
157
152
 
@@ -163,7 +158,7 @@ module Lookbook
163
158
 
164
159
  callable_data = {
165
160
  name: name.to_s,
166
- index_position: (@panels.filter { |p| p.pane == config.pane }.size + 1),
161
+ index_position: (@panels.select { |p| p.pane == config.pane }.size + 1),
167
162
  **inspector_data
168
163
  }
169
164
 
@@ -175,15 +170,15 @@ module Lookbook
175
170
  @panels << Lookbook::Store.new(resolved_config, deep: false)
176
171
  end
177
172
 
178
- @panels.filter(&:show).sort_by { |p| [p.position, p.label] }
173
+ @panels = @panels.select(&:show).sort_by { |p| [p.position, p.label] }
179
174
  end
180
175
 
181
176
  def main_panels
182
- panels.filter { |panel| panel.pane == :main }
177
+ panels.select { |panel| panel.pane == :main }
183
178
  end
184
179
 
185
180
  def drawer_panels
186
- panels.filter { |panel| panel.pane == :drawer }
181
+ panels.select { |panel| panel.pane == :drawer }
187
182
  end
188
183
 
189
184
  def preview_controller
@@ -11,14 +11,20 @@ module Lookbook
11
11
  def landing_path
12
12
  landing = Lookbook.pages.find(&:landing) || Lookbook.pages.first
13
13
  if landing.present?
14
- page_path(landing.lookup_path)
14
+ lookbook_page_path landing.lookup_path
15
15
  else
16
- home_path
16
+ lookbook_home_path
17
17
  end
18
18
  end
19
19
 
20
20
  def generate_id(*args)
21
21
  args.map { |args| args.delete_prefix("/").tr("&?=/_\-", "-") }.join("-")
22
22
  end
23
+
24
+ def append_styles(&block)
25
+ content_for :styles do
26
+ capture(&block)
27
+ end
28
+ end
23
29
  end
24
30
  end
@@ -2,6 +2,10 @@ module Lookbook
2
2
  module ComponentHelper
3
3
  COMPONENT_CLASSES = {} # cache for constantized references
4
4
 
5
+ def icon(name, **attrs)
6
+ render Lookbook::Icon::Component.new(name: name, **attrs)
7
+ end
8
+
5
9
  def render_component(ref, **attrs, &block)
6
10
  klass = component_class(ref)
7
11
  comp = attrs.key?(:content) ? klass.new(**attrs.except(:content)).with_content(attrs[:content]) : klass.new(**attrs)
@@ -5,7 +5,7 @@ module Lookbook
5
5
  def page_path(id)
6
6
  page = id.is_a?(Page) ? id : Lookbook.pages.find(id)
7
7
  if page.present?
8
- lookbook.page_path page.lookup_path
8
+ lookbook_page_path page.lookup_path
9
9
  else
10
10
  Lookbook.logger.warn "Could not find page with id ':#{id}'"
11
11
  end
@@ -16,7 +16,7 @@ module Lookbook
16
16
 
17
17
  @embed_counter ||= 0
18
18
 
19
- preview_lookup = args.first.is_a?(Symbol) ? args.first : preview_class_name(args.first)
19
+ preview_lookup = args.first.is_a?(Symbol) ? args.first : preview_class_path(args.first)
20
20
  preview = Lookbook.previews.find(preview_lookup)
21
21
  example = args[1] ? preview&.example(args[1]) : preview&.default_example
22
22
 
@@ -3,7 +3,7 @@
3
3
  alpine_data: "$store.layout.main",
4
4
  ":class": "$store.layout.mobile && '!block'" do |layout| %>
5
5
 
6
- <% layout.pane class: "flex flex-col bg-lookbook-sidebar relative translate-x-0",
6
+ <% layout.pane id: "app-sidebar", class: "flex flex-col bg-lookbook-sidebar relative translate-x-0",
7
7
  ":class": "{
8
8
  'transition': $store.layout.mobile,
9
9
  'translate-x-full': $store.layout.mobile && sidebarHidden,
@@ -17,6 +17,7 @@
17
17
  style: "height: calc(100vh - 2.5rem);" do |layout| %>
18
18
  <% layout.pane class: "overflow-hidden" do %>
19
19
  <%= render_component :nav,
20
+ id: "previews-nav",
20
21
  collection: Lookbook.previews,
21
22
  alpine_data: "$store.nav.previews",
22
23
  label: "Previews",
@@ -28,6 +29,7 @@
28
29
  <% if Lookbook.pages.any? %>
29
30
  <% layout.pane class: "overflow-hidden" do %>
30
31
  <%= render_component :nav,
32
+ id: "pages-nav",
31
33
  collection: Lookbook.pages,
32
34
  alpine_data: "$store.nav.pages",
33
35
  label: "Pages" %>
@@ -40,7 +42,7 @@
40
42
  <div x-data="{hidden: false}" class="flex-none border-t border-lookbook-divider absolute bottom-0 left-0 right-0" x-show="!hidden">
41
43
  <%= render_component :toolbar do |toolbar| %>
42
44
  <% toolbar.section padded: true, class: "flex items-center" do %>
43
- <%= render_component :icon, name: :alert_triangle, size: 4, class: "text-red-700" %>
45
+ <%= icon :alert_triangle, size: 4, class: "text-red-700" %>
44
46
  <span class="ml-2">Preview load errors</span>
45
47
  <% end %>
46
48
  <% toolbar.section align: :right do %>
@@ -67,7 +69,7 @@
67
69
  <% end %>
68
70
  <% end %>
69
71
 
70
- <% layout.pane class: "overflow-hidden", ":class": "$store.layout.mobile && 'w-screen'" do %>
72
+ <% layout.pane id: "app-main", class: "overflow-hidden", ":class": "$store.layout.mobile && 'w-screen'" do %>
71
73
  <%= content_for?(:main) ? yield(:main) : yield %>
72
74
  <% end %>
73
75
 
@@ -16,7 +16,7 @@
16
16
  size: :lg,
17
17
  icon: :chevron_left,
18
18
  tooltip: "Previous page",
19
- href: page_path(@previous_page.lookup_path),
19
+ href: lookbook_page_path(@previous_page.lookup_path),
20
20
  class: "pr-0.5 bg-transparent" %>
21
21
  <% else %>
22
22
  <%= render_component :button,
@@ -31,7 +31,7 @@
31
31
  size: :lg,
32
32
  icon: :chevron_right,
33
33
  tooltip: "Next page",
34
- href: page_path(@next_page.lookup_path),
34
+ href: lookbook_page_path(@next_page.lookup_path),
35
35
  class: "pl-0.5 bg-transparent" %>
36
36
  <% else %>
37
37
  <%= render_component :button,
@@ -7,58 +7,12 @@
7
7
  @navigation:start="closeMobileSidebar"
8
8
  class="w-screen h-screen grid grid-rows-[40px_1fr] relative">
9
9
 
10
- <%= render_component :header do |header| %>
10
+ <%= render_component :header, id: "app-header", debug_menu: config.debug_menu do |header| %>
11
11
  <% header.branding { config.project_name } %>
12
12
  <% end %>
13
13
 
14
- <% if false %>
15
- <%= render_component :toolbar, class: "group !bg-lookbook-header !text-lookbook-header-text" do |toolbar| %>
16
- <% toolbar.section padded: true do %>
17
- <%= render_component :branding,
18
- text: config.project_name,
19
- href: landing_path if config.project_name %>
20
- <% end %>
21
- <% toolbar.section padded: false, align: :right, class: "flex items-center" do %>
22
- <%= render_component :button_group, class: "relative -top-px" do |group| %>
23
- <% if Rails.env == "development" %>
24
- <% group.button icon: :help_circle, class: "opacity-50 hover:opacity-100 transition !text-lookbook-header-text" do |button| %>
25
- <% button.dropdown do %>
26
- <%= tag.div class: "divide-y divide-lookbook-divider" do %>
27
- <div class="flex items-center text-xs px-3 py-2">
28
- <span class="opacity-60 mr-1">Lookbook</span>
29
- <span class="mr-6">v<%= Lookbook::VERSION %></span>
30
- <a href="https://github.com/allmarkedup/lookbook" target="_blank" class="ml-auto opacity-70">
31
- <%= render_component :icon, name: :github, size: 3 %>
32
- </a>
33
- </div>
34
- <div class="px-3 py-2">
35
- <a href="#"
36
- class="text-xs underline"
37
- @click.stop="localStorage.clear(); window.location.reload();">
38
- Clear local storage
39
- </a>
40
- </div>
41
- <% end %>
42
- <% end %>
43
- <% end %>
44
- <% end %>
45
- <% group.button icon: :menu,
46
- "@click.stop": "toggleSidebar",
47
- x_show: "$store.layout.mobile && sidebarHidden",
48
- class: "!text-lookbook-header-text" %>
49
- <% group.button icon: :x,
50
- "@click.stop": "toggleSidebar",
51
- x_show: "$store.layout.mobile && !sidebarHidden",
52
- "@keydown.esc.window": "closeMobileSidebar",
53
- class: "!text-lookbook-header-text" %>
54
- <% end %>
55
- <% end %>
56
- <% end %>
57
- <% end %>
58
-
59
14
  <%= content_for?(:shell) ? yield(:shell) : yield %>
60
15
  </div>
61
16
  <% end %>
62
17
 
63
- <%= render template: "layouts/lookbook/skeleton" %>
64
- 0
18
+ <%= render template: "layouts/lookbook/skeleton" %>
@@ -8,11 +8,17 @@
8
8
  <link href="/lookbook-assets/css/lookbook.css?v=<%= Lookbook::VERSION %>" rel="stylesheet">
9
9
  <link href="/lookbook-assets/css/themes/<%= config.ui_theme %>.css?v=<%= Lookbook::VERSION %>" rel="stylesheet">
10
10
  <% if @theme_overrides.present? %>
11
- <style>
11
+ <style media="all">
12
12
  <%== @theme_overrides %>
13
13
  </style>
14
14
  <% end %>
15
15
 
16
+ <% if content_for? :styles %>
17
+ <style media="all">
18
+ <%= content_for :styles %>
19
+ </style>
20
+ <% end %>
21
+
16
22
  <% if config.ui_favicon != false %>
17
23
  <link rel="icon" href="<%= config.ui_favicon || "data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>👀</text></svg>" %>">
18
24
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <div class="bg-white flex flex-col items-center justify-center h-screen w-full">
2
2
  <div class="px-4 text-center max-w-sm">
3
- <%= render_component :icon, name: :alert_triangle, size: 10, class: "text-red-300 mx-auto" %>
3
+ <%= icon :alert_triangle, size: 10, class: "text-red-300 mx-auto" %>
4
4
  <div class="mt-3">
5
5
  <h5 class="text-base">
6
6
  <%== message %>
@@ -1,7 +1,7 @@
1
1
  <div id="welcome-message" class="flex flex-col h-full w-full">
2
2
  <div class="flex flex-col items-center justify-center h-full">
3
3
  <div class="p-4 text-center mx-auto">
4
- <%= render_component :icon, name: :layers, size: 10, class: "opacity-30 mx-auto" %>
4
+ <%= icon :layers, size: 10, class: "opacity-30 mx-auto" %>
5
5
  <div class="mt-6 text-base opacity-40">
6
6
  <% if Lookbook.previews.any? %>
7
7
  <h5>Select a preview to get started</h5>
@@ -1,17 +1,17 @@
1
1
  <div class="px-4 md:px-10 pt-8 md:pt-10 overflow-auto scroll-smooth w-full max-h-full pb-12" x-ref="scroller">
2
2
  <div class="w-full max-w-3xl mx-auto h-full flex flex-col">
3
3
  <% if @page.header? %>
4
- <header class="mb-8 prose max-w-none flex-none">
4
+ <header id="page-header" class="mb-8 prose max-w-none flex-none">
5
5
  <h1><%= @page.title %></h1>
6
6
  </header>
7
7
  <% end %>
8
8
 
9
- <%= render_component :prose, markdown: false, class: "max-w-none flex-none" do %>
9
+ <%= render_component :prose, id: "page-content", markdown: false, class: "max-w-none flex-none" do %>
10
10
  <%= @page_content %>
11
11
  <% end %>
12
12
 
13
13
  <% if @page.sections.any? %>
14
- <%= render_component :page_tabs, markdown: false do |page_tabs| %>
14
+ <%= render_component :page_tabs, id: "page-tabbed-sections", markdown: false, class: "mt-6" do |page_tabs| %>
15
15
  <% @page.sections.each do |section| %>
16
16
  <% page_tabs.tab name: "page-section-#{section.name}", label: section.label do %>
17
17
  <%= page_controller.render_page(section) %>
@@ -21,20 +21,20 @@
21
21
  <% end %>
22
22
 
23
23
  <% if @page.footer? && @pages.many? %>
24
- <footer class="flex items-center justify-between border-t border-gray-300 mt-12 pt-8 pb-10 ">
24
+ <footer id="page-footer" class="flex items-center justify-between border-t border-gray-300 mt-12 pt-8 pb-10 ">
25
25
  <% if @previous_page %>
26
- <a href="<%= page_path @previous_page.lookup_path %>"
26
+ <a href="<%= lookbook_page_path @previous_page.lookup_path %>"
27
27
  class="flex items-center flex-none">
28
- <%= render_component :icon, name: :arrow_left, size: 4, class: "hover:text-indigo-800" %>
28
+ <%= icon :arrow_left, size: 4, class: "hover:text-indigo-800" %>
29
29
  <span class="ml-2 underline"><%= @previous_page.title %></span>
30
30
  </a>
31
31
  <% end %>
32
32
 
33
33
  <% if @next_page %>
34
- <a href="<%= page_path @next_page.lookup_path %>"
34
+ <a href="<%= lookbook_page_path @next_page.lookup_path %>"
35
35
  class="flex items-center flex-none ml-auto">
36
36
  <span class="mr-2 underline"><%= @next_page.title %></span>
37
- <%= render_component :icon, name: :arrow_right, size: 4, class: "hover:text-indigo-800" %>
37
+ <%= icon :arrow_right, size: 4, class: "hover:text-indigo-800" %>
38
38
  </a>
39
39
  <% end %>
40
40
  </footer>
@@ -1,4 +1,4 @@
1
- <% items = examples.filter { |example| example.notes.present? } %>
1
+ <% items = examples.select { |example| example.notes.present? } %>
2
2
  <% if items.many? %>
3
3
  <div class="divide-y divide-dashed divide-lookbook-divider bg-lookbook-prose h-full w-full">
4
4
  <% items.each do |item| %>
@@ -1,5 +1,5 @@
1
1
  <%= render_component :viewport,
2
- src: lookbook.preview_path(request.query_parameters.merge(lookbook_timestamp: Time.now)),
2
+ src: lookbook_preview_path(request.query_parameters.merge(lookbook_timestamp: Time.now)),
3
3
  alpine_data: "$store.inspector.main",
4
4
  class: "-inset-px relative",
5
5
  style: "width: calc(100% + 2px); height: calc(100% + 2px)"
@@ -38,7 +38,7 @@
38
38
  "@click.stop": "startSpin(); $dispatch('viewport:reload'); stopSpin(500);" %>
39
39
 
40
40
  <% group.button icon: :external_link,
41
- href: lookbook.preview_path(@example.lookup_path),
41
+ href: lookbook_preview_path(@example.lookup_path),
42
42
  tooltip: "Open preview in new window",
43
43
  target: "_blank" %>
44
44
 
@@ -55,7 +55,7 @@
55
55
  <div class="h-full relative overflow-auto">
56
56
  <%= render_component :tab_panels, alpine_data: "$store.inspector.main" do |tabs| %>
57
57
  <% @main_panels.each do |panel| %>
58
- <% tabs.panel name: panel.name, class: panel.panel_classes do %>
58
+ <% tabs.panel id: panel.id, name: panel.name, class: [panel.panel_classes, { "p-4": panel.padded, "prose": panel.prose }] do %>
59
59
  <%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
60
60
  <% end %>
61
61
  <% end %>
@@ -80,7 +80,7 @@
80
80
 
81
81
  <% toolbar.section align: :right, class: "flex-none relative z-10" do %>
82
82
  <%= render_component :button_group do |group| %>
83
- <%= @drawer_panels.filter { |p| !p.disabled && p.copy }.each do |panel| %>
83
+ <%= @drawer_panels.select { |p| !p.disabled && p.copy }.each do |panel| %>
84
84
  <% group.button icon: :copy,
85
85
  tooltip: "Copy panel contents",
86
86
  copy: !!panel.copy,
@@ -123,7 +123,7 @@
123
123
  <div class="h-full overflow-auto">
124
124
  <%= render_component :tab_panels, alpine_data: "$store.inspector.drawer" do |tabs| %>
125
125
  <% @drawer_panels.each do |panel| %>
126
- <% tabs.panel name: panel.name do %>
126
+ <% tabs.panel id: panel.id, name: panel.name, class: [panel.panel_classes, { "p-4": panel.padded, "prose": panel.prose }] do %>
127
127
  <%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
128
128
  <% end %>
129
129
  <% end %>
data/config/routes.rb CHANGED
@@ -3,13 +3,13 @@ Lookbook::Engine.routes.draw do
3
3
  mount Lookbook::Engine.websocket => Lookbook.config.cable_mount_path
4
4
  end
5
5
 
6
- root to: "application#index", as: :home
6
+ root to: "application#index", as: :lookbook_home
7
7
 
8
- get "/#{Lookbook.config.page_route}", to: "pages#index", as: :page_index
9
- get "/#{Lookbook.config.page_route}/*path", to: "pages#show", as: :page
8
+ get "/#{Lookbook.config.page_route}", to: "pages#index", as: :lookbook_page_index
9
+ get "/#{Lookbook.config.page_route}/*path", to: "pages#show", as: :lookbook_page
10
10
 
11
- get "/preview/*path", to: "previews#preview", as: :preview
12
- get "/inspect/*path", to: "previews#show", as: :inspect
11
+ get "/preview/*path", to: "previews#preview", as: :lookbook_preview
12
+ get "/inspect/*path", to: "previews#show", as: :lookbook_inspect
13
13
 
14
- get "/*path", to: "previews#show_legacy", as: :inspect_legacy
14
+ get "/*path", to: "previews#show_legacy", as: :lookbook_inspect_legacy
15
15
  end
@@ -42,7 +42,7 @@ module Lookbook
42
42
  end
43
43
 
44
44
  def non_empty_items
45
- items.filter do |item|
45
+ items.select do |item|
46
46
  !item.is_a?(Lookbook::Collection) || item.items.any?
47
47
  end
48
48
  end
@@ -0,0 +1,31 @@
1
+ module Lookbook
2
+ class Component < Entity
3
+
4
+ attr_accessor :name
5
+
6
+ def initialize(name)
7
+ @name = name
8
+ super(path)
9
+ end
10
+
11
+ def path
12
+ name.underscore
13
+ end
14
+
15
+ def full_path
16
+ Pathname.new("#{Lookbook.config.components_path}/#{path}.rb")
17
+ end
18
+
19
+ def dir_path
20
+ full_path.dirname
21
+ end
22
+
23
+ def template_path
24
+ Dir.glob("#{Lookbook.config.components_path}/#{path}.*.erb").first
25
+ end
26
+
27
+ def inline?
28
+ template_path.present?
29
+ end
30
+ end
31
+ end