lookbook 1.0.1 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/components/lookbook/base_component.rb +10 -2
- data/app/components/lookbook/copy_button/component.rb +1 -1
- data/app/components/lookbook/dimensions_display/component.rb +1 -4
- data/app/components/lookbook/embed/component.html.erb +5 -5
- data/app/components/lookbook/embed/component.rb +2 -2
- data/app/components/lookbook/icon/component.html.erb +1 -1
- data/app/components/lookbook/icon/component.rb +1 -5
- data/app/components/lookbook/nav/item/component.rb +2 -2
- data/app/components/lookbook/params_editor/field/component.rb +1 -1
- data/app/controllers/lookbook/previews_controller.rb +20 -18
- data/app/helpers/lookbook/component_helper.rb +2 -1
- data/app/views/lookbook/previews/show.html.erb +2 -2
- data/config/routes.rb +1 -1
- data/lib/lookbook/component.rb +4 -0
- data/lib/lookbook/engine.rb +72 -51
- data/lib/lookbook/page.rb +4 -4
- data/lib/lookbook/preview.rb +6 -2
- data/lib/lookbook/version.rb +1 -1
- data/public/lookbook-assets/js/lookbook.js +88 -88
- data/public/lookbook-assets/js/lookbook.js.map +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd24f301fb1e05131ba58a2d236b15155f38b372c52ada4823ea6f76111dc0b1
|
4
|
+
data.tar.gz: 8675198f147aa93461a89964ad2b28461facdd672088b3edfe0880ea1b293545
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a9e80161cf8880083c2138144304dfc5427478c8114073f9409e3fb883eddf9abe7e055aea33b16625316c15be15fd139b8ab3607d808ff90419b5ad95b4eab
|
7
|
+
data.tar.gz: 1e1836fdad458167f63e3736d3d99107b1a0346da530fe57f9be03eb188c029d5891c8534999475673aa78fd02c645c37edb181b5960165316172bcf5cded59b
|
@@ -31,11 +31,19 @@ module Lookbook
|
|
31
31
|
nil
|
32
32
|
end
|
33
33
|
|
34
|
+
def alpine_encode(data)
|
35
|
+
if data.is_a? String
|
36
|
+
"\'#{json_escape data}\'"
|
37
|
+
else
|
38
|
+
json_escape data.to_json.tr("\"", "\'")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
34
42
|
def prepare_alpine_data(x_data = nil)
|
35
43
|
alpine_component_name = x_data || @html_attrs&.dig(:"x-data") || alpine_component
|
36
44
|
if alpine_component_name.present?
|
37
|
-
args = Array.wrap(alpine_data)
|
38
|
-
args.any? ? "#{alpine_component_name}(#{
|
45
|
+
args = Array.wrap(alpine_data).compact
|
46
|
+
args.any? ? "#{alpine_component_name}(#{args.join(",")})" : alpine_component_name
|
39
47
|
end
|
40
48
|
end
|
41
49
|
end
|
@@ -2,15 +2,12 @@ module Lookbook
|
|
2
2
|
class DimensionsDisplay::Component < Lookbook::BaseComponent
|
3
3
|
def initialize(target:, **html_attrs)
|
4
4
|
@target = target
|
5
|
+
@alpine_data = alpine_encode(@target)
|
5
6
|
super(**html_attrs)
|
6
7
|
end
|
7
8
|
|
8
9
|
protected
|
9
10
|
|
10
|
-
def alpine_data
|
11
|
-
@target.to_json
|
12
|
-
end
|
13
|
-
|
14
11
|
def alpine_component
|
15
12
|
"dimensionsDisplayComponent"
|
16
13
|
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
<% if @
|
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
4
|
<%= render_component :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
11
|
<%= render_component :button_group do |group| %>
|
12
12
|
<% group.button icon: :eye,
|
13
|
-
href: lookbook_inspect_path(@
|
13
|
+
href: lookbook_inspect_path(@target.path, @params),
|
14
14
|
tooltip: "View in Inspector" %>
|
15
15
|
<% group.button icon: :external_link,
|
16
|
-
href: lookbook_preview_path(@
|
16
|
+
href: lookbook_preview_path(@target.path, @params),
|
17
17
|
tooltip: "Open in new window",
|
18
18
|
target: "_blank" %>
|
19
19
|
<% end %>
|
@@ -28,7 +28,7 @@
|
|
28
28
|
@viewport:resize-complete="resizeIframe"
|
29
29
|
@tabs:change.window="resizeIframe">
|
30
30
|
<%= render_component :viewport,
|
31
|
-
src: lookbook_preview_path(@
|
31
|
+
src: lookbook_preview_path(@target.path, @params.merge(lookbook_embed: true)),
|
32
32
|
alpine_data: "store",
|
33
33
|
resize_height: false,
|
34
34
|
max_height: @max_height,
|
@@ -2,7 +2,7 @@ module Lookbook
|
|
2
2
|
class Embed::Component < Lookbook::BaseComponent
|
3
3
|
def initialize(id:, example:, params: {}, opts: {}, max_height: nil, **html_attrs)
|
4
4
|
@id = id
|
5
|
-
@
|
5
|
+
@target = example
|
6
6
|
@params = params
|
7
7
|
@opts = opts
|
8
8
|
@max_height = max_height
|
@@ -20,7 +20,7 @@ module Lookbook
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def alpine_data
|
23
|
-
[@id
|
23
|
+
[alpine_encode(@id), "$store.pages.embeds"].join(",")
|
24
24
|
end
|
25
25
|
|
26
26
|
def alpine_component
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%= render_component_tag :i, style: "height: #{size_rems}; width: #{size_rems}" do %>
|
1
|
+
<%= render_component_tag :i, style: "height: #{size_rems}; width: #{size_rems}; #{@html_attrs[:style]}" do %>
|
2
2
|
<svg>
|
3
3
|
<use :href="`/lookbook-assets/feather-sprite.svg#${iconName}`" x-cloak />
|
4
4
|
</svg>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class Icon::Component < Lookbook::BaseComponent
|
3
3
|
def initialize(name:, size: 4, **html_attrs)
|
4
|
-
@
|
4
|
+
@alpine_data = name.is_a?(Symbol) ? alpine_encode(name.to_s.tr("_", "-")) : name
|
5
5
|
@size = size || 4
|
6
6
|
super(**html_attrs)
|
7
7
|
end
|
@@ -12,10 +12,6 @@ module Lookbook
|
|
12
12
|
|
13
13
|
protected
|
14
14
|
|
15
|
-
def alpine_data
|
16
|
-
@icon_name
|
17
|
-
end
|
18
|
-
|
19
15
|
def alpine_component
|
20
16
|
"iconComponent"
|
21
17
|
end
|
@@ -13,7 +13,7 @@ module Lookbook
|
|
13
13
|
before_action :set_params
|
14
14
|
|
15
15
|
def preview
|
16
|
-
if @
|
16
|
+
if @target
|
17
17
|
begin
|
18
18
|
opts = {layout: @preview.layout}
|
19
19
|
if params[:lookbook_embed] == "true"
|
@@ -32,7 +32,7 @@ module Lookbook
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def show
|
35
|
-
if @
|
35
|
+
if @target
|
36
36
|
begin
|
37
37
|
@main_panels = main_panels
|
38
38
|
@drawer_panels = drawer_panels
|
@@ -52,9 +52,9 @@ module Lookbook
|
|
52
52
|
private
|
53
53
|
|
54
54
|
def lookup_entities
|
55
|
-
@
|
56
|
-
if @
|
57
|
-
@preview = @
|
55
|
+
@target = Lookbook.previews.find_example(params[:path])
|
56
|
+
if @target.present?
|
57
|
+
@preview = @target.preview
|
58
58
|
if params[:path] == @preview&.lookup_path
|
59
59
|
redirect_to lookbook_inspect_path "#{params[:path]}/#{@preview.default_example.name}"
|
60
60
|
end
|
@@ -85,17 +85,17 @@ module Lookbook
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def target_examples
|
88
|
-
@
|
88
|
+
@target.type == :group ? @target.examples : [@target]
|
89
89
|
end
|
90
90
|
|
91
91
|
def set_title
|
92
|
-
@title = @
|
92
|
+
@title = @target.present? ? [@target&.label, @preview&.label].compact.join(" :: ") : "Not found"
|
93
93
|
end
|
94
94
|
|
95
95
|
def set_params
|
96
|
-
if @
|
96
|
+
if @target
|
97
97
|
# cast known params to type
|
98
|
-
@
|
98
|
+
@target.params.each do |param|
|
99
99
|
if preview_controller.params.key?(param[:name])
|
100
100
|
preview_controller.params[param[:name]] = Lookbook::Params.cast(preview_controller.params[param[:name]], param[:type])
|
101
101
|
end
|
@@ -103,7 +103,7 @@ module Lookbook
|
|
103
103
|
# set display and data params
|
104
104
|
preview_controller.params.merge!({
|
105
105
|
lookbook: {
|
106
|
-
display: @
|
106
|
+
display: @target.display_params,
|
107
107
|
data: Lookbook.data
|
108
108
|
}
|
109
109
|
})
|
@@ -113,7 +113,7 @@ module Lookbook
|
|
113
113
|
def preview_params
|
114
114
|
preview_controller.params.permit!
|
115
115
|
preview_controller.params.to_h.select do |key, value|
|
116
|
-
!!@
|
116
|
+
!!@target.params.find { |param| param[:name] == key }
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
@@ -125,12 +125,7 @@ module Lookbook
|
|
125
125
|
path: params[:path]
|
126
126
|
}
|
127
127
|
|
128
|
-
example = @example
|
129
128
|
preview = @preview
|
130
|
-
preview.define_singleton_method(:params, proc {
|
131
|
-
example.params
|
132
|
-
})
|
133
|
-
|
134
129
|
examples = target_examples.map do |example|
|
135
130
|
render_args = @preview.render_args(example.name, params: preview_controller.params)
|
136
131
|
has_template = render_args[:template] != "view_components/preview"
|
@@ -144,11 +139,18 @@ module Lookbook
|
|
144
139
|
example
|
145
140
|
end
|
146
141
|
|
142
|
+
target = @target.type == :group ? @target : examples.find { |e| e.lookup_path == @target.lookup_path }
|
143
|
+
|
144
|
+
preview.define_singleton_method(:params, proc {
|
145
|
+
target.params
|
146
|
+
})
|
147
|
+
|
147
148
|
@inspector_data ||= Lookbook::Store.new({
|
148
149
|
context: context_data,
|
149
150
|
preview: preview,
|
150
151
|
examples: examples,
|
151
|
-
example:
|
152
|
+
example: examples.first,
|
153
|
+
target: target,
|
152
154
|
data: Lookbook.data,
|
153
155
|
app: Lookbook
|
154
156
|
})
|
@@ -198,7 +200,7 @@ module Lookbook
|
|
198
200
|
{
|
199
201
|
file_path: @preview&.full_path,
|
200
202
|
line_number: 0,
|
201
|
-
source_code: @
|
203
|
+
source_code: @target&.source
|
202
204
|
}
|
203
205
|
elsif exception.is_a?(ActionView::Template::Error) & exception.message.include?("implements a reserved method")
|
204
206
|
message_parts = exception.message.split("\n").first.split
|
@@ -29,7 +29,7 @@
|
|
29
29
|
<% group.button icon: :code,
|
30
30
|
tooltip: "Copy page embed code",
|
31
31
|
copy: true do %>
|
32
|
-
<%= embed <%= @preview.preview_class %>, :<%= @
|
32
|
+
<%= embed <%= @preview.preview_class %>, :<%= @target.name %>, params: <%= request.query_parameters.deep_symbolize_keys.to_s %> %>
|
33
33
|
<% end %>
|
34
34
|
<% end %>
|
35
35
|
|
@@ -38,7 +38,7 @@
|
|
38
38
|
"@click.stop": "startSpin(); $dispatch('viewport:reload'); stopSpin(500);" %>
|
39
39
|
|
40
40
|
<% group.button icon: :external_link,
|
41
|
-
href: lookbook_preview_path(@
|
41
|
+
href: lookbook_preview_path(@target.lookup_path, request.query_parameters),
|
42
42
|
tooltip: "Open preview in new window",
|
43
43
|
target: "_blank" %>
|
44
44
|
|
data/config/routes.rb
CHANGED
data/lib/lookbook/component.rb
CHANGED
data/lib/lookbook/engine.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require "view_component"
|
2
2
|
require "action_cable/engine"
|
3
3
|
require "listen"
|
4
|
-
require "rake"
|
5
4
|
|
6
5
|
module Lookbook
|
7
6
|
autoload :Config, "lookbook/config"
|
@@ -107,7 +106,7 @@ module Lookbook
|
|
107
106
|
end
|
108
107
|
else
|
109
108
|
# Fallback for older Rails versions - don't start listeners if running in a rake task.
|
110
|
-
unless
|
109
|
+
unless Lookbook::Engine.prevent_listening?
|
111
110
|
init_listeners
|
112
111
|
end
|
113
112
|
end
|
@@ -127,69 +126,75 @@ module Lookbook
|
|
127
126
|
Lookbook::Engine.run_hooks(:after_initialize)
|
128
127
|
end
|
129
128
|
|
130
|
-
def init_listeners
|
131
|
-
return unless config.lookbook.listen == true
|
132
|
-
Listen.logger = Lookbook.logger
|
133
|
-
Lookbook.logger.info "Initializing listeners"
|
134
|
-
|
135
|
-
preview_listener = Listen.to(
|
136
|
-
*config.lookbook.listen_paths,
|
137
|
-
only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
|
138
|
-
force_polling: config.lookbook.listen_use_polling
|
139
|
-
) do |modified, added, removed|
|
140
|
-
changes = {modified: modified, added: added, removed: removed}
|
141
|
-
begin
|
142
|
-
Lookbook::Engine.parser.parse
|
143
|
-
rescue
|
144
|
-
end
|
145
|
-
Lookbook::Preview.clear_cache
|
146
|
-
Lookbook::Engine.reload_ui(changes)
|
147
|
-
Lookbook::Engine.run_hooks(:after_change, changes)
|
148
|
-
end
|
149
|
-
Lookbook::Engine.register_listener(preview_listener)
|
150
|
-
|
151
|
-
page_listener = Listen.to(
|
152
|
-
*config.lookbook.page_paths,
|
153
|
-
only: /\.(html.*|md.*)$/,
|
154
|
-
force_polling: config.lookbook.listen_use_polling
|
155
|
-
) do |modified, added, removed|
|
156
|
-
changes = {modified: modified, added: added, removed: removed}
|
157
|
-
Lookbook::Engine.reload_ui(changes)
|
158
|
-
Lookbook::Engine.run_hooks(:after_change, changes)
|
159
|
-
end
|
160
|
-
Lookbook::Engine.register_listener(page_listener)
|
161
|
-
end
|
162
|
-
|
163
129
|
at_exit do
|
164
130
|
if Lookbook::Engine.listeners.any?
|
165
131
|
Lookbook.logger.debug "Stopping listeners"
|
166
|
-
Lookbook::Engine.
|
132
|
+
Lookbook::Engine.stop_listeners
|
167
133
|
end
|
168
134
|
Lookbook::Engine.run_hooks(:before_exit)
|
169
135
|
end
|
170
136
|
|
171
137
|
class << self
|
138
|
+
def init_listeners
|
139
|
+
config = Lookbook.config
|
140
|
+
return unless config.listen == true
|
141
|
+
Listen.logger = Lookbook.logger
|
142
|
+
|
143
|
+
preview_listener = Listen.to(
|
144
|
+
*config.listen_paths,
|
145
|
+
only: /\.(#{config.listen_extensions.join("|")})$/,
|
146
|
+
force_polling: config.listen_use_polling
|
147
|
+
) do |modified, added, removed|
|
148
|
+
changes = {modified: modified, added: added, removed: removed}
|
149
|
+
begin
|
150
|
+
parser.parse
|
151
|
+
rescue
|
152
|
+
end
|
153
|
+
Lookbook::Preview.clear_cache
|
154
|
+
reload_ui(changes)
|
155
|
+
run_hooks(:after_change, changes)
|
156
|
+
end
|
157
|
+
register_listener(preview_listener)
|
158
|
+
|
159
|
+
page_listener = Listen.to(
|
160
|
+
*config.page_paths,
|
161
|
+
only: /\.(html.*|md.*)$/,
|
162
|
+
force_polling: config.listen_use_polling
|
163
|
+
) do |modified, added, removed|
|
164
|
+
changes = {modified: modified, added: added, removed: removed}
|
165
|
+
reload_ui(changes)
|
166
|
+
run_hooks(:after_change, changes)
|
167
|
+
end
|
168
|
+
register_listener(page_listener)
|
169
|
+
end
|
170
|
+
|
172
171
|
def websocket
|
172
|
+
config = Lookbook.config
|
173
173
|
return @websocket unless @websocket.nil?
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
174
|
+
return unless config.auto_refresh == true && !Rails.env.test?
|
175
|
+
Lookbook.logger.info "Initializing websocket"
|
176
|
+
|
177
|
+
cable = ActionCable::Server::Configuration.new
|
178
|
+
cable.cable = {adapter: "async"}.with_indifferent_access
|
179
|
+
cable.mount_path = config.cable_mount_path
|
180
|
+
cable.connection_class = -> { Lookbook::Connection }
|
181
|
+
cable.logger = config.cable_logger
|
182
|
+
|
183
|
+
@websocket ||= if Gem::Version.new(Rails.version) >= Gem::Version.new(6.0)
|
184
|
+
ActionCable::Server::Base.new(config: cable)
|
185
|
+
else
|
186
|
+
ws = ActionCable::Server::Base.new
|
187
|
+
ws.config = cable
|
188
|
+
ws
|
188
189
|
end
|
189
190
|
end
|
190
191
|
|
191
192
|
def websocket_mount_path
|
192
|
-
"#{mounted_path}#{config.lookbook.cable_mount_path}" if websocket
|
193
|
+
"#{mounted_path}#{config.lookbook.cable_mount_path}" if websocket?
|
194
|
+
end
|
195
|
+
|
196
|
+
def websocket?
|
197
|
+
websocket.present?
|
193
198
|
end
|
194
199
|
|
195
200
|
def mounted_path
|
@@ -222,6 +227,10 @@ module Lookbook
|
|
222
227
|
@listeners ||= []
|
223
228
|
end
|
224
229
|
|
230
|
+
def stop_listeners
|
231
|
+
listeners.each { |listener| listener.stop }
|
232
|
+
end
|
233
|
+
|
225
234
|
def run_hooks(event_name, *args)
|
226
235
|
config.lookbook.hooks[event_name].each do |hook|
|
227
236
|
hook.call(Lookbook, *args)
|
@@ -232,6 +241,18 @@ module Lookbook
|
|
232
241
|
websocket&.broadcast("reload", changed)
|
233
242
|
end
|
234
243
|
|
244
|
+
def prevent_listening?
|
245
|
+
Rails.env.test? || running_in_rake_task?
|
246
|
+
end
|
247
|
+
|
248
|
+
def running_in_rake_task?
|
249
|
+
if defined?(Rake) && Rake.respond_to?(:application)
|
250
|
+
File.basename($0) == "rake" || Rake.application.top_level_tasks.any?
|
251
|
+
else
|
252
|
+
false
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
235
256
|
attr_reader :preview_controller
|
236
257
|
end
|
237
258
|
end
|
data/lib/lookbook/page.rb
CHANGED
@@ -13,7 +13,7 @@ module Lookbook
|
|
13
13
|
:data
|
14
14
|
]
|
15
15
|
|
16
|
-
attr_reader :errors
|
16
|
+
attr_reader :errors, :rel_path
|
17
17
|
attr_accessor :sections
|
18
18
|
|
19
19
|
def initialize(path, base_path)
|
@@ -23,8 +23,8 @@ module Lookbook
|
|
23
23
|
@errors = []
|
24
24
|
@sections = []
|
25
25
|
@page_name = remove_position_prefix(path_name)
|
26
|
-
rel_path = @pathname.relative_path_from(@base_path)
|
27
|
-
page_path = rel_path.dirname.to_s == "." ? @page_name : "#{rel_path.dirname}/#{@page_name}"
|
26
|
+
@rel_path = @pathname.relative_path_from(@base_path)
|
27
|
+
page_path = @rel_path.dirname.to_s == "." ? @page_name : "#{@rel_path.dirname}/#{@page_name}"
|
28
28
|
super(page_path)
|
29
29
|
end
|
30
30
|
|
@@ -33,7 +33,7 @@ module Lookbook
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def full_path
|
36
|
-
Rails.root.join(@pathname.to_s)
|
36
|
+
Pathname.new Rails.root.join(@pathname.to_s)
|
37
37
|
end
|
38
38
|
|
39
39
|
def name
|
data/lib/lookbook/preview.rb
CHANGED
@@ -61,11 +61,15 @@ module Lookbook
|
|
61
61
|
examples.first
|
62
62
|
end
|
63
63
|
|
64
|
+
def rel_path
|
65
|
+
"#{name.underscore}.rb"
|
66
|
+
end
|
67
|
+
|
64
68
|
def full_path
|
65
69
|
base_path = Array(Lookbook.config.preview_paths).detect do |preview_path|
|
66
|
-
Dir["#{preview_path}/#{
|
70
|
+
Dir["#{preview_path}/#{rel_path}"].first
|
67
71
|
end
|
68
|
-
Pathname.new(Dir["#{base_path}/#{
|
72
|
+
Pathname.new(Dir["#{base_path}/#{rel_path}"].first)
|
69
73
|
end
|
70
74
|
|
71
75
|
def url_path
|
data/lib/lookbook/version.rb
CHANGED