lookbook 1.5.1 → 2.0.0.beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -21
  3. data/app/assets/lookbook/css/lookbook.css +9 -0
  4. data/app/assets/lookbook/css/themes/blue.css +7 -0
  5. data/app/assets/lookbook/css/themes/green.css +7 -0
  6. data/app/assets/lookbook/css/themes/indigo.css +7 -0
  7. data/app/assets/lookbook/css/themes/rose.css +7 -0
  8. data/app/assets/lookbook/css/themes/zinc.css +7 -0
  9. data/app/assets/lookbook/css/tooltip.css +9 -6
  10. data/app/assets/lookbook/img/lucide-sprite.svg +4960 -0
  11. data/app/assets/lookbook/js/app.js +22 -4
  12. data/app/assets/lookbook/js/helpers/dom.js +4 -7
  13. data/app/assets/lookbook/js/helpers/string.js +4 -11
  14. data/app/assets/lookbook/js/{embed.js → iframe.js} +0 -0
  15. data/app/assets/lookbook/js/index.js +61 -0
  16. data/app/assets/lookbook/js/lib/lookbook.js +113 -0
  17. data/app/assets/lookbook/js/lib/tippy.js +1 -0
  18. data/app/assets/lookbook/js/lookbook-core.js +1 -0
  19. data/app/assets/lookbook/js/lookbook.js +2 -61
  20. data/app/components/lookbook/base_component.rb +3 -1
  21. data/app/components/lookbook/button/component.html.erb +13 -24
  22. data/app/components/lookbook/button/component.js +13 -3
  23. data/app/components/lookbook/button/component.rb +16 -25
  24. data/app/components/lookbook/code/component.rb +0 -2
  25. data/app/components/lookbook/copy_button/component.html.erb +4 -4
  26. data/app/components/lookbook/copy_button/component.rb +6 -3
  27. data/app/components/lookbook/debug_menu/component.html.erb +1 -0
  28. data/app/components/lookbook/debug_menu/component.rb +12 -1
  29. data/app/components/lookbook/display_options/editor/component.html.erb +1 -1
  30. data/app/components/lookbook/display_options/field/component.css +0 -26
  31. data/app/components/lookbook/display_options/field/component.html.erb +1 -1
  32. data/app/components/lookbook/embed/component.html.erb +6 -51
  33. data/app/components/lookbook/embed/component.rb +17 -16
  34. data/app/components/lookbook/embed/inspector/component.html.erb +102 -0
  35. data/app/components/lookbook/embed/inspector/component.js +46 -0
  36. data/app/components/lookbook/embed/inspector/component.rb +64 -0
  37. data/app/components/lookbook/embed_code_dropdown/component.css +12 -0
  38. data/app/components/lookbook/embed_code_dropdown/component.html.erb +19 -0
  39. data/app/components/lookbook/embed_code_dropdown/component.js +26 -0
  40. data/app/components/lookbook/embed_code_dropdown/component.rb +41 -0
  41. data/app/components/lookbook/header/component.html.erb +7 -6
  42. data/app/components/lookbook/header/component.rb +5 -1
  43. data/app/components/lookbook/icon/component.html.erb +1 -1
  44. data/app/components/lookbook/icon_button/component.html.erb +20 -0
  45. data/app/components/lookbook/icon_button/component.rb +46 -0
  46. data/app/components/lookbook/nav/component.html.erb +0 -1
  47. data/app/components/lookbook/nav/entity/component.rb +2 -2
  48. data/app/components/lookbook/nav/item/component.rb +1 -1
  49. data/app/components/lookbook/params/editor/component.rb +1 -0
  50. data/app/components/lookbook/prose/component.rb +1 -3
  51. data/app/components/lookbook/tabs/component.html.erb +2 -2
  52. data/app/components/lookbook/tabs/component.js +1 -1
  53. data/app/components/lookbook/tag_component.rb +2 -1
  54. data/app/components/lookbook/text_button/component.html.erb +26 -0
  55. data/app/components/lookbook/text_button/component.rb +42 -0
  56. data/app/components/lookbook/toolbar/component.html.erb +1 -1
  57. data/app/components/lookbook/viewport/component.rb +0 -4
  58. data/app/controllers/concerns/lookbook/targetable_concern.rb +24 -19
  59. data/app/controllers/concerns/lookbook/with_panels_concern.rb +30 -0
  60. data/app/controllers/concerns/lookbook/with_preview_controller_concern.rb +4 -3
  61. data/app/controllers/lookbook/application_controller.rb +9 -12
  62. data/app/controllers/lookbook/embeds_controller.rb +148 -0
  63. data/app/controllers/lookbook/inspector_controller.rb +3 -22
  64. data/app/controllers/lookbook/page_controller.rb +7 -6
  65. data/app/controllers/lookbook/pages_controller.rb +3 -4
  66. data/app/controllers/lookbook/preview_controller.rb +17 -0
  67. data/app/controllers/lookbook/previews_controller.rb +8 -10
  68. data/app/helpers/lookbook/application_helper.rb +3 -19
  69. data/app/views/layouts/lookbook/application.html.erb +85 -60
  70. data/app/views/layouts/lookbook/embed.html.erb +16 -0
  71. data/app/views/layouts/lookbook/shell.html.erb +1 -1
  72. data/app/views/layouts/lookbook/skeleton.html.erb +13 -8
  73. data/app/views/lookbook/embeds/show.html.erb +12 -0
  74. data/app/views/lookbook/inspector/panels/_notes.html.erb +1 -1
  75. data/app/views/lookbook/inspector/panels/_output.html.erb +3 -3
  76. data/app/views/lookbook/inspector/panels/_source.html.erb +6 -6
  77. data/app/views/lookbook/inspector/show.html.erb +130 -123
  78. data/app/views/lookbook/pages/show.html.erb +81 -34
  79. data/app/views/lookbook/partials/_iframe_content_scripts.html.erb +1 -0
  80. data/app/views/lookbook/partials/_user_styles.html.erb +5 -0
  81. data/app/views/lookbook/{preview.html.erb → previews/group.html.erb} +7 -7
  82. data/app/views/lookbook/previews/preview.html.erb +5 -0
  83. data/app/views/lookbook/previews/show.html.erb +1 -0
  84. data/config/app.yml +31 -16
  85. data/config/panels.yml +23 -25
  86. data/config/routes.rb +3 -1
  87. data/config/tags.yml +6 -2
  88. data/lib/lookbook/cable/cable.rb +53 -0
  89. data/{app/channels/lookbook → lib/lookbook/cable}/connection.rb +0 -0
  90. data/{app/channels/lookbook → lib/lookbook/cable}/reload_channel.rb +0 -0
  91. data/lib/lookbook/engine.rb +109 -87
  92. data/lib/lookbook/entities/collections/entity_collection.rb +11 -6
  93. data/lib/lookbook/entities/collections/page_collection.rb +33 -8
  94. data/lib/lookbook/entities/collections/preview_collection.rb +42 -17
  95. data/lib/lookbook/entities/collections/render_target_collection.rb +4 -0
  96. data/lib/lookbook/entities/collections/scenario_collection.rb +4 -0
  97. data/lib/lookbook/entities/concerns/{annotatable.rb → annotatable_entity.rb} +7 -6
  98. data/lib/lookbook/entities/concerns/{inspectable.rb → inspectable_entity.rb} +2 -1
  99. data/lib/lookbook/entities/concerns/{locatable.rb → locatable_entity.rb} +8 -14
  100. data/lib/lookbook/entities/concerns/navigable_entity.rb +44 -0
  101. data/lib/lookbook/entities/entity.rb +7 -2
  102. data/lib/lookbook/entities/{page.rb → page_entity.rb} +10 -6
  103. data/lib/lookbook/entities/{page_section.rb → page_section_entity.rb} +1 -1
  104. data/lib/lookbook/entities/preview_entity.rb +99 -0
  105. data/lib/lookbook/entities/renderable_entity.rb +50 -0
  106. data/lib/lookbook/entities/rendered_scenario_entity.rb +53 -0
  107. data/lib/lookbook/entities/scenario_entity.rb +112 -0
  108. data/lib/lookbook/entities/scenario_group_entity.rb +53 -0
  109. data/lib/lookbook/error.rb +5 -5
  110. data/lib/lookbook/file_watcher.rb +19 -35
  111. data/lib/lookbook/helpers/class_names_helper.rb +28 -0
  112. data/lib/lookbook/helpers/page_helper.rb +18 -0
  113. data/{app/helpers/lookbook → lib/lookbook/helpers}/preview_helper.rb +3 -0
  114. data/lib/lookbook/helpers/ui_elements_helper.rb +115 -0
  115. data/lib/lookbook/preview.rb +79 -0
  116. data/lib/lookbook/preview_controller_actions.rb +50 -0
  117. data/lib/lookbook/preview_parser.rb +4 -2
  118. data/lib/lookbook/reloaders.rb +71 -0
  119. data/lib/lookbook/runtime_context.rb +49 -0
  120. data/lib/lookbook/services/data/resolvers/data_resolver.rb +4 -6
  121. data/lib/lookbook/services/entities/entity_tree_builder.rb +6 -6
  122. data/lib/lookbook/services/list_resolver.rb +35 -0
  123. data/lib/lookbook/services/markdown_renderer.rb +12 -2
  124. data/lib/lookbook/services/priority_prefix_parser.rb +16 -0
  125. data/lib/lookbook/services/urls/search_param_encoder.rb +16 -0
  126. data/lib/lookbook/services/urls/search_param_parser.rb +7 -6
  127. data/lib/lookbook/stores/config_store.rb +16 -16
  128. data/lib/lookbook/stores/input_store.rb +1 -3
  129. data/lib/lookbook/stores/panel_store.rb +28 -50
  130. data/lib/lookbook/support/deprecation.rb +5 -0
  131. data/lib/lookbook/support/errors/preview_template_error.rb +7 -0
  132. data/lib/lookbook/support/evented_file_update_checker.rb +69 -0
  133. data/lib/lookbook/support/null_websocket.rb +9 -0
  134. data/lib/lookbook/support/store.rb +9 -0
  135. data/lib/lookbook/support/tree_node.rb +7 -7
  136. data/lib/lookbook/support/utils/path_utils.rb +7 -1
  137. data/lib/lookbook/support/utils/utils.rb +8 -0
  138. data/lib/lookbook/tags/{position_tag.rb → priority_tag.rb} +4 -4
  139. data/lib/lookbook/tags/renders_tag.rb +4 -0
  140. data/lib/lookbook/tags/tag_provider.rb +3 -0
  141. data/lib/lookbook/tags/type_tag.rb +7 -0
  142. data/lib/lookbook/tags/yard_tag.rb +1 -2
  143. data/lib/lookbook/version.rb +1 -1
  144. data/lib/lookbook/websocket.rb +6 -53
  145. data/lib/lookbook.rb +179 -53
  146. data/public/lookbook-assets/css/lookbook.css +141 -83
  147. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  148. data/public/lookbook-assets/css/themes/blue.css +7 -0
  149. data/public/lookbook-assets/css/themes/blue.css.map +1 -1
  150. data/public/lookbook-assets/css/themes/green.css +7 -0
  151. data/public/lookbook-assets/css/themes/green.css.map +1 -1
  152. data/public/lookbook-assets/css/themes/indigo.css +7 -0
  153. data/public/lookbook-assets/css/themes/indigo.css.map +1 -1
  154. data/public/lookbook-assets/css/themes/rose.css +7 -0
  155. data/public/lookbook-assets/css/themes/rose.css.map +1 -1
  156. data/public/lookbook-assets/css/themes/zinc.css +7 -0
  157. data/public/lookbook-assets/css/themes/zinc.css.map +1 -1
  158. data/public/lookbook-assets/img/lucide-sprite.svg +4960 -0
  159. data/public/lookbook-assets/js/embed.js +1363 -841
  160. data/public/lookbook-assets/js/embed.js.map +1 -1
  161. data/public/lookbook-assets/js/iframe.js +906 -0
  162. data/public/lookbook-assets/js/iframe.js.map +1 -0
  163. data/public/lookbook-assets/js/index.js +13567 -0
  164. data/public/lookbook-assets/js/index.js.map +1 -0
  165. data/public/lookbook-assets/js/lookbook-core.js +85 -0
  166. data/public/lookbook-assets/js/lookbook-core.js.map +1 -0
  167. data/public/lookbook-assets/js/lookbook.js +165 -12754
  168. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  169. data/public/lookbook-assets/lookbook-esm.js +1427 -0
  170. data/public/lookbook-assets/lookbook-esm.js.map +1 -0
  171. data/public/lookbook-assets/lookbook-global.js +1427 -0
  172. data/public/lookbook-assets/lookbook-global.js.map +1 -0
  173. data/public/lookbook-assets/lookbook.js +1427 -0
  174. data/public/lookbook-assets/lookbook.js.map +1 -0
  175. metadata +80 -72
  176. data/app/components/lookbook/embed/component.js +0 -39
  177. data/app/helpers/lookbook/component_helper.rb +0 -84
  178. data/app/helpers/lookbook/output_helper.rb +0 -19
  179. data/app/helpers/lookbook/page_helper.rb +0 -34
  180. data/app/views/layouts/lookbook/inspector.html.erb +0 -7
  181. data/app/views/layouts/lookbook/page.html.erb +0 -53
  182. data/app/views/layouts/lookbook/standalone.html.erb +0 -5
  183. data/lib/lookbook/entities/collections/component_collection.rb +0 -4
  184. data/lib/lookbook/entities/collections/preview_example_collection.rb +0 -4
  185. data/lib/lookbook/entities/component.rb +0 -31
  186. data/lib/lookbook/entities/concerns/navigable.rb +0 -43
  187. data/lib/lookbook/entities/preview.rb +0 -87
  188. data/lib/lookbook/entities/preview_example.rb +0 -100
  189. data/lib/lookbook/entities/preview_group.rb +0 -48
  190. data/lib/lookbook/preview_actions.rb +0 -43
  191. data/lib/lookbook/process.rb +0 -21
  192. data/lib/lookbook/rendered_example.rb +0 -37
  193. data/lib/lookbook/services/position_prefix_parser.rb +0 -16
  194. data/lib/lookbook/services/urls/search_param_builder.rb +0 -13
  195. data/lib/lookbook/tags/component_tag.rb +0 -13
