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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +29 -254
  3. data/app/assets/lookbook/css/lookbook.css +1 -1
  4. data/app/assets/lookbook/css/themes/blue.css +58 -37
  5. data/app/assets/lookbook/css/themes/indigo.css +58 -37
  6. data/app/assets/lookbook/css/themes/zinc.css +58 -37
  7. data/app/assets/lookbook/css/tooltip.css +5 -5
  8. data/app/components/lookbook/base_component.rb +0 -1
  9. data/app/components/lookbook/button/component.html.erb +2 -2
  10. data/app/components/lookbook/embed/component.html.erb +5 -5
  11. data/app/components/lookbook/embed/component.rb +8 -0
  12. data/app/components/lookbook/filter/component.html.erb +1 -1
  13. data/app/components/lookbook/header/component.html.erb +1 -1
  14. data/app/components/lookbook/inspector_panel/component.css +5 -0
  15. data/app/components/lookbook/inspector_panel/component.html.erb +6 -0
  16. data/app/components/lookbook/inspector_panel/component.rb +36 -0
  17. data/app/components/lookbook/nav/component.rb +1 -2
  18. data/app/components/lookbook/nav/item/component.html.erb +1 -1
  19. data/app/components/lookbook/params_editor/field/component.rb +2 -1
  20. data/app/components/lookbook/prose/component.html.erb +1 -1
  21. data/app/components/lookbook/tab_panels/component.rb +1 -1
  22. data/app/components/lookbook/tab_panels/panel/component.rb +2 -2
  23. data/app/components/lookbook/tabs/dropdown_tab/component.html.erb +1 -1
  24. data/app/components/lookbook/tabs/tab/component.html.erb +1 -1
  25. data/app/components/lookbook/tag_component.rb +1 -1
  26. data/app/components/lookbook/toolbar/component.html.erb +1 -1
  27. data/app/components/lookbook/viewport/component.css +1 -1
  28. data/app/components/lookbook/viewport/component.html.erb +1 -1
  29. data/app/controllers/lookbook/application_controller.rb +1 -1
  30. data/app/controllers/lookbook/pages_controller.rb +1 -0
  31. data/app/controllers/lookbook/previews_controller.rb +21 -9
  32. data/app/helpers/lookbook/application_helper.rb +9 -6
  33. data/app/helpers/lookbook/preview_helper.rb +2 -3
  34. data/app/views/layouts/lookbook/application.html.erb +1 -1
  35. data/app/views/layouts/lookbook/page.html.erb +2 -2
  36. data/app/views/layouts/lookbook/shell.html.erb +6 -0
  37. data/app/views/layouts/lookbook/skeleton.html.erb +15 -14
  38. data/app/views/lookbook/previews/panels/_content.html.erb +1 -1
  39. data/app/views/lookbook/previews/panels/_notes.html.erb +2 -2
  40. data/app/views/lookbook/previews/panels/_params.html.erb +1 -1
  41. data/app/views/lookbook/previews/show.html.erb +7 -5
  42. data/lib/lookbook/code_formatter.rb +1 -1
  43. data/lib/lookbook/collection.rb +1 -1
  44. data/lib/lookbook/component.rb +2 -3
  45. data/lib/lookbook/config.rb +68 -46
  46. data/lib/lookbook/data.rb +11 -0
  47. data/lib/lookbook/engine.rb +64 -68
  48. data/lib/lookbook/entity.rb +1 -1
  49. data/lib/lookbook/hooks.rb +21 -0
  50. data/lib/lookbook/markdown.rb +1 -1
  51. data/lib/lookbook/page.rb +4 -5
  52. data/lib/lookbook/page_section.rb +2 -4
  53. data/lib/lookbook/panels.rb +15 -0
  54. data/lib/lookbook/params.rb +12 -0
  55. data/lib/lookbook/parser.rb +4 -1
  56. data/lib/lookbook/preview.rb +9 -11
  57. data/lib/lookbook/preview_example.rb +1 -1
  58. data/lib/lookbook/preview_group.rb +8 -0
  59. data/lib/lookbook/source_inspector.rb +9 -0
  60. data/lib/lookbook/store.rb +14 -2
  61. data/lib/lookbook/tag.rb +112 -0
  62. data/lib/lookbook/tags.rb +22 -0
  63. data/lib/lookbook/theme.rb +38 -9
  64. data/lib/lookbook/version.rb +1 -1
  65. data/lib/lookbook.rb +1 -0
  66. data/lib/tasks/lookbook_tasks.rake +1 -2
  67. data/public/lookbook-assets/css/lookbook.css +307 -150
  68. data/public/lookbook-assets/css/lookbook.css.map +1 -1
  69. data/public/lookbook-assets/css/themes/blue.css +57 -36
  70. data/public/lookbook-assets/css/themes/blue.css.map +1 -1
  71. data/public/lookbook-assets/css/themes/indigo.css +57 -36
  72. data/public/lookbook-assets/css/themes/indigo.css.map +1 -1
  73. data/public/lookbook-assets/css/themes/zinc.css +57 -36
  74. data/public/lookbook-assets/css/themes/zinc.css.map +1 -1
  75. data/public/lookbook-assets/js/embed.js +193 -193
  76. data/public/lookbook-assets/js/lookbook.js +1151 -1308
  77. data/public/lookbook-assets/js/lookbook.js.map +1 -1
  78. metadata +12 -4
