lookbook 1.0.0.beta.5 → 1.0.0.beta.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -254
  3. data/app/assets/lookbook/css/lookbook.css +1 -1
  4. data/app/assets/lookbook/css/themes/blue.css +57 -36
  5. data/app/assets/lookbook/css/themes/indigo.css +57 -36
  6. data/app/assets/lookbook/css/themes/zinc.css +57 -36
  7. data/app/assets/lookbook/css/tooltip.css +5 -5
  8. data/app/components/lookbook/button/component.html.erb +2 -2
  9. data/app/components/lookbook/embed/component.html.erb +5 -5
  10. data/app/components/lookbook/embed/component.rb +8 -0
  11. data/app/components/lookbook/filter/component.html.erb +1 -1
  12. data/app/components/lookbook/header/component.html.erb +1 -1
  13. data/app/components/lookbook/inspector_panel/component.html.erb +4 -0
  14. data/app/components/lookbook/inspector_panel/component.rb +36 -0
  15. data/app/components/lookbook/nav/item/component.html.erb +1 -1
  16. data/app/components/lookbook/prose/component.html.erb +1 -1
  17. data/app/components/lookbook/tabs/dropdown_tab/component.html.erb +1 -1
  18. data/app/components/lookbook/tabs/tab/component.html.erb +1 -1
  19. data/app/components/lookbook/toolbar/component.html.erb +1 -1
  20. data/app/components/lookbook/viewport/component.css +1 -1
  21. data/app/components/lookbook/viewport/component.html.erb +1 -1
  22. data/app/controllers/lookbook/pages_controller.rb +1 -0
  23. data/app/controllers/lookbook/previews_controller.rb +15 -3
  24. data/app/helpers/lookbook/application_helper.rb +0 -6
  25. data/app/helpers/lookbook/preview_helper.rb +2 -3
  26. data/app/views/layouts/lookbook/application.html.erb +1 -1
  27. data/app/views/layouts/lookbook/page.html.erb +2 -2
  28. data/app/views/layouts/lookbook/shell.html.erb +6 -0
  29. data/app/views/layouts/lookbook/skeleton.html.erb +0 -6
  30. data/app/views/lookbook/previews/panels/_content.html.erb +1 -1
  31. data/app/views/lookbook/previews/panels/_notes.html.erb +2 -2
  32. data/app/views/lookbook/previews/panels/_params.html.erb +1 -1
  33. data/app/views/lookbook/previews/show.html.erb +5 -3
  34. data/lib/lookbook/config.rb +56 -39
  35. data/lib/lookbook/engine.rb +8 -0
  36. data/lib/lookbook/params.rb +12 -0
  37. data/lib/lookbook/store.rb +8 -0
  38. data/lib/lookbook/version.rb +1 -1
  39. data/public/lookbook-assets/css/lookbook.css +302 -150
  40. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  41. data/public/lookbook-assets/css/themes/blue.css +57 -36
  42. data/public/lookbook-assets/css/themes/blue.css.map +1 -1
  43. data/public/lookbook-assets/css/themes/indigo.css +57 -36
  44. data/public/lookbook-assets/css/themes/indigo.css.map +1 -1
  45. data/public/lookbook-assets/css/themes/zinc.css +57 -36
  46. data/public/lookbook-assets/css/themes/zinc.css.map +1 -1
  47. data/public/lookbook-assets/js/embed.js +193 -193
  48. data/public/lookbook-assets/js/lookbook.js +1169 -1326
  49. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  50. metadata +6 -4