@@ -1,82 +1,107 @@
1
- <% content_for :shell do %>
2
- <% if @previews.any? || @pages.any? %>
3
-
4
- <%= lookbook_render :split_layout,
5
- alpine_data: "$store.layout.main",
6
- ":class": "$store.layout.mobile && '!block'" do |layout| %>
1
+ <% content_for :body do %>
2
+ <div
3
+ id="app"
4
+ x-data="app"
5
+ x-cloak
6
+ @popstate.window="handleNavigation"
7
+ @click.document="hijax"
8
+ @navigation:start="closeMobileSidebar"
9
+ class="w-screen h-screen grid grid-rows-[40px_1fr] relative">
7
10
 
8
- <% layout.with_pane id: "app-sidebar", class: "flex flex-col bg-lookbook-sidebar-bg relative translate-x-0",
9
- ":class": "{
10
- 'transition': $store.layout.mobile,
11
- 'translate-x-full': $store.layout.mobile && sidebarHidden,
12
- '!absolute right-0 bottom-0 top-[40px] h-[calc(100%_-_40px)] w-full max-w-[420px] z-50 border-l border-lookbook-divider': $store.layout.mobile
13
- }",
14
- "@click.outside": "closeMobileSidebar",
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| %>
11
+ <%= render "lookbook/partials/user_styles" %>
20
12
 
