lookbook 3.0.0.alpha.1 → 3.0.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -261
  3. data/app/components/lookbook/ui/app/router/router.html.erb +1 -0
  4. data/app/components/lookbook/ui/app/router/router.js +29 -3
  5. data/app/components/lookbook/ui/elements/nav/nav_item/nav_item.js +2 -4
  6. data/app/components/lookbook/ui/elements/viewport/viewport.css +1 -0
  7. data/app/components/lookbook/ui/elements/viewport/viewport.html.erb +0 -1
  8. data/app/components/lookbook/ui/elements/viewport/viewport.rb +1 -6
  9. data/app/components/lookbook/ui/previews/preview_embed/preview_embed.html.erb +1 -2
  10. data/app/components/lookbook/ui/previews/preview_embed/preview_embed.rb +5 -4
  11. data/app/components/lookbook/ui/previews/preview_inspector/preview_inspector.html.erb +2 -2
  12. data/app/components/lookbook/ui/previews/preview_inspector/preview_inspector.rb +3 -2
  13. data/app/controllers/lookbook/events_controller.rb +4 -0
  14. data/app/controllers/lookbook/previews_controller.rb +1 -1
  15. data/app/views/layouts/lookbook/embed.html.erb +1 -1
  16. data/app/views/lookbook/inspector/panels/_preview.html.erb +1 -2
  17. data/app/views/lookbook/previews/embed.html.erb +1 -1
  18. data/app/views/lookbook/previews/inspect.html.erb +1 -0
  19. data/app/views/lookbook/previews/scenario.html.erb +5 -1
  20. data/config/initializers/05_autoload_previews.rb +2 -2
  21. data/config/routes.rb +2 -1
  22. data/lib/lookbook/concerns/feature_checks.rb +17 -0
  23. data/lib/lookbook/config.rb +2 -3
  24. data/lib/lookbook/directory_entity.rb +72 -0
  25. data/lib/lookbook/engine.rb +1 -1
  26. data/lib/lookbook/entity.rb +4 -2
  27. data/lib/lookbook/entity_tree.rb +17 -2
  28. data/lib/lookbook/pages/page_directories.rb +20 -0
  29. data/lib/lookbook/pages/page_directory_entity.rb +9 -40
  30. data/lib/lookbook/pages/page_entity.rb +4 -2
  31. data/lib/lookbook/pages/pages.rb +5 -14
  32. data/lib/lookbook/previews/preview_directories.rb +20 -0
  33. data/lib/lookbook/previews/preview_directory_entity.rb +8 -35
  34. data/lib/lookbook/previews/preview_entity.rb +7 -8
  35. data/lib/lookbook/previews/previews.rb +14 -15
  36. data/lib/lookbook/previews/scenario_entity.rb +1 -1
  37. data/lib/lookbook/reloader.rb +3 -6
  38. data/lib/lookbook/services/list_resolver.rb +13 -2
  39. data/lib/lookbook/services/styles_extractor.rb +1 -1
  40. data/lib/lookbook/utils.rb +4 -0
  41. data/lib/lookbook/version.rb +1 -1
  42. data/lib/lookbook.rb +0 -1
  43. data/public/lookbook-assets/app.css +2 -0
  44. data/public/lookbook-assets/app.js +48 -8
  45. metadata +6 -17
  46. data/lib/lookbook/previews/tags/priority_tag.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1abe573d8ff2988838217abe357ec62bf107b4117203388872f622ef5575253
4
- data.tar.gz: cee6369ffc488c3cbe1a502b85cbfb96b55c65144866b6f958ee19f9278b526f
3
+ metadata.gz: e001a0495be9b2addbeb92aaf82dfa6152b19e3f038c9cb4846ef9cccbc938e3
4
+ data.tar.gz: b59f9ddfd438cd2e38d7a99d0196f0a8e98aa2355a50db0ba7e34e253b4cd1e2
5
5
  SHA512:
6
- metadata.gz: 58b876a5c0deae713e792516f22b935e2852b5647626b9f758f736864a084d1cc13bba6b4ace46edc1ed233451724dbbfb7f3dcb254fc262bf27f5cda3e49a74
7
- data.tar.gz: c464e9e51c3a7b7bcaaacd9178f0bdda3f4acb2d6cf2e0fa77ab25408357e8c46ed56119980815c5fe89f74a6827fa559b78d951e0f556bbd9bae3f4fae6f025
6
+ metadata.gz: 4175c9a8b770a18d9b873e94a607f52666cb66be489f9c7e6abf57c5edbc6249a3c54bccc2820efbf2f06a9dd70fd63e8c429eb51d102d905895336eaaf924c5
7
+ data.tar.gz: d4e4ad273d84d352f765cb7398e4e6b927fa094fd6b4ae9831855b90386c9df91cd6357cf1a98e90ad2de02ae62f1f066f41620e3d83641f5aa9ef3c1e501f97
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  This branch contains a work-in-progress, exploratory, from-scratch rebuild of Lookbook, intended to form the basis of a future v3.0 release.
8
8
 
9
- [Demo](#demo-site) ・ [Usage](#usage) ・ [Development](#development) ・ [Background & motivation](#v3-rebuild---background-and-motivation) ・ [Current status](#v3-rebuild---current-status)
9
+ [Demo](#demo-site) ・ [Documentation](#documentation) ・ [Development](#development)
10
10
 
11
11
  ![CI status](https://github.com/lookbook-hq/lookbook/actions/workflows/ci.yml/badge.svg?branch=v3)
12
12
 
@@ -16,53 +16,15 @@ You can find a hosted version of the [demo/test app](#demo-app) here: https://v3
16
16
 
17
17
  This pulls directly from the `v3` development branch and so may occasionally be broken.
18
18
 
19
- ## Usage
19
+ ## Documentation
20
20
 
21
- Lookbook v3 is currently under heavy development and **should not be considered stable**.
21
+ v3-specific documentation is still very much a work in progress. The pages below should provide enough information if you wish to install the latest alpha release and test out some of the new features.
22
22
 
23
- However, intrepid individuals who are familiar with Lookbook and wish to kick the tyres or get a preview of the upcoming changes can install the Lookbook gem directly from the `v3` branch of this repository.
24
-
25
- > Alternatively you can pull down the codebase and [run the included demo app](#demo-app) to see some of the new features in action.
26
-
27
- ### Requirements
28
-
29
- * Ruby >= 3.0.0
30
- * Rails >= 6.1.0
31
-
32
- ### Installation
33
-
34
- Add Lookbook to the `development` group in your Gemfile:
35
-
36
- ```rb
37
- group :development do
38
- gem "lookbook", github: "lookbook-hq/lookbook", branch: "v3"
39
- gem "listen" # Required for 'live' UI updates when file changes are detected
40
- end
41
- ```
42
-
43
- Lookbook will automatically be mounted at `/lookbook` within your app when the server is started.
44
-
45
- > 🚨 Previously Lookbook required manual mounting in your app. This is **no longer the case**, so if trialing v3 in a project with an existing Lookbook install you must remove [the mounting code](https://lookbook.build/guide/installation#step-2) from your routes.rb file first.
46
-
47
- ### Configuration
48
-
49
- The currently implemented v3 configuration options are not yet documented, but can be seen in the [config.rb](lib/lookbook/config.rb) file.
50
-
51
- > 🚨 If testing out the v3 branch on an existing Lookbook install you may see errors if setting v2.x config options that have not yet been re-implemented in v3.
52
-
53
- ### Breaking changes
54
-
55
- Lookbook v3.0 will contain a number of breaking changes from the v2.x releases.
56
-
57
- The majority of these changes will be in the _extending_, _theming_ and _API_ areas, so heavily customised Lookbook installations may find upgrading a more involved process. As yet there is no documentation on the exact scope of these changes.
58
-
59
- In addition, until v3 development reaches beta release stage there are likely to be _unintentional breaking changes_ due to missing or partly-implemented features.
60
-
61
- For these reasons, it is recommended that anyone who wants to kick the tyres on the pre-alpha v3 codebase do so **on new projects** or **existing projects with simple, 'vanilla' Lookbook installs** to minimise the chance of running into issues.
62
-
63
- ### Running in production
64
-
65
- Please don't do this. It's really not ready yet.
23
+ * [Installing/Upgrading](./docs/alpha/01_usage.md)
24
+ * [New features](./docs/alpha/02_new_features.md)
25
+ * [Background and motivation](./docs/alpha/03_motivation.md)
26
+ * [Development status](./docs/alpha/08_status.md)
27
+ * [Troubleshooting/Known issues](./docs/alpha/09_troubleshooting.md)
66
28
 
67
29
  ## Development
68
30
 
@@ -141,221 +103,6 @@ If you want to disable `Lookbook` logging, set
141
103
  Lookbook.logger = ::Logger.new('/dev/null')
142
104
  ```
143
105
 
144
- ## v3 rebuild - background and motivation
145
-
146
- The current Lookbook codebase has grown organically and haphazardly from a few custom ViewComponent preview templates into a standalone Rails Engine gem with support for previewing many different types of components and views.
147
-
148
- In order to provide a solid foundation for future development this v3 branch was created with aspirations to improve the quality of the Lookbook codebase, reduce the number of third party dependencies, fix long-standing issues that are hard to address in the current implementation
149
- and explore building out new (and experimental) feature ideas.
150
-
151
- More concretely, a number of **key goals** are helping shape the development work:
152
-
153
- #### UI
154
-
155
- * Improve accessibilty and usability of the app (#17)
156
- * Expose a better theming system using CSS variables (with light and dark modes out of the box)
157
- * Replace ViewComponent dependency with bespoke component system for building the UI
158
-
159
- #### Previews
160
-
161
- * Add support for ActionMailer previews (#570)
162
- * Implement customisable preview overview/documentation pages
163
- * Fix compatability issues with partial/view template previews (#581, #555)
164
- * Improve handling and logging of parser errors (#593)
165
-
166
- #### Preview embeds
167
-
168
- * Add more granualar security configuration options for embed iframes (#571)
169
- * Implement `<lookbook-embed></lookbook-embed>` as a native web component
170
-
171
- #### Pages
172
-
173
- * Make it easier to customise the look and feel of pages
174
- * Expand set of UI and path helpers available in pages
175
-
176
- #### Development/Testing
177
-
178
- * Streamline Lookbook development process - runnable test/demo/development app, simpler asset dev/build pipeline
179
- * Improve test setup - switch to Minitest, run tests against demo app, better integration test coverage
180
- * Make logging play nicer with standard Rails logging options and third party gems
181
-
182
- #### Other
183
-
184
- * Remove ActionCable requirement, use SSE for live UI updates in dev
185
- * Improve error handling and compatability with `better_errors` etc (#528)
186
- * Remove some of the madness from codebase 🙈
187
-
188
- ## v3 rebuild - Current status
189
-
190
- Lookbook v3 is currently in a pre-alpha stage and is under active, exploratory development.
191
-
192
- The 'todo' list below is intended to provide a _very rough_ overview of the current state of progress. **It is not exhaustive**. Checked off items may still be revisited/refactored/removed in the future without warning.
193
-
194
- **Emoji key:**
195
-
196
- * 🆕 - New feature in v3
197
- * 🚧 - In progress or implemented but incomplete
198
- * 🧪 - Experimental feature/implementation
199
-
200
- ### UI
201
-
202
- #### General
203
-
204
- * [x] Basic desktop UI implementation
205
- * [x] Replace Tailwind with vanilla CSS
206
- * [x] Bespoke component system to replace ViewComponent
207
- * [x] Status bar 🆕 🚧
208
- * [x] Notifications for parser errors
209
- * [x] SSE-based live UI updating 🧪
210
- * [x] Expand nav to current item when opening app
211
- * [x] Don't fetch/render entire DOM on navigation (no need to re-render sidebar etc)
212
- * [ ] Improve accessibilty (exact requirements tbd)
213
- * [ ] Mobile/small screen layout optimisations
214
- * [ ] Side-dockable preview inspector drawer
215
- * [ ] Search fields 'clear' buttons
216
- * [ ] Use custom icon sprite instead of inlined icons
217
-
218
- #### Code samples
219
-
220
- * [x] Syntax highlighting 🆕 🚧 🧪
221
- * [ ] Replace Shiki with something lighter (server-side?)
222
- * [ ] Click to copy
223
- * [ ] Line wrap toggle
224
-
225
- #### Theming/branding
226
-
227
- * [x] Light/dark mode themes + toggle 🆕 🚧
228
- * [x] Project links in header 🆕
229
- * [ ] Theme system based on CSS custom properties 🚧
230
- * [ ] Project logo customisation
231
-
232
- ### Previews
233
-
234
- #### Preview types
235
-
236
- * [x] ViewComponent previews
237
- * [x] Phlex previews
238
- * [x] Partials/templates previews
239
- * [x] ActionMailer previews 🆕 🧪
240
-
241
- #### Tags/annotations
242
-
243
- * [x] Notes
244
- * [x] `@label`
245
- * [x] `@hidden`
246
- * [x] `@param`
247
- * [x] `@display`
248
- * [x] `@!group ... @!endgroup`
249
- * [x] `@id` 🆕
250
- * [x] `@priority` 🆕
251
- * [x] `@location/@logical_path`
252
- * [ ] `@component/@renders`
253
- * [ ] `@source`
254
- * [ ] `@after_render`
255
- * [ ] `@status/@wip` ?
256
-
257
- #### Dynamic params
258
-
259
- * [x] Text input
260
- * [x] Textarea input
261
- * [x] Select input
262
- * [x] Checkbox input 🆕
263
- * [ ] Toggle input
264
- * [ ] Color picker input
265
- * [ ] Range input
266
-
267
- #### Display options
268
-
269
- * [x] Static display options
270
- * [x] Dynamic display options
271
-
272
- #### Inspector
273
-
274
- * [x] Preview panel
275
- * [x] Output panel
276
- * [x] Usage panel (combination of old 'source' and 'notes' panels)
277
- * [x] Metadata panel 🚧 🆕 🧪
278
- * [x] Params panel 🚧
279
- * [ ] Configurable breakpoints for quick preview viewport resizing
280
- * [ ] Embed code dropdown
281
- * [ ] Preview URL copy button
282
- * [ ] Manual preview refresh button
283
-
284
- #### Other
285
-
286
- * [x] Grouped scenarios
287
- * [x] Preview overview pages 🚧 🆕
288
- * [x] Custom preview controllers support
289
- * [x] Custom preview layouts support
290
- * [x] Preview parser error reporting
291
- * [x] Render previews in parent app context to fix path helper issues
292
- * [x] JSON endpoint
293
- * [x] ActionView annotation stripping
294
- * [ ] Option to specify order of preview directories in nav (i.e. non-alphabetical)
295
- * [ ] Output transformation
296
-
297
- ### Preview Embeds
298
-
299
- * [x] `<lookbook-embed>` implemented as HTML custom element
300
- * [x] Internal embeds (within pages in Lookbook)
301
- * [ ] External embeds (outside of Lookbook)
302
- * [ ] Configurable frame ancestors
303
-
304
- ### Pages
305
-
306
- * [x] Basic markdown + ERB pages system
307
- * [x] YAML Frontmatter config
308
- * [x] Landing page
309
- * [ ] Tabbed pages
310
- * [ ] Page layout and styling options 🚧
311
-
312
- ### Extending
313
-
314
- * [x] Custom inspector panels 🚧
315
- * [ ] Custom param inputs
316
- * [ ] Custom tags
317
- * [ ] Lifecycle hooks
318
- * [ ] Global data store
319
- * [ ] Ruby API
320
-
321
- ### Development
322
-
323
- * [x] Replace Parcel with PostCSS + esbuild for compiling assets
324
- * [x] Runnable, bundled demo app for development
325
- * [x] Minitest test suite setup
326
- * [x] Setup GH actions CI
327
- * [ ] Comprehensive set of test components + previews 🚧
328
- * [ ] UI integration tests 🚧
329
- * [ ] Set up Ruby & Rails versions test matrix via Appraisal
330
- * [ ] Release script (automate from GH?)
331
-
332
- ### Internals
333
-
334
- * [x] Auto-mounting of Lookbook engine 🆕
335
- * [x] Remove ActionCable dependency, use SSE for triggering UI live updates 🆕 🧪
336
- * [x] File change detection system
337
- * [x] Config options defined in Ruby and not YAML
338
- * [x] Config options synced with ViewComponent where appropriate
339
- * [x] UUID-based permalink endpoint 🆕 🧪
340
- * [x] Improved logger implementation
341
- * [ ] Rationalise & document entity method names
342
- * [ ] Make debug logging more consitent
343
- * [ ] Improve parsing/tree building performance
344
-
345
- ### Documentation
346
-
347
- * [ ] Switch to Nanoc for static docs building?
348
- * [ ] Document new features in v3
349
- * [ ] Port and update existing docs to new docs site
350
- * [ ] Automate config option documentation via YARD
351
- * [ ] Automate API docs via YARD
352
- * [ ] Set up automated build & deploy process for docs
353
-
354
- ### Other/Ideas/Maybe
355
-
356
- * [ ] CLI tool
357
- * [ ] JSON API
358
-
359
106
  ## License
360
107
 
361
108
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -5,6 +5,7 @@
5
5
  "@click": "handleClick",
6
6
  "@lookbook:visit": "visit($event.detail.url)",
7
7
  "@lookbook:update": "updatePage",
8
+ "@error.window": "handleError",
8
9
  "@popstate.window": "visit(location, false)",
9
10
  "@visibilitychange.document": "handleVisibilityChange"
10
11
  }) do %>
@@ -7,6 +7,8 @@ export default AlpineComponent("router", (sseEndpoint = null) => {
7
7
  return {
8
8
  serverEventsListener: null,
9
9
  routerLogger: null,
10
+ lastUpdate: Date.now(),
11
+ morphing: false,
10
12
 
11
13
  init() {
12
14
  this.routerLogger = new Logger("Router");
@@ -29,6 +31,7 @@ export default AlpineComponent("router", (sseEndpoint = null) => {
29
31
  await this.updateDOM(location, "router", {
30
32
  headers: { "X-Lookbook-Frame": "root" },
31
33
  });
34
+ this.lastUpdate = Date.now();
32
35
  this.routerLogger.info(`Page updated`);
33
36
  this.$dispatch("page-update:complete");
34
37
  },
@@ -41,16 +44,34 @@ export default AlpineComponent("router", (sseEndpoint = null) => {
41
44
  if (updateHistory) {
42
45
  history.pushState({}, "", result.url);
43
46
  }
47
+ this.lastUpdate = Date.now();
44
48
  this.routerLogger.debug(`Page loaded`);
45
49
  this.$dispatch("page-load:complete");
46
50
  },
47
51
 
52
+ async handleError(error) {
53
+ if (this.morphing) {
54
+ const { stack } = error.error;
55
+ if (stack.indexOf("Alpine") >= 0) {
56
+ window.location.reload();
57
+ }
58
+ }
59
+ },
60
+
48
61
  async updateDOM(url, selector, options = {}) {
62
+ if (this.morphing) {
63
+ return;
64
+ }
65
+
49
66
  const result = await fetchHTML(url, selector, options);
50
67
  if (result.status < 500) {
68
+ this.morphing = true;
51
69
  document.dispatchEvent(new CustomEvent("morph:start"));
52
70
  Alpine.morph(document.querySelector(selector), result.fragment);
53
- document.dispatchEvent(new CustomEvent("morph:complete"));
71
+ this.$nextTick(() => {
72
+ document.dispatchEvent(new CustomEvent("morph:complete"));
73
+ this.morphing = false;
74
+ });
54
75
  } else {
55
76
  location.href = url;
56
77
  }
@@ -69,8 +90,13 @@ export default AlpineComponent("router", (sseEndpoint = null) => {
69
90
  }
70
91
  },
71
92
 
72
- handleVisibilityChange() {
73
- if (this.serverEventsListener && !document.hidden) this.updatePage();
93
+ async handleVisibilityChange() {
94
+ if (this.serverEventsListener && !document.hidden) {
95
+ const response = await fetch(`${sseEndpoint}/ping`);
96
+ const lastServerUpdate = Date.parse(await response.text());
97
+
98
+ if (lastServerUpdate > this.lastUpdate) this.updatePage();
99
+ }
74
100
  },
75
101
 
76
102
  destroy() {
@@ -3,12 +3,14 @@ import { getData } from "@js/alpine/utils";
3
3
 
4
4
  export default AlpineComponent("navItem", ({ keywords, collection }) => {
5
5
  return {
6
+ key: null,
6
7
  keywords: [],
7
8
  isCollection: false,
8
9
  filteredOut: false,
9
10
  selected: false,
10
11
 
11
12
  init() {
13
+ this.key = this.$el.getAttribute("key");
12
14
  this.keywords = keywords || [];
13
15
  this.isCollection = collection || false;
14
16
  this.setSelectionState();
@@ -52,10 +54,6 @@ export default AlpineComponent("navItem", ({ keywords, collection }) => {
52
54
  return this.$root.getAttribute("data-url");
53
55
  },
54
56
 
55
- get key() {
56
- return this.$root.getAttribute("key");
57
- },
58
-
59
57
  get expanded() {
60
58
  return (
61
59
  this.expandedItems && this.key && this.expandedItems.includes(this.key)
@@ -53,6 +53,7 @@
53
53
  grid-template-columns: 1fr;
54
54
  grid-template-rows: 1fr;
55
55
  outline: 1px solid var(--lb-color-surface-divider);
56
+ background-color: var(--lb-viewport-background-color);
56
57
  }
57
58
 
58
59
  &.resize-x {
@@ -26,7 +26,6 @@
26
26
  class="viewport-window"
27
27
  :class="{inert}"
28
28
  src="<%= src %>"
29
- <% if srcdoc.present? %>srcdoc="<%== srcdoc %>"<% end %>
30
29
  frameborder="0"
31
30
  title="viewport window"></iframe>
32
31
  <% if resize_x? %>
@@ -3,18 +3,13 @@ module Lookbook
3
3
  class Viewport < BaseComponent
4
4
  attr_reader :id, :src
5
5
 
6
- def initialize(id:, src:, srcdoc: nil, resize_x: true, resize_y: true, **kwargs)
6
+ def initialize(id:, src:, resize_x: true, resize_y: true, **kwargs)
7
7
  @id = id
8
8
  @src = src
9
- @srcdoc = srcdoc
10
9
  @resize_x = resize_x
11
10
  @resize_y = resize_y
12
11
  end
13
12
 
14
- def srcdoc
15
- @srcdoc&.gsub("&", "&amp;")&.gsub("\"", "&quot;")
16
- end
17
-
18
13
  def resize_x? = @resize_x
19
14
 
20
15
  def resize_y? = @resize_y
@@ -25,7 +25,6 @@
25
25
 
26
26
  lb_viewport(
27
27
  target.preview_path(preview_params),
28
- srcdoc: preview_html,
29
28
  id: "embed-viewport-#{target.name}",
30
29
  resize_y: false
31
30
  )
@@ -44,7 +43,7 @@
44
43
 
45
44
  panels.each do |panel|
46
45
  pane.with_tab_panel(panel.name, key: "embed-panel-#{target.name}-#{panel.name}", label: panel.label) do
47
- render panel.partial, preview: preview, target: target, panel: panel
46
+ render panel.partial, preview: preview, target: target, panel: panel, preview_html: preview_html, **panel.locals
48
47
  end
49
48
  end
50
49
  end
@@ -1,22 +1,23 @@
1
1
  module Lookbook
2
2
  module UI
3
3
  class PreviewEmbed < BaseComponent
4
- attr_reader :preview, :target, :targets, :panels, :display_options, :display_options_values, :preview_html
4
+ attr_reader :preview, :target, :targets, :panels, :preview_html, :display_options, :display_options_values
5
5
 
6
- def initialize(preview:, target:, preview_html: nil, targets: [], panels: [], preview_params: {}, display_options: {}, display_options_values: {}, **kwargs)
6
+ def initialize(preview:, target:, targets: [], panels: [], preview_params: {}, preview_html: nil, display_options: {}, display_options_values: {}, **kwargs)
7
7
  @preview = preview
8
8
  @target = target
9
9
  @targets = targets
10
10
  @panels = panels
11
- @preview_html = preview_html
12
11
  @preview_params = preview_params
12
+ @preview_html = preview_html
13
13
  @display_options = display_options
14
14
  @display_options_values = display_options_values
15
15
  end
16
16
 
17
17
  def preview_params
18
18
  @preview_params.merge({
19
- _lookbook_embed: true
19
+ _lookbook_embed: true,
20
+ checksum: helpers.checksum(preview_html)
20
21
  })
21
22
  end
22
23
  end
@@ -40,7 +40,7 @@
40
40
 
41
41
  preview_panels.each do |panel|
42
42
  pane.with_tab_panel(panel.name, key: "inspector-panel-#{@target.name}-#{panel.name}", label: panel.label) do
43
- render panel.partial, preview: preview, target: target, panel: panel, **panel.locals
43
+ render panel.partial, preview: preview, target: target, panel: panel, preview_html: preview_html, **panel.locals
44
44
  end
45
45
  end
46
46
  end
@@ -60,7 +60,7 @@
60
60
 
61
61
  drawer_panels.each do |panel|
62
62
  pane.with_tab_panel(panel.name, key: "inspector-panel-#{@target.name}-#{panel.name}", label: panel.label) do
63
- render panel.partial, preview: preview, target: target, panel: panel, **panel.locals
63
+ render panel.partial, preview: preview, target: target, panel: panel, preview_html: preview_html, **panel.locals
64
64
  end
65
65
  end
66
66
  end
@@ -1,13 +1,14 @@
1
1
  module Lookbook
2
2
  module UI
3
3
  class PreviewInspector < BaseComponent
4
- attr_reader :preview, :target, :preview_url, :preview_panels, :drawer_panels, :display_options, :display_options_values
4
+ attr_reader :preview, :target, :preview_url, :preview_panels, :preview_html, :drawer_panels, :display_options, :display_options_values
5
5
 
6
- def initialize(preview:, target:, preview_url:, preview_panels: [], drawer_panels: [], display_options: {}, display_options_values: {}, **kwargs)
6
+ def initialize(preview:, target:, preview_url:, preview_panels: [], preview_html: nil, drawer_panels: [], display_options: {}, display_options_values: {}, **kwargs)
7
7
  @preview = preview
8
8
  @target = target
9
9
  @preview_url = preview_url
10
10
  @preview_panels = preview_panels
11
+ @preview_html = preview_html
11
12
  @drawer_panels = drawer_panels
12
13
  @display_options = display_options
13
14
  @display_options_values = display_options_values
@@ -30,5 +30,9 @@ module Lookbook
30
30
 
31
31
  head :ok
32
32
  end
33
+
34
+ def ping
35
+ render html: Engine.updated_at
36
+ end
33
37
  end
34
38
  end
@@ -39,7 +39,7 @@ module Lookbook
39
39
  @targets = @preview.inspector_targets.select { _1.name.to_sym.in?(target_names) }
40
40
  @panels = Inspector.embed_panels(embed_params[:panels], **panel_context)
41
41
  @actions = embed_params.fetch(:actions, [])
42
- @preview_html = render_target_in_layout(@target, embed: true)
42
+ @preview_html = render_target_in_layout(@target)
43
43
 
44
44
  render layout: "lookbook/embed"
45
45
  end
@@ -1,6 +1,6 @@
1
1
  <% content_for :body do %>
2
2
  <%= render Lookbook::UI::Router.new do %>
3
- <%= yield %>
3
+ <%= tag.main { yield } %>
4
4
  <% end %>
5
5
  <% end %>
6
6
 
@@ -1,7 +1,6 @@
1
1
  <%=
2
2
  lb_viewport(
3
- target.preview_path(request.query_parameters),
4
- srcdoc: @preview_html,
3
+ target.preview_path(request.query_parameters.merge({checksum: checksum(preview_html)})),
5
4
  id: "preview-viewport",
6
5
  )
7
6
  %>
@@ -1,12 +1,12 @@
1
1
  <%=
2
2
  render Lookbook::UI::PreviewEmbed.new(
3
3
  preview: @preview,
4
- preview_html: @preview_html,
5
4
  target: @target,
6
5
  targets: @targets,
7
6
  panels: @panels,
8
7
  actions: @actions,
9
8
  preview_params: request.query_parameters,
9
+ preview_html: @preview_html,
10
10
  display_options: @inspector.dynamic_display_options,
11
11
  display_options_values: @display_options
12
12
  )
@@ -2,6 +2,7 @@
2
2
  render Lookbook::UI::PreviewInspector.new(
3
3
  preview: @preview,
4
4
  target: @target,
5
+ preview_html: @preview_html,
5
6
  preview_panels: @preview_panels,
6
7
  drawer_panels: @drawer_panels,
7
8
  display_options: @inspector.dynamic_display_options,
@@ -5,7 +5,11 @@
5
5
  <%= render(@render_args[:component], @render_args[:args], &@render_args[:block]) %>
6
6
  <% end %>
7
7
  <% elsif @render_args[:email] %>
8
- <%= raw(@render_args[:email].decoded) %>
8
+ <% if @render_args[:email].multipart? %>
9
+ <%= raw(@render_args[:email].html_part.decoded) %>
10
+ <% else %>
11
+ <%= raw(@render_args[:email].decoded) %>
12
+ <% end %>
9
13
  <% else %>
10
14
  <%= render(@render_args[:template], **@render_args[:locals], &@render_args[:block]) %>
11
15
  <% end %>
@@ -1,5 +1,5 @@
1
- if Lookbook::Engine.enabled? && Lookbook.config.preview_paths.any?
2
- paths_to_add = Lookbook.config.preview_paths - ActiveSupport::Dependencies.autoload_paths
1
+ if Lookbook::Engine.enabled? && Lookbook::Previews.preview_paths.any?
2
+ paths_to_add = Lookbook::Previews.preview_paths - ActiveSupport::Dependencies.autoload_paths
3
3
  filtered_paths = paths_to_add.filter { |p| !Lookbook::Engine.component_paths.include?(p) }
4
4
  ActiveSupport::Dependencies.autoload_paths.concat(filtered_paths) if filtered_paths.any?
5
5
  end
data/config/routes.rb CHANGED
@@ -14,7 +14,8 @@ if Lookbook::Engine.enabled?
14
14
 
15
15
  get "/embed", to: "embeds#show", as: :embed
16
16
 
17
- resources :events, only: [:index]
17
+ get "/events", to: "events#index", as: :events
18
+ get "/events/ping", to: "events#ping", as: :ping
18
19
 
19
20
  match "*path", to: "application#not_found", via: :all
20
21
  end
@@ -0,0 +1,17 @@
1
+ module Lookbook
2
+ module FeatureChecks
3
+ extend ActiveSupport::Concern
4
+
5
+ def view_component_available?
6
+ @has_view_component ||= Utils.gem_installed?("view_component")
7
+ end
8
+
9
+ def listen_available?
10
+ @has_listen ||= Utils.gem_installed?("listen") && defined?(::Listen)
11
+ end
12
+
13
+ def action_mailer_available?
14
+ @has_action_mailer ||= !!defined?(::ActionMailer)
15
+ end
16
+ end
17
+ end
@@ -14,7 +14,7 @@ module Lookbook
14
14
  preview_layout: nil,
15
15
  preview_url_param: :name,
16
16
  preview_overview_template: "lookbook/previews/overview",
17
- preview_paths: ["test/components/previews", "test/mailers/previews"],
17
+ preview_paths: ["lookbook/previews", "test/components/previews"],
18
18
  preview_watch_paths: [],
19
19
  preview_watch_extensions: ["rb", "html.*"],
20
20
  preview_display_options: {},
@@ -38,7 +38,7 @@ module Lookbook
38
38
  inspector_param_inputs: default_inspector_param_inputs,
39
39
 
40
40
  page_route: "pages",
41
- page_paths: ["test/components/docs"],
41
+ page_paths: ["lookbook/docs", "test/components/docs"],
42
42
  page_extensions: ["md", "html.*", "md.*"],
43
43
  page_watch_paths: [],
44
44
  page_watch_extensions: [],
@@ -128,7 +128,6 @@ module Lookbook
128
128
  Lookbook::LabelTag,
129
129
  Lookbook::LocationTag,
130
130
  Lookbook::ParamTag,
131
- Lookbook::PriorityTag,
132
131
  Lookbook::StatusTag
133
132
  ]
134
133
  end