@@ -4,23 +4,23 @@
4
4
  .tippy-box[data-theme~="tooltip"] {
5
5
  @apply text-xs opacity-90;
6
6
 
7
- background-color: var(--lookbook-tooltip);
7
+ background-color: var(--lookbook-tooltip-bg);
8
8
  color: var(--lookbook-tooltip-text);
9
9
 
10
10
  &[data-placement^="top"] > .tippy-arrow::before {
11
- border-top-color: var(--lookbook-tooltip);
11
+ border-top-color: var(--lookbook-tooltip-bg);
12
12
  }
13
13
 
14
14
  &[data-placement^="bottom"] > .tippy-arrow::before {
15
- border-bottom-color: var(--lookbook-tooltip);
15
+ border-bottom-color: var(--lookbook-tooltip-bg);
16
16
  }
17
17
 
18
18
  &[data-placement^="left"] > .tippy-arrow::before {
19
- border-left-color: var(--lookbook-tooltip);
19
+ border-left-color: var(--lookbook-tooltip-bg);
20
20
  }
21
21
 
22
22
  &[data-placement^="right"] > .tippy-arrow::before {
23
- border-right-color: var(--lookbook-tooltip);
23
+ border-right-color: var(--lookbook-tooltip-bg);
24
24
  }
25
25
  }
26
26
 
@@ -1,9 +1,9 @@
1
1
  <%= render_component_tag tag_name,
2
2
  href: @href,
3
3
  class: [
4
- "block text-lookbook-button-text focus:outline-none focus-visible:outline-none #{padding}",
4
+ "block text-lookbook-icon-button-stroke focus:outline-none focus-visible:outline-none #{padding}",
5
5
  {
6
- "hover:text-lookbook-button-text-hover": !@disabled,
6
+ "hover:text-lookbook-icon-button-stroke-hover": !@disabled,
7
7
  "cursor-[not-allowed] opacity-50": @disabled
8
8
  }
9
9
  ],
@@ -7,13 +7,13 @@
7
7
  <%= @example.preview.label %> (<%= @example.label %>)
8
8
  </h3>
9
9
  <% end %>
10
- <% toolbar.section align: :right, divide: :left do %>
11
- <%= render_component :button_group do |group| %>
10
+ <% toolbar.section align: :right, divide: :left do %>
11
+ <%= render_component :button_group do |group| %>
12
12
  <% group.button icon: :eye,
13
- href: helpers.lookbook_inspect_path(@example.path, @params),
13
+ href: lookbook_inspect_path(@example.path, @params),
14
14
  tooltip: "View in Inspector" %>
15
15
  <% group.button icon: :external_link,