21
- <% if @previews.any? %>
22
- <% layout.with_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.with_toolbar do |toolbar| %>
28
- <% toolbar.with_section padded: true do %>
29
- <h4 class="pt-1">Previews</h4>
30
- <% end %>
31
- <% toolbar.with_section align: :right, padded: false do %>
32
- <%= lookbook_render :button_group, size: :xs do |group| %>
33
- <% group.with_button icon: :minus_square,
34
- tooltip: "Collapse all",
35
- "@click": "closeAll" %>
13
+ <%= lookbook_render :header, id: "app-header", debug_menu: @config.debug_menu do |header| %>
14
+ <% header.branding { @config.project_name } %>
15
+ <% end %>
16
+
17
+ <% if @previews.any? || @pages.any? %>
18
+
19
+ <%= lookbook_render :split_layout,
20
+ alpine_data: "$store.layout.main",
21
+ ":class": "$store.layout.mobile && '!block'" do |layout| %>
22
+
23
+ <% layout.with_pane id: "app-sidebar", class: "flex flex-col bg-lookbook-sidebar-bg relative translate-x-0",
24
+ ":class": "{
25
+ 'transition': $store.layout.mobile,
26
+ 'translate-x-full': $store.layout.mobile && sidebarHidden,
27
+ '!absolute right-0 bottom-0 top-[40px] h-[calc(100%_-_40px)] w-full max-w-[420px] z-50 border-l border-lookbook-divider': $store.layout.mobile
28
+ }",
29
+ "@click.outside": "closeMobileSidebar",
30
+ cloak: true do %>
31
+
32
+ <% cache do %>
33
+
34
+ <%= lookbook_render :split_layout,
35
+ alpine_data: "$store.layout.#{@pages.any? && @previews.any? ? "sidebar" : "singleSectionSidebar"}",
36
+ style: "height: calc(100vh - 2.5rem);" do |layout| %>
37
+
38
+ <% if @previews.any? %>
39
+ <% layout.with_pane class: "overflow-hidden" do %>
40
+ <%= lookbook_render :nav,
41
+ id: "previews-nav",
42
+ tree: @previews.to_tree,
43
+ alpine_data: "$store.nav.previews" do |nav| %>
44
+ <%= nav.with_toolbar do |toolbar| %>
45
+ <% toolbar.with_section padded: true do %>
46
+ <h4 class="pt-1">Previews</h4>
47
+ <% end %>
48
+ <% toolbar.with_section align: :right, padded: false do %>
49
+ <%= lookbook_render :button_group, size: :xs do |group| %>
50
+ <% group.with_button icon: :minus_square,
51
+ tooltip: "Collapse all",
52
+ "@click": "closeAll" %>
53
+ <% end %>
36
54
  <% end %>
