lookbook 1.3.4 → 1.4.0

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -11
  3. data/app/assets/lookbook/css/themes/blue.css +1 -1
  4. data/app/assets/lookbook/css/themes/green.css +1 -1
  5. data/app/assets/lookbook/css/themes/indigo.css +1 -1
  6. data/app/assets/lookbook/css/themes/rose.css +1 -1
  7. data/app/assets/lookbook/css/themes/zinc.css +1 -1
  8. data/app/components/lookbook/code/component.rb +2 -4
  9. data/app/components/lookbook/header/component.html.erb +1 -1
  10. data/app/components/lookbook/inspector_panel/component.rb +1 -1
  11. data/app/components/lookbook/nav/component.rb +8 -15
  12. data/app/components/lookbook/nav/directory/component.html.erb +26 -0
  13. data/app/components/lookbook/nav/directory/component.rb +4 -0
  14. data/app/components/lookbook/nav/{item → entity}/component.html.erb +5 -7
  15. data/app/components/lookbook/nav/entity/component.rb +49 -0
  16. data/app/components/lookbook/nav/item/component.css +15 -0
  17. data/app/components/lookbook/nav/item/component.js +4 -0
  18. data/app/components/lookbook/nav/item/component.rb +13 -56
  19. data/app/controllers/concerns/lookbook/targetable_concern.rb +13 -38
  20. data/app/controllers/lookbook/application_controller.rb +9 -7
  21. data/app/controllers/lookbook/page_controller.rb +2 -2
  22. data/app/controllers/lookbook/pages_controller.rb +9 -15
  23. data/app/helpers/lookbook/application_helper.rb +1 -1
  24. data/app/helpers/lookbook/page_helper.rb +7 -4
  25. data/app/views/layouts/lookbook/application.html.erb +3 -4
  26. data/app/views/layouts/lookbook/page.html.erb +2 -2
  27. data/app/views/layouts/lookbook/shell.html.erb +2 -2
  28. data/app/views/layouts/lookbook/skeleton.html.erb +7 -7
  29. data/app/views/lookbook/index.html.erb +3 -3
  30. data/app/views/lookbook/inspector/panels/_params.html.erb +2 -2
  31. data/config/languages.yml +41 -0
  32. data/config/panels.yml +1 -1
  33. data/config/tags.yml +4 -0
  34. data/lib/lookbook/engine.rb +65 -43
  35. data/lib/lookbook/entities/collections/component_collection.rb +4 -0
  36. data/lib/lookbook/entities/collections/concerns/hierarchical_collection.rb +27 -0
  37. data/lib/lookbook/entities/collections/entity_collection.rb +66 -0
  38. data/lib/lookbook/entities/collections/page_collection.rb +30 -0
  39. data/lib/lookbook/entities/collections/preview_collection.rb +35 -0
  40. data/lib/lookbook/entities/collections/preview_example_collection.rb +9 -0
  41. data/lib/lookbook/entities/component.rb +31 -0
  42. data/lib/lookbook/entities/concerns/annotatable.rb +58 -0
  43. data/lib/lookbook/entities/concerns/inspectable.rb +44 -0
  44. data/lib/lookbook/entities/concerns/locatable.rb +73 -0
  45. data/lib/lookbook/entities/concerns/navigable.rb +27 -0
  46. data/lib/lookbook/entities/entity.rb +48 -0
  47. data/lib/lookbook/entities/page.rb +80 -0
  48. data/lib/lookbook/entities/page_section.rb +43 -0
  49. data/lib/lookbook/entities/preview.rb +87 -0
  50. data/lib/lookbook/entities/preview_example.rb +91 -0
  51. data/lib/lookbook/entities/preview_group.rb +48 -0
  52. data/lib/lookbook/file_watcher.rb +1 -1
  53. data/lib/lookbook/lang.rb +12 -35
  54. data/lib/lookbook/param.rb +2 -2
  55. data/lib/lookbook/preview_parser.rb +1 -1
  56. data/lib/lookbook/rendered_example.rb +37 -0
  57. data/lib/lookbook/services/code/code_indenter.rb +14 -0
  58. data/lib/lookbook/services/data/resolvers/data_resolver.rb +2 -2
  59. data/lib/lookbook/services/data/resolvers/method_resolver.rb +1 -1
  60. data/lib/lookbook/services/entities/entity_tree_builder.rb +45 -0
  61. data/lib/lookbook/services/position_prefix_parser.rb +16 -0
  62. data/lib/lookbook/support/store.rb +0 -33
  63. data/lib/lookbook/support/tree_node.rb +83 -0
  64. data/lib/lookbook/support/utils/path_utils.rb +26 -2
  65. data/lib/lookbook/support/utils/utils.rb +24 -0
  66. data/lib/lookbook/tags/component_tag.rb +6 -0
  67. data/lib/lookbook/tags/custom_tag.rb +2 -0
  68. data/lib/lookbook/tags/id_tag.rb +1 -1
  69. data/lib/lookbook/tags/logical_path_tag.rb +3 -0
  70. data/lib/lookbook/tags/param_tag.rb +2 -0
  71. data/lib/lookbook/tags/source_tag.rb +7 -0
  72. data/lib/lookbook/tags/yard_tag.rb +35 -7
  73. data/lib/lookbook/version.rb +1 -1
  74. data/lib/lookbook.rb +11 -7
  75. data/public/lookbook-assets/css/lookbook.css +33 -21
  76. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  77. data/public/lookbook-assets/js/lookbook.js +64 -63
  78. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  79. metadata +35 -18
  80. data/lib/lookbook/collection.rb +0 -161
  81. data/lib/lookbook/component.rb +0 -34
  82. data/lib/lookbook/entity.rb +0 -47
  83. data/lib/lookbook/page.rb +0 -194
  84. data/lib/lookbook/page_collection.rb +0 -19
  85. data/lib/lookbook/page_section.rb +0 -29
  86. data/lib/lookbook/preview.rb +0 -181
  87. data/lib/lookbook/preview_collection.rb +0 -23
  88. data/lib/lookbook/preview_example.rb +0 -93
  89. data/lib/lookbook/preview_group.rb +0 -58
  90. data/lib/lookbook/source_inspector.rb +0 -76
  91. data/lib/lookbook/support/utils/attribute_utils.rb +0 -14
  92. data/lib/lookbook/utils.rb +0 -65
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b470e546db75bd013d11e664180acde6ba376e5f81efe0ad21e4fba92489fe5
4
- data.tar.gz: bf7186410dfeb3506d002e6ab43133b883350e5f7827ab92ff840900a5a28650
3
+ metadata.gz: 3a8ca9a9db0798d392083b4470397bf94260811a1f82f8b89dee0e5646fca156
4
+ data.tar.gz: 24fe83948823edd7387b11ca2ee5628f778a15034173491bfdfd20347d6b1484
5
5
  SHA512:
6
- metadata.gz: 93556785190aff39487ae217fdc50969c0c5444c02dc9b9579b7184ffa568696b72bdc66ea24600e92fb2b67569b9100aca4417f3082b0d1876e59aa0e12c8c2
7
- data.tar.gz: 4a218ca0928bfb9c1aa74b9c1a17c5cfae21cfc7ceadbf9cd4354a3d26a65af1eae9087a96782666c85b39cee646ebd6075b857ec5caa43aa547cc1239d68a19
6
+ metadata.gz: 1463db9307bc67d9224a4a96f21ee404902fe0e266b40b0456c84e551a26b96a779e816f2780b5c1ea30189b8d94e3e5dfc16ab6d2f0b3df3a0e06d8f2705282
7
+ data.tar.gz: ea867f97d2cb0d532e59c3c62de31405dca1fe29e7f9ade020fe6b7eb2cb3d2b04d16d7b110e3479eaa54316d6df9ba3328594c73c659e37f6c513867325ad54
data/README.md CHANGED
@@ -4,21 +4,21 @@
4
4
  A tool to help browse, develop, test & document [ViewComponents](https://viewcomponent.org/) in Ruby on Rails apps.
5
5
 
6
6
  [![Gem version](https://img.shields.io/gem/v/lookbook)](https://rubygems.org/gems/lookbook)
7
- [![CI status](https://github.com/allmarkedup/lookbook/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/allmarkedup/lookbook/actions/workflows/ci.yml)
7
+ [![CI status](https://github.com/ViewComponent/lookbook/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/ViewComponent/lookbook/actions/workflows/ci.yml)
8
8
  <br>
9
9
 
10
10
  ## Documentation
11
11
 
12
12
  ✨ **Lookbook guide and API docs**: [lookbook.build](https://lookbook.build)
13
13
 
14
- > _Looking for pre-v1.0 documentation? [Head over here](https://github.com/allmarkedup/lookbook/tree/0.9.x)._
14
+ > _Looking for pre-v1.0 documentation? [Head over here](https://github.com/ViewComponent/lookbook/tree/0.9.x)._
15
15
 
16
16
 
17
17
  ## Demo
18
18
 
19
19
  ✨ **Online Demo**: [lookbook-demo-app.herokuapp.com/lookbook](https://lookbook-demo-app.herokuapp.com/lookbook)
20
20
 
21
- ✨ **Demo repo**: [github.com/allmarkedup/lookbook-demo](https://github.com/allmarkedup/lookbook-demo)
21
+ ✨ **Demo repo**: [github.com/ViewComponent/lookbook-demo](https://github.com/ViewComponent/lookbook-demo)
22
22
 
23
23
  [![Lookbook UI](.github/assets/lookbook_screenshot_v1.0_beta.png)](https://lookbook-demo-app.herokuapp.com/lookbook/)
24
24
 
@@ -29,10 +29,10 @@ Lookbook is implemented as an isolated [Rails Engine](https://guides.rubyonrails
29
29
 
30
30
  This repository contains:
31
31
 
32
- * The Lookbook source code ([`/app`](https://github.com/allmarkedup/lookbook/tree/main/app), [`/lib`](https://github.com/allmarkedup/lookbook/tree/main/lib), [`/config`](https://github.com/allmarkedup/lookbook/tree/main/config), etc)
33
- * A '[workbench](#workbench)' app used for Lookbook component development ([`/workbench`](https://github.com/allmarkedup/lookbook/tree/main/workbench)).
34
- * The Lookbook [documentation site](#docs-site) source code and content ([`/docs`](https://github.com/allmarkedup/lookbook/tree/main/docs)).
35
- * A [test suite](#testing) with a 'runable' dummy app ([`/spec`](https://github.com/allmarkedup/lookbook/tree/main/spec)).
32
+ * The Lookbook source code ([`/app`](https://github.com/ViewComponent/lookbook/tree/main/app), [`/lib`](https://github.com/ViewComponent/lookbook/tree/main/lib), [`/config`](https://github.com/ViewComponent/lookbook/tree/main/config), etc)
33
+ * A '[workbench](#workbench)' app used for Lookbook component development ([`/workbench`](https://github.com/ViewComponent/lookbook/tree/main/workbench)).
34
+ * The Lookbook [documentation site](#docs-site) source code and content ([`/docs`](https://github.com/ViewComponent/lookbook/tree/main/docs)).
35
+ * A [test suite](#testing) with a 'runable' dummy app ([`/spec`](https://github.com/ViewComponent/lookbook/tree/main/spec)).
36
36
 
37
37
  ### Workbench
38
38
 
@@ -69,16 +69,16 @@ The dummy app that the tests are being run against can be viewed by running the
69
69
 
70
70
  Lookbook is an un-funded open source project and contributions of all types and sizes are most welcome!
71
71
 
72
- Please take the time to read over the [Contributing](./CONTRIBUTING.md) guide before making your first contribution and if anything isn't clear then [start a discussion](https://github.com/allmarkedup/lookbook/discussions) and we will do our best to help you out.
72
+ Please take the time to read over the [Contributing](./CONTRIBUTING.md) guide before making your first contribution and if anything isn't clear then [start a discussion](https://github.com/ViewComponent/lookbook/discussions) and we will do our best to help you out.
73
73
 
74
74
  ## Contributors
75
75
 
76
76
  Lookbook was created by [Mark Perkins](https://github.com/allmarkedup) and continues to grow
77
- &amp; improve thanks to the ideas, suggestions and hard work of all of [these excellent humans](https://github.com/allmarkedup/lookbook/graphs/contributors):
77
+ &amp; improve thanks to the ideas, suggestions and hard work of all of [these excellent humans](https://github.com/ViewComponent/lookbook/graphs/contributors):
78
78
  <br>
79
79
  <br>
80
- <a href="https://github.com/allmarkedup/lookbook/graphs/contributors">
81
- <img src="https://contrib.rocks/image?repo=allmarkedup/lookbook&columns=14" width="800" />
80
+ <a href="https://github.com/ViewComponent/lookbook/graphs/contributors">
81
+ <img src="https://contrib.rocks/image?repo=ViewComponent/lookbook&columns=14" width="800" />
82
82
  </a>
83
83
 
84
84
  ## License
@@ -63,4 +63,4 @@
63
63
  --lookbook-header-border: var(--lookbook-accent-700);
64
64
  --lookbook-blank-slate-title: var(--lookbook-accent-600);
65
65
  --lookbook-branding-text: var(--lookbook-header-text);
66
- }
66
+ }
@@ -63,4 +63,4 @@
63
63
  --lookbook-header-border: var(--lookbook-accent-700);
64
64
  --lookbook-blank-slate-title: var(--lookbook-accent-600);
65
65
  --lookbook-branding-text: var(--lookbook-header-text);
66
- }
66
+ }
@@ -63,4 +63,4 @@
63
63
  --lookbook-header-border: var(--lookbook-accent-700);
64
64
  --lookbook-blank-slate-title: var(--lookbook-accent-600);
65
65
  --lookbook-branding-text: var(--lookbook-header-text);
66
- }
66
+ }
@@ -63,4 +63,4 @@
63
63
  --lookbook-header-border: var(--lookbook-accent-700);
64
64
  --lookbook-blank-slate-title: var(--lookbook-accent-600);
65
65
  --lookbook-branding-text: var(--lookbook-header-text);
66
- }
66
+ }
@@ -63,4 +63,4 @@
63
63
  --lookbook-header-border: var(--lookbook-accent-700);
64
64
  --lookbook-blank-slate-title: var(--lookbook-accent-600);
65
65
  --lookbook-branding-text: var(--lookbook-header-text);
66
- }
66
+ }
@@ -1,5 +1,3 @@
1
- require "active_model"
2
-
3
1
  module Lookbook
4
2
  class Code::Component < Lookbook::BaseComponent
5
3
  include Lookbook::OutputHelper
@@ -56,8 +54,8 @@ module Lookbook
56
54
  end
57
55
 
58
56
  def before_render
59
- @theme ||= (config.highlighter_options && config.highlighter_options[:theme]&.to_sym) || :github
60
- @dark ||= ::ActiveModel::Type::Boolean.new.cast((config.highlighter_options && config.highlighter_options[:dark]) || false)
57
+ @theme ||= Lookbook.config.highlighter_options.fetch(:theme, :github).to_sym
58
+ @dark ||= !!Lookbook.config.highlighter_options.fetch(:dark, false)
61
59
  end
62
60
 
63
61
  protected
@@ -25,7 +25,7 @@
25
25
  <% menu = lookbook_render :debug_menu,
26
26
  version: Lookbook::VERSION,
27
27
  docs_url: "https://lookbook.build/guide",
28
- repo_url: "https://github.com/allmarkedup/lookbook" do %>
28
+ repo_url: "https://github.com/ViewComponent/lookbook" do %>
29
29
  <%= helpers.pretty_json(Lookbook.debug_data) %>
30
30
  <% end %>
31
31
  <% button.dropdown({}).with_content(menu) %>
@@ -8,7 +8,7 @@ module Lookbook
8
8
  end
9
9
 
10
10
  def id
11
- AttributeUtils.dom_id("panel", @name)
11
+ Utils.id("panel", @name)
12
12
  end
13
13
 
14
14
  def before_render
@@ -3,25 +3,18 @@ module Lookbook
3
3
  renders_one :filter, Lookbook::Filter::Component
4
4
  renders_one :toolbar, Lookbook::Toolbar::Component
5
5
 
6
- def initialize(
7
- collection:, id: nil,
8
- collapse_singles: false,
9
- **attrs
10
- )
11
- @id = id.presence || "#{collection.id}-nav"
12
- @collection = collection.as_tree
13
- @item_args = {
14
- collapse_singles: collapse_singles
15
- }
6
+ attr_reader :id, :tree
7
+
8
+ def initialize(tree:, id: nil, **attrs)
9
+ @id = id
10
+ @tree = tree
16
11
  super(**attrs, id: id)
17
12
  end
18
13
 
19
14
  def items
20
- @collection.non_empty_items.map do |item|
21
- lookbook_render Lookbook::Nav::Item::Component.new item,
22
- nav_id: @id,
23
- depth: 1,
24
- **@item_args
15
+ tree.map do |node|
16
+ item_class = (node.type == :directory) ? Nav::Directory::Component : Nav::Entity::Component
17
+ lookbook_render item_class.new node, nav_id: id
25
18
  end
26
19
  end
27
20
 
@@ -0,0 +1,26 @@
1
+ <%= render_component_tag :li,
2
+ id: id,
3
+ class: "list-none",
4
+ "x-show": "!filteredOut",
5
+ data: { "entity-type": :directory },
6
+ cloak: true do %>
7
+ <%= lookbook_tag :button,
8
+ class: "nav-action",
9
+ style: "padding-left: #{left_pad}px",
10
+ "x-bind": "bindings.toggle" do %>
11
+ <div class="nav-action-inner">
12
+ <%= icon nil,
13
+ size: 3,
14
+ class: "nav-toggle-icon",
15
+ "x-effect": "iconName = open ? 'chevron-down' : 'chevron-right'" if children? %>
16
+ <%= icon nav_icon, size: 3.5, class: "mr-1.5 text-lookbook-nav-icon-stroke" %>
17
+ <span class="truncate"><%= label %></span>
18
+ </div>
19
+ <% end %>
20
+
21
+ <% if children? %>
22
+ <ul x-ref="items" x-show="open" x-cloak>
23
+ <%= safe_join(children) %>
24
+ </ul>
25
+ <% end %>
26
+ <% end %>
@@ -0,0 +1,4 @@
1
+ module Lookbook
2
+ class Nav::Directory::Component < Nav::Item::Component
3
+ end
4
+ end
@@ -2,22 +2,20 @@
2
2
  id: id,
3
3
  class: "list-none",
4
4
  "x-show": "!filteredOut",
5
- data: {
6
- "entity-type": item.type
7
- },
5
+ data: { "entity-type": type },
8
6
  cloak: true do %>
9
7
  <%= lookbook_tag href.present? ? :a : :button,
10
8
  href: href,
11
- class: "flex w-full items-center py-1 select-none cursor-pointer text-lookbook-nav-text hover:bg-lookbook-nav-item-hover transition",
9
+ class: "nav-action",
12
10
  style: "padding-left: #{left_pad}px",
13
11
  "x-bind": "bindings.#{href.present? ? "link" : "toggle"}" do %>
14
- <div class="relative flex items-center w-full">
12
+ <div class="nav-action-inner">
15
13
  <%= icon nil,
16
14
  size: 3,
17
- class: "mr-1 text-lookbook-nav-toggle absolute -left-4",
15
+ class: "nav-toggle-icon",
18
16
  "x-effect": "iconName = open ? 'chevron-down' : 'chevron-right'" if children? %>
19
17
  <%= icon nav_icon, size: 3.5, class: "mr-1.5 text-lookbook-nav-icon-stroke" %>
20
- <span class="truncate <% if @item.type == :preview %>font-bold<% end %>"><%= label %></span>
18
+ <span class="truncate <% if node.type == :preview %>font-bold<% end %>"><%= label %></span>
21
19
  </div>
22
20
  <% end %>
23
21
 
@@ -0,0 +1,49 @@
1
+ module Lookbook
2
+ class Nav::Entity::Component < Nav::Item::Component
3
+ ICONS = {
4
+ page: :file,
5
+ preview: :layers,
6
+ example: :eye,
7
+ group: :eye
8
+ }.freeze
9
+
10
+ def nav_icon
11
+ ICONS[type] || :file
12
+ end
13
+
14
+ def href
15
+ if collapsed?
16
+ node.first.url_path
17
+ elsif type != :preview
18
+ node.url_path
19
+ end
20
+ end
21
+
22
+ def children
23
+ collapsed? ? [] : super
24
+ end
25
+
26
+ def type
27
+ collapsed? ? :example : node.type
28
+ end
29
+
30
+ def collapsed?
31
+ node.type == :preview && node.children.one?
32
+ end
33
+
34
+ def search_terms
35
+ matchers = if collapsed?
36
+ node.first.search_terms
37
+ else
38
+ node.respond_to?(:search_terms) ? Array(node.search_terms) : []
39
+ end
40
+ matchers.flatten.map { |m| m.gsub(/\s/, "").downcase }
41
+ end
42
+
43
+ protected
44
+
45
+ def alpine_data
46
+ alpine_encode({id: node.id, matchers: search_terms})
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,15 @@
1
+ @layer components {
2
+ [data-component="nav"] {
3
+ .nav-action {
4
+ @apply flex w-full items-center py-1 select-none cursor-pointer text-lookbook-nav-text hover:bg-lookbook-nav-item-hover transition;
5
+ }
6
+
7
+ .nav-action-inner {
8
+ @apply relative flex items-center w-full;
9
+ }
10
+
11
+ .nav-toggle-icon {
12
+ @apply mr-1 text-lookbook-nav-toggle absolute -left-4;
13
+ }
14
+ }
15
+ }
@@ -1,4 +1,8 @@
1
1
  export default function navItemComponent({ id, matchers }) {
2
+ matchers = matchers.map((matcher) =>
3
+ matcher.replace(/\s/g, "").toLowerCase()
4
+ );
5
+
2
6
  return {
3
7
  filteredOut: false,
4
8
 
@@ -1,87 +1,44 @@
1
1
  module Lookbook
2
2
  class Nav::Item::Component < Lookbook::BaseComponent
3
- ICONS = {
4
- page: :file,
5
- page_collection: :folder,
6
- preview_collection: :folder,
7
- preview: :layers,
8
- example: :eye,
9
- group: :eye,
10
- collection: :folder
11
- }.freeze
3
+ delegate :label, :depth, to: :node
12
4
 
13
- delegate :label, to: :@item
5
+ attr_reader :node, :nav_id
14
6
 
15
- def initialize(
16
- item,
17
- nav_id:,
18
- depth: 1,
19
- collapse_singles: false,
20
- **html_attrs
21
- )
7
+ def initialize(node, nav_id:, **html_attrs)
8
+ @node = node
22
9
  @nav_id = nav_id
23
- @item = item
24
- @depth = depth
25
- @collapse_singles = collapse_singles
26
10
  super(**html_attrs)
27
11
  end
28
12
 
29
13
  def id
30
- "#{@nav_id}-#{@item.id}"
14
+ "#{nav_id}-#{node.id}"
31
15
  end
32
16
 
33
17
  def left_pad
34
- ((@depth - 1) * 12) + 24
35
- end
36
-
37
- def href
38
- if collapsed?
39
- item.url_path
40
- elsif !collection?
41
- item.url_path
42
- end
18
+ ((depth - 1) * 12) + 24
43
19
  end
44
20
 
45
21
  def children
46
- @children ||= if collection? && !collapsed?
47
- item.non_empty_items.map do |item|
48
- lookbook_render Lookbook::Nav::Item::Component.new item,
49
- nav_id: @nav_id,
50
- depth: (@depth + 1),
51
- collapse_singles: @collapse_singles
52
- end
53
- else
54
- []
55
- end
56
- end
57
-
58
- def item
59
- collapsed? ? @item.first : @item
22
+ @children ||= node.map { |node| render_item(node) }
60
23
  end
61
24
 
62
25
  def nav_icon
63
- ICONS[@item.type] || :file
64
- end
65
-
66
- def collection?
67
- @item.is_a? Lookbook::Collection
26
+ :folder
68
27
  end
69
28
 
70
29
  def children?
71
- children.any? if collection? && !collapsed?
30
+ children.any?
72
31
  end
73
32
 
74
- def collapsed?
75
- @collapse_singles == true && collection? && @item.collapsible? && @item.one?
33
+ def render_item(node)
34
+ item_class = (node.type == :directory) ? Nav::Directory::Component : Nav::Entity::Component
35
+ lookbook_render item_class.new node, nav_id: nav_id
76
36
  end
77
37
 
78
38
  protected
79
39
 
80
40
  def alpine_data
81
- alpine_encode({
82
- id: @item.id,
83
- matchers: item.is_a?(Lookbook::Collection) ? nil : item.matchers
84
- })
41
+ alpine_encode({id: node.id, matchers: []})
85
42
  end
86
43
 
87
44
  def alpine_component
@@ -14,19 +14,19 @@ module Lookbook
14
14
  end
15
15
 
16
16
  def lookup_entities
17
- @target = Lookbook.previews.find_example(params[:path])
17
+ @target = Lookbook.previews.find_example_by_path(params[:path])
18
18
  if @target.present?
19
19
  @preview = @target.preview
20
- if params[:path] == @preview&.lookup_path
21
- redirect_to lookbook_inspect_path "#{params[:path]}/#{@preview.default_example.name}"
20
+ if params[:path] == @preview&.path
21
+ redirect_to lookbook_inspect_path("#{params[:path]}/#{@preview.default_example.name}", params.permit!)
22
22
  end
23
23
  else
24
- @preview = Lookbook.previews.find(params[:path])
24
+ @preview = Lookbook.previews.find_by_path(params[:path])
25
25
  if @preview.present?
26
- first_example = @preview.examples.first
27
- redirect_to lookbook_inspect_path(first_example.lookup_path) if first_example
26
+ default_example = @preview.default_example
27
+ redirect_to lookbook_inspect_path(default_example.path, params.permit!) if default_example
28
28
  else
29
- @preview = Lookbook.previews.find(path_segments.slice(0, path_segments.size - 1).join("/"))
29
+ @preview = Lookbook.previews.find_by_path(path_segments.slice(0, path_segments.size - 1).join("/"))
30
30
  end
31
31
  end
32
32
  end
@@ -89,46 +89,21 @@ module Lookbook
89
89
  end
90
90
 
91
91
  preview_controller.params.permit!
92
- @preview_params = preview_controller.params.to_h.select do |key, value|
93
- !!@params.find { |param_tag| param_tag.name == key.to_s }
94
- end
95
92
  end
96
93
 
97
94
  def inspector_data
98
95
  return @inspector_data if @inspector_data.present?
99
96
 
100
- context_data = {
101
- preview_params: @preview_params,
102
- path: params[:path]
103
- }
104
-
105
- preview = @preview
106
- target_examples = (@target.type == :group) ? @target.examples : [@target]
107
-
108
- examples = target_examples.map do |example|
109
- render_args = @preview.render_args(example.name, params: preview_controller.params)
110
- has_template = render_args[:template] != "view_components/preview"
97
+ rendered_examples = @target.examples.map do |example|
111
98
  output = preview_controller.process(:render_example_to_string, @preview, example.name)
112
- source = has_template ? example.template_source(render_args[:template]) : example.method_source
113
- source_lang = has_template ? example.template_lang(render_args[:template]) : example.lang
114
-
115
- example.define_singleton_method(:output, proc { output })
116
- example.define_singleton_method(:source, proc { source })
117
- example.define_singleton_method(:source_lang, proc { source_lang })
118
- example
99
+ RenderedExample.new(example, output, preview_controller.params)
119
100
  end
120
101
 
121
- target = (@target.type == :group) ? @target : examples.find { |e| e.lookup_path == @target.lookup_path }
122
-
123
- params_ref = @params
124
- preview.define_singleton_method(:params, proc { params_ref })
125
-
126
102
  @inspector_data ||= Lookbook::Store.new({
127
- context: context_data,
128
- preview: preview,
129
- examples: examples,
130
- example: examples.first,
131
- target: target,
103
+ context: Store.new({params: @params, path: params[:path]}),
104
+ preview: @preview,
105
+ examples: rendered_examples,
106
+ target: @target,
132
107
  data: Lookbook.data,
133
108
  app: Lookbook
134
109
  })
@@ -9,16 +9,16 @@ module Lookbook
9
9
  helper Lookbook::ComponentHelper
10
10
 
11
11
  before_action :generate_theme_overrides
12
- before_action :assign_collections
12
+ before_action :assign_instance_vars
13
13
 
14
14
  def self.controller_path
15
15
  "lookbook"
16
16
  end
17
17
 
18
18
  def index
19
- landing = Lookbook.pages.find(&:landing) || Lookbook.pages.first
19
+ landing = Lookbook.pages.find(&:landing?) || Lookbook.pages.first
20
20
  if landing.present?
21
- redirect_to lookbook_page_path(landing.lookup_path)
21
+ redirect_to lookbook_page_path(landing.path)
22
22
  else
23
23
  render "lookbook/index"
24
24
  end
@@ -30,9 +30,11 @@ module Lookbook
30
30
  @theme_overrides ||= Lookbook.theme.to_css
31
31
  end
32
32
 
33
- def assign_collections
34
- @previews = Preview.all
35
- @pages = Page.all
33
+ def assign_instance_vars
34
+ @previews = Lookbook.previews
35
+ @pages = Lookbook.pages
36
+ @config = Lookbook.config
37
+ @engine = Lookbook.engine
36
38
  end
37
39
 
38
40
  def feature_enabled?(feature)
@@ -48,7 +50,7 @@ module Lookbook
48
50
  error_params = {}
49
51
  if exception.is_a?(ViewComponent::PreviewTemplateError)
50
52
  error_params = {
51
- file_path: @preview&.full_path,
53
+ file_path: @preview&.file_path,
52
54
  line_number: 0,
53
55
  source_code: @target&.source
54
56
  }
@@ -11,8 +11,8 @@ module Lookbook
11
11
  def render_page(page, locals = {})
12
12
  @page = page
13
13
  @pages = Lookbook.pages
14
- @next_page = @pages.find_next(@page)
15
- @previous_page = @pages.find_previous(@page)
14
+ @next_page = @pages.next(@page)
15
+ @previous_page = @pages.previous(@page)
16
16
 
17
17
  content = ActionViewAnnotationsHandler.call(disable_annotations: true) do
18
18
  render_to_string inline: @page.content, locals: {
@@ -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
@@ -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
@@ -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,