16
- href: helpers.lookbook_inspect_path(@example.path, @params),
16
+ href: lookbook_inspect_path(@example.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: helpers.lookbook_preview_path(@example.path, @params.merge(lookbook_embed: true)),
31
+ src: lookbook_preview_path(@example.path, @params.merge(lookbook_embed: true)),
32
32
  alpine_data: "store",
33
33
  resize_height: false,
34
34
  max_height: @max_height,
@@ -11,6 +11,14 @@ module Lookbook
11
11
 
12
12
  protected
13
13
 
14
+ def lookbook_inspect_path(*args)
15
+ Lookbook::Engine.routes.url_helpers.lookbook_inspect_path(*args)
16
+ end
17
+
18
+ def lookbook_preview_path(*args)
19
+ Lookbook::Engine.routes.url_helpers.lookbook_preview_path(*args)
20
+ end
21
+
14
22
  def alpine_data
15
23
  [@id.to_json, "$store.pages.embeds"].join(",")
16
24
  end
@@ -10,7 +10,7 @@
10
10
  @keydown.esc.stop="clear"
11
11
  @keydown.f.stop.prevent.window="focus"
12
12
  @keydown.stop>
13
- <button class="text-lookbook-button-text hover:text-lookbook-button-text-hover focus:ring-0 focus:outline-none absolute top-1/2 right-3 -translate-y-1/2" @click="clear" :class="{hidden: !active}">
13
+ <button class="text-lookbook-icon-button-stroke hover:text-lookbook-icon-button-stroke-hover focus:ring-0 focus:outline-none absolute top-1/2 right-3 -translate-y-1/2" @click="clear" :class="{hidden: !active}">
14
14
  <%= icon :x, size: 3 %>
15
15
  </button>
16
16
  </div>
@@ -1,5 +1,5 @@
1
1
  <%= render_component_tag :header do %>
2
- <%= render_component :toolbar, class: "!bg-lookbook-header !text-lookbook-header-text !border-lookbook-header-border" do |toolbar| %>
2
+ <%= render_component :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
@@ -0,0 +1,4 @@
1
+ <% if panel_styles %>
2
+ <% content_for :panel_css do %><%= panel_styles %><% end %>
3
+ <% end %>
4
+ <%= panel_html %>
@@ -0,0 +1,36 @@
1
+ require "css_parser"
2
+
3
+ module Lookbook
4
+ class InspectorPanel::Component < Lookbook::BaseComponent
5
+ attr_reader :panel_styles, :panel_html, :id
6
+
7
+ def initialize(id:, name:, system: false, **html_attrs)
8
+ @id = id
9
+ @name = name
10
+ @system = system
11
+ @panel_html = nil
12
+ @panel_styles = nil
13
+ super(**html_attrs)
14
+ end
15
+
16
+ def before_render
17
+ 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
+ style_tag.unlink
29
+ end
30
+ @panel_html = panel_dom.to_html.html_safe
31
+ end
32
+ end
33
+ @panel_html ||= content
34
+ end
35
+ end
36
+ end
@@ -16,7 +16,7 @@
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
- <%= icon nav_icon, size: 3.5, class: "mr-1.5 text-lookbook-nav-icon" %>
19
+ <%= icon nav_icon, size: 3.5, class: "mr-1.5 text-lookbook-nav-icon-stroke" %>
20
20
  <span><%= label %></span>
21
21
  </div>
22
22
  <% end %>
@@ -1,3 +1,3 @@
1
- <%= render_component_tag class: "prose #{size_class} text-lookbook-prose-text bg-lookbook-prose prose-a:text-lookbook-prose-link" do %>
1
+ <%= render_component_tag class: "prose #{size_class} text-lookbook-prose-text bg-lookbook-prose-bg prose-a:text-lookbook-prose-link" do %>
2
2
  <%== rendered_content %>
3
3
  <% end %>
@@ -8,7 +8,7 @@
8
8
  }
9
9
  ],
10
10
  ":class": "{
11
- 'border-lookbook-tabs-highlight': isSelected($el),
11
+ 'border-lookbook-tabs-border-active': isSelected($el),
12
12
  'border-transparent text-lookbook-tabs-text hover:text-lookbook-tabs-text-hover': !isSelected($el),
13
13
  'hidden': visibleTabsCount >= #{@position}
14
14
  }",
@@ -9,7 +9,7 @@
9
9
  }
10
10
  ],
11
11
  ":class": "{
12
- 'border-lookbook-tabs-highlight': isSelected($el),
12
+ 'border-lookbook-tabs-border-active': isSelected($el),
13
13
  'border-transparent text-lookbook-tabs-text hover:text-lookbook-tabs-text-hover': !isSelected($el),
14
14
  '!text-lookbook-tabs-text-disabled': isDisabled($el),
15
15
  'invisible pointer-events-none relative z-[-1]': visibleTabsCount < #{@position}
@@ -1,4 +1,4 @@
1
- <%= render_component_tag class: "h-10 border-b border-lookbook-divider w-full flex items-center text-sm flex-none bg-lookbook-toolbar" do %>
1
+ <%= render_component_tag class: "h-10 border-b border-lookbook-divider w-full flex items-center text-sm flex-none bg-lookbook-toolbar-bg" do %>
2
2
  <div class="toolbar-sections flex items-stretch w-full">
3
3
  <%= safe_join(sections) %>
4
4
  </div>
@@ -5,7 +5,7 @@
5
5
 