37
55
  <% end %>
56
+ <% nav.filter store: "$store.nav.previews.filter", placeholder: "Filter previews by name&hellip;" %>
38
57
  <% end %>
39
- <% nav.with_filter store: "$store.nav.previews.filter", placeholder: "Filter previews by name&hellip;" %>
40
58
  <% end %>
41
59
  <% end %>
42
- <% end %>
43
60
 
44
- <% if @pages.any? %>
45
- <% layout.with_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.with_toolbar do |toolbar| %>
51
- <% toolbar.with_section padded: true do %>
52
- <h4 class="pt-1">Pages</h4>
53
- <% end %>
54
- <% toolbar.with_section align: :right, padded: false do %>
55
- <%= lookbook_render :button_group, size: :xs do |group| %>
56
- <% group.with_button icon: :minus_square,
57
- tooltip: "Collapse all",
58
- "@click": "closeAll" %>
61
+ <% if @pages.any? %>
62
+ <% layout.with_pane class: "overflow-hidden" do %>
63
+ <%= lookbook_render :nav,
64
+ id: "pages-nav",
65
+ tree: @pages.to_tree,
66
+ alpine_data: "$store.nav.pages" do |nav| %>
67
+ <%= nav.with_toolbar do |toolbar| %>
68
+ <% toolbar.with_section padded: true do %>
69
+ <h4 class="pt-1">Pages</h4>
70
+ <% end %>
71
+ <% toolbar.with_section align: :right, padded: false do %>
72
+ <%= lookbook_render :button_group, size: :xs do |group| %>
73
+ <% group.with_button icon: :minus_square,
74
+ tooltip: "Collapse all",
75
+ "@click": "closeAll" %>
76
+ <% end %>
59
77
  <% end %>
60
78
  <% end %>
61
79
  <% end %>
62
80
  <% end %>
63
81
  <% end %>
64
82
  <% end %>
83
+
65
84
  <% end %>
66
85
  <% end %>
67
- <% end %>
68
86
 
69
- <% layout.with_pane id: "app-main", class: "overflow-hidden h-full", ":class": "$store.layout.mobile && 'w-screen'" do %>
70
- <%= content_for?(:main) ? yield(:main) : yield %>
87
+ <% layout.with_pane id: "app-main", class: "overflow-hidden h-full", ":class": "$store.layout.mobile && 'w-screen'" do %>
88
+ <%= content_for?(:main) ? yield(:main) : yield %>
89
+ <% end %>
71
90
  <% end %>
