lookbook 1.0.0.beta.5 → 1.0.0.beta.8

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