lookbook 1.0.8 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/lookbook/css/lookbook.css +76 -2
  3. data/app/assets/lookbook/js/app.js +20 -2
  4. data/app/{components/lookbook/params_editor/field/component.js → assets/lookbook/js/components/params_input.js} +1 -14
  5. data/app/assets/lookbook/js/lookbook.js +2 -1
  6. data/app/components/lookbook/base_component.rb +2 -3
  7. data/app/components/lookbook/button/component.html.erb +2 -2
  8. data/app/components/lookbook/button/component.rb +6 -1
  9. data/app/components/lookbook/button_group/component.rb +3 -4
  10. data/app/components/lookbook/copy_button/component.html.erb +1 -1
  11. data/app/components/lookbook/debug_menu/component.html.erb +51 -0
  12. data/app/components/lookbook/debug_menu/component.rb +18 -0
  13. data/app/components/lookbook/embed/component.html.erb +3 -3
  14. data/app/components/lookbook/header/component.html.erb +19 -44
  15. data/app/components/lookbook/inspector_panel/component.html.erb +5 -3
  16. data/app/components/lookbook/inspector_panel/component.rb +6 -18
  17. data/app/components/lookbook/nav/component.js +4 -0
  18. data/app/components/lookbook/nav/component.rb +1 -1
  19. data/app/components/lookbook/nav/item/component.html.erb +4 -4
  20. data/app/components/lookbook/nav/item/component.rb +1 -1
  21. data/app/components/lookbook/page_tabs/component.html.erb +4 -4
  22. data/app/components/lookbook/page_tabs/component.rb +1 -1
  23. data/app/components/lookbook/params/editor/component.html.erb +21 -0
  24. data/app/components/lookbook/{params_editor → params/editor}/component.js +1 -1
  25. data/app/components/lookbook/params/editor/component.rb +40 -0
  26. data/app/components/lookbook/params/field/component.css +76 -0
  27. data/app/components/lookbook/params/field/component.html.erb +27 -0
  28. data/app/components/lookbook/params/field/component.js +7 -0
  29. data/app/components/lookbook/params/field/component.rb +101 -0
  30. data/app/components/lookbook/tabs/component.html.erb +2 -2
  31. data/app/components/lookbook/tag_component.rb +1 -0
  32. data/app/components/lookbook/viewport/component.css +1 -1
  33. data/app/components/lookbook/viewport/component.html.erb +11 -0
  34. data/app/controllers/lookbook/previews_controller.rb +1 -1
  35. data/app/helpers/lookbook/component_helper.rb +45 -26
  36. data/app/helpers/lookbook/page_helper.rb +1 -1
  37. data/app/views/layouts/lookbook/application.html.erb +18 -4
  38. data/app/views/layouts/lookbook/page.html.erb +4 -4
  39. data/app/views/layouts/lookbook/shell.html.erb +4 -4
  40. data/app/views/layouts/lookbook/skeleton.html.erb +0 -6
  41. data/app/views/lookbook/error.html.erb +1 -1
  42. data/app/views/lookbook/pages/show.html.erb +2 -2
  43. data/app/views/lookbook/previews/inputs/_color.html.erb +5 -0
  44. data/app/views/lookbook/previews/inputs/_range.html.erb +15 -0
  45. data/app/views/lookbook/previews/inputs/_select.html.erb +5 -0
  46. data/app/views/lookbook/previews/inputs/_text.html.erb +5 -0
  47. data/app/views/lookbook/previews/inputs/_textarea.html.erb +5 -0
  48. data/app/views/lookbook/previews/inputs/_toggle.html.erb +20 -0
  49. data/app/views/lookbook/previews/panels/_content.html.erb +2 -2
  50. data/app/views/lookbook/previews/panels/_notes.html.erb +2 -2
  51. data/app/views/lookbook/previews/panels/_output.html.erb +1 -1
  52. data/app/views/lookbook/previews/panels/_params.html.erb +3 -3
  53. data/app/views/lookbook/previews/panels/_preview.html.erb +1 -1
  54. data/app/views/lookbook/previews/panels/_source.html.erb +2 -2
  55. data/app/views/lookbook/previews/show.html.erb +13 -19
  56. data/lib/lookbook/config.rb +16 -1
  57. data/lib/lookbook/engine.rb +16 -6
  58. data/lib/lookbook/markdown.rb +1 -1
  59. data/lib/lookbook/panels.rb +14 -4
  60. data/lib/lookbook/params.rb +66 -35
  61. data/lib/lookbook/parser.rb +1 -0
  62. data/lib/lookbook/preview.rb +10 -4
  63. data/lib/lookbook/preview_controller.rb +7 -19
  64. data/lib/lookbook/preview_example.rb +1 -1
  65. data/lib/lookbook/source_inspector.rb +10 -4
  66. data/lib/lookbook/tag.rb +13 -3
  67. data/lib/lookbook/tag_options.rb +111 -0
  68. data/lib/lookbook/tags.rb +6 -2
  69. data/lib/lookbook/template_parser.rb +72 -0
  70. data/lib/lookbook/theme.rb +1 -1
  71. data/lib/lookbook/utils.rb +23 -0
  72. data/lib/lookbook/version.rb +1 -1
  73. data/lib/lookbook.rb +2 -0
  74. data/public/lookbook-assets/css/lookbook.css +369 -126
  75. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  76. data/public/lookbook-assets/js/embed.js +13 -13
  77. data/public/lookbook-assets/js/embed.js.map +1 -1
  78. data/public/lookbook-assets/js/lookbook.js +706 -621
  79. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  80. metadata +42 -10
  81. data/app/components/lookbook/params_editor/component.html.erb +0 -3
  82. data/app/components/lookbook/params_editor/component.rb +0 -11
  83. data/app/components/lookbook/params_editor/field/component.html.erb +0 -49
  84. data/app/components/lookbook/params_editor/field/component.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95694c758af19ee6a561b2aedfee93d932c663f7027471204da2dce393052a5a
4
- data.tar.gz: 1b4f3e4af714af47b6719cbbef7a861ad0ca2341089e2689ef8ed80b9a745867
3
+ metadata.gz: d855b9a3a2e36fa5e18aa2388ced2c97a8b07dc8cd5b81785cd6ed1b85269bca
4
+ data.tar.gz: 3f54dfcf6def53543c8247634ed0b40e6a39807d6e09c59690c50f0f8a0f175d
5
5
  SHA512:
6
- metadata.gz: 0a148ae5b71546463c003244040e54de07106db6f927e61b77ff35c92d524f37ed59e53646833675a8d1c399968904ffe41891817e85628aa8da879af8aa3bd8
7
- data.tar.gz: ee91d909da4634558dbf542802ee770c921f0dfdec0bdc37592977b082a97705957bf7e19cf5168b599e78dca1f5d4222147417262c4b41f90b305a43c2c4f72
6
+ metadata.gz: f213eb79ea2eab3f01af6be18544c1d59d02905b50d6ff773f54f89e14e0982be43ff948c1eab32819317278a6915070cf1c8259923bb17b195d86d4932f27c5
7
+ data.tar.gz: 616c37c62765074f87d79c14313499e9bcec19e8722751f74ce39793693ca3058b60f55ac5e80edb406b9301022d79d55c3bb33f9601281576d3f15eb868109b
@@ -47,9 +47,83 @@
47
47
  }
48
48
 