91
+ <% else %>
92
+ <div id="app-main" class="w-screen h-full overflow-hidden">
93
+ <%= content_for?(:main) ? yield(:main) : yield %>
94
+ </div>
72
95
  <% end %>
73
96
 
74
- <% else %>
75
- <div id="app-main" class="w-screen h-full overflow-hidden">
76
- <%= content_for?(:main) ? yield(:main) : yield %>
77
- </div>
78
- <% end %>
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>
97
+ <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>
98
+
99
+ <% if content_for? :dropdowns %>
100
+ <div class="hidden">
101
+ <%= content_for :dropdowns -%>
102
+ </div>
103
+ <% end %>
104
+ </div>
80
105
  <% end %>
81
106
 
82
- <%= render template: "layouts/lookbook/shell" %>
107
+ <%= render template: "layouts/lookbook/skeleton" %>
@@ -0,0 +1,16 @@
1
+ <% content_for :body do %>
2
+ <div
3
+ id="app"
4
+ x-data="app"
5
+ x-cloak
6
+ @popstate.window="handleNavigation"
7
+ @click.document="hijax"
8
+ class="overflow-hidden">
9
+
10
+ <%= render "lookbook/partials/user_styles" %>
11
+
12
+ <%= content_for?(:main) ? yield(:main) : yield %>
13
+ </div>
14
+ <% end %>
15
+
16
+ <%= render template: "layouts/lookbook/skeleton" %>
@@ -15,7 +15,7 @@
15
15
  <% end %>
16
16
 
17
17
  <%= lookbook_render :header, id: "app-header", debug_menu: @config.debug_menu do |header| %>
18
- <% header.with_branding { @config.project_name } %>
18
+ <% header.branding { @config.project_name } %>
19
19
  <% end %>
20
20
 
21
21
  <%= content_for?(:shell) ? yield(:shell) : yield %>
@@ -5,8 +5,8 @@
5
5
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
7
7
 
8
- <link href="<%= asset_path("/css/lookbook.css") %>" rel="stylesheet">
9
- <link href="<%= asset_path("/css/themes/#{@config.ui_theme}.css") %>" rel="stylesheet">
8
+ <link href="<%= lookbook_asset_path("/css/lookbook.css") %>" rel="stylesheet">
9
+ <link href="<%= lookbook_asset_path("/css/themes/#{@config.ui_theme}.css") %>" rel="stylesheet">
10
10
 
11
11
  <%- if @theme_overrides.present? %>
12
12
  <style media="all">
@@ -17,11 +17,11 @@
17
17
  <% if @config.ui_favicon == true %>
18
18
  <link
19
19
  rel="icon"
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"
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"
21
21
  media="(prefers-color-scheme: dark)">
22
22
  <link
23
23
  rel="icon"
24
- 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_light_mode %>' d='M0 0h96v84H0V0z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"
24
+ 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_light_mode %>' d='M0 0h96v84H0V0z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"
25
25
  media="(prefers-color-scheme: light)">
26
26
  <% end %>
27
27
 
@@ -32,15 +32,20 @@
32
32
  window.SOCKET_PATH = "<%= @engine.websocket.full_mount_path %>";
33
33
  <% end %>
34
34
  </script>
35
+
36
+ <script src="<%= lookbook_asset_path("/js/index.js") %>" defer></script>
35
37
 
36
- <script src="<%= asset_path("/js/lookbook.js") %>" defer></script>
37
- <% if params[:lookbook_embed] %>
38
- <script src="<%= asset_path("/js/embed.js") %>" defer></script>
38
+ <% if @embed %>
39
+ <%= render "lookbook/partials/iframe_content_scripts" %>
40
+ <% else %>
41
+ <script src="<%= lookbook_asset_path("/js/lookbook.js") %>" defer></script>
39
42
  <% end %>
40
43
 
44
+ <%= content_for :scripts %>
45
+
41
46
  <title><%= [@title, @config.project_name || "Lookbook"].compact.join(" :: ") %></title>
42
47
  </head>
43
48
  <body>
44
- <%= yield :body %>
49
+ <%= content_for?(:body) ? yield(:body) : yield %>
45
50
  </body>
46
51
  </html>
@@ -0,0 +1,12 @@
1
+ <%= lookbook_render "embed/inspector",
2
+ target: @target,
3
+ scenarios: @scenario_choices,
4
+ panels: @panels,
5
+ actions: @actions,
6
+ options: @options,
7
+ context: {
8
+ data: @inspector_data,
9
+ params: @passed_params,
10
+ dynamic_display_options: @dynamic_display_options,
11
+ static_display_options: @static_display_options
12
+ } %>
@@ -1,4 +1,4 @@
1
- <% items = examples.select { |example| example.notes.present? } %>
1
+ <% items = scenarios.select { |scenario| scenario.notes.present? } %>
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| %>
@@ -1,7 +1,7 @@
1
1
  <%= lookbook_render :code, line_numbers: true, full_height: true do -%>
2
- <% if examples.many? -%>
3
- <% examples.each do |example| -%><%== "<!-- #{example.label} -->\n#{beautify(example.output)}\n\n" -%><% end %>
2
+ <% if scenarios.many? -%>
3
+ <% scenarios.each do |scenario| -%><%== "<!-- #{scenario.label} -->\n#{scenario.output}\n\n" -%><% end %>
4
4
  <%- else -%>