@@ -1,7 +1,7 @@
1
1
  module Lookbook
2
2
  class PreviewExample < Entity
3
3
  attr_reader :name, :preview
4
- delegate :params, :position, :group, :notes, :hidden?, :source, to: :@example_inspector
4
+ delegate :params, :position, :group, :notes, :hidden?, :source, :tags, :tag, to: :@example_inspector
5
5
 
6
6
  def initialize(name, preview)
7
7
  @name = name
@@ -49,6 +49,14 @@ module Lookbook
49
49
  @preview.hierarchy_depth + 1
50
50
  end
51
51
 
52
+ def tags(name = nil)
53
+ examples.map { |example| example.tags(name) }.flatten
54
+ end
55
+
56
+ def tag(name = nil)
57
+ tags(name).first
58
+ end
59
+
52
60
  alias_method :lookup_path, :path
53
61
  end
54
62
  end
@@ -79,5 +79,14 @@ module Lookbook
79
79
  def methods
80
80
  code_object&.meths
81
81
  end
82
+
83
+ def tags(name = nil)
84
+ tag_objects = code_object&.tags(name).presence || []
85
+ Lookbook::Tags.process_tags(tag_objects)
86
+ end
87
+
88
+ def tag(name = nil)
89
+ tags(name).first
90
+ end
82
91
  end
83
92
  end
@@ -21,16 +21,28 @@ module Lookbook
21
21
  self
22
22
  end
23
23
 
24
+ def get(key, fallback = nil)
25
+ if 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
27
35
 
36
+ def respond_to_missing?(name, *)
37
+ key?(name)
38
+ end
39
+
28
40
  def normalize_key(key)
29
- key.to_s.downcase.gsub("-", "_").to_sym
41
+ key.to_s.downcase.tr("-", "_").to_sym
30
42
  end
31
43
 
32
44
  def normalize_value(value)
33
45
  @deep && value.is_a?(Hash) ? Store.new(value) : value
34
46
  end
35
47
  end
36
- end
48
+ end
@@ -0,0 +1,112 @@
1
+ require "shellwords"
2
+
3
+ module Lookbook
4
+ class Tag
5
+ attr_reader :data, :arg_names
6
+ attr_accessor :args, :opts
7
+
8
+ def initialize(tag_object, arg_names = nil, parser: nil, **options)
9
+ @tag_object = tag_object
10
+ @arg_names = arg_names
11
+ @args = {}
12
+ @opts = {}
13
+ @options = options
14
+ @parser = parser
15
+ @data = Store.new
16
+ run_parser
17
+ end
18
+
19
+ def tag_name
20
+ @name ||= @tag_object.tag_name.to_sym
21
+ end
22
+
23
+ def tag_body
24
+ @tag_object.text
25
+ end
26
+
27
+ def get_opt(key, fallback = nil)
28
+ opts[key] || fallback
29
+ end
30
+
31
+ def opts_str
32
+ @opts_str ||= text_tokens.size > args_count ? text_tokens.slice(args_count, text_tokens.size).join(" ") : ""
33
+ end
34
+
35
+ protected
36
+
37
+ def parse_args
38
+ unless arg_names.nil?
39
+ values = text_tokens.slice(0, args_count)
40
+ @args = build_args(values)
41
+ end
42
+ end
43
+
44
+ def parse_opts
45
+ return @opts if @options[:parse_options] == false
46
+ parsed_opts = parse_yaml(opts_str)
47
+ @opts = parsed_opts.is_a?(Hash) ? parsed_opts.with_indifferent_access : {}
48
+ end
49
+
50
+ def run_parser
51
+ parse_args
52
+ parse_opts
53
+ @parser.call(self) if @parser.respond_to?(:call)
54
+ end
55
+
56
+ def arg_options
57
+ return [] if arg_names.nil?
58
+ @arg_options ||= arg_names.map do |arg|
59
+ unless arg.is_a? Hash
60
+ name = arg
61
+ arg = {
62
+ name: name.to_sym
63
+ }
64
+ end
65
+ arg[:parse] = false unless arg.key? :parse
66
+ arg
67
+ end
68
+ end
69
+
70
+ def validate_arg_names
71
+ if arg_names.present?
72
+ arg_names.each do |name|
73
+ if methods.include? name.to_sym
74
+ raise ArgumentError, "'#{name}' is a reserved word and cannot be used as an argument name."
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ def args_count
81
+ arg_options.size
82
+ end
83
+
84
+ def parse_yaml(str, fallback = "~")
85
+ YAML.safe_load(str || fallback)
86
+ end
87
+
88
+ def text_tokens
89
+ @tokens ||= Shellwords.split(@tag_object.text)
90
+ end
91
+
92
+ def build_args(values)
93
+ arg_options.map.with_index do |arg, i|
94
+ value = values[i]
95
+ value = parse_arg(value) if arg[:parse] == true && value.present?
96
+ [arg[:name].to_sym, value]
97
+ end.to_h
98
+ end
99
+
100
+ def method_missing(name, *method_args)
101
+ if name.end_with? "="
102
+ data[name.to_s.chomp("=").to_sym] = method_args.first
103
+ else
104
+ data[name] || args[name]
105
+ end
106
+ end
107
+
108
+ def respond_to_missing?(name, *)
109
+ data.key?(name) || args.key?(name)
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,22 @@
1
+ module Lookbook
2
+ module Tags
3
+ def define_tag(name, args = nil, opts = {}, &block)
4
+ name = name.to_s.downcase.underscore.to_sym
5
+ if args.is_a? Hash
6
+ opts = args
7
+ args = nil
8
+ end
9
+ opts[:args] = args
10
+ opts[:parser] = block if block
11
+ Lookbook.config.preview_tags[name] = opts
12
+ end
13
+
14
+ def self.process_tags(tag_objects)
15
+ return [] if tag_objects.none?
16
+ tag_objects.map do |tag_object|
17
+ opts = Lookbook.config.preview_tags[tag_object.tag_name] || {}
18
+ Lookbook::Tag.new(tag_object, opts[:args], opts.except(:args))
19
+ end.compact
20
+ end
21
+ end
22
+ end
@@ -1,19 +1,48 @@
1
1
  module Lookbook