6
6
  .resize-handle {
7
7
  @apply flex items-center justify-center h-full w-full border-lookbook-divider bg-lookbook-viewport-handle hover:bg-indigo-100 hover:bg-opacity-20;
8
- @apply text-lookbook-viewport-handle-icon hover:text-lookbook-viewport-handle-icon-hover transition select-none touch-none;
8
+ @apply text-lookbook-viewport-handle-icon-stroke hover:text-lookbook-viewport-handle-icon-stroke-hover transition select-none touch-none;
9
9
  }
10
10
  }
11
11
  }
@@ -34,7 +34,7 @@
34
34
  <% end %>
35
35
  <% if @resize_height %>
36
36
  <div
37
- class="resize-handle border-b border-l border-lookbook-divider cursor-[col-resize] <%= "border-r" unless @resize_width %>"
37
+ class="resize-handle border-b border-l border-lookbook-divider cursor-[row-resize] <%= "border-r" unless @resize_width %>"
38
38
  @pointerdown="onResizeHeightStart"
39
39
  @dblclick="toggleFullHeight">
40
40
  <svg class="h-4 w-4 pointer-events-none rotate-90" fill="currentColor" viewBox="0 0 24 24" >
@@ -2,6 +2,7 @@ module Lookbook
2
2
  class PagesController < ApplicationController
3
3
  layout "lookbook/page"
4
4
  helper_method :page_controller
5
+ helper Lookbook::PageHelper
5
6
 
6
7
  def self.controller_path
7
8
  "lookbook/pages"
@@ -47,6 +47,16 @@ module Lookbook
47
47
  redirect_to lookbook_inspect_path params[:path]
48
48
  end
49
49
 
50
+ # Namespaced preview helpers
51
+
52
+ def lookbook_display(key, fallback = nil)
53
+ params.dig(:lookbook, :display, key.to_sym) || fallback
54
+ end
55
+
56
+ def lookbook_data(key, fallback = nil)
57
+ Lookbook.data.get(key, fallback)
58
+ end
59
+
50
60
  private
51
61
 
52
62
  def lookup_entities
@@ -98,10 +108,11 @@ module Lookbook
98
108
  preview_controller.params[param[:name]] = Lookbook::Params.cast(preview_controller.params[param[:name]], param[:type])
99
109
  end
100
110
  end
101
- # set display params
111
+ # set display and data params
102
112
  preview_controller.params.merge!({
103
113
  lookbook: {
104
- display: @example.display_params
114
+ display: @example.display_params,
115
+ data: Lookbook.data
105
116
  }
106
117
  })
107
118
  end
@@ -145,7 +156,8 @@ module Lookbook
145
156
  context: context_data,
146
157
  preview: preview,
147
158
  examples: examples,
148
- components: preview.components,
159
+ example: example,
160
+ data: Lookbook.data,
149
161
  app: Lookbook
150
162
  })
151
163
  end
@@ -20,11 +20,5 @@ module Lookbook
20
20
  def generate_id(*args)
21
21
  args.map { |args| args.delete_prefix("/").tr("&?=/_\-", "-") }.join("-")
22
22
  end
23
-
24
- def append_styles(&block)
25
- content_for :styles do
26
- capture(&block)
27
- end
28
- end
29
23
  end
30
24
  end
@@ -1,7 +1,6 @@
1
1
  module Lookbook
2
2
  module PreviewHelper
3
- def lookbook_display(key, fallback = nil)
4
- params.dig(:lookbook, :display, key.to_sym) || fallback
5
- end
3
+ # Left intentionally empty.
4
+ # Included for backwards compatability.
6
5
  end
7
6
  end
@@ -4,7 +4,7 @@
4
4
  alpine_data: "$store.layout.main",
5
5
  ":class": "$store.layout.mobile && '!block'" do |layout| %>
6
6
 
7
- <% layout.pane id: "app-sidebar", class: "flex flex-col bg-lookbook-sidebar relative translate-x-0",
7
+ <% layout.pane id: "app-sidebar", class: "flex flex-col bg-lookbook-sidebar-bg relative translate-x-0",
8
8
  ":class": "{