5
- <%== beautify(examples.first.output) -%>
5
+ <%== scenarios.first.output -%>
6
6
  <%- end %>
7
7
  <% end %>
@@ -1,11 +1,11 @@
1
1
  <div class="h-full">
2
- <% if examples.many? %>
3
- <%= lookbook_render :code, language: examples.first.source_lang[:name], line_numbers: true, full_height: true do -%>
4
- <%- examples.each.with_index(1) do |example, i| -%>
5
- <%== "#{sprintf example.source_lang[:comment], example.label}\n#{example.source}\n#{"\n" if i < examples.size}" %><% end %>
2
+ <% if scenarios.many? %>
3
+ <%= lookbook_render :code, language: scenarios.first.source_lang[:name], line_numbers: true, full_height: true do -%>
4
+ <%- scenarios.each.with_index(1) do |scenario, i| -%>
5
+ <%== "#{sprintf scenario.source_lang[:comment], scenario.label}\n#{scenario.source}\n#{"\n" if i < scenarios.size}" %><% end %>
6
6
  <% end %>
7
7
  <% else %>
8
- <% example = examples.first %>
9
- <%= lookbook_render :code, language: example.source_lang[:name], line_numbers: true, full_height: true do %><%== example.source %><% end %>
8
+ <% scenario = scenarios.first %>
9
+ <%= lookbook_render :code, language: scenario.source_lang[:name], line_numbers: true, full_height: true do %><%== scenario.source %><% end %>
10
10
  <% end %>
11
11
  </div>
@@ -1,150 +1,157 @@
1
- <%= lookbook_render :split_layout,
2
- alpine_data: "$store.layout.inspector",
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| %>
7
-
8
- <%= layout.with_pane class: "flex flex-col h-full overflow-hidden",
9
- "x-effect": "forceOrientation = (layoutWidth < $store.inspector.minVerticalSplitWidth) ? 'horizontal' : null" do %>
10
-
11
- <%= lookbook_render :toolbar, id: "main-toolbar" do |toolbar| %>
12
- <% toolbar.with_section ":class": "layoutResizing && 'overflow-hidden'" do %>
13
- <%= lookbook_render :tabs, alpine_data: "$store.inspector.main", id: "inspector-tabs-main" do |tabs| %>
14
- <%= @main_panels.each do |panel| %>
15
- <% tabs.with_tab name: panel.name,
16
- label: panel.label,
17
- hotkey: panel.hotkey,
18
- disabled: panel.disabled %>
1
+ <main class="h-[calc(100vh_-_2.5rem)]">
2
+ <%= lookbook_render :split_layout,
3
+ alpine_data: "$store.layout.inspector",
4
+ ":class": "($store.inspector.drawer.hidden || #{@drawer_panels.none?}) && '!grid-rows-[1fr] !grid-cols-[1fr]'",
5
+ data: {
6
+ "preview-target": @target.id
7
+ } do |layout| %>
8
+
9
+ <%= layout.with_pane class: "flex flex-col h-full overflow-hidden",
10
+ "x-effect": "forceOrientation = (layoutWidth < $store.inspector.minVerticalSplitWidth) ? 'horizontal' : null" do %>
11
+
12
+ <%= lookbook_render :toolbar, id: "main-toolbar" do |toolbar| %>
13
+ <% toolbar.with_section ":class": "layoutResizing && 'overflow-hidden'" do %>
14
+ <%= lookbook_render :tabs, alpine_data: "$store.inspector.main", id: "inspector-tabs-main" do |tabs| %>
15
+ <%= @main_panels.each do |panel| %>
16
+ <% tabs.with_tab name: panel.name,
17
+ label: panel.label,
18
+ hotkey: panel.hotkey,
19
+ disabled: panel.disabled %>
20
+ <% end %>
19
21
  <% end %>
20
22
  <% end %>
21
- <% end %>
22
23
 
23
- <% toolbar.with_section align: :right, class: "flex-none" do %>
24
- <% if @dynamic_display_options.any? %>
25
- <%= lookbook_render "display_options/editor" do |editor| %>
26
- <% @dynamic_display_options.each do |key, opts| %>
27
- <% editor.with_field name: key, opts: opts, value: @static_display_options[key] %>
24
+ <% toolbar.with_section align: :right, class: "flex-none" do %>
25
+ <% if @dynamic_display_options.any? %>
26
+ <%= lookbook_render "display_options/editor" do |editor| %>
27
+ <% @dynamic_display_options.each do |key, opts| %>
28
+ <% editor.with_field name: key, opts: opts, value: @static_display_options[key] %>
29
+ <% end %>
28
30
  <% end %>
29
31
  <% end %>
30
32
  <% end %>
31
- <% end %>
32
-
33
- <% toolbar.with_section divide: :left, class: "flex-none relative z-10" do %>
34
- <%= lookbook_render :button_group do |group| %>
35
- <% group.with_button icon: :link,
36
- tooltip: "Copy preview URL",
37
- copy: true do %>
38
- <%= lookbook_inspect_url(@target.lookup_path, request.query_parameters) %>
39
- <% end %>
40
33
 
