lookbook 0.4.1 → 0.4.5

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.
@@ -8,6 +8,10 @@ module Lookbook
8
8
  def config
9
9
  @config ||= Engine.config.lookbook
10
10
  end
11
+
12
+ def logger
13
+ @logger ||= config.debug == true ? Rails.logger : Lookbook::NullLogger.new
14
+ end
11
15
  end
12
16
 
13
17
  class Engine < Rails::Engine
@@ -35,6 +39,8 @@ module Lookbook
35
39
  options.listen_paths = options.listen_paths.map(&:to_s)
36
40
  options.listen_paths += options.preview_paths
37
41
  options.listen_paths << (vc_options.view_component_path || Rails.root.join("app/components"))
42
+
43
+ options.experimental_features = false unless options.experimental_features.present?
38
44
  end
39
45
 
40
46
  initializer "lookbook.cable.config" do |app|
@@ -0,0 +1,24 @@
1
+ module Lookbook
2
+ module Features
3
+ EXPERIMENTAL_FEATURES = [:params]
4
+
5
+ def self.experimental_feature?(name)
6
+ EXPERIMENTAL_FEATURES.include?(name.to_sym)
7
+ end
8
+
9
+ def self.enabled?(name)
10
+ return true unless experimental_feature?(name)
11
+ enabled.include?(name.to_sym)
12
+ end
13
+
14
+ def self.enabled
15
+ if Lookbook.config.experimental_features == true
16
+ EXPERIMENTAL_FEATURES
17
+ elsif Lookbook.config.experimental_features.blank?
18
+ []
19
+ else
20
+ Lookbook.config.experimental_features.map(&:to_sym)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,110 @@
1
+ module Lookbook
2
+ module Params
3
+ class << self
4
+ def build_param(param, default)
5
+ input, options_str = param.text.present? ? param.text.split(" ", 2) : [nil, ""]
6
+ type = param.types&.first
7
+ options = YAML.safe_load(options_str || "~")
8
+ input ||= guess_input(type, default)
9
+ type ||= guess_type(input, default)
10
+ {
11
+ name: param.name,
12
+ input: input_text?(input) ? "text" : input,
13
+ input_type: (input if input_text?(input)),
14
+ options: options,
15
+ type: type,
16
+ default: default
17
+ }
18
+ end
19
+
20
+ def parse_method_param_str(param_str)
21
+ return nil if param_str[0].nil? || param_str[1].nil?
22
+ name = param_str[0].chomp(":")
23
+ value = param_str[1]&.strip
24
+ value = case value
25
+ when "nil"
26
+ nil
27
+ else
28
+ if value&.first == ":"
29
+ value.delete_prefix(":").to_sym
30
+ else
31
+ YAML.safe_load(value)
32
+ end
33
+ end
34
+ [name, value]
35
+ end
36
+
37
+ def cast(value, type = "String")
38
+ case type.downcase
39
+ when "symbol"
40
+ value.delete_prefix(":").to_sym
41
+ when "hash"
42
+ result = safe_parse_yaml(value, {})
43
+ unless result.is_a? Hash
44
+ Lookbook.logger.debug "Failed to parse '#{value}' into a Hash"
45
+ result = {}
46
+ end
47
+ result
48
+ when "array"
49
+ result = safe_parse_yaml(value, [])
50
+ unless result.is_a? Array
51
+ Lookbook.logger.debug "Failed to parse '#{value}' into an Array"
52
+ result = []
53
+ end
54
+ result
55
+ else
56
+ begin
57
+ type_class = "ActiveModel::Type::#{type}".constantize
58
+ type_class.new.cast(value)
59
+ rescue NameError
60
+ raise ArgumentError, "'#{type}' is not a valid param type to cast to."
61
+ end
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def guess_input(type, default)
68
+ if type&.downcase == "boolean" || (type.blank? && boolean?(default))
69
+ "toggle"
70
+ else
71
+ "text"
72
+ end
73
+ end
74
+
75
+ def guess_type(input, default)
76
+ if input&.downcase == "toggle"
77
+ "Boolean"
78
+ elsif input&.downcase == "number"
79
+ "Integer"
80
+ elsif boolean?(default)
81
+ "Boolean"
82
+ elsif default.is_a? Symbol
83
+ "Symbol"
84
+ else
85
+ "String"
86
+ end
87
+ end
88
+
89
+ def input_text?(input)
90
+ [
91
+ "email",
92
+ "number",
93
+ "tel",
94
+ "text",
95
+ "url"
96
+ ].include? input
97
+ end
98
+
99
+ def safe_parse_yaml(value, fallback)
100
+ value.present? ? YAML.safe_load(value) : fallback
101
+ rescue Psych::SyntaxError
102
+ fallback
103
+ end
104
+
105
+ def boolean?(value)
106
+ value == true || value == false
107
+ end
108
+ end
109
+ end
110
+ end
@@ -5,7 +5,7 @@ module Lookbook
5
5
  YARDOC_FILE_PATH = Rails.root.join("tmp/storage/.yardoc").to_s
