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

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.
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