lookbook 0.4.1 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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