6
6
 
7
7
  def initialize(paths)
8
- @paths = paths.map { |p| "#{p}/**/*_preview.rb" }
8
+ @paths = paths.map { |p| "#{p}/**/*preview.rb" }
9
9
  YARD::Registry.yardoc_file = YARDOC_FILE_PATH
10
10
  end
11
11
 
@@ -71,7 +71,7 @@ module Lookbook
71
71
  end
72
72
 
73
73
  def lookbook_id
74
- lookbook_path.tr("_", "-")
74
+ lookbook_path.tr("/", "-").tr("_", "-")
75
75
  end
76
76
 
77
77
  def lookbook_layout
@@ -14,10 +14,9 @@ module Lookbook
14
14
  render_to_string template, opts
15
15
  end
16
16
 
17
- def render_in_layout_to_string(template, locals, layout_override = nil)
17
+ def render_in_layout_to_string(template, locals, layout = nil)
18
18
  append_view_path Lookbook::Engine.root.join("app/views")
19
- layout = determine_layout(layout_override, prepend_views: false)[:layout]
20
- render_to_string template, locals: locals, layout: layout
19
+ render_to_string template, locals: locals, **determine_layout(@preview.lookbook_layout)
21
20
  end
22
21
  end
23
22
  end
@@ -10,7 +10,7 @@ module Lookbook
10
10
  end
11
11
 
12
12
  def id
13
- path.underscore.tr("_", "-")
13
+ path.underscore.tr("/", "-").tr("_", "-")
14
14
  end
15
15
 
16
16
  def path
@@ -25,6 +25,12 @@ module Lookbook
25
25
  @preview.display_params.merge(lookbook_display_params)
26
26
  end
27
27
 
28
+ def params
29
+ @params || code_object&.tags("param")&.map do |param|
30
+ Lookbook::Params.build_param(param, parameter_defaults[param.name])
31
+ end
32
+ end
33
+
28
34
  def method_source
29
35
  code_object.source.split("\n")[1..-2].join("\n").strip_heredoc
30
36
  end
@@ -55,6 +61,12 @@ module Lookbook
55
61
 
56
62
  private
57
63
 
64
+ def parameter_defaults
65
+ @parameter_defaults || code_object&.parameters&.map do |param_str|
66
+ Lookbook::Params.parse_method_param_str(param_str)
67
+ end&.compact&.to_h
68
+ end
69
+
58
70
  def taggable_object_path
59
71
  "#{@preview.name}##{name}"
60
72
  end
@@ -11,7 +11,7 @@ module Lookbook
11
11
  end
12
12
 
13
13
  def id
14
- path.underscore.tr("_", "-")
14
+ path.underscore.tr("/", "-").tr("_", "-")
15
15
  end
16
16
 
17
17
  def path
@@ -26,6 +26,10 @@ module Lookbook
26
26
  :group
27
27
  end
28
28
 
29
+ def params
30
+ []
31
+ end
32
+
29
33
  def hidden?
30
34
  false
31
35
  end
@@ -27,8 +27,8 @@ module Lookbook
27
27
  parts = tag.text.strip.match(/^([^\s]*)\s?(.*)$/)
28
28
  if parts.present?
29
29
  begin
30
- display_params[parts[1]] = JSON.parse parts[2]
31
- rescue JSON::ParserError => err
30
+ display_params[parts[1]] = YAML.safe_load(parts[2] || "~")
31
+ rescue SyntaxError => err
32
32
  Rails.logger.error("\n👀 [Lookbook] Invalid JSON in @display tag.\n👀 [Lookbook] (#{err})\n")