9
9
  'transition': $store.layout.mobile,
10
10
  'translate-x-full': $store.layout.mobile && sidebarHidden,
@@ -4,11 +4,11 @@
4
4
  x-data="{}"
5
5
  @navigation:complete.window="$refs.scroller.scrollTop = 0">
6
6
 
7
- <div class="h-full bg-lookbook-page relative">
7
+ <div class="h-full bg-lookbook-page-bg relative">
8
8
  <% unless @error %>
9
9
 
10
10
  <div class="absolute top-0 right-0 pt-1 pr-0 pl-1 pb-1 rounded-bl-md">
11
- <div class="bg-lookbook-page opacity-90 absolute inset-0 w-full h-full z-0"></div>
11
+ <div class="bg-lookbook-page-bg opacity-90 absolute inset-0 w-full h-full z-0"></div>
12
12
  <div class="relative z-10 flex items-center">
13
13
 
14
14
  <% if @previous_page %>
@@ -7,6 +7,12 @@
7
7
  @navigation:start="closeMobileSidebar"
8
8
  class="w-screen h-screen grid grid-rows-[40px_1fr] relative">
9
9
 
10
+ <% if content_for? :panel_css %>
11
+ <style media="all" id="panel-styles">
12
+ <%= content_for :panel_css -%>
13
+ </style>
14
+ <% end %>
15
+
10
16
  <%= render_component :header, id: "app-header", debug_menu: config.debug_menu do |header| %>
11
17
  <% header.branding { config.project_name } %>
12
18
  <% end %>
@@ -13,12 +13,6 @@
13
13
  </style>
14
14
  <% end %>
15
15
 
16
- <% if content_for? :styles %>
17
- <style media="all">
18
- <%= content_for :styles %>
19
- </style>
20
- <% end %>
21
-
22
16
  <% if config.ui_favicon != false %>
23
17
  <link rel="icon" href="<%= config.ui_favicon || "data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>👀</text></svg>" %>">
24
18
  <% end %>
@@ -1,4 +1,4 @@
1
- <div class="p-4 bg-lookbook-prose h-full">
1
+ <div class="p-4 bg-lookbook-prose-bg h-full">
2
2
  <% if panel.content.present? %>
3
3
  <%= render_component :prose, markdown: true do %>
4
4
  <%== panel.content %>
@@ -1,6 +1,6 @@
1
1
  <% items = examples.select { |example| example.notes.present? } %>
2
2
  <% if items.many? %>
3
- <div class="divide-y divide-dashed divide-lookbook-divider bg-lookbook-prose h-full w-full">
3
+ <div class="divide-y divide-dashed divide-lookbook-divider bg-lookbook-prose-bg h-full w-full">
4
4
  <% items.each do |item| %>
5
5
  <div class="px-4 py-6 relative">
6
6
  <h6 class="italic font-mono mb-4 opacity-40">
@@ -11,7 +11,7 @@
11
11
  <% end %>
12
12
  </div>
13
13
  <% else %>
14
- <div class="p-4 bg-lookbook-prose w-full h-full">
14
+ <div class="p-4 bg-lookbook-prose-bg w-full h-full">
15
15
  <%= render_component :prose do %>
16
16
  <%== items.any? ? items.first.notes : "<em class='opacity-50'>No notes provided.</em>" %>
17
17
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <% if preview.params.none? %>
2
- <div class="p-4 w-full h-full bg-lookbook-prose">
2
+ <div class="p-4 w-full h-full bg-lookbook-prose-bg">
3
3
  <%= render_component :prose do %>
4
4
  <em class='opacity-50'>No params configured.</em>
5
5
  <% end %>
@@ -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(@example.lookup_path),
41
+ href: lookbook_preview_path(@example.lookup_path, request.query_parameters),
42
42
  tooltip: "Open preview in new window",
43
43
  target: "_blank" %>
44
44
 
