lookbook 1.0.0.beta.5 → 1.0.0.beta.8
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/README.md +29 -254
- data/app/assets/lookbook/css/lookbook.css +1 -1
- data/app/assets/lookbook/css/themes/blue.css +58 -37
- data/app/assets/lookbook/css/themes/indigo.css +58 -37
- data/app/assets/lookbook/css/themes/zinc.css +58 -37
- data/app/assets/lookbook/css/tooltip.css +5 -5
- data/app/components/lookbook/base_component.rb +0 -1
- data/app/components/lookbook/button/component.html.erb +2 -2
- data/app/components/lookbook/embed/component.html.erb +5 -5
- data/app/components/lookbook/embed/component.rb +8 -0
- data/app/components/lookbook/filter/component.html.erb +1 -1
- data/app/components/lookbook/header/component.html.erb +1 -1
- data/app/components/lookbook/inspector_panel/component.css +5 -0
- data/app/components/lookbook/inspector_panel/component.html.erb +6 -0
- data/app/components/lookbook/inspector_panel/component.rb +36 -0
- data/app/components/lookbook/nav/component.rb +1 -2
- data/app/components/lookbook/nav/item/component.html.erb +1 -1
- data/app/components/lookbook/params_editor/field/component.rb +2 -1
- data/app/components/lookbook/prose/component.html.erb +1 -1
- data/app/components/lookbook/tab_panels/component.rb +1 -1
- data/app/components/lookbook/tab_panels/panel/component.rb +2 -2
- data/app/components/lookbook/tabs/dropdown_tab/component.html.erb +1 -1
- data/app/components/lookbook/tabs/tab/component.html.erb +1 -1
- data/app/components/lookbook/tag_component.rb +1 -1
- data/app/components/lookbook/toolbar/component.html.erb +1 -1
- data/app/components/lookbook/viewport/component.css +1 -1
- data/app/components/lookbook/viewport/component.html.erb +1 -1
- data/app/controllers/lookbook/application_controller.rb +1 -1
- data/app/controllers/lookbook/pages_controller.rb +1 -0
- data/app/controllers/lookbook/previews_controller.rb +21 -9
- data/app/helpers/lookbook/application_helper.rb +9 -6
- data/app/helpers/lookbook/preview_helper.rb +2 -3
- data/app/views/layouts/lookbook/application.html.erb +1 -1
- data/app/views/layouts/lookbook/page.html.erb +2 -2
- data/app/views/layouts/lookbook/shell.html.erb +6 -0
- data/app/views/layouts/lookbook/skeleton.html.erb +15 -14
- data/app/views/lookbook/previews/panels/_content.html.erb +1 -1
- data/app/views/lookbook/previews/panels/_notes.html.erb +2 -2
- data/app/views/lookbook/previews/panels/_params.html.erb +1 -1
- data/app/views/lookbook/previews/show.html.erb +7 -5
- data/lib/lookbook/code_formatter.rb +1 -1
- data/lib/lookbook/collection.rb +1 -1
- data/lib/lookbook/component.rb +2 -3
- data/lib/lookbook/config.rb +68 -46
- data/lib/lookbook/data.rb +11 -0
- data/lib/lookbook/engine.rb +64 -68
- data/lib/lookbook/entity.rb +1 -1
- data/lib/lookbook/hooks.rb +21 -0
- data/lib/lookbook/markdown.rb +1 -1
- data/lib/lookbook/page.rb +4 -5
- data/lib/lookbook/page_section.rb +2 -4
- data/lib/lookbook/panels.rb +15 -0
- data/lib/lookbook/params.rb +12 -0
- data/lib/lookbook/parser.rb +4 -1
- data/lib/lookbook/preview.rb +9 -11
- data/lib/lookbook/preview_example.rb +1 -1
- data/lib/lookbook/preview_group.rb +8 -0
- data/lib/lookbook/source_inspector.rb +9 -0
- data/lib/lookbook/store.rb +14 -2
- data/lib/lookbook/tag.rb +112 -0
- data/lib/lookbook/tags.rb +22 -0
- data/lib/lookbook/theme.rb +38 -9
- data/lib/lookbook/version.rb +1 -1
- data/lib/lookbook.rb +1 -0
- data/lib/tasks/lookbook_tasks.rake +1 -2
- data/public/lookbook-assets/css/lookbook.css +307 -150
- data/public/lookbook-assets/css/lookbook.css.map +1 -1
- data/public/lookbook-assets/css/themes/blue.css +57 -36
- data/public/lookbook-assets/css/themes/blue.css.map +1 -1
- data/public/lookbook-assets/css/themes/indigo.css +57 -36
- data/public/lookbook-assets/css/themes/indigo.css.map +1 -1
- data/public/lookbook-assets/css/themes/zinc.css +57 -36
- data/public/lookbook-assets/css/themes/zinc.css.map +1 -1
- data/public/lookbook-assets/js/embed.js +193 -193
- data/public/lookbook-assets/js/lookbook.js +1151 -1308
- data/public/lookbook-assets/js/lookbook.js.map +1 -1
- metadata +12 -4
data/lib/lookbook/config.rb
CHANGED
@@ -6,14 +6,14 @@ module Lookbook
|
|
6
6
|
class Config
|
7
7
|
def initialize
|
8
8
|
@options = Store.new
|
9
|
-
|
9
|
+
|
10
10
|
@options.set({
|
11
11
|
project_name: "Lookbook",
|
12
12
|
log_level: 2,
|
13
13
|
auto_refresh: true,
|
14
14
|
|
15
15
|
components_path: "app/components",
|
16
|
-
|
16
|
+
|
17
17
|
page_controller: "Lookbook::PageController",
|
18
18
|
page_route: "pages",
|
19
19
|
page_paths: ["test/components/docs"],
|
@@ -22,9 +22,9 @@ module Lookbook
|
|
22
22
|
|
23
23
|
preview_paths: [],
|
24
24
|
preview_display_params: {},
|
25
|
-
|
26
|
-
|
27
|
-
sort_examples:
|
25
|
+
preview_srcdoc: nil,
|
26
|
+
preview_tags: {},
|
27
|
+
sort_examples: false,
|
28
28
|
|
29
29
|
listen: Rails.env.development?,
|
30
30
|
listen_paths: [],
|
@@ -39,11 +39,12 @@ module Lookbook
|
|
39
39
|
|
40
40
|
ui_theme: "indigo",
|
41
41
|
ui_theme_overrides: {},
|
42
|
+
ui_favicon: true,
|
42
43
|
|
43
44
|
hooks: {
|
44
45
|
after_initialize: [],
|
45
46
|
before_exit: [],
|
46
|
-
after_change: []
|
47
|
+
after_change: []
|
47
48
|
},
|
48
49
|
|
49
50
|
debug_menu: Rails.env.development?,
|
@@ -57,7 +58,8 @@ module Lookbook
|
|
57
58
|
partial: "lookbook/previews/panels/preview",
|
58
59
|
hotkey: "v",
|
59
60
|
panel_classes: "overflow-hidden",
|
60
|
-
padded: false
|
61
|
+
padded: false,
|
62
|
+
system: true
|
61
63
|
},
|
62
64
|
output: {
|
63
65
|
pane: :main,
|
@@ -65,7 +67,8 @@ module Lookbook
|
|
65
67
|
partial: "lookbook/previews/panels/output",
|
66
68
|
label: "HTML",
|
67
69
|
hotkey: "h",
|
68
|
-
padded: false
|
70
|
+
padded: false,
|
71
|
+
system: true
|
69
72
|
},
|
70
73
|
source: {
|
71
74
|
pane: :drawer,
|
@@ -74,7 +77,8 @@ module Lookbook
|
|
74
77
|
label: "Source",
|
75
78
|
hotkey: "s",
|
76
79
|
copy: ->(data) { data.examples.map { |e| e.source }.join("\n") },
|
77
|
-
padded: false
|
80
|
+
padded: false,
|
81
|
+
system: true
|
78
82
|
},
|
79
83
|
notes: {
|
80
84
|
pane: :drawer,
|
@@ -83,7 +87,8 @@ module Lookbook
|
|
83
87
|
label: "Notes",
|
84
88
|
hotkey: "n",
|
85
89
|
disabled: ->(data) { data.examples.select { |e| e.notes.present? }.none? },
|
86
|
-
padded: false
|
90
|
+
padded: false,
|
91
|
+
system: true
|
87
92
|
},
|
88
93
|
params: {
|
89
94
|
pane: :drawer,
|
@@ -92,25 +97,10 @@ module Lookbook
|
|
92
97
|
label: "Params",
|
93
98
|
hotkey: "p",
|
94
99
|
disabled: ->(data) { data.preview.params.none? },
|
95
|
-
padded: false
|
100
|
+
padded: false,
|
101
|
+
system: true
|
96
102
|
}
|
97
|
-
}
|
98
|
-
|
99
|
-
inspector_panel_defaults: {
|
100
|
-
id: ->(data) { "inspector-panel-#{data.name}" },
|
101
|
-
partial: "lookbook/previews/panels/content",
|
102
|
-
content: nil,
|
103
|
-
label: ->(data) { data.name.titleize },
|
104
|
-
pane: :drawer,
|
105
|
-
position: ->(data) { data.index_position },
|
106
|
-
hotkey: nil,
|
107
|
-
disabled: false,
|
108
|
-
show: true,
|
109
|
-
copy: nil,
|
110
|
-
panel_classes: nil,
|
111
|
-
locals: {},
|
112
|
-
padded: true
|
113
|
-
},
|
103
|
+
}
|
114
104
|
})
|
115
105
|
end
|
116
106
|
|
@@ -122,22 +112,33 @@ module Lookbook
|
|
122
112
|
absolute_path(@options.components_path)
|
123
113
|
end
|
124
114
|
|
115
|
+
def page_paths=(paths = [])
|
116
|
+
@options.page_paths += paths if paths.is_a? Array
|
117
|
+
end
|
118
|
+
|
125
119
|
def page_paths
|
126
120
|
normalize_paths(@options.page_paths)
|
127
121
|
end
|
128
122
|
|
123
|
+
def preview_paths=(paths = [])
|
124
|
+
@options.preview_paths += paths if paths.is_a? Array
|
125
|
+
end
|
126
|
+
|
129
127
|
def preview_paths
|
130
128
|
normalize_paths(@options.preview_paths)
|
131
129
|
end
|
132
130
|
|
131
|
+
def preview_srcdoc=(enable)
|
132
|
+
Lookbook.logger.warn "The `preview_srcdoc` config option is deprecated and will be removed in v2.0"
|
133
|
+
end
|
134
|
+
|
133
135
|
def listen_paths
|
134
136
|
normalize_paths(@options.listen_paths)
|
135
137
|
end
|
136
138
|
|
137
|
-
def listen_extensions
|
138
|
-
@options.listen_extensions +=
|
139
|
+
def listen_extensions=(extensions = [])
|
140
|
+
@options.listen_extensions += extensions if extensions.is_a? Array
|
139
141
|
@options.listen_extensions.uniq!
|
140
|
-
@options.listen_extensions
|
141
142
|
end
|
142
143
|
|
143
144
|
def parser_registry_path
|
@@ -146,7 +147,7 @@ module Lookbook
|
|
146
147
|
|
147
148
|
def inspector_panels(&block)
|
148
149
|
panels = Store.new(@options.inspector_panels.select { |key, panel| panel != false })
|
149
|
-
if
|
150
|
+
if block
|
150
151
|
yield panels
|
151
152
|
else
|
152
153
|
panels
|
@@ -154,16 +155,13 @@ module Lookbook
|
|
154
155
|
end
|
155
156
|
|
156
157
|
def define_inspector_panel(name, opts = {})
|
158
|
+
pane = opts[:pane].presence || :drawer
|
159
|
+
siblings = inspector_panels.select { |key, panel| panel.pane == pane }
|
160
|
+
opts[:position] ||= siblings.size + 1
|
157
161
|
@options.inspector_panels[name] = opts
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
panel.pane == pane && key != name.to_sym
|
162
|
-
end
|
163
|
-
siblings.each do |key, panel|
|
164
|
-
if panel.position >= opts[:position]
|
165
|
-
panel.position += 1
|
166
|
-
end
|
162
|
+
siblings.each do |key, panel|
|
163
|
+
if panel.position >= opts[:position]
|
164
|
+
panel.position += 1
|
167
165
|
end
|
168
166
|
end
|
169
167
|
end
|
@@ -180,6 +178,24 @@ module Lookbook
|
|
180
178
|
amend_inspector_panel(name, false)
|
181
179
|
end
|
182
180
|
|
181
|
+
def inspector_panel_defaults
|
182
|
+
{
|
183
|
+
id: ->(data) { "inspector-panel-#{data.name}" },
|
184
|
+
partial: "lookbook/previews/panels/content",
|
185
|
+
content: nil,
|
186
|
+
label: ->(data) { data.name.titleize },
|
187
|
+
pane: :drawer,
|
188
|
+
position: ->(data) { data.index_position },
|
189
|
+
hotkey: nil,
|
190
|
+
disabled: false,
|
191
|
+
show: true,
|
192
|
+
copy: nil,
|
193
|
+
panel_classes: nil,
|
194
|
+
locals: {},
|
195
|
+
system: false
|
196
|
+
}
|
197
|
+
end
|
198
|
+
|
183
199
|
def ui_theme=(name)
|
184
200
|
name = name.to_s
|
185
201
|
if Theme.valid_theme?(name)
|
@@ -190,7 +206,7 @@ module Lookbook
|
|
190
206
|
end
|
191
207
|
|
192
208
|
def ui_theme_overrides(&block)
|
193
|
-
if
|
209
|
+
if block
|
194
210
|
yield @options.ui_theme_overrides
|
195
211
|
else
|
196
212
|
@options.ui_theme_overrides
|
@@ -221,12 +237,14 @@ module Lookbook
|
|
221
237
|
def to_json(*a)
|
222
238
|
to_h.to_json(*a)
|
223
239
|
end
|
224
|
-
|
240
|
+
|
225
241
|
protected
|
226
242
|
|
227
243
|
def normalize_paths(paths)
|
228
|
-
paths.map!
|
229
|
-
|
244
|
+
paths.map! do |path|
|
245
|
+
full_path = absolute_path(path)
|
246
|
+
full_path if Dir.exist?(full_path)
|
247
|
+
end.compact!
|
230
248
|
paths
|
231
249
|
end
|
232
250
|
|
@@ -237,5 +255,9 @@ module Lookbook
|
|
237
255
|
def method_missing(name, *args)
|
238
256
|
@options.send(name, *args)
|
239
257
|
end
|
258
|
+
|
259
|
+
def respond_to_missing?(name, *)
|
260
|
+
to_h.key? name
|
261
|
+
end
|
240
262
|
end
|
241
|
-
end
|
263
|
+
end
|
data/lib/lookbook/engine.rb
CHANGED
@@ -2,12 +2,21 @@ require "rails"
|
|
2
2
|
require "view_component"
|
3
3
|
require "action_cable/engine"
|
4
4
|
require "listen"
|
5
|
+
require "rake"
|
5
6
|
|
6
7
|
module Lookbook
|
7
|
-
|
8
8
|
autoload :Config, "lookbook/config"
|
9
|
-
|
9
|
+
autoload :Data, "lookbook/data"
|
10
|
+
autoload :Hooks, "lookbook/hooks"
|
11
|
+
autoload :Panels, "lookbook/panels"
|
12
|
+
autoload :Tags, "lookbook/tags"
|
13
|
+
|
10
14
|
class << self
|
15
|
+
include Lookbook::Data
|
16
|
+
include Lookbook::Hooks
|
17
|
+
include Lookbook::Panels
|
18
|
+
include Lookbook::Tags
|
19
|
+
|
11
20
|
def version
|
12
21
|
Lookbook::VERSION
|
13
22
|
end
|
@@ -48,38 +57,12 @@ module Lookbook
|
|
48
57
|
Page.any?
|
49
58
|
end
|
50
59
|
|
51
|
-
def after_initialize(&block)
|
52
|
-
add_hook(:after_initialize, block)
|
53
|
-
end
|
54
|
-
|
55
|
-
def before_exit(&block)
|
56
|
-
add_hook(:before_exit, block)
|
57
|
-
end
|
58
|
-
|
59
|
-
def after_change(&block)
|
60
|
-
add_hook(:after_change, block)
|
61
|
-
end
|
62
|
-
|
63
|
-
def define_panel(name, opts = {})
|
64
|
-
config.define_inspector_panel(name, opts)
|
65
|
-
end
|
66
|
-
|
67
|
-
def amend_panel(name, opts = {})
|
68
|
-
config.amend_inspector_panel(name, opts)
|
69
|
-
end
|
70
|
-
|
71
|
-
def remove_panel(name)
|
72
|
-
config.remove_inspector_panel(name)
|
73
|
-
end
|
74
|
-
|
75
60
|
def broadcast(event_name, data = {})
|
76
61
|
Engine.websocket&.broadcast(event_name.to_s, data)
|
77
62
|
end
|
78
63
|
|
79
|
-
|
80
|
-
|
81
|
-
def add_hook(event_name, block)
|
82
|
-
config.hooks[event_name] << block
|
64
|
+
def theme
|
65
|
+
@theme ||= Lookbook::Theme.new(config.ui_theme, config.ui_theme_overrides)
|
83
66
|
end
|
84
67
|
end
|
85
68
|
|
@@ -89,14 +72,14 @@ module Lookbook
|
|
89
72
|
config.lookbook = Lookbook.config
|
90
73
|
config.autoload_paths << File.expand_path(Lookbook::Engine.root.join("app/components"))
|
91
74
|
|
92
|
-
initializer "lookbook.viewcomponent.config" do
|
75
|
+
initializer "lookbook.viewcomponent.config" do
|
93
76
|
config.lookbook.preview_paths += config.view_component.preview_paths
|
94
77
|
config.lookbook.preview_controller ||= config.view_component.preview_controller
|
95
78
|
|
96
79
|
config.lookbook.components_path = config.view_component.view_component_path if config.view_component.view_component_path.present?
|
97
80
|
|
98
81
|
config.lookbook.listen_paths += config.lookbook.preview_paths
|
99
|
-
config.lookbook.listen_paths << config.lookbook.components_path
|
82
|
+
config.lookbook.listen_paths << config.lookbook.components_path
|
100
83
|
end
|
101
84
|
|
102
85
|
initializer "lookbook.logging.development" do
|
@@ -104,7 +87,7 @@ module Lookbook
|
|
104
87
|
end
|
105
88
|
|
106
89
|
initializer "lookbook.parser.tags" do
|
107
|
-
Lookbook::Parser.define_tags
|
90
|
+
Lookbook::Parser.define_tags(Lookbook.config.preview_tags)
|
108
91
|
end
|
109
92
|
|
110
93
|
initializer "lookbook.assets.serve" do
|
@@ -118,39 +101,20 @@ module Lookbook
|
|
118
101
|
@preview_controller = Lookbook.config.preview_controller.constantize
|
119
102
|
@preview_controller.include(Lookbook::PreviewController)
|
120
103
|
|
121
|
-
if
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
*config.lookbook.listen_paths,
|
126
|
-
only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
|
127
|
-
force_polling: config.lookbook.listen_use_polling
|
128
|
-
) do |modified, added, removed|
|
129
|
-
changes = { modified: modified, added: added, removed: removed }
|
130
|
-
begin
|
131
|
-
parser.parse
|
132
|
-
rescue
|
133
|
-
end
|
134
|
-
Lookbook::Preview.clear_cache
|
135
|
-
Lookbook::Engine.reload_ui(changes)
|
136
|
-
Lookbook::Engine.run_hooks(:after_change, changes)
|
104
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new("6.1.3.1")
|
105
|
+
# Rails.application.server is only available for newer Rails versions
|
106
|
+
Rails.application.server do
|
107
|
+
init_listeners
|
137
108
|
end
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
only: /\.(html.*|md.*)$/,
|
143
|
-
force_polling: config.lookbook.listen_use_polling
|
144
|
-
) do |modified, added, removed|
|
145
|
-
changes = { modified: modified, added: added, removed: removed }
|
146
|
-
Lookbook::Engine.reload_ui(changes)
|
147
|
-
Lookbook::Engine.run_hooks(:after_change, changes)
|
109
|
+
else
|
110
|
+
# Fallback for older Rails versions - don't start listeners if running in a rake task.
|
111
|
+
unless File.basename($0) == "rake" || Rake.application.top_level_tasks.any?
|
112
|
+
init_listeners
|
148
113
|
end
|
149
|
-
Lookbook::Engine.register_listener(page_listener)
|
150
114
|
end
|
151
115
|
|
152
116
|
if config.lookbook.runtime_parsing
|
153
|
-
parser.parse
|
117
|
+
Lookbook::Engine.parser.parse
|
154
118
|
else
|
155
119
|
unless File.exist?(config.lookbook.parser_registry_path)
|
156
120
|
Lookbook.logger.warn "
|
@@ -164,16 +128,48 @@ module Lookbook
|
|
164
128
|
Lookbook::Engine.run_hooks(:after_initialize)
|
165
129
|
end
|
166
130
|
|
131
|
+
def init_listeners
|
132
|
+
return unless config.lookbook.listen == true
|
133
|
+
Listen.logger = Lookbook.logger
|
134
|
+
Lookbook.logger.info "Initializing listeners"
|
135
|
+
|
136
|
+
preview_listener = Listen.to(
|
137
|
+
*config.lookbook.listen_paths,
|
138
|
+
only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
|
139
|
+
force_polling: config.lookbook.listen_use_polling
|
140
|
+
) do |modified, added, removed|
|
141
|
+
changes = {modified: modified, added: added, removed: removed}
|
142
|
+
begin
|
143
|
+
Lookbook::Engine.parser.parse
|
144
|
+
rescue
|
145
|
+
end
|
146
|
+
Lookbook::Preview.clear_cache
|
147
|
+
Lookbook::Engine.reload_ui(changes)
|
148
|
+
Lookbook::Engine.run_hooks(:after_change, changes)
|
149
|
+
end
|
150
|
+
Lookbook::Engine.register_listener(preview_listener)
|
151
|
+
|
152
|
+
page_listener = Listen.to(
|
153
|
+
*config.lookbook.page_paths,
|
154
|
+
only: /\.(html.*|md.*)$/,
|
155
|
+
force_polling: config.lookbook.listen_use_polling
|
156
|
+
) do |modified, added, removed|
|
157
|
+
changes = {modified: modified, added: added, removed: removed}
|
158
|
+
Lookbook::Engine.reload_ui(changes)
|
159
|
+
Lookbook::Engine.run_hooks(:after_change, changes)
|
160
|
+
end
|
161
|
+
Lookbook::Engine.register_listener(page_listener)
|
162
|
+
end
|
163
|
+
|
167
164
|
at_exit do
|
168
|
-
if
|
165
|
+
if Lookbook::Engine.listeners.any?
|
169
166
|
Lookbook.logger.debug "Stopping listeners"
|
170
|
-
Lookbook::Engine.listeners.each { |listener| listener.stop }
|
167
|
+
Lookbook::Engine.listeners.each { |listener| listener.stop }
|
171
168
|
end
|
172
169
|
Lookbook::Engine.run_hooks(:before_exit)
|
173
170
|
end
|
174
171
|
|
175
172
|
class << self
|
176
|
-
|
177
173
|
def websocket
|
178
174
|
return @websocket unless @websocket.nil?
|
179
175
|
if config.lookbook.auto_refresh
|
@@ -186,9 +182,9 @@ module Lookbook
|
|
186
182
|
@websocket ||= if Rails.version.to_f >= 6.0
|
187
183
|
ActionCable::Server::Base.new(config: cable)
|
188
184
|
else
|
189
|
-
|
190
|
-
|
191
|
-
|
185
|
+
ws = ActionCable::Server::Base.new
|
186
|
+
ws.config = cable
|
187
|
+
ws
|
192
188
|
end
|
193
189
|
end
|
194
190
|
end
|
@@ -223,7 +219,7 @@ module Lookbook
|
|
223
219
|
end
|
224
220
|
|
225
221
|
def run_hooks(event_name, *args)
|
226
|
-
|
222
|
+
config.lookbook.hooks[event_name].each do |hook|
|
227
223
|
hook.call(Lookbook, *args)
|
228
224
|
end
|
229
225
|
end
|
data/lib/lookbook/entity.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Lookbook
|
2
|
+
module Hooks
|
3
|
+
def after_initialize(&block)
|
4
|
+
add_hook(:after_initialize, block)
|
5
|
+
end
|
6
|
+
|
7
|
+
def before_exit(&block)
|
8
|
+
add_hook(:before_exit, block)
|
9
|
+
end
|
10
|
+
|
11
|
+
def after_change(&block)
|
12
|
+
add_hook(:after_change, block)
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def add_hook(event_name, block)
|
18
|
+
Lookbook.config.hooks[event_name] << block
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/lookbook/markdown.rb
CHANGED
@@ -13,7 +13,7 @@ module Lookbook
|
|
13
13
|
}
|
14
14
|
|
15
15
|
def self.render(text)
|
16
|
-
text&.gsub!(
|
16
|
+
text&.gsub!(/<!-- (BEGIN|END) (.*) -->/, "")
|
17
17
|
markdown = Redcarpet::Markdown.new(Renderer, Lookbook.config.markdown_options)
|
18
18
|
markdown.render(text).html_safe
|
19
19
|
end
|
data/lib/lookbook/page.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class Page < Entity
|
3
|
-
|
4
3
|
FRONTMATTER_FIELDS = [
|
5
4
|
:id,
|
6
5
|
:label,
|
@@ -76,7 +75,7 @@ module Lookbook
|
|
76
75
|
def type
|
77
76
|
:page
|
78
77
|
end
|
79
|
-
|
78
|
+
|
80
79
|
def id
|
81
80
|
options[:id]
|
82
81
|
end
|
@@ -125,7 +124,7 @@ module Lookbook
|
|
125
124
|
}))
|
126
125
|
end
|
127
126
|
@options = Lookbook.config.page_options.deep_merge(frontmatter).with_indifferent_access
|
128
|
-
@options[:id] =
|
127
|
+
@options[:id] = generate_id(@options[:id] || lookup_path)
|
129
128
|
@options[:label] ||= name.titleize
|
130
129
|
@options[:title] ||= @options[:label]
|
131
130
|
@options[:hidden] ||= false
|
@@ -159,7 +158,7 @@ module Lookbook
|
|
159
158
|
end
|
160
159
|
|
161
160
|
def all
|
162
|
-
|
161
|
+
pages, sections =
|
163
162
|
Array(page_paths).flat_map do |dir|
|
164
163
|
Dir["#{dir}/**/*.html.*", "#{dir}/**/*.md.*"].sort.map do |path|
|
165
164
|
create(path, dir)
|
@@ -172,7 +171,7 @@ module Lookbook
|
|
172
171
|
|
173
172
|
page_dict = sorted_pages.index_by(&:path)
|
174
173
|
sorted_sections = sections.sort_by { |section| [section.position, section.label] }
|
175
|
-
|
174
|
+
|
176
175
|
sorted_sections.each do |section|
|
177
176
|
page_dict[section.path].sections << section
|
178
177
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Lookbook
|
2
2
|
class PageSection < Page
|
3
|
-
|
4
3
|
def name
|
5
4
|
return @name if @name.present?
|
6
5
|
matches = full_path.to_s.match(%r{\[(?<name>\w+)\]})
|
@@ -24,8 +23,7 @@ module Lookbook
|
|
24
23
|
end
|
25
24
|
|
26
25
|
def lookup_path
|
27
|
-
|
26
|
+
"#{super}/#{name}"
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
31
|
-
end
|
29
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Lookbook
|
2
|
+
module Panels
|
3
|
+
def define_panel(name, opts = {})
|
4
|
+
Lookbook.config.define_inspector_panel(name, opts)
|
5
|
+
end
|
6
|
+
|
7
|
+
def amend_panel(name, opts = {})
|
8
|
+
Lookbook.amend_inspector_panel(name, opts)
|
9
|
+
end
|
10
|
+
|
11
|
+
def remove_panel(name)
|
12
|
+
Lookbook.remove_inspector_panel(name)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/lookbook/params.rb
CHANGED
@@ -63,6 +63,14 @@ module Lookbook
|
|
63
63
|
result = []
|
64
64
|
end
|
65
65
|
result
|
66
|
+
when "datetime"
|
67
|
+
begin
|
68
|
+
result = DateTime.parse(value)
|
69
|
+
rescue Date::Error
|
70
|
+
Lookbook.logger.debug "Failed to parse '#{value}' into a DateTime"
|
71
|
+
result = DateTime.now
|
72
|
+
end
|
73
|
+
result
|
66
74
|
else
|
67
75
|
begin
|
68
76
|
type_class = "ActiveModel::Type::#{type}".constantize
|
@@ -92,6 +100,8 @@ module Lookbook
|
|
92
100
|
"Boolean"
|
93
101
|
elsif default.is_a? Symbol
|
94
102
|
"Symbol"
|
103
|
+
elsif ["date", "datetime-local"].include?(input&.downcase) || default.is_a?(DateTime)
|
104
|
+
"DateTime"
|
95
105
|
else
|
96
106
|
"String"
|
97
107
|
end
|
@@ -99,6 +109,8 @@ module Lookbook
|
|
99
109
|
|
100
110
|
def input_text?(input)
|
101
111
|
[
|
112
|
+
"date",
|
113
|
+
"datetime-local",
|
102
114
|
"email",
|
103
115
|
"number",
|
104
116
|
"tel",
|
data/lib/lookbook/parser.rb
CHANGED
@@ -24,13 +24,16 @@ module Lookbook
|
|
24
24
|
end
|
25
25
|
|
26
26
|
class << self
|
27
|
-
def define_tags
|
27
|
+
def define_tags(custom = {})
|
28
28
|
YARD::Tags::Library.define_tag("Hidden status", :hidden)
|
29
29
|
YARD::Tags::Library.define_tag("Label", :label)
|
30
30
|
YARD::Tags::Library.define_tag("Display", :display)
|
31
31
|
YARD::Tags::Library.define_tag("Position", :position)
|
32
32
|
YARD::Tags::Library.define_tag("ID", :id)
|
33
33
|
YARD::Tags::Library.define_tag("Component", :component)
|
34
|
+
custom.each do |name, opts|
|
35
|
+
YARD::Tags::Library.define_tag(name.to_s.titleize, name)
|
36
|
+
end
|
34
37
|
end
|
35
38
|
end
|
36
39
|
end
|
data/lib/lookbook/preview.rb
CHANGED
@@ -3,7 +3,7 @@ module Lookbook
|
|
3
3
|
include Utils
|
4
4
|
|
5
5
|
delegate :name, :render_args, to: :@preview
|
6
|
-
delegate :position, :group, :notes, :hidden?, to: :@preview_inspector
|
6
|
+
delegate :position, :group, :notes, :hidden?, :tags, :tag, to: :@preview_inspector
|
7
7
|
|
8
8
|
def initialize(preview)
|
9
9
|
@preview = preview
|
@@ -97,7 +97,7 @@ module Lookbook
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def components
|
100
|
-
component_classes = @preview_inspector&.components
|
100
|
+
component_classes = @preview_inspector&.components&.any? ? @preview_inspector&.components : [guess_component]
|
101
101
|
component_classes.map do |class_name|
|
102
102
|
Component.new(class_name.to_s)
|
103
103
|
end
|
@@ -106,11 +106,9 @@ module Lookbook
|
|
106
106
|
protected
|
107
107
|
|
108
108
|
def guess_component
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
nil
|
113
|
-
end
|
109
|
+
name.chomp("Preview").constantize
|
110
|
+
rescue
|
111
|
+
nil
|
114
112
|
end
|
115
113
|
|
116
114
|
class << self
|
@@ -156,7 +154,7 @@ module Lookbook
|
|
156
154
|
|
157
155
|
def clear_cache
|
158
156
|
cache_dir = File.dirname(cache_marker_path)
|
159
|
-
FileUtils.mkdir_p(cache_dir) unless File.
|
157
|
+
FileUtils.mkdir_p(cache_dir) unless File.exist?(cache_dir)
|
160
158
|
File.write(cache_marker_path, Time.now.to_i)
|
161
159
|
end
|
162
160
|
|
@@ -167,7 +165,7 @@ module Lookbook
|
|
167
165
|
end
|
168
166
|
|
169
167
|
def cache_stale?
|
170
|
-
return false if !File.
|
168
|
+
return false if !File.exist?(cache_marker_path)
|
171
169
|
cache_timestamp = File.read(cache_marker_path).to_i
|
172
170
|
if @last_cache_timestamp.nil? || cache_timestamp > @last_cache_timestamp
|
173
171
|
@last_cache_timestamp = cache_timestamp
|
@@ -179,7 +177,7 @@ module Lookbook
|
|
179
177
|
|
180
178
|
def mark_as_cached
|
181
179
|
cache_dir = File.dirname(cache_marker_path)
|
182
|
-
FileUtils.mkdir_p(cache_dir) unless File.
|
180
|
+
FileUtils.mkdir_p(cache_dir) unless File.exist?(cache_dir)
|
183
181
|
File.write(cache_marker_path, Time.now)
|
184
182
|
end
|
185
183
|
|
@@ -196,7 +194,7 @@ module Lookbook
|
|
196
194
|
)
|
197
195
|
end
|
198
196
|
end
|
199
|
-
|
197
|
+
|
200
198
|
def preview_files
|
201
199
|
files = Array(Lookbook.config.preview_paths).map do |preview_path|
|
202
200
|
Dir["#{preview_path}/**/*preview.rb"].map do |path|
|