33
33
  end
34
34
  end
@@ -1,3 +1,3 @@
1
1
  module Lookbook
2
- VERSION = "0.4.1"
2
+ VERSION = "0.4.5"
3
3
  end
data/lib/lookbook.rb CHANGED
@@ -5,6 +5,8 @@ module Lookbook
5
5
  extend ActiveSupport::Autoload
6
6
 
7
7
  autoload :Lang, "lookbook/lang"
8
+ autoload :Params, "lookbook/params"
9
+ autoload :Features, "lookbook/features"
8
10
  autoload :Collection, "lookbook/collection"
9
11
  autoload :Parser, "lookbook/parser"
10
12
  autoload :Preview, "lookbook/preview"
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v2.2.17 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v2.2.19 | MIT License | https://tailwindcss.com */
2
2
 
3
3
  /*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */
4
4
 
@@ -606,6 +606,9 @@ video {
606
606
  --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
607
607
  --tw-border-opacity: 1;
608
608
  border-color: rgba(229, 231, 235, var(--tw-border-opacity));
609
+ --tw-ring-offset-shadow: 0 0 #0000;
610
+ --tw-ring-shadow: 0 0 #0000;
611
+ --tw-shadow: 0 0 #0000;
609
612
  --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
610
613
  --tw-ring-offset-width: 0px;
611
614
  --tw-ring-offset-color: #fff;
@@ -820,12 +823,6 @@ pre[class*="language-"] {
820
823
  fill: none;
821
824
  }
822
825
 
823
- .min-h-fill {
824
- min-height: -webkit-fill-available;
825
- min-height: -moz-available;
826
- min-height: fill-available;
827
- }
828
-
829
826
  ::-webkit-scrollbar {
830
827
  width: 8px;
831
828
  height: 8px;
@@ -1563,6 +1560,10 @@ pre[class*="language-"] {
1563
1560
  display: flex;
1564
1561
  }
1565
1562
 
1563
+ .inline-flex {
1564
+ display: inline-flex;
1565
+ }
1566
+
1566
1567
  .hidden {
1567
1568
  display: none;
1568
1569
  }
@@ -1599,6 +1600,10 @@ pre[class*="language-"] {
1599
1600
  height: 11px;
1600
1601
  }
1601
1602
 
1603
+ .h-6 {
1604
+ height: 1.5rem;
1605
+ }
1606
+
1602
1607
  .w-full {
1603
1608
  width: 100%;
1604
1609
  }
@@ -1631,10 +1636,22 @@ pre[class*="language-"] {
1631
1636
  width: 1.25rem;
1632
1637
  }
1633
1638
 
1639
+ .w-\[200px\] {
1640
+ width: 200px;
1641
+ }
1642
+
1643
+ .w-11 {
1644
+ width: 2.75rem;
1645
+ }
1646
+
1634
1647
  .max-w-xs {
1635
1648
  max-width: 20rem;
1636
1649
  }
1637
1650
 
1651
+ .max-w-\[800px\] {
1652
+ max-width: 800px;
1653
+ }
1654
+
1638
1655
  .flex-none {
1639
1656
  flex: none;
1640
1657
  }
@@ -1643,6 +1660,10 @@ pre[class*="language-"] {
1643
1660
  flex: 1 1 auto;
1644
1661
  }
1645
1662
 
1663
+ .flex-shrink-0 {
1664
+ flex-shrink: 0;
1665
+ }
1666
+
1646
1667
  .flex-grow {
1647
1668
  flex-grow: 1;
1648
1669
  }
@@ -1657,6 +1678,16 @@ pre[class*="language-"] {
1657
1678
  transform: var(--tw-transform);
1658
1679
  }
1659
1680
 
1681
+ .translate-x-5 {
1682
+ --tw-translate-x: 1.25rem;
1683
+ transform: var(--tw-transform);
1684
+ }
1685
+
1686
+ .translate-x-0 {
1687
+ --tw-translate-x: 0px;
1688
+ transform: var(--tw-transform);
1689
+ }
1690
+
1660
1691
  .transform {
1661
1692
  transform: var(--tw-transform);
1662
1693
  }
@@ -1692,6 +1723,10 @@ pre[class*="language-"] {
1692
1723
  flex-direction: column;
1693
1724
  }
1694
1725
 
1726
+ .items-start {
1727
+ align-items: flex-start;
1728
+ }
1729
+
1695
1730
  .items-center {
1696
1731
  align-items: center;
1697
1732
  }
@@ -1751,6 +1786,10 @@ pre[class*="language-"] {
1751
1786
  white-space: nowrap;
1752
1787
  }
1753
1788
 
1789
+ .rounded-full {
1790
+ border-radius: 9999px;
1791
+ }
1792
+
1754
1793
  .rounded-b {
1755
1794
  border-bottom-right-radius: 0.25rem;
1756
1795
  border-bottom-left-radius: 0.25rem;
@@ -1768,6 +1807,10 @@ pre[class*="language-"] {
1768
1807
  border-width: 1px;
1769
1808
  }
1770
1809
 
1810
+ .border-2 {
1811
+ border-width: 2px;
1812
+ }
1813
+
1771
1814
  .border-r {
1772
1815
  border-right-width: 1px;
1773
1816
  }
@@ -1835,6 +1878,16 @@ pre[class*="language-"] {
1835
1878
  background-color: rgba(249, 250, 251, var(--tw-bg-opacity));
1836
1879
  }
1837
1880
 
1881
+ .bg-indigo-500 {
1882
+ --tw-bg-opacity: 1;
1883
+ background-color: rgba(99, 102, 241, var(--tw-bg-opacity));
1884
+ }
1885
+
1886
+ .bg-gray-300 {
1887
+ --tw-bg-opacity: 1;
1888
+ background-color: rgba(209, 213, 219, var(--tw-bg-opacity));
1889
+ }
1890
+
1838
1891
  .p-4 {
1839
1892
  padding: 1rem;
1840
1893
  }
@@ -1882,6 +1935,11 @@ pre[class*="language-"] {
1882
1935
  padding-bottom: 0px;
1883
1936
  }
1884
1937
 
1938
+ .py-3 {
1939
+ padding-top: 0.75rem;
1940
+ padding-bottom: 0.75rem;
1941
+ }
1942
+
1885
1943
  .pr-3 {
1886
1944
  padding-right: 0.75rem;
1887
1945
  }
@@ -2000,11 +2058,22 @@ pre[class*="language-"] {
2000
2058
  opacity: 0.5;
2001
2059
  }
2002
2060
 
2061
+ .shadow {
2062
+ --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
2063
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
2064
+ }
2065
+
2003
2066
  .outline-none {
2004
2067
  outline: 2px solid transparent;
2005
2068
  outline-offset: 2px;
2006
2069
  }
2007
2070
 
2071
+ .ring-0 {
2072
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
2073
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
2074
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
2075
+ }
2076
+
2008
2077
  .blur {
2009
2078
  --tw-blur: blur(8px);
2010
2079
  filter: var(--tw-filter);
@@ -2022,6 +2091,44 @@ pre[class*="language-"] {
2022
2091
  transition-duration: 150ms;
2023
2092
  }
2024
2093
 
2094
+ .transition-colors {
2095
+ transition-property: background-color, border-color, color, fill, stroke;
2096
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
2097
+ transition-duration: 150ms;
2098
+ }
2099
+
2100
+ .duration-200 {
2101
+ transition-duration: 200ms;
2102
+ }
2103
+
2104
+ .ease-in-out {
2105
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
2106
+ }
2107
+
2108
+ .min-h-fill {
2109
+ min-height: -webkit-fill-available;
2110
+ min-height: -moz-available;
2111
+ min-height: fill-available;
2112
+ }
2113
+
2114
+ .form-input {
2115
+ width: 100%;
2116
+ border-radius: 0.125rem;
2117
+ --tw-border-opacity: 1;
2118
+ border-color: rgba(209, 213, 219, var(--tw-border-opacity));
2119
+ font-size: 0.875rem;
2120
+ line-height: 1.25rem;
2121
+ --tw-text-opacity: 1;
2122
+ color: rgba(55, 65, 81, var(--tw-text-opacity));
2123
+ }
2124
+
2125
+ .form-input:focus {
2126
+ --tw-border-opacity: 1;
2127
+ border-color: rgba(165, 180, 252, var(--tw-border-opacity));
2128
+ --tw-ring-opacity: 1;
2129
+ --tw-ring-color: rgba(165, 180, 252, var(--tw-ring-opacity));
2130
+ }
2131
+
2025
2132
  .tippy-box[data-animation=fade][data-state=hidden]{
2026
2133
  opacity:0
2027
2134
  }
@@ -2463,6 +2570,21 @@ pre[class*="language-"] {
2463
2570
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
2464
2571
  }
2465
2572
 
2573
+ .focus\:ring-2:focus {
2574
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
2575
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
2576
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
2577
+ }
2578
+
2579
+ .focus\:ring-indigo-400:focus {
2580
+ --tw-ring-opacity: 1;
2581
+ --tw-ring-color: rgba(129, 140, 248, var(--tw-ring-opacity));
2582
+ }
2583
+
2584
+ .focus\:ring-offset-2:focus {
2585
+ --tw-ring-offset-width: 2px;
2586
+ }
2587
+
2466
2588
  .group:hover .group-hover\:text-indigo-800 {
2467
2589
  --tw-text-opacity: 1;
2468
2590
  color: rgba(55, 48, 163, var(--tw-text-opacity));
@@ -7333,7 +7333,9 @@ Expression: "${expression}"
7333
7333
  var module_default3 = src_default3;
7334
7334
 
7335
7335
  // node_modules/@ryangjchandler/alpine-clipboard/src/index.js
7336
- function src_default4(Alpine3) {
7336
+ var onCopy = () => {
7337
+ };
7338
+ function Clipboard(Alpine3) {
7337
7339
  Alpine3.magic("clipboard", () => {
7338
7340
  return function(target) {
7339
7341
  if (typeof target === "function") {
@@ -7342,10 +7344,17 @@ Expression: "${expression}"
7342
7344
  if (typeof target === "object") {
7343
7345
  target = JSON.stringify(target);
7344
7346
  }
7345
- return window.navigator.clipboard.writeText(target);
7347
+ return window.navigator.clipboard.writeText(target).then(onCopy);
7346
7348
  };
7347
7349
  });
7348
7350
  }
7351
+ Clipboard.configure = (config) => {
7352
+ if (config.hasOwnProperty("onCopy") && typeof config.onCopy === "function") {
7353
+ onCopy = config.onCopy;
7354
+ }
7355
+ return Clipboard;
7356
+ };
7357
+ var src_default4 = Clipboard;
7349
7358
 
7350
7359
  // app/assets/lookbook/js/utils/screen.js
7351
7360
  function screen_default(Alpine3) {
@@ -8359,6 +8368,9 @@ Expression: "${expression}"
8359
8368
  if (fromEl.isEqualNode(toEl)) {
8360
8369
  return false;
8361
8370
  }
8371
+ if (fromEl.hasAttribute("skip-morph")) {
8372
+ return false;
8373
+ }
8362
8374
  return true;
8363
8375
  }
8364
8376
  }, opts));
@@ -8395,7 +8407,12 @@ Expression: "${expression}"
8395
8407
  render() {
8396
8408
  if (this.ready) {
8397
8409
  morph_default(this.$el, store2.doc.getElementById(this.$el.id));
8410
+ this.$dispatch("document:patched");
8398
8411
  }
8412
+ },
8413
+ navigateTo(path2) {
8414
+ history.pushState({}, null, path2);
8415
+ this.$dispatch("popstate");
8399
8416
  }
8400
8417
  };
8401
8418
  }
@@ -8469,6 +8486,27 @@ Expression: "${expression}"
8469
8486
  };
8470
8487
  }