49
49
  @layer components {
50
- .form-input {
50
+ [type="text"],
51
+ [type="email"],
52
+ [type="url"],
53
+ [type="password"],
54
+ [type="number"],
55
+ [type="date"],
56
+ [type="datetime-local"],
57
+ [type="month"],
58
+ [type="search"],
59
+ [type="tel"],
60
+ [type="time"],
61
+ [type="week"],
62
+ textarea,
63
+ select {
51
64
  @apply text-lookbook-input-text placeholder:text-lookbook-input-text-placeholder placeholder:italic;
52
65
  @apply border-lookbook-input-border focus:ring-lookbook-input-border-focus focus:border-lookbook-input-border-focus;
53
- @apply rounded-md text-sm w-full bg-lookbook-input-bg;
66
+ @apply rounded-md text-sm w-full bg-lookbook-input-bg block;
67
+ }
68
+
69
+ input[type="range"] {
70
+ -webkit-appearance: none;
71
+ appearance: none;
72
+ background: transparent;
73
+ cursor: pointer;
74
+ width: 100%;
75
+ }
76
+
77
+ input[type="range"]:focus {
78
+ outline: none;
79
+ }
80
+
81
+ input[type="range"]::-webkit-slider-runnable-track {
82
+ @apply bg-lookbook-input-toggle;
83
+ border-radius: 0.5rem;
84
+ height: 0.5rem;
85
+ }
86
+
87
+ input[type="range"]::-webkit-slider-thumb {
88
+ -webkit-appearance: none;
89
+ appearance: none;
90
+ @apply bg-lookbook-input-toggle-active;
91
+ margin-top: -4px;
92
+ border-radius: 0.5rem;
93
+ height: 1rem;
94
+ width: 1rem;
95
+ }
96
+
97
+ input[type="range"]::-moz-range-track {
98
+ @apply bg-lookbook-input-toggle;
99
+ border-radius: 0.5rem;
100
+ height: 0.5rem;
101
+ }
102
+
103
+ input[type="range"]::-moz-range-thumb {
104
+ @apply bg-lookbook-input-toggle-active;
105
+ border: none;
106
+ border-radius: 0.5rem;
107
+ height: 1rem;
108
+ width: 1rem;
109
+ }
110
+
111
+ input[type="range"]:focus::-webkit-slider-thumb,
112
+ input[type="range"]:focus::-moz-range-thumb {
113
+ @apply outline-1 outline-lookbook-input-toggle-active outline-offset-2;
114
+ }
115
+
116
+ input[type="color"] {
117
+ -webkit-appearance: none;
118
+ width: 46px;
119
+ @apply border border-lookbook-input-border rounded-lg cursor-pointer;
120
+ }
121
+
122
+ input[type="color"]::-webkit-color-swatch-wrapper {
123
+ padding: 0;
124
+ }
125
+
126
+ input[type="color"]::-webkit-color-swatch {
127
+ @apply border-0 rounded-lg;
54
128
  }
55
129
  }
@@ -5,10 +5,20 @@ import { isExternalLink } from "./helpers/dom";
5
5
 
6
6
  export default function app() {
7
7
  return {
8
+ _requestsInProgress: 0,
9
+
8
10
  version: Alpine.$persist("").as("lookbook-version"),
9
11
 
10
12
  location: window.location,
11
13
 
14
+ get sidebarHidden() {
15
+ return this.$store.layout.sidebar.hidden;
16
+ },
17
+
18
+ get loading() {
19
+ return this._requestsInProgress > 0;
20
+ },
21
+
12
22
  init() {
13
23
  if (window.SOCKET_PATH) {
14
24
  console.log("SOCKET CREATED");
@@ -42,6 +52,7 @@ export default function app() {
42
52
  async updateDOM() {
43
53
  this.debug("Starting DOM update");
44
54
  this.$dispatch("dom:update-start");
55
+ this.requestStart();
45
56
  try {
46
57
  const { fragment, title } = await fetchHTML(
47
58
  window.location,
@@ -49,6 +60,7 @@ export default function app() {
49
60
  );
50
61
  morph(this.$root, fragment);
51
62
  document.title = title;
63
+ this.requestEnd();
52
64
  this.$dispatch("dom:update-complete");
53
65
  this.debug("DOM update complete");
54
66
  } catch (err) {
@@ -67,8 +79,14 @@ export default function app() {
67
79
  }
68
80
  },
69
81
 
70
- get sidebarHidden() {
71
- return this.$store.layout.sidebar.hidden;
82
+ requestStart() {
83
+ this._requestsInProgress += 1;
84
+ },
85
+
86
+ requestEnd() {
87
+ if (this._requestsInProgress > 0) {
88
+ this._requestsInProgress -= 1;
89
+ }
72
90
  },
73
91
 
74
92
  ...Alpine.$log,
@@ -1,4 +1,4 @@
1
- export default function paramsEditorFieldComponent({ name, value }) {
1
+ export default function paramsInputComponent({ name, value }) {
2
2
  return {
3
3
  name,
4
4
  value,
@@ -19,18 +19,5 @@ export default function paramsEditorFieldComponent({ name, value }) {
19
19
  validate() {
20
20
  return this.$root.reportValidity ? this.$root.reportValidity() : true;
21
21
  },
22
-
23
- get isNarrowLayout() {
24
- return this.narrow || false;
25
- },
26
-
27
- bindings: {
28
- input: {
29
- [":id"]: "`param-${name}`",
30
- ["x-ref"]: "input",
31
- ["x-model.debounce.200"]: "value",
32
- ["@keydown.stop"]: true,
33
- },
34
- },
35
22
  };
36
23
  }
@@ -19,7 +19,7 @@ import app from "./app";
19
19
  // Note: A ParcelJS issue prevents loading all depths of component JS files in one glob,
20
20
  // so need to split it up. Path aliases also do not work with the glob imports.
21
21
  import { getComponents } from "./helpers/build";
22
- import * as components from "../../../components/lookbook/*/component.js";
22
+ import * as components from "../../../components/lookbook/*/*component.js";
23
23
  import * as subComponents from "../../../components/lookbook/*/*/component.js";
24
24
  import * as jsComponents from "./components/*.js";
25
25
 
@@ -50,6 +50,7 @@ Alpine.data("app", app);
50
50
  [components, subComponents, jsComponents].forEach((scripts) => {
51
51
  const components = getComponents(scripts);
52
52
  Object.keys(components).forEach((name) => {
53
+ console.log(name);
53
54
  Alpine.data(`${name}Component`, components[name]);
54
55
  });
55
56
  });
@@ -12,11 +12,10 @@ module Lookbook
12
12
  merged_classes = class_names(attrs[:class], @html_attrs[:class])
13
13
  merged_attrs = @html_attrs.except(:class).deep_merge(attrs.except(:class))
14
14
 
15
- render Lookbook::TagComponent.new(tag: tag,
16
- name: component_name,
15
+ lookbook_tag tag, name: component_name,
17
16
  **merged_attrs,
18
17
  "x-data": prepare_alpine_data(merged_attrs[:"x-data"]),
19
- class: merged_classes), &block
18
+ class: merged_classes, &block
20
19
  end
21
20
 
22
21
  def component_name
@@ -10,7 +10,7 @@
10
10
  disabled: @disabled,
11
11
  "@keydown.esc.stop": "hideDropdown" do %>
12
12
  <span x-ref="icon">
13
- <%= icon || render_component(:icon, name: @icon, size: icon_size, ":class": "{'animate-spin': _spinning}") %>
13
+ <%= icon || lookbook_render(:icon, name: @icon, size: icon_size, ":class": "{'animate-spin': _spinning}") %>
14
14
  </span>
15
15
  <% if @tooltip %>
16
16
  <label class="hidden" x-ref="tooltip"><%= @tooltip %></label>
@@ -18,7 +18,7 @@
18
18
  <% if content %>
19
19
  <div x-ref="content"><%== content %></div>
20
20
  <% end %>
21
- <% if dropdown %>
21
+ <% if dropdown? %>
22
22
  <div class="hidden" x-ref="dropdown">
23
23
  <div class="bg-white divide-y divide-lookbook-divider text-left">
24
24
  <%== dropdown %>
@@ -4,6 +4,7 @@ module Lookbook
4
4
  renders_one :dropdown
5
5
 
6
6
  ICON_SIZES = {
7
+ xs: 3,
7
8
  sm: 3.5,
8
9
  md: 4,
9
10
  lg: 6
@@ -23,13 +24,17 @@ module Lookbook
23
24
  end
24
25
 
25
26
  def padding
26
- @size == :sm ? "p-1" : "p-2"
27
+ [:xs, :sm].include?(@size) ? "p-1" : "p-2"
27
28
  end
28
29
 
29
30
  def tag_name
30
31
  @href.present? ? :a : :button
31
32
  end
32
33
 
34
+ def dropdown?
35
+ dropdown.present?
36
+ end
37
+
33
38
  protected
34
39
 
35
40
  def alpine_component
@@ -2,12 +2,11 @@ module Lookbook
2
2
  class ButtonGroup::Component < Lookbook::BaseComponent
3
3
  renders_many :buttons, ->(copy: nil, **attrs, &block) do
4
4
  attrs[:size] = @size
5
- instance = if copy.present?
6
- CopyButton::Component.new(target: copy, **attrs)
5
+ if copy.present?
6
+ lookbook_render :copy_button, target: copy, **attrs, &block
7
7
  else
8
- Button::Component.new(**attrs)
8
+ lookbook_render :button, **attrs, &block
9
9
  end
10
- render instance, &block
11
10
  end
12
11
 
13
12
  def initialize(size: :md, **html_attrs)
@@ -1,4 +1,4 @@
1
- <%= render_component :button,
1
+ <%= lookbook_render :button,
2
2
  name: "copy-button",
3
3
  **@button_attrs,
4
4
  "x-data": prepare_alpine_data,
@@ -0,0 +1,51 @@
1
+ <%= render_component_tag class: "divide-y divide-lookbook-divider min-w-[180px]" do %>
2
+ <div class="px-3 py-3">
3
+ <ul class="space-y-2 opacity-80">
4
+ <% if debug_data? %>
5
+ <li>
6
+ <a href="#"
7
+ class="text-xs flex items-center hover:underline"
8
+ x-data="clipboardComponent"
9
+ @click.prevent.stop="copyToClipboard('#debug-data')">
10
+ <span x-show="copied" x-cloak>
11
+ <%= icon :check, size: 2.5, class: "text-green-600" %>
12
+ </span>
13
+ <span x-show="!copied">
14
+ <%= icon :clipboard, size: 2.5 %>
15
+ </span>
16
+ <span class="ml-2">Copy debug data</span>
17
+ </a>
18
+ </li>
19
+ <% end %>
20
+ <li>
21
+ <a href="#"
22
+ class="text-xs flex items-center hover:underline"
23
+ @click.stop="localStorage.clear(); window.location.reload();">
24
+ <%= icon :refresh_cw, size: 2.5 %>
25
+ <span class="ml-2">Reset local storage</span>
26
+ </a>
27
+ </li>
28
+ </ul>
29
+ </div>
30
+ <div class="flex items-center text-xs px-3 py-2 bg-zinc-50">
31
+ <span class="opacity-70 mr-1">Lookbook</span>
32
+ <span class="mr-6">v<%= @version %></span>
33
+ <div class="flex items-center space-x-2">
34
+ <% if @docs_url.present? %>
35
+ <a href="<%= @docs_url %>" target="_blank" class="ml-auto opacity-70" title="Documentation">
36
+ <%= icon :book, size: 3 %>
37
+ </a>
38
+ <% end %>
39
+ <% if @repo_url.present? %>
40
+ <a href="<%= @repo_url %>" target="_blank" class="ml-auto opacity-70" title="Github">
41
+ <%= icon :github, size: 3 %>
42
+ </a>
43
+ <% end %>
44
+ </div>
45
+ </div>
46
+ <% if debug_data? %>
47
+ <div id="debug-data" class="hidden" x-cloak>
48
+ <%== debug_data %>
49
+ </div>
50
+ <% end %>
51
+ <% end %>
@@ -0,0 +1,18 @@
1
+ module Lookbook
2
+ class DebugMenu::Component < Lookbook::BaseComponent
3
+ def initialize(version: nil, docs_url: nil, repo_url: nil, **html_attrs)
4
+ @version = version
5
+ @docs_url = docs_url
6
+ @repo_url = repo_url
7
+ super(**html_attrs)
8
+ end
9
+
10
+ def debug_data
11
+ content
12
+ end
13
+
14
+ def debug_data?
15
+ debug_data.present?
16
+ end
17
+ end
18
+ end
@@ -1,14 +1,14 @@
1
1
  <% if @target.present? %>
2
2
  <%= render_component_tag class: "not-prose border-b border-lookbook-divider rounded-sm overflow-hidden", "@navigation:start.window": "cleanup" do %>
3
3
 
4
- <%= render_component :toolbar, class: "border border-b-0 border-lookbook-divider" do |toolbar| %>
4
+ <%= lookbook_render :toolbar, class: "border border-b-0 border-lookbook-divider" do |toolbar| %>
5
5
  <% toolbar.section padded: true do %>
6
6
  <h3>
7
7
  <%= @target.preview.label %> (<%= @target.label %>)
8
8
  </h3>
9
9
  <% end %>
10
10
  <% toolbar.section align: :right, divide: :left do %>
11
- <%= render_component :button_group do |group| %>
11
+ <%= lookbook_render :button_group do |group| %>
12
12
  <% group.button icon: :eye,
13
13
  href: lookbook_inspect_path(@target.path, @params),
14
14
  tooltip: "View in Inspector" %>
@@ -27,7 +27,7 @@
27
27
  @viewport:resize-progress="resizeIframe"
28
28
  @viewport:resize-complete="resizeIframe"
29
29
  @tabs:change.window="resizeIframe">
30
- <%= render_component :viewport,
30
+ <%= lookbook_render :viewport,
31
31
  src: lookbook_preview_path(@target.path, @params.merge(lookbook_embed: true)),
32
32
  alpine_data: "store",
33
33
  resize_height: false,
@@ -1,5 +1,5 @@
1
1
  <%= render_component_tag :header do %>
2
- <%= render_component :toolbar, class: "!bg-lookbook-header-bg !text-lookbook-header-text !border-lookbook-header-border" do |toolbar| %>
2
+ <%= lookbook_render :toolbar, class: "!bg-lookbook-header-bg !text-lookbook-header-text !border-lookbook-header-border" do |toolbar| %>
3
3
  <% toolbar.section padded: true do %>
4
4
  <% if branding.present? %>
5
5
  <a
@@ -11,57 +11,32 @@
11
11
  <% end %>
12
12
 
13
13
  <% toolbar.section padded: false, align: :right, class: "flex items-center" do %>
14
- <%= render_component :button_group do |group| %>
14
+
15
+ <div x-show="loading" x-cloak>
16
+ <svg class="animate-spin h-3.5 w-3.5 text-lookbook-header-text opacity-60" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
17
+ <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
18
+ <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
19
+ </svg>
20
+ </div>
21
+
22
+ <%= lookbook_render :button_group do |group| %>
15
23
  <% if @debug_menu %>
16
- <% group.button icon: :help_circle, class: "opacity-50 hover:opacity-100 transition !text-lookbook-header-text" do |button| %>
17
- <% button.dropdown do %>
18
- <%= tag.div class: "divide-y divide-lookbook-divider min-w-[180px]" do %>
19
- <div class="px-3 py-3">
20
- <ul class="space-y-2 opacity-80">
21
- <li>
22
- <a href="#"
23
- class="text-xs flex items-center hover:underline"
24
- x-data="clipboardComponent"
25
- @click.prevent.stop="copyToClipboard('#debug-data')">
26
- <span x-show="copied" x-cloak>
27
- <%= icon :check, size: 2.5, class: "text-green-600" %>
28
- </span>
29
- <span x-show="!copied">
30
- <%= icon :clipboard, size: 2.5 %>
31
- </span>
32
- <span class="ml-2">Copy debug data</span>
33
- </a>
34
- </li>
35
- <li>
36
- <a href="#"
37
- class="text-xs flex items-center hover:underline"
38
- @click.stop="localStorage.clear(); window.location.reload();">
39
- <%= icon :refresh_cw, size: 2.5 %>
40
- <span class="ml-2">Reset local storage</span>
41
- </a>
42
- </li>
43
- </ul>
44
- </div>
45
- <div class="flex items-center text-xs px-3 py-2 bg-zinc-50">
46
- <span class="opacity-70 mr-1">Lookbook</span>
47
- <span class="mr-6">v<%= Lookbook::VERSION %></span>
48
- <div class="flex items-center space-x-2">
49
- <a href="https://lookbook.build/guide" target="_blank" class="ml-auto opacity-70" title="Documentation">
50
- <%= icon :book, size: 3 %>
51
- </a>
52
- <a href="https://github.com/allmarkedup/lookbook" target="_blank" class="ml-auto opacity-70" title="Github">
53
- <%= icon :github, size: 3 %>
54
- </a>
55
- </div>
56
- </div>
57
- <% end %>
24
+ <% group.button icon: :help_circle, class: "opacity-50 hover:opacity-100 transition !text-lookbook-header-text", "x-show": "!loading" do |button| %>
25
+ <% menu = lookbook_render :debug_menu,
26
+ version: Lookbook::VERSION,
27
+ docs_url: "https://lookbook.build/guide",
28
+ repo_url: "https://github.com/allmarkedup/lookbook" do %>
29
+ <%= helpers.pretty_json(Lookbook.debug_data) %>
58
30
  <% end %>
31
+ <% button.dropdown({}).with_content(menu) %>
59
32
  <% end %>
60
33
  <% end %>
34
+
61
35
  <% group.button icon: :menu,
62
36
  "@click.stop": "toggleSidebar",
63
37
  "x-show": "$store.layout.mobile && sidebarHidden",
64
38
  class: "!text-lookbook-header-text" %>
39
+
65
40
  <% group.button icon: :x,
66
41
  "@click.stop": "toggleSidebar",
67
42
  "x-show": "$store.layout.mobile && !sidebarHidden",
@@ -1,6 +1,8 @@
1
1
  <%= render_component_tag :div, class: "h-full" do %>
2
- <% if panel_styles %>
3
- <% content_for :panel_css do %><%= panel_styles %><% end %>
4
- <% end %>
5
2
  <%= panel_html %>
3
+ <% end %>
4
+
5
+ <% if panel_styles %>
6
+ <% content_for :user_styles do %><%= panel_styles %>
7
+ <% end %>
6
8
  <% end %>
@@ -4,30 +4,18 @@ module Lookbook
4
4
  class InspectorPanel::Component < Lookbook::BaseComponent
5
5
  attr_reader :panel_styles, :panel_html, :id
6
6
 
7
- def initialize(id:, name:, system: false, **html_attrs)
7
+ def initialize(id:, name:, **attrs)
8
8
  @id = id
9
9
  @name = name
10
- @system = system
11
- @panel_html = nil
12
- @panel_styles = nil
13
- super(**html_attrs)
10
+ @system = attrs[:system] || false
11
+ super(**attrs.except(:system))
14
12
  end
15
13
 
16
14
  def before_render
17
15
  if @system == false
18
- panel_dom = ::Nokogiri::HTML.fragment(content)
19
- style_tags = panel_dom.css("style")
20
- if style_tags.any?
21
- css_parser = ::CssParser::Parser.new
22
- @panel_styles = ""
23
- style_tags.each do |style_tag|
24
- css_parser.load_string! style_tag.text
25
- css_parser.each_selector do |selector, declarations, specificity|
26
- @panel_styles += "##{id} #{selector} { #{declarations} }\n"
27
- end
28
- end
29
- @panel_html = content.gsub(/<style(?:\s[^>]*)?>.*<\/style>/, "").html_safe
30
- end
16
+ tpl = TemplateParser.new(content)
17
+ @panel_styles = tpl.styles.map { |s| "##{id} #{s}" }.join("\n")
18
+ @panel_html = tpl.content
31
19
  end
32
20
  @panel_html ||= content
33
21
  end
@@ -25,6 +25,10 @@ export default function navComponent(store) {
25
25
  }
26
26
  },
27
27
 
28
+ closeAll() {
29
+ store.open.length = 0;
30
+ },
31
+
28
32
  toggleOpen(id) {
29
33
  this.isOpen(id) ? this.setClosed(id) : this.setOpen(id);
30
34
  },
@@ -18,7 +18,7 @@ module Lookbook
18
18
 
19
19
  def items
20
20
  @collection.non_empty_items.map do |item|
21
- render Lookbook::Nav::Item::Component.new item,
21
+ lookbook_render Lookbook::Nav::Item::Component.new item,
22
22
  nav_id: @id,
23
23
  depth: 1,
24
24
  **@item_args
@@ -6,18 +6,18 @@
6
6
  "entity-type": item.type
7
7
  },
8
8
  cloak: true do %>
9
- <%= render_tag href.present? ? :a : :div,
9
+ <%= lookbook_tag href.present? ? :a : :div,
10
10
  href: href,
11
- class: "flex items-center py-1 select-none cursor-pointer text-lookbook-nav-text hover:bg-lookbook-nav-item-hover",
11
+ class: "flex items-center py-1 select-none cursor-pointer text-lookbook-nav-text hover:bg-lookbook-nav-item-hover transition",
12
12
  style: "padding-left: #{left_pad}px",
13
13
  "x-bind": "bindings.#{href.present? ? "link" : "toggle"}" do %>
14
- <div class="relative flex items-center">
14
+ <div class="relative flex items-center w-full">
15
15
  <%= icon nil,
16
16
  size: 3,
17
17
  class: "mr-1 text-lookbook-nav-toggle absolute -left-4",
18
18
  "x-effect": "iconName = open ? 'chevron-down' : 'chevron-right'" if children? %>
19
19
  <%= icon nav_icon, size: 3.5, class: "mr-1.5 text-lookbook-nav-icon-stroke" %>
20
- <span <% if @item.type == :preview %>class="font-bold"<% end %>><%= label %></span>
20
+ <span class="truncate <% if @item.type == :preview %>font-bold<% end %>"><%= label %></span>
21
21
  </div>
22
22
  <% end %>
23
23
 
@@ -45,7 +45,7 @@ module Lookbook
45
45
  def children
46
46
  @children ||= if collection? && !collapsed?
47
47
  item.non_empty_items.map do |item|
48
- render Lookbook::Nav::Item::Component.new item,
48
+ lookbook_render Lookbook::Nav::Item::Component.new item,
49
49
  nav_id: @nav_id,
50
50
  depth: (@depth + 1),
51
51
  collapse_singles: @collapse_singles
@@ -1,16 +1,16 @@
1
1
  <%= render_component_tag "x-data": "{ activeTab: null }" do %>
2
2
  <div class="flex w-full border-b border-lookbook-divider mb-6">
3
- <%= render_component :tabs, theme: :page do |t| %>
3
+ <%= lookbook_render :tabs, theme: :page do |t| %>
4
4
  <% @tabs.each do |props| %>
5
5
  <%= t.tab **props %>
6
6
  <% end %>
7
7
  <% end %>
8
8
  </div>
9
- <%= render_component :tab_panels do |t| %>
9
+ <%= lookbook_render :tab_panels do |t| %>
10
10
  <% @tabs.each do |props| %>
11
11
  <% t.panel name: props[:name] do %>
12
- <%= render_component :prose, markdown: props[:markdown], class: "max-w-none flex-none" do %>
13
- <%== props[:content] %>
12
+ <%= lookbook_render :prose, markdown: props[:markdown], class: "max-w-none flex-none" do %>
13
+ <%== props[:tab_content] %>
14
14
  <% end %>
15
15
  <% end %>
16
16
  <% end %>
@@ -2,7 +2,7 @@ module Lookbook
2
2
  class PageTabs::Component < Lookbook::BaseComponent
3
3
  renders_many :tabs, ->(**attrs, &block) do
4
4
  @tabs ||= []
5
- attrs[:content] = capture(&block)
5
+ attrs[:tab_content] = capture(&block)
6
6
  attrs[:markdown] ||= @markdown
7
7
  @tabs << attrs
8
8
  end
@@ -0,0 +1,21 @@
1
+ <%= render_component_tag class: "p-4 overflow-hidden" do %>
2
+ <div class="bg-white border border-lookbook-divider rounded-md overflow-x-auto">
3
+ <table class="border-collapse w-full" :class="narrow && 'linear'">
4
+ <thead>
5
+ <tr>
6
+ <th class="param-label">Param</th>
7
+ <th class="param-description">Description</th>
8
+ <th class="param-input">Input</th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <%= safe_join(fields.compact) %>
13
+ </tbody>
14
+ </table>
15
+ </div>
16
+ <% end %>
17
+
18
+ <% if param_styles %>
19
+ <% content_for :user_styles do %><%= param_styles %>
20
+ <% end %>
21
+ <% end %>
@@ -5,7 +5,7 @@ export default function paramsEditorComponent() {
5
5
  narrow: false,
6
6
  init() {
7
7
  observeSize(this.$el, ({ width }) => {
8
- this.narrow = width < 450;
8
+ this.narrow = width < 500;
9
9
  });
10
10
  },
11
11
  };