2
2
  class Theme
3
+ BASE_THEMES = {
4
+ indigo: {
5
+ favicon_light_mode: "#4F46E5",
6
+ favicon_dark_mode: "#818CF8"
7
+ },
8
+ zinc: {
9
+ favicon_light_mode: "#52525b",
10
+ favicon_dark_mode: "#E4E4E7"
11
+ },
12
+ blue: {
13
+ favicon_light_mode: "#2563EB",
14
+ favicon_dark_mode: "#60A5FA"
15
+ }
16
+ }
3
17
 
4
- BASE_THEMES = [:indigo, :zinc, :blue]
5
-
6
- def initialize(config = {})
7
- @config = config
18
+ def initialize(base_theme, overrides = {})
19
+ @base_theme = base_theme
20
+ @overrides = overrides
8
21
  @css = nil
9
22
  end
10
23
 
24
+ def favicon_light_mode
25
+ (
26
+ @overrides[:favicon_light_mode].presence ||
27
+ @overrides[:favicon].presence ||
28
+ BASE_THEMES[@base_theme.to_sym][:favicon_light_mode]
29
+ )
30
+ end
31
+
32
+ def favicon_dark_mode
33
+ (
34
+ @overrides[:favicon_dark_mode].presence ||
35
+ @overrides[:favicon].presence ||
36
+ BASE_THEMES[@base_theme.to_sym][:favicon_dark_mode]
37
+ )
38
+ end
39
+
11
40
  def to_css
12
41
  return @css unless @css.nil?
13
- @css ||= if @config.present?
42
+ @css ||= if @overrides.present?
14
43
  styles = [":root {"]
15
- styles << @config.map do |key, value|
16
- " --lookbook-#{key.to_s.underscore.gsub("_","-")}: #{value};"
44
+ styles << @overrides.select { |key| !key.start_with?("favicon") }.map do |key, value|
45
+ " --lookbook-#{key.to_s.underscore.tr("_", "-")}: #{value};"
17
46
  end
18
47
  styles.push "}"
19
48
  styles.join("\n")
@@ -23,7 +52,7 @@ module Lookbook
23
52
  end
24
53
 
25
54
  def self.valid_theme?(name)
26
- BASE_THEMES.include? name.to_sym
55
+ BASE_THEMES.key? name.to_sym
27
56
  end
28
57
  end
29
- end
58
+ end
@@ -1,3 +1,3 @@
1
1
  module Lookbook
2
- VERSION = "1.0.0.beta.5"
2
+ VERSION = "1.0.0.beta.8"
3
3
  end
data/lib/lookbook.rb CHANGED
@@ -11,6 +11,7 @@ module Lookbook
11
11
  autoload :Lang, "lookbook/lang"
12
12
  autoload :Params, "lookbook/params"
13
13
  autoload :Page, "lookbook/page"
14
+ autoload :Tag, "lookbook/tag"
14
15
  autoload :PageSection, "lookbook/page_section"
15
16
  autoload :PageCollection, "lookbook/page_collection"
16
17
  autoload :Features, "lookbook/features"
@@ -1,7 +1,6 @@
1
1
  require_relative "../lookbook"
2
2
 
3
3
  namespace :lookbook do
4
-
5
4
  desc "Run the rspec tests"
6
5
  task :test do
7
6
  sh "bundle exec rspec"
@@ -16,7 +15,7 @@ namespace :lookbook do
16
15
 
17
16
  namespace :previews do
18
17
  desc "Preparse the previews"
19
- task :preparse => :environment do
18
+ task preparse: :environment do
20
19
  Lookbook::Engine.parser.parse
21
20
  puts "Lookbook preview parsing complete"
22
21
  end