8471
8488
 
8489
+ // app/assets/lookbook/js/workbench/param.js
8490
+ function param() {
8491
+ return {
8492
+ focused: false,
8493
+ setFocus() {
8494
+ if (this.focused && this.$el.focus) {
8495
+ this.$el.focus();
8496
+ }
8497
+ },
8498
+ update(name, value) {
8499
+ const searchParams = new URLSearchParams(window.location.search);
8500
+ searchParams.set(name, value);
8501
+ const path2 = location.href.replace(location.search, "");
8502
+ this.navigateTo(`${path2}?${searchParams.toString()}`);
8503
+ },
8504
+ validate() {
8505
+ return this.$el.reportValidity ? this.$el.reportValidity() : true;
8506
+ }
8507
+ };
8508
+ }
8509
+
8472
8510
  // app/assets/lookbook/js/nav.js
8473
8511
  function nav_default() {
8474
8512
  return {
@@ -8492,13 +8530,12 @@ Expression: "${expression}"
8492
8530
  });
8493
8531
  },
8494
8532
  navigate(path2) {
8495
- if (path2 instanceof Event) {
8496
- path2 = path2.currentTarget.href;
8497
- }
8498
- history.pushState({}, null, path2);
8499
- this.$dispatch("popstate");
8533
+ this.navigateTo(path2 instanceof Event ? path2.currentTarget.href : path2);
8500
8534
  },