41
- <% if @pages.any? %>
42
- <% group.with_button icon: :code,
43
- tooltip: "Copy page embed code",
34
+ <% toolbar.with_section divide: :left, class: "flex-none relative z-10" do %>
35
+ <%= lookbook_render :button_group do |group| %>
36
+ <%= group.with_button id: "embed-generator-dropdown-button", icon: :code_2, tooltip: "Get embed code" do |button| %>
37
+ <% button.with_dropdown.with_content(lookbook_render :embed_code_dropdown,
38
+ pages: @pages,
39
+ preview: @preview,
40
+ target: @target,
41
+ params: request.query_parameters
42
+ ) %>
43
+ <% end %>
44
+ <% group.with_button id: "copy-preview-url-button",
45
+ icon: :link,
46
+ tooltip: "Copy preview URL",
44
47
  copy: true do %>
45
- &lt;%= embed <%= @preview.preview_class_name %>, :<%= @target.name %>, params: <%= request.query_parameters.deep_symbolize_keys.to_s %> %&gt;
48
+ <%= lookbook_inspect_url(@target.lookup_path, request.query_parameters) %>
46
49
  <% end %>
50
+
51
+ <% group.with_button id: "refresh-preview-button",
52
+ icon: :refresh_cw,
53
+ tooltip: "Refresh preview",
54
+ "@click.stop": "startSpin(); $dispatch('viewport:reload'); stopSpin(500);" %>
55
+
56
+ <% group.with_button id: "open-preview-button",
57
+ icon: :external_link,
58
+ href: lookbook_preview_path(@target.lookup_path, request.query_parameters),
59
+ tooltip: "Open preview in new window",
60
+ target: "_blank" %>
61
+
62
+ <% group.with_button id: "show-drawer-button",
63
+ icon: "vertical ? 'sidebar' : 'credit-card'",
64
+ tooltip: "Show drawer",
65
+ "@click": "$store.inspector.drawer.hidden = false",
66
+ class: "rotate-180",
67
+ "x-show": "$store.inspector.drawer.hidden",
68
+ cloak: true %>
47
69
  <% end %>
48
-
49
- <% group.with_button icon: :refresh_cw,
50
- tooltip: "Refresh preview",
51
- "@click.stop": "startSpin(); $dispatch('viewport:reload'); stopSpin(500);" %>
52
-
53
- <% group.with_button icon: :external_link,
54
- href: lookbook_preview_path(@target.lookup_path, request.query_parameters),
55
- tooltip: "Open preview in new window",
56
- target: "_blank" %>
57
-
58
- <% group.with_button icon: "vertical ? 'sidebar' : 'credit-card'",
59
- tooltip: "Show drawer",
60
- "@click": "$store.inspector.drawer.hidden = false",
61
- class: "rotate-180",
62
- "x-show": "$store.inspector.drawer.hidden",
63
- cloak: true %>
64
70
  <% end %>
65
71
  <% end %>
66
- <% end %>
67
72
 
68
- <div class="h-full relative overflow-auto">
69
- <%= lookbook_render :tab_panels, alpine_data: "$store.inspector.main", id: "inspector-panels-main" do |tabs| %>
70
- <% @main_panels.each do |panel| %>
71
- <% tabs.with_panel name: panel.name do %>
72
- <%= lookbook_render :inspector_panel, name: panel.name do %>
73
- <%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
73
+ <div class="h-full relative overflow-auto">
74
+ <%= lookbook_render :tab_panels, alpine_data: "$store.inspector.main", id: "inspector-panels-main" do |tabs| %>
75
+ <% @main_panels.each do |panel| %>
76
+ <% tabs.with_panel name: panel.name do %>
77
+ <%= lookbook_render :inspector_panel, name: panel.name do %>
78
+ <%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
79
+ <% end %>
74
80
  <% end %>
75
81
  <% end %>
76
82
  <% end %>
77
- <% end %>
78
- </div>
79
- <% end %>
80
-
81
- <%= layout.with_pane class: "flex flex-col h-full overflow-hidden bg-lookbook-drawer-bg",
82
- "x-show": "!$store.inspector.drawer.hidden && #{@drawer_panels.any?}" do %>
83
+ </div>
84
+ <% end %>
83
85
 
84
- <%= lookbook_render :toolbar, id: "drawer-toolbar" do |toolbar| %>
85
- <% toolbar.with_section ":class": "layoutResizing && 'overflow-hidden'" do %>
86
- <%= lookbook_render :tabs, alpine_data: "$store.inspector.drawer", id: "inspector-tabs-drawer" do |tabs| %>
87
- <%= @drawer_panels.each do |panel| %>
88
- <% tabs.with_tab name: panel.name,
89
- label: panel.label,
90
- hotkey: panel.hotkey,
91
- disabled: panel.disabled %>
86
+ <%= layout.with_pane class: "flex flex-col h-full overflow-hidden bg-lookbook-drawer-bg",
87
+ "x-show": "!$store.inspector.drawer.hidden && #{@drawer_panels.any?}" do %>
88
+
89
+ <%= lookbook_render :toolbar, id: "drawer-toolbar" do |toolbar| %>
90
+ <% toolbar.with_section ":class": "layoutResizing && 'overflow-hidden'" do %>
91
+ <%= lookbook_render :tabs, alpine_data: "$store.inspector.drawer", id: "inspector-tabs-drawer" do |tabs| %>
92
+ <%= @drawer_panels.each do |panel| %>
93
+ <% tabs.with_tab name: panel.name,
94
+ label: panel.label,
95
+ hotkey: panel.hotkey,
96
+ disabled: panel.disabled %>
97
+ <% end %>
92
98
  <% end %>