@@ -63,7 +63,7 @@
63
63
  </div>
64
64
  <% end %>
65
65
 
66
- <%= layout.pane class: "flex flex-col h-full overflow-hidden bg-lookbook-drawer",
66
+ <%= layout.pane class: "flex flex-col h-full overflow-hidden bg-lookbook-drawer-bg",
67
67
  "x-show": "!$store.inspector.drawer.hidden && #{@drawer_panels.any?}" do %>
68
68
 
69
69
  <%= render_component :toolbar do |toolbar| %>
@@ -124,7 +124,9 @@
124
124
  <%= render_component :tab_panels, alpine_data: "$store.inspector.drawer" do |tabs| %>
125
125
  <% @drawer_panels.each do |panel| %>
126
126
  <% tabs.panel id: panel.id, name: panel.name, class: [panel.panel_classes, { "p-4": panel.padded, "prose": panel.prose }] do %>
127
- <%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
127
+ <%= render_component :inspector_panel, **panel.slice(:id, :name, :system) do %>
128
+ <%= render panel.partial, **@inspector_data, panel: panel, **panel.locals %>
129
+ <% end %>
128
130
  <% end %>
129
131
  <% end %>
130
132
  <% end %>
@@ -22,9 +22,8 @@ module Lookbook
22
22
 
23
23
  preview_paths: [],
24
24
  preview_display_params: {},
25
- preview_options: {},
26
- preview_srcdoc: false,
27
- sort_examples: true,
25
+ preview_srcdoc: nil,
26
+ sort_examples: false,
28
27
 
29
28
  listen: Rails.env.development?,
30
29
  listen_paths: [],
@@ -57,7 +56,8 @@ module Lookbook
57
56
  partial: "lookbook/previews/panels/preview",
58
57
  hotkey: "v",
59
58
  panel_classes: "overflow-hidden",
60
- padded: false
59
+ padded: false,
60
+ system: true
61
61
  },
62
62
  output: {
63
63
  pane: :main,
@@ -65,7 +65,8 @@ module Lookbook
65
65
  partial: "lookbook/previews/panels/output",
66
66
  label: "HTML",
67
67
  hotkey: "h",
68
- padded: false
68
+ padded: false,
69
+ system: true
69
70
  },
70
71
  source: {
71
72
  pane: :drawer,
@@ -74,7 +75,8 @@ module Lookbook
74
75
  label: "Source",
75
76
  hotkey: "s",
76
77
  copy: ->(data) { data.examples.map { |e| e.source }.join("\n") },
77
- padded: false
78
+ padded: false,
79
+ system: true
78
80
  },
79
81
  notes: {
80
82
  pane: :drawer,
@@ -83,7 +85,8 @@ module Lookbook
83
85
  label: "Notes",
84
86
  hotkey: "n",
85
87
  disabled: ->(data) { data.examples.select { |e| e.notes.present? }.none? },
86
- padded: false
88
+ padded: false,
89
+ system: true
87
90
  },
88
91
  params: {
89
92
  pane: :drawer,
@@ -92,25 +95,10 @@ module Lookbook
92
95
  label: "Params",
93
96
  hotkey: "p",
94
97
  disabled: ->(data) { data.preview.params.none? },
95
- padded: false
98
+ padded: false,
99
+ system: true
96
100
  }
97
101
  },
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
- },
114
102
  })
115
103
  end
116
104
 
@@ -122,22 +110,33 @@ module Lookbook
122
110
  absolute_path(@options.components_path)
123
111
  end
124
112
 
113
+ def page_paths=(paths = [])
114
+ @options.page_paths += paths if paths.is_a? Array
115
+ end
116
+
125
117
  def page_paths
126
118
  normalize_paths(@options.page_paths)
127
119
  end
128
120
 
121
+ def preview_paths=(paths = [])
122
+ @options.preview_paths += paths if paths.is_a? Array
123
+ end
124
+
129
125
  def preview_paths
130
126
  normalize_paths(@options.preview_paths)
131
127
  end
132
128
 
129
+ def preview_srcdoc=(enable)
130
+ Lookbook.logger.warn "The `preview_srcdoc` config option is deprecated and will be removed in v2.0"
131
+ end
132
+
133
133
  def listen_paths
134
134
  normalize_paths(@options.listen_paths)
135
135
  end
136
136
 
137
- def listen_extensions
138
- @options.listen_extensions += ["rb", "html.*"]
137
+ def listen_extensions=(extensions = [])
138
+ @options.listen_extensions += extensions if extensions.is_a? Array
139
139
  @options.listen_extensions.uniq!
140
- @options.listen_extensions
141
140
  end
142
141
 
143
142
  def parser_registry_path
@@ -154,16 +153,13 @@ module Lookbook
154
153
  end
155
154
 
156
155
  def define_inspector_panel(name, opts = {})
157
- @options.inspector_panels[name] = opts
158
- if opts[:position].present?
159
- pane = inspector_panels[name].pane.presence || :drawer
160
- siblings = inspector_panels.select do |key, panel|
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
156
+ pane = opts[:pane].presence || :drawer
157
+ siblings = inspector_panels.select { |key, panel| panel.pane == pane }
158
+ opts[:position] ||= siblings.size + 1
159
+ @options.inspector_panels[name] = opts
160
+ siblings.each do |key, panel|
161
+ if panel.position >= opts[:position]
162
+ panel.position += 1
167
163
  end
168
164
  end
169
165
  end
@@ -180,6 +176,25 @@ module Lookbook
180
176
  amend_inspector_panel(name, false)
181
177
  end
182
178
 
179
+ def inspector_panel_defaults
180
+ {
181
+ id: ->(data) { "inspector-panel-#{data.name}" },
182
+ partial: "lookbook/previews/panels/content",
183
+ content: nil,
184
+ label: ->(data) { data.name.titleize },
185
+ pane: :drawer,
186
+ position: ->(data) { data.index_position },
187
+ hotkey: nil,
188
+ disabled: false,
189
+ show: true,
190
+ copy: nil,
191
+ panel_classes: nil,
192
+ locals: {},
193
+ padded: true,
194
+ system: false
195
+ }
196
+ end
197
+
183
198
  def ui_theme=(name)
184
199
  name = name.to_s
185
200
  if Theme.valid_theme?(name)
@@ -225,8 +240,10 @@ module Lookbook
225
240
  protected
226
241
 
227
242
  def normalize_paths(paths)
228
- paths.map! { |path| absolute_path(path) }
229
- paths.select! { |path| Dir.exist?(path) }
243
+ paths.map! do |path|
244
+ full_path = absolute_path(path)
245
+ full_path if Dir.exist?(full_path)
246
+ end.compact!
230
247
  paths
231
248
  end
232
249
 
@@ -48,6 +48,14 @@ module Lookbook
48
48
  Page.any?
49
49
  end
50
50
 
51
+ def data
52
+ @data ||= Store.new
53
+ end
54
+
55
+ def data=(props)
56
+ @data = Store.new(props)
57
+ end
58
+
51
59
  def after_initialize(&block)
52
60
  add_hook(:after_initialize, block)
53
61
  end
@@ -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",
@@ -21,6 +21,14 @@ module Lookbook
21
21
  self
22
22
  end
23
23
 
24
+ def get(key, fallback = nil)
25
+ if self.key?(normalize_key(key))
26
+ self[normalize_key(key)]
27
+ else
28
+ fallback
29
+ end
30
+ end
31
+
24
32
  def method_missing(name, *args)
25
33
  super(normalize_key(name), *args.map { |arg| normalize_value(arg) })
26
34
  end
@@ -1,3 +1,3 @@
1
1
  module Lookbook
2
- VERSION = "1.0.0.beta.5"
2
+ VERSION = "1.0.0.beta.6"
3
3
  end