8501
- focusFilter() {
8535
+ focusFilter($event) {
8536
+ if ($event.target.tagName === "INPUT") {
8537
+ return;
8538
+ }
8502
8539
  this.currentFocus = this.$refs.filter;
8503
8540
  setTimeout(() => this.$refs.filter.focus(), 0);
8504
8541
  },
@@ -8666,6 +8703,7 @@ Expression: "${expression}"
8666
8703
  module_default.data("workbench", workbench);
8667
8704
  module_default.data("preview", preview);
8668
8705
  module_default.data("inspector", inspector);
8706
+ module_default.data("param", param);
8669
8707
  module_default.data("clipboard", clipboard);
8670
8708
  module_default.data("sizeObserver", sizeObserver);
8671
8709
  module_default.data("split", split_default);
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lookbook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Perkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-21 00:00:00.000000000 Z
11
+ date: 2021-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -202,11 +202,13 @@ files:
202
202
  - app/assets/lookbook/js/utils/split.js
203
203
  - app/assets/lookbook/js/workbench.js
204
204
  - app/assets/lookbook/js/workbench/inspector.js
205
+ - app/assets/lookbook/js/workbench/param.js
205
206
  - app/assets/lookbook/js/workbench/preview.js
206
207
  - app/channels/lookbook/connection.rb
207
208
  - app/channels/lookbook/reload_channel.rb
208
209
  - app/controllers/lookbook/app_controller.rb
209
210
  - app/helpers/lookbook/application_helper.rb
211
+ - app/helpers/lookbook/preview_helper.rb
210
212
  - app/views/lookbook/app/error.html.erb
211
213
  - app/views/lookbook/app/index.html.erb
212
214
  - app/views/lookbook/app/not_found.html.erb
@@ -226,13 +228,20 @@ files:
226
228
  - app/views/lookbook/workbench/_preview.html.erb
227
229
  - app/views/lookbook/workbench/inspector/_code.html.erb
228
230
  - app/views/lookbook/workbench/inspector/_notes.html.erb
231
+ - app/views/lookbook/workbench/inspector/_params.html.erb
229
232
  - app/views/lookbook/workbench/inspector/_plain.html.erb
233
+ - app/views/lookbook/workbench/inspector/params/_select.html.erb
234
+ - app/views/lookbook/workbench/inspector/params/_text.html.erb
235
+ - app/views/lookbook/workbench/inspector/params/_textarea.html.erb
236
+ - app/views/lookbook/workbench/inspector/params/_toggle.html.erb
230
237
  - config/routes.rb
231
238
  - lib/lookbook.rb
232
239
  - lib/lookbook/collection.rb
233
240
  - lib/lookbook/engine.rb
241
+ - lib/lookbook/features.rb
234
242
  - lib/lookbook/lang.rb
235
243
  - lib/lookbook/null_logger.rb
244
+ - lib/lookbook/params.rb
236
245
  - lib/lookbook/parser.rb
237
246
  - lib/lookbook/preview.rb
238
247
  - lib/lookbook/preview_controller.rb
@@ -263,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
263
272
  - !ruby/object:Gem::Version
264
273
  version: '0'
265
274
  requirements: []
266
- rubygems_version: 3.1.2
275
+ rubygems_version: 3.2.22
267
276
  signing_key:
268
277
  specification_version: 4
269
278
  summary: A native development UI for ViewComponent