93
99
  <% end %>
94
- <% end %>
95
100
 
96
- <% toolbar.with_section align: :right, class: "flex-none relative z-10" do %>
97
- <%= lookbook_render :button_group do |group| %>
98
- <%= @drawer_panels.select { |p| !p.disabled && p.copy }.each do |panel| %>
99
- <% group.with_button icon: :copy,
100
- tooltip: "Copy panel contents",
101
- copy: !!panel.copy,
102
- "x-show": "$store.inspector.drawer.activeTab === '#{panel.name}'",
103
- cloak: true do %>
104
- <%= panel.copy ? panel.copy : "" %>
105
- <% end %>
106
- <% end %>
101
+ <% toolbar.with_section align: :right, class: "flex-none relative z-10" do %>
102
+ <%= lookbook_render :button_group do |group| %>
103
+ <%= @drawer_panels.select { |p| !p.disabled && p.copy }.each do |panel| %>
104
+ <% group.with_button id: "copy-panel-contents-button",
105
+ icon: :copy,
106
+ tooltip: "Copy panel contents",
107
+ copy: !!panel.copy,
108
+ "x-show": "$store.inspector.drawer.activeTab === '#{panel.name}'",
109
+ cloak: true do %>
110
+ <%= panel.copy ? panel.copy : "" %>
111
+ <% end %>
112
+ <% end %>
113
+ <% end %>
107
114
  <% end %>
108
- <% end %>
109
-
110
- <% toolbar.with_section divide: :left, class: "flex-none relative z-10" do %>
111
- <%= lookbook_render :button_group do |group| %>
112
-
113
- <% group.with_button icon: :corner_up_right,
114
- tooltip: "Move drawer to right",
115
- "@click": "switchOrientation",
116
- "x-show": "horizontal && layoutWidth > $store.inspector.minVerticalSplitWidth",
117
- cloak: true %>
118
-
119
- <% group.with_button icon: :corner_up_right,
120
- "x-show": "horizontal && layoutWidth <= $store.inspector.minVerticalSplitWidth",
121
- disabled: true,
122
- cloak: true %>
123
115
 
124
- <% group.with_button icon: :corner_left_down,
125
- tooltip: "Move drawer to bottom",
126
- "@click": "switchOrientation",
127
- "x-show": "vertical",
128
- cloak: true %>
129
-
130
- <% group.with_button icon: :x_circle,
131
- tooltip: "Hide drawer",
132
- "@click": "$store.inspector.drawer.hidden = true",
133
- cloak: true %>
116
+ <% toolbar.with_section divide: :left, class: "flex-none relative z-10" do %>
117
+ <%= lookbook_render :button_group do |group| %>
118
+
119
+ <% group.with_button id: "drawer-to-right-button",
120
+ icon: :sidebar_open,
121
+ tooltip: "Pin drawer on right",
122
+ "@click": "switchOrientation",
123
+ "x-show": "horizontal",
124
+ ":class": "{'pointer-events-none opacity-50 !cursor-not-allowed': horizontal && layoutWidth <= $store.inspector.minVerticalSplitWidth}",
125
+ cloak: true %>
126
+
127
+ <% group.with_button id: "drawer-to-bottom-button",
128
+ icon: :sidebar_open,
129
+ tooltip: "Pin drawer on bottom",
130
+ "@click": "switchOrientation",
131
+ "x-show": "vertical",
132
+ class: "rotate-90",
133
+ cloak: true %>
134
+
135
+ <% group.with_button id: "hide-drawer-button",
136
+ icon: :x_circle,
137
+ tooltip: "Hide drawer",
138
+ "@click": "$store.inspector.drawer.hidden = true",
139
+ cloak: true %>
140
+ <% end %>
134
141
  <% end %>
135
- <% end %>
136
- <% end %>
137
-
138
- <div class="h-full overflow-auto">
139
- <%= lookbook_render :tab_panels, alpine_data: "$store.inspector.drawer", id: "inspector-panels-drawer" do |tabs| %>
140
- <% @drawer_panels.each do |panel| %>
141
- <% tabs.with_panel name: panel.name do %>
142
- <%= lookbook_render :inspector_panel, name: panel.name do %>
143
- <%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
142
+ <% end %>
143
+
144
+ <div class="h-full overflow-auto">
145
+ <%= lookbook_render :tab_panels, alpine_data: "$store.inspector.drawer", id: "inspector-panels-drawer" do |tabs| %>
146
+ <% @drawer_panels.each do |panel| %>
147
+ <% tabs.with_panel name: panel.name do %>
148
+ <%= lookbook_render :inspector_panel, name: panel.name do %>
149
+ <%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
150
+ <% end %>
144
151
  <% end %>
145
152
  <% end %>
146
153
  <% end %>
147
- <% end %>
148
- </div>
154
+ </div>
155
+ <% end %>
149
156
  <% end %>
150
- <% end %>
157
+ </main>