lookbook 1.1.1 → 1.2.1
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/assets/lookbook/js/helpers/string.js +23 -1
- data/app/assets/lookbook/js/lookbook.js +0 -1
- data/app/components/lookbook/button/component.html.erb +2 -1
- data/app/components/lookbook/button/component.js +9 -0
- data/app/components/lookbook/display_options/editor/component.html.erb +13 -0
- data/app/components/lookbook/display_options/editor/component.rb +7 -0
- data/app/components/lookbook/display_options/field/component.css +33 -0
- data/app/components/lookbook/display_options/field/component.html.erb +8 -0
- data/app/components/lookbook/display_options/field/component.js +30 -0
- data/app/components/lookbook/display_options/field/component.rb +28 -0
- data/app/components/lookbook/inspector_panel/component.html.erb +1 -1
- data/app/components/lookbook/inspector_panel/component.rb +10 -11
- data/app/components/lookbook/params/editor/component.rb +6 -3
- data/app/components/lookbook/params/field/component.rb +1 -5
- data/app/components/lookbook/tab_panels/panel/component.html.erb +1 -1
- data/app/components/lookbook/tab_panels/panel/component.rb +1 -2
- data/app/components/lookbook/tabs/dropdown_tab/component.html.erb +1 -0
- data/app/components/lookbook/tabs/tab/component.html.erb +1 -0
- data/app/components/lookbook/viewport/component.html.erb +1 -1
- data/app/components/lookbook/viewport/component.rb +2 -1
- data/app/controllers/lookbook/previews_controller.rb +40 -29
- data/app/helpers/lookbook/preview_helper.rb +1 -1
- data/app/views/lookbook/previews/panels/_params.html.erb +1 -1
- data/app/views/lookbook/previews/panels/_preview.html.erb +9 -6
- data/app/views/lookbook/previews/show.html.erb +29 -11
- data/config/app.yml +36 -0
- data/config/hooks.yml +4 -0
- data/config/inputs.yml +48 -0
- data/config/panels.yml +30 -0
- data/config/routes.rb +1 -1
- data/config/tags.yml +29 -0
- data/lib/lookbook/engine.rb +40 -20
- data/lib/lookbook/markdown.rb +1 -11
- data/lib/lookbook/page.rb +1 -1
- data/lib/lookbook/params.rb +0 -7
- data/lib/lookbook/parser.rb +3 -10
- data/lib/lookbook/preview.rb +7 -3
- data/lib/lookbook/preview_example.rb +7 -3
- data/lib/lookbook/preview_group.rb +2 -2
- data/lib/lookbook/services/config_loader.rb +20 -0
- data/lib/lookbook/services/search_param_builder.rb +13 -0
- data/lib/lookbook/services/search_param_parser.rb +15 -0
- data/lib/lookbook/services/tags/key_value_tag_parser.rb +24 -0
- data/lib/lookbook/source_inspector.rb +10 -16
- data/lib/lookbook/stores/config_store.rb +80 -0
- data/lib/lookbook/stores/hook_store.rb +28 -0
- data/lib/lookbook/stores/input_store.rb +58 -0
- data/lib/lookbook/stores/panel_store.rb +141 -0
- data/lib/lookbook/stores/tag_store.rb +46 -0
- data/lib/lookbook/support/errors/config_error.rb +7 -0
- data/lib/lookbook/support/errors/lookbook_error.rb +21 -0
- data/lib/lookbook/support/errors/parser_error.rb +7 -0
- data/lib/lookbook/support/service.rb +7 -0
- data/lib/lookbook/support/store.rb +77 -0
- data/lib/lookbook/support/utils/attribute_utils.rb +9 -0
- data/lib/lookbook/support/utils/path_utils.rb +19 -0
- data/lib/lookbook/tags.rb +5 -14
- data/lib/lookbook/version.rb +1 -1
- data/lib/lookbook.rb +43 -12
- data/public/lookbook-assets/css/lookbook.css +33 -0
- data/public/lookbook-assets/css/lookbook.css.map +1 -1
- data/public/lookbook-assets/js/lookbook.js +145 -4
- data/public/lookbook-assets/js/lookbook.js.map +1 -1
- metadata +29 -6
- data/lib/lookbook/config.rb +0 -278
- data/lib/lookbook/hooks.rb +0 -21
- data/lib/lookbook/panels.rb +0 -25
- data/lib/lookbook/store.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 746247239c9d22b8537a0327dfa40e3d4a2b687a9d48e0a4b61819cba7766bec
|
4
|
+
data.tar.gz: c288e6e752520bb2b4b90b5e1f682cd68c99961939496b5d698abf2604962efc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b0aae039cf5d29f2d9f93aca8f2fd62996ecbce1ad9cc9ab8c8b19e82343f71a3dc6694406182e5ebd41b0a6ad97c160a7c156e51463cda51f522b186a25a1d
|
7
|
+
data.tar.gz: cf44c51bfa10e5eabc5dc6c88931d3e1676e5b72599e00304c83aca343d6a080ef31afa0044e39383d1c4b4ccc179260832afb5951d5427858767b09ff749a4a
|
@@ -8,4 +8,26 @@ function prefixString(string, prefix = null) {
|
|
8
8
|
return prefix ? `${prefix}-${string}` : string;
|
9
9
|
}
|
10
10
|
|
11
|
-
|
11
|
+
function parseSearchParamValue(value) {
|
12
|
+
const params = {};
|
13
|
+
value.split("|").forEach((pair_str) => {
|
14
|
+
const [key, value] = pair_str.split(":").map((part) => part.trim());
|
15
|
+
params[key] = value;
|
16
|
+
});
|
17
|
+
return params;
|
18
|
+
}
|
19
|
+
|
20
|
+
function buildSearchParamValue(data) {
|
21
|
+
const pairs = [];
|
22
|
+
for (const [key, value] of Object.entries(data)) {
|
23
|
+
pairs.push(`${key}:${value}`);
|
24
|
+
}
|
25
|
+
return pairs.join("|");
|
26
|
+
}
|
27
|
+
|
28
|
+
export {
|
29
|
+
prefixString,
|
30
|
+
decodeEntities,
|
31
|
+
parseSearchParamValue,
|
32
|
+
buildSearchParamValue,
|
33
|
+
};
|
@@ -50,7 +50,6 @@ 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);
|
54
53
|
Alpine.data(`${name}Component`, components[name]);
|
55
54
|
});
|
56
55
|
});
|
@@ -8,7 +8,8 @@
|
|
8
8
|
}
|
9
9
|
],
|
10
10
|
disabled: @disabled,
|
11
|
-
"@keydown.esc.stop": "hideDropdown"
|
11
|
+
"@keydown.esc.stop": "hideDropdown",
|
12
|
+
"@navigation:complete.window": "updateDropdown" do %>
|
12
13
|
<span x-ref="icon">
|
13
14
|
<%= icon || lookbook_render(:icon, name: @icon, size: icon_size, ":class": "{'animate-spin': _spinning}") %>
|
14
15
|
</span>
|
@@ -38,6 +38,15 @@ export default function buttonComponent() {
|
|
38
38
|
}
|
39
39
|
},
|
40
40
|
|
41
|
+
updateDropdown() {
|
42
|
+
if (dropdown) {
|
43
|
+
dropdown.hide();
|
44
|
+
this.$nextTick(() => {
|
45
|
+
dropdown.setContent(this.$refs.dropdown.innerHTML);
|
46
|
+
});
|
47
|
+
}
|
48
|
+
},
|
49
|
+
|
41
50
|
startSpin() {
|
42
51
|
this._spinning = true;
|
43
52
|
},
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%= render_component_tag class: "px-2" do %>
|
2
|
+
<% if fields.many? %>
|
3
|
+
<%= lookbook_render :button, icon: :settings, tooltip: "Display options" do |button| %>
|
4
|
+
<% button.dropdown do %>
|
5
|
+
<div class="p-3 space-y-3">
|
6
|
+
<%= safe_join(fields) %>
|
7
|
+
</div>
|
8
|
+
<% end %>
|
9
|
+
<% end %>
|
10
|
+
<% else %>
|
11
|
+
<%= safe_join(fields) %>
|
12
|
+
<% end %>
|
13
|
+
<% end %>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
@layer components {
|
2
|
+
[data-component="display-options-field"] {
|
3
|
+
[type="text"],
|
4
|
+
[type="email"],
|
5
|
+
[type="url"],
|
6
|
+
[type="password"],
|
7
|
+
[type="number"],
|
8
|
+
[type="date"],
|
9
|
+
[type="datetime-local"],
|
10
|
+
[type="month"],
|
11
|
+
[type="search"],
|
12
|
+
[type="tel"],
|
13
|
+
[type="time"],
|
14
|
+
[type="week"],
|
15
|
+
textarea,
|
16
|
+
select {
|
17
|
+
padding: 0.26rem 0.6rem;
|
18
|
+
font-size: 0.8rem;
|
19
|
+
line-height: 1.1rem;
|
20
|
+
}
|
21
|
+
|
22
|
+
label {
|
23
|
+
@apply text-[0.82rem] text-lookbook-input-text cursor-pointer;
|
24
|
+
}
|
25
|
+
|
26
|
+
select {
|
27
|
+
border-radius: 0.375rem;
|
28
|
+
padding-right: 1.5rem;
|
29
|
+
background-size: 1.2em 1.2em;
|
30
|
+
background-position: right 0.4rem center;
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import Cookies from "js-cookie";
|
2
|
+
import {
|
3
|
+
parseSearchParamValue,
|
4
|
+
buildSearchParamValue,
|
5
|
+
} from "~/app/assets/lookbook/js/helpers/string";
|
6
|
+
|
7
|
+
export default function displayOptionsFieldComponent({ name, value }) {
|
8
|
+
return {
|
9
|
+
name,
|
10
|
+
value,
|
11
|
+
|
12
|
+
init() {
|
13
|
+
this.$watch("value", () => this.update());
|
14
|
+
},
|
15
|
+
|
16
|
+
update() {
|
17
|
+
Cookies.set(`lookbook-display-${name}`, this.value);
|
18
|
+
|
19
|
+
const searchParams = new URLSearchParams(window.location.search);
|
20
|
+
const display = searchParams.get("_display");
|
21
|
+
|
22
|
+
const displayParams = display ? parseSearchParamValue(display) : {};
|
23
|
+
displayParams[this.name] = this.value;
|
24
|
+
searchParams.set("_display", buildSearchParamValue(displayParams));
|
25
|
+
|
26
|
+
const path = location.href.replace(location.search, "");
|
27
|
+
this.navigateTo(`${path}?${searchParams.toString()}`);
|
28
|
+
},
|
29
|
+
};
|
30
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Lookbook
|
2
|
+
module DisplayOptions
|
3
|
+
class Field::Component < Lookbook::BaseComponent
|
4
|
+
attr_reader :name, :value
|
5
|
+
|
6
|
+
def initialize(name:, opts:, value:, **html_attrs)
|
7
|
+
@name = name
|
8
|
+
@opts = opts
|
9
|
+
@value = value
|
10
|
+
super(**html_attrs)
|
11
|
+
end
|
12
|
+
|
13
|
+
def choices
|
14
|
+
@opts.is_a?(Hash) ? @opts[:choices].to_a : @opts
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def alpine_data
|
20
|
+
"{name: '#{name}', value: '#{value}'}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def alpine_component
|
24
|
+
"displayOptionsFieldComponent"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -2,22 +2,21 @@ require "css_parser"
|
|
2
2
|
|
3
3
|
module Lookbook
|
4
4
|
class InspectorPanel::Component < Lookbook::BaseComponent
|
5
|
-
attr_reader :panel_styles, :panel_html
|
5
|
+
attr_reader :panel_styles, :panel_html
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
@id = id
|
7
|
+
def initialize(name:, **attrs)
|
9
8
|
@name = name
|
10
|
-
|
11
|
-
|
9
|
+
super(**attrs)
|
10
|
+
end
|
11
|
+
|
12
|
+
def id
|
13
|
+
AttributeUtils.dom_id("panel", @name)
|
12
14
|
end
|
13
15
|
|
14
16
|
def before_render
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@panel_html = tpl.content
|
19
|
-
end
|
20
|
-
@panel_html ||= content
|
17
|
+
tpl = TemplateParser.new(content)
|
18
|
+
@panel_styles = tpl.styles.map { |s| "##{id} #{s}" }.join("\n")
|
19
|
+
@panel_html = tpl.content
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
@@ -5,11 +5,14 @@ module Lookbook
|
|
5
5
|
@field_count += 1
|
6
6
|
@descriptions = true if description.present?
|
7
7
|
input_config = @inputs[input.tr("-", "_").to_sym]
|
8
|
-
Lookbook::Params::Field::Component.new(input: input,
|
8
|
+
Lookbook::Params::Field::Component.new(input: input,
|
9
|
+
description: description,
|
10
|
+
index: @field_count,
|
11
|
+
config: input_config, **attrs)
|
9
12
|
end
|
10
13
|
|
11
|
-
def initialize(inputs:
|
12
|
-
@inputs = inputs
|
14
|
+
def initialize(inputs: nil, **html_attrs)
|
15
|
+
@inputs = inputs.to_h
|
13
16
|
@field_count = -1
|
14
17
|
@descriptions = false
|
15
18
|
@@input_styles = {}
|
@@ -59,7 +59,7 @@ module Lookbook
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def input_options
|
62
|
-
config_options = @config.fetch(:
|
62
|
+
config_options = @config.fetch(:opts, {})
|
63
63
|
opts = config_options.merge(@input_options).symbolize_keys
|
64
64
|
opts[:id] = "param-#{@name}"
|
65
65
|
opts
|
@@ -79,7 +79,6 @@ module Lookbook
|
|
79
79
|
|
80
80
|
def render_input
|
81
81
|
target = @config[:partial]
|
82
|
-
|
83
82
|
if target
|
84
83
|
render(target, **render_props)
|
85
84
|
else
|
@@ -88,9 +87,6 @@ module Lookbook
|
|
88
87
|
rescue ::ActionView::MissingTemplate => exception
|
89
88
|
Lookbook.logger.error exception
|
90
89
|
input_error "Param input partial '#{@config[:partial]}' could not be found."
|
91
|
-
rescue => exception
|
92
|
-
Lookbook.logger.error exception
|
93
|
-
input_error exception.message
|
94
90
|
end
|
95
91
|
|
96
92
|
def alpine_component
|
@@ -25,7 +25,7 @@
|
|
25
25
|
<div
|
26
26
|
class="grid bg-white relative -inset-px <%= "grid-cols-[1fr_17px]" if @resize_width %> <%= "grid-rows-[1fr_17px]" if @resize_height %>"
|
27
27
|
style="width: calc(100% + 2px); height: calc(100% + 1px); <%= "max-height: #{@max_height}px;" if @max_height.present? %>">
|
28
|
-
<iframe seamless
|
28
|
+
<iframe seamless<%= " id=#{@iframe_id}" if @iframe_id.present? %>
|
29
29
|
x-ref="iframe"
|
30
30
|
class="h-full w-full border border-lookbook-divider"
|
31
31
|
:class="{ 'pointer-events-none': reflowing }"
|
@@ -1,10 +1,11 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class Viewport::Component < Lookbook::BaseComponent
|
3
|
-
def initialize(src:, resize_height: true, resize_width: true, max_height: nil, **html_attrs)
|
3
|
+
def initialize(src:, resize_height: true, resize_width: true, max_height: nil, iframe_id: nil, **html_attrs)
|
4
4
|
@src = src
|
5
5
|
@resize_height = resize_height
|
6
6
|
@resize_width = resize_width
|
7
7
|
@max_height = max_height
|
8
|
+
@iframe_id = iframe_id
|
8
9
|
super(**html_attrs)
|
9
10
|
end
|
10
11
|
|
@@ -10,6 +10,7 @@ module Lookbook
|
|
10
10
|
|
11
11
|
before_action :lookup_entities, only: [:preview, :show]
|
12
12
|
before_action :set_title
|
13
|
+
before_action :set_display_options
|
13
14
|
before_action :set_params
|
14
15
|
|
15
16
|
def preview
|
@@ -92,6 +93,38 @@ module Lookbook
|
|
92
93
|
@title = @target.present? ? [@target&.label, @preview&.label].compact.join(" :: ") : "Not found"
|
93
94
|
end
|
94
95
|
|
96
|
+
def set_display_options
|
97
|
+
@dynamic_display_options = []
|
98
|
+
@static_display_options = []
|
99
|
+
|
100
|
+
if @target.present?
|
101
|
+
opts = @target.display_options
|
102
|
+
@dynamic_display_options = opts.select { _2.is_a?(Array) || _2.is_a?(Hash) }
|
103
|
+
@static_display_options = opts.except(*@dynamic_display_options.keys)
|
104
|
+
|
105
|
+
if params[:_display]
|
106
|
+
display_params = SearchParamParser.call(params[:_display])
|
107
|
+
display_params.each do |name, value|
|
108
|
+
if @dynamic_display_options.key?(name)
|
109
|
+
cookies["lookbook-display-#{name}"] = value
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
@dynamic_display_options.each do |name, opts|
|
115
|
+
choices = opts.is_a?(Hash) ? opts[:choices].to_a : opts
|
116
|
+
@static_display_options[name] ||= cookies.fetch("lookbook-display-#{name}", choices.first)
|
117
|
+
end
|
118
|
+
|
119
|
+
unless params[:_display]
|
120
|
+
display_params = @dynamic_display_options.map do |name, opts|
|
121
|
+
[name, @static_display_options[name]]
|
122
|
+
end.to_h
|
123
|
+
request.query_parameters[:_display] = SearchParamBuilder.call(display_params)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
95
128
|
def set_params
|
96
129
|
if @target
|
97
130
|
# cast known params to type
|
@@ -103,7 +136,7 @@ module Lookbook
|
|
103
136
|
# set display and data params
|
104
137
|
preview_controller.params.merge!({
|
105
138
|
lookbook: {
|
106
|
-
display: @
|
139
|
+
display: @static_display_options,
|
107
140
|
data: Lookbook.data
|
108
141
|
}
|
109
142
|
})
|
@@ -156,38 +189,16 @@ module Lookbook
|
|
156
189
|
})
|
157
190
|
end
|
158
191
|
|
159
|
-
def panels
|
160
|
-
return @panels if @panels.present?
|
161
|
-
inspector_data_hash = inspector_data.to_h
|
162
|
-
panel_counts = {}
|
163
|
-
|
164
|
-
@panels = Lookbook.config.inspector_panels.map do |name, config|
|
165
|
-
config_with_defaults = Lookbook.config.inspector_panel_defaults.merge(config)
|
166
|
-
panel_counts[config_with_defaults[:pane].to_sym] ||= 0
|
167
|
-
panel_counts[config_with_defaults[:pane].to_sym] += 1
|
168
|
-
|
169
|
-
callable_data = {
|
170
|
-
name: name.to_s,
|
171
|
-
index_position: panel_counts[config_with_defaults[:pane].to_sym],
|
172
|
-
**inspector_data_hash
|
173
|
-
}
|
174
|
-
|
175
|
-
resolved_config = config_with_defaults.transform_values do |value|
|
176
|
-
value.instance_of?(Proc) ? value.call(Lookbook::Store.new(callable_data)) : value
|
177
|
-
end
|
178
|
-
resolved_config[:name] = name.to_s
|
179
|
-
Store.new(resolved_config)
|
180
|
-
end
|
181
|
-
|
182
|
-
@panels = @panels.select(&:show).sort_by { |p| [p.position, p.label] }
|
183
|
-
end
|
184
|
-
|
185
192
|
def main_panels
|
186
|
-
panels.
|
193
|
+
Engine.panels.in_group(:main).map do |config|
|
194
|
+
PanelStore.resolve_config(config, inspector_data)
|
195
|
+
end
|
187
196
|
end
|
188
197
|
|
189
198
|
def drawer_panels
|
190
|
-
panels.
|
199
|
+
Engine.panels.in_group(:drawer).map do |config|
|
200
|
+
PanelStore.resolve_config(config, inspector_data)
|
201
|
+
end
|
191
202
|
end
|
192
203
|
|
193
204
|
def preview_controller
|
@@ -6,7 +6,7 @@
|
|
6
6
|
</div>
|
7
7
|
<% else %>
|
8
8
|
<div class="h-full overflow-x-hidden">
|
9
|
-
<%= lookbook_render "params/editor", inputs: Lookbook::
|
9
|
+
<%= lookbook_render "params/editor", inputs: Lookbook::Engine.inputs do |editor| %>
|
10
10
|
<% preview.params.each do |param| %>
|
11
11
|
<% editor.field **param, value: params[param[:name]] %>
|
12
12
|
<% end %>
|
@@ -1,6 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
<div class="overflow-hidden h-full w-full">
|
2
|
+
<%= lookbook_render :viewport,
|
3
|
+
iframe_id: "preview-iframe",
|
4
|
+
src: lookbook_preview_path(request.query_parameters.merge(lookbook_timestamp: Time.now)),
|
5
|
+
alpine_data: "$store.inspector.main",
|
6
|
+
class: "-inset-px relative",
|
7
|
+
style: "width: calc(100% + 2px); height: calc(100% + 2px)"
|
8
|
+
%>
|
9
|
+
</div>
|
@@ -5,9 +5,9 @@
|
|
5
5
|
<%= layout.pane class: "flex flex-col h-full overflow-hidden",
|
6
6
|
"x-effect": "forceOrientation = (layoutWidth < $store.inspector.minVerticalSplitWidth) ? 'horizontal' : null" do %>
|
7
7
|
|
8
|
-
<%= lookbook_render :toolbar do |toolbar| %>
|
8
|
+
<%= lookbook_render :toolbar, id: "main-toolbar" do |toolbar| %>
|
9
9
|
<% toolbar.section ":class": "layoutResizing && 'overflow-hidden'" do %>
|
10
|
-
<%= lookbook_render :tabs, alpine_data: "$store.inspector.main" do |tabs| %>
|
10
|
+
<%= lookbook_render :tabs, alpine_data: "$store.inspector.main", id: "inspector-tabs-main" do |tabs| %>
|
11
11
|
<%= @main_panels.each do |panel| %>
|
12
12
|
<% tabs.tab name: panel.name,
|
13
13
|
label: panel.label,
|
@@ -17,8 +17,24 @@
|
|
17
17
|
<% end %>
|
18
18
|
<% end %>
|
19
19
|
|
20
|
-
<% toolbar.section
|
20
|
+
<% toolbar.section align: :right, class: "flex-none" do %>
|
21
|
+
<% if @dynamic_display_options.any? %>
|
22
|
+
<%= lookbook_render "display_options/editor" do |editor| %>
|
23
|
+
<% @dynamic_display_options.each do |key, opts| %>
|
24
|
+
<% editor.field name: key, opts: opts, value: @static_display_options[key] %>
|
25
|
+
<% end %>
|
26
|
+
<% end %>
|
27
|
+
<% end %>
|
28
|
+
<% end %>
|
29
|
+
|
30
|
+
<% toolbar.section divide: :left, class: "flex-none relative z-10" do %>
|
21
31
|
<%= lookbook_render :button_group do |group| %>
|
32
|
+
<% group.button icon: :link,
|
33
|
+
tooltip: "Copy preview URL",
|
34
|
+
copy: true do %>
|
35
|
+
<%= lookbook_inspect_url(@target.lookup_path, request.query_parameters) %>
|
36
|
+
<% end %>
|
37
|
+
|
22
38
|
<% if @pages.any? %>
|
23
39
|
<% group.button icon: :code,
|
24
40
|
tooltip: "Copy page embed code",
|
@@ -47,10 +63,12 @@
|
|
47
63
|
<% end %>
|
48
64
|
|
49
65
|
<div class="h-full relative overflow-auto">
|
50
|
-
<%= lookbook_render :tab_panels, alpine_data: "$store.inspector.main" do |tabs| %>
|
66
|
+
<%= lookbook_render :tab_panels, alpine_data: "$store.inspector.main", id: "inspector-panels-main" do |tabs| %>
|
51
67
|
<% @main_panels.each do |panel| %>
|
52
|
-
<% tabs.panel
|
53
|
-
<%=
|
68
|
+
<% tabs.panel name: panel.name do %>
|
69
|
+
<%= lookbook_render :inspector_panel, name: panel.name do %>
|
70
|
+
<%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
|
71
|
+
<% end %>
|
54
72
|
<% end %>
|
55
73
|
<% end %>
|
56
74
|
<% end %>
|
@@ -60,9 +78,9 @@
|
|
60
78
|
<%= layout.pane class: "flex flex-col h-full overflow-hidden bg-lookbook-drawer-bg",
|
61
79
|
"x-show": "!$store.inspector.drawer.hidden && #{@drawer_panels.any?}" do %>
|
62
80
|
|
63
|
-
<%= lookbook_render :toolbar do |toolbar| %>
|
81
|
+
<%= lookbook_render :toolbar, id: "drawer-toolbar" do |toolbar| %>
|
64
82
|
<% toolbar.section ":class": "layoutResizing && 'overflow-hidden'" do %>
|
65
|
-
<%= lookbook_render :tabs, alpine_data: "$store.inspector.drawer" do |tabs| %>
|
83
|
+
<%= lookbook_render :tabs, alpine_data: "$store.inspector.drawer", id: "inspector-tabs-drawer" do |tabs| %>
|
66
84
|
<%= @drawer_panels.each do |panel| %>
|
67
85
|
<% tabs.tab name: panel.name,
|
68
86
|
label: panel.label,
|
@@ -115,10 +133,10 @@
|
|
115
133
|
<% end %>
|
116
134
|
|
117
135
|
<div class="h-full overflow-auto">
|
118
|
-
<%= lookbook_render :tab_panels, alpine_data: "$store.inspector.drawer" do |tabs| %>
|
136
|
+
<%= lookbook_render :tab_panels, alpine_data: "$store.inspector.drawer", id: "inspector-panels-drawer" do |tabs| %>
|
119
137
|
<% @drawer_panels.each do |panel| %>
|
120
|
-
<% tabs.panel
|
121
|
-
<%= lookbook_render :inspector_panel,
|
138
|
+
<% tabs.panel name: panel.name do %>
|
139
|
+
<%= lookbook_render :inspector_panel, name: panel.name do %>
|
122
140
|
<%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
|
123
141
|
<% end %>
|
124
142
|
<% end %>
|
data/config/app.yml
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
shared:
|
2
|
+
project_name: Lookbook
|
3
|
+
log_level: 2
|
4
|
+
log_use_rails_logger: true
|
5
|
+
auto_refresh: true
|
6
|
+
components_path: app/components
|
7
|
+
page_controller: Lookbook::PageController
|
8
|
+
page_route: pages
|
9
|
+
page_paths: [test/components/docs]
|
10
|
+
page_options: {}
|
11
|
+
markdown_options:
|
12
|
+
tables: true
|
13
|
+
fenced_code_blocks: true
|
14
|
+
disable_indented_code_blocks: true
|
15
|
+
strikethrough: true
|
16
|
+
highlight: true
|
17
|
+
with_toc_data: true
|
18
|
+
lax_spacing: true
|
19
|
+
sort_examples: false
|
20
|
+
preview_paths: []
|
21
|
+
preview_display_options: {}
|
22
|
+
preview_disable_action_view_annotations: true
|
23
|
+
preview_params_options_eval: false
|
24
|
+
listen: false
|
25
|
+
listen_paths: []
|
26
|
+
listen_extensions: [rb, html.*]
|
27
|
+
listen_use_polling: false
|
28
|
+
ui_theme: indigo
|
29
|
+
ui_theme_overrides: {}
|
30
|
+
ui_favicon: true
|
31
|
+
debug_menu: false
|
32
|
+
experimental_features: false
|
33
|
+
|
34
|
+
development:
|
35
|
+
listen: true
|
36
|
+
debug_menu: true
|
data/config/hooks.yml
ADDED
data/config/inputs.yml
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
shared:
|
2
|
+
select:
|
3
|
+
partial: lookbook/previews/inputs/select
|
4
|
+
opts: {}
|
5
|
+
|
6
|
+
textarea:
|
7
|
+
partial: lookbook/previews/inputs/textarea
|
8
|
+
opts: {}
|
9
|
+
|
10
|
+
toggle:
|
11
|
+
partial: lookbook/previews/inputs/toggle
|
12
|
+
opts: {}
|
13
|
+
|
14
|
+
color:
|
15
|
+
partial: lookbook/previews/inputs/color
|
16
|
+
opts: {}
|
17
|
+
|
18
|
+
range:
|
19
|
+
partial: lookbook/previews/inputs/range
|
20
|
+
opts: {}
|
21
|
+
|
22
|
+
text:
|
23
|
+
partial: lookbook/previews/inputs/text
|
24
|
+
opts: {}
|
25
|
+
|
26
|
+
email:
|
27
|
+
partial: lookbook/previews/inputs/text
|
28
|
+
opts: {}
|
29
|
+
|
30
|
+
number:
|
31
|
+
partial: lookbook/previews/inputs/text
|
32
|
+
opts: {}
|
33
|
+
|
34
|
+
tel:
|
35
|
+
partial: lookbook/previews/inputs/text
|
36
|
+
opts: {}
|
37
|
+
|
38
|
+
url:
|
39
|
+
partial: lookbook/previews/inputs/text
|
40
|
+
opts: {}
|
41
|
+
|
42
|
+
date:
|
43
|
+
partial: lookbook/previews/inputs/text
|
44
|
+
opts: {}
|
45
|
+
|
46
|
+
datetime_local:
|
47
|
+
partial: lookbook/previews/inputs/text
|
48
|
+
opts: {}
|