playbook_ui 7.16.0.pre.alpha5 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +0 -3
  3. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_header_styles.scss +7 -0
  4. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_overrides.scss +4 -1
  5. data/app/pb_kits/playbook/pb_docs/kit_api.html.erb +12 -0
  6. data/app/pb_kits/playbook/pb_docs/kit_api.rb +19 -0
  7. data/app/pb_kits/playbook/pb_docs/kit_example.html.erb +28 -0
  8. data/app/pb_kits/playbook/pb_docs/kit_example.rb +46 -0
  9. data/app/pb_kits/playbook/pb_filter/filter.html.erb +86 -0
  10. data/app/pb_kits/playbook/pb_filter/filter.rb +9 -5
  11. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +2 -2
  12. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -1
  13. data/app/pb_kits/playbook/pb_form/docs/_form_simple_form.html.erb +1 -2
  14. data/app/pb_kits/playbook/pb_form/form.html.erb +7 -0
  15. data/app/pb_kits/playbook/pb_form/form.rb +12 -14
  16. data/app/pb_kits/playbook/pb_form/form_builder.rb +1 -1
  17. data/app/pb_kits/playbook/pb_form/form_builder/action_area.html.erb +3 -0
  18. data/app/pb_kits/playbook/pb_form/form_builder/action_area.rb +5 -21
  19. data/app/pb_kits/playbook/pb_form/form_with.html.erb +18 -0
  20. data/app/pb_kits/playbook/pb_form/form_with.rb +34 -0
  21. data/app/pb_kits/playbook/pb_form/{_form_simple_form.html.erb → simple_form.html.erb} +3 -3
  22. data/app/pb_kits/playbook/pb_form/simple_form.rb +63 -0
  23. data/app/pb_kits/playbook/pb_layout/{_item.html.erb → item.html.erb} +1 -1
  24. data/app/pb_kits/playbook/pb_layout/item.rb +1 -5
  25. data/app/pb_kits/playbook/pb_progress_step/_progress_step_item.jsx +2 -5
  26. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +1 -0
  27. data/lib/playbook.rb +14 -8
  28. data/lib/playbook/classnames.rb +34 -0
  29. data/lib/playbook/engine.rb +4 -10
  30. data/lib/playbook/kit_base.rb +13 -1
  31. data/lib/playbook/kit_resolver.rb +23 -0
  32. data/lib/playbook/markdown.rb +4 -0
  33. data/lib/playbook/markdown/helper.rb +153 -0
  34. data/lib/playbook/pb_doc_helper.rb +89 -0
  35. data/lib/playbook/pb_kit_helper.rb +3 -24
  36. data/lib/playbook/props.rb +3 -118
  37. data/lib/playbook/spacing.rb +76 -0
  38. data/lib/playbook/version.rb +1 -1
  39. data/lib/playbook/z_index.rb +31 -0
  40. metadata +31 -25
  41. data/app/controllers/playbook/application_controller.rb +0 -15
  42. data/app/helpers/playbook/application_helper.rb +0 -30
  43. data/app/helpers/playbook/pb_doc_helper.rb +0 -206
  44. data/app/helpers/playbook/pb_sample_helper.rb +0 -64
  45. data/app/helpers/playbook/redcarpet_helper.rb +0 -151
  46. data/app/pb_kits/playbook/config/_kit_example.html.erb +0 -23
  47. data/app/pb_kits/playbook/config/_kit_samples_list.html.erb +0 -3
  48. data/app/pb_kits/playbook/config/_kit_ui.html.erb +0 -43
  49. data/app/pb_kits/playbook/config/_pb_kit_api.html.erb +0 -16
  50. data/app/pb_kits/playbook/pb_filter/_filter.html.erb +0 -6
  51. data/app/pb_kits/playbook/pb_filter/templates/_core.html.erb +0 -67
  52. data/app/pb_kits/playbook/pb_filter/templates/_default.html.erb +0 -23
  53. data/app/pb_kits/playbook/pb_form/_form_form_with.html.erb +0 -13
  54. data/app/pb_kits/playbook/pb_form/form/form_with_form.rb +0 -39
  55. data/app/pb_kits/playbook/pb_form/form/simple_form_form.rb +0 -46
  56. data/app/pb_kits/playbook/pb_form/form_builder/form_with_form_builder.rb +0 -11
  57. data/app/pb_kits/playbook/pb_form/form_builder/simple_form_builder.rb +0 -25
  58. data/app/pb_kits/playbook/pb_kit/base.rb +0 -99
@@ -0,0 +1,18 @@
1
+ <%= form_with(id: id,
2
+ aria: aria,
3
+ class: classname,
4
+ data: data,
5
+ builder: form_builder,
6
+ **options) do |form| %>
7
+ <% instance_exec form, &children %>
8
+
9
+ <% if validate %>
10
+ <% content_for :pb_js do %>
11
+ <%= javascript_tag do %>
12
+ window.addEventListener('DOMContentLoaded', function() {
13
+ PbFormValidation.start()
14
+ })
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbForm
5
+ class FormWith < Playbook::KitBase
6
+ class FormBuilder < ::ActionView::Helpers::FormBuilder
7
+ include ::Playbook::PbForm::FormBuilder
8
+ end
9
+
10
+ prop :options, type: Playbook::Props::Hash, default: {}
11
+ prop :validate, type: Playbook::Props::Boolean, default: false
12
+
13
+ def data
14
+ prop(:data).merge("pb-form-validation" => validate)
15
+ end
16
+
17
+ def options
18
+ { url: "" }.merge(Hash(prop(:options)))
19
+ end
20
+
21
+ def classname
22
+ [generate_classname("pb-form"), options[:class]].join(" ")
23
+ end
24
+
25
+ def form_builder
26
+ ::Playbook::PbForm::FormWith::FormBuilder
27
+ end
28
+
29
+ def render_in(view_context, &_block)
30
+ super(view_context, &nil)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,8 +1,8 @@
1
- <%= simple_form_for *object.merged_form_system_options do |form| %>
2
- <% instance_exec form, &object.children %>
1
+ <%= simple_form_for model, options do |form| %>
2
+ <% instance_exec form, &children %>
3
3
  <% end %>
4
4
 
5
- <% if object.validate %>
5
+ <% if validate %>
6
6
  <% content_for :pb_js do %>
7
7
  <%= javascript_tag do %>
8
8
  window.addEventListener('DOMContentLoaded', function() {
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ if defined?(SimpleForm)
4
+ module Playbook
5
+ module PbForm
6
+ class SimpleForm < Playbook::KitBase
7
+ class FormBuilder < ::SimpleForm::FormBuilder
8
+ include ::Playbook::PbForm::FormBuilder
9
+
10
+ def input(attribute_name, options = {}, &block)
11
+ super(
12
+ attribute_name,
13
+ options.deep_merge(label: false, input_html: {
14
+ props: {
15
+ label: true,
16
+ },
17
+ }),
18
+ &block
19
+ )
20
+ end
21
+ end
22
+
23
+ prop :options, type: Playbook::Props::Hash, default: {}
24
+ prop :validate, type: Playbook::Props::Boolean, default: false
25
+
26
+ def options
27
+ {
28
+ builder: Playbook::PbForm::SimpleForm::FormBuilder,
29
+ html: html_options,
30
+ data: data,
31
+ url: "",
32
+ }.merge(prop(:options))
33
+ end
34
+
35
+ def model
36
+ prop(:options).fetch(:model, nil)
37
+ end
38
+
39
+ def data
40
+ prop(:data).merge("pb-form-validation" => validate)
41
+ end
42
+
43
+ def classname
44
+ [generate_classname("pb-form"), html[:class]].join(" ")
45
+ end
46
+
47
+ def html
48
+ prop(:options).fetch(:html, {})
49
+ end
50
+
51
+ def render_in(view_context, &_block)
52
+ super(view_context, &nil)
53
+ end
54
+
55
+ private
56
+
57
+ def html_options
58
+ html.merge(class: classname)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -2,5 +2,5 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname) do %>
5
- <%= capture(&object.children) %>
5
+ <%= content %>
6
6
  <% end %>
@@ -2,11 +2,7 @@
2
2
 
3
3
  module Playbook
4
4
  module PbLayout
5
- class Item
6
- include Playbook::Props
7
-
8
- partial "pb_layout/item"
9
-
5
+ class Item < Playbook::KitBase
10
6
  prop :size, type: Playbook::Props::Enum,
11
7
  values: %w[sm md lg],
12
8
  default: "sm"
@@ -17,14 +17,11 @@ const ProgressStepItem = ({
17
17
  status = 'inactive',
18
18
  children,
19
19
  icon = 'check',
20
- }: ProgressStepItemProps, ref: React.ElementRef<"li">) => {
20
+ }: ProgressStepItemProps) => {
21
21
  const progressStepItem = buildCss('pb_progress_step_item', status)
22
22
 
23
23
  return (
24
- <li
25
- className={classnames(progressStepItem, className)}
26
- ref={ref}
27
- >
24
+ <li className={classnames(progressStepItem, className)}>
28
25
  <div className="box">
29
26
  <div className="circle">
30
27
  <Icon icon={icon} />
@@ -40,6 +40,7 @@ module Playbook
40
40
  id: id,
41
41
  isMulti: true,
42
42
  label: label,
43
+ name: name,
43
44
  options: options,
44
45
  placeholder: placeholder,
45
46
  }
data/lib/playbook.rb CHANGED
@@ -9,8 +9,10 @@ require "view_component/engine"
9
9
  require "playbook/props"
10
10
  require "playbook/version"
11
11
  require "playbook/pb_kit_helper"
12
+ require "playbook/pb_doc_helper"
12
13
  require "playbook/kit_base"
13
- require "playbook/markdown/template_handler"
14
+ require "playbook/kit_resolver"
15
+ require "playbook/markdown"
14
16
  require "playbook/engine" if defined?(Rails)
15
17
 
16
18
  module Playbook
@@ -19,12 +21,16 @@ module Playbook
19
21
  class ConflictingPropsError < StandardError; end
20
22
  class MissingPropError < StandardError; end
21
23
 
22
- class << self
23
- def webpacker
24
- @webpacker ||= ::Webpacker::Instance.new(
25
- root_path: ROOT_PATH,
26
- config_path: ROOT_PATH.join("config/webpacker.yml")
27
- )
28
- end
24
+ module_function
25
+
26
+ def webpacker
27
+ @webpacker ||= ::Webpacker::Instance.new(
28
+ root_path: ROOT_PATH,
29
+ config_path: ROOT_PATH.join("config/webpacker.yml")
30
+ )
31
+ end
32
+
33
+ def kit_path(kit, *args)
34
+ Playbook::Engine.root.join("app/pb_kits/playbook/pb_#{kit}", *args)
29
35
  end
30
36
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Classnames
5
+ def self.included(base)
6
+ base.prop :classname
7
+ base.prop :dark, type: Playbook::Props::Boolean, default: false
8
+ end
9
+
10
+ def generate_classname(*name_parts, separator: "_")
11
+ [
12
+ name_parts.compact.join(separator),
13
+ prop(:classname),
14
+ spacing_props,
15
+ dark_props,
16
+ max_width_props,
17
+ z_index_props,
18
+ ].compact.join(" ")
19
+ end
20
+
21
+ def generate_classname_without_spacing(*name_parts, separator: "_")
22
+ [
23
+ name_parts.compact.join(separator),
24
+ prop(:classname),
25
+ ].compact.join(" ")
26
+ end
27
+
28
+ private
29
+
30
+ def dark_props
31
+ dark ? "dark" : nil
32
+ end
33
+ end
34
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "sassc-rails"
3
4
  require "slim-rails"
4
5
 
@@ -13,18 +14,11 @@ module Playbook
13
14
  config.view_component.render_monkey_patch_enabled = false
14
15
 
15
16
  config.assets.paths ||= []
16
- config.assets.paths << "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/fonts"
17
- config.assets.paths << "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/app/pb_kits/playbook/pb_*"
17
+ config.assets.paths << Playbook::Engine.root.join("fonts")
18
+ config.assets.paths << Playbook::Engine.root.join("app/pb_kits/playbook/pb_*")
18
19
 
19
20
  config.sass.load_paths ||= []
20
- config.sass.load_paths << "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/app/pb_kits/playbook"
21
-
22
- initializer "playbook_ui.add_view_paths", after: :add_view_paths do |_app|
23
- ActiveSupport.on_load(:action_controller) do
24
- append_view_path "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/app/pb_kits/playbook"
25
- append_view_path "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/app/pb_kits/playbook/config"
26
- end
27
- end
21
+ config.sass.load_paths << Playbook::Engine.root.join("app/pb_kits/playbook")
28
22
 
29
23
  initializer "webpacker.proxy" do |app|
30
24
  insert_middleware = begin
@@ -1,9 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "playbook/classnames"
4
+ require "playbook/spacing"
5
+ require "playbook/z_index"
6
+
3
7
  module Playbook
4
8
  class KitBase < ViewComponent::Base
5
- include Playbook::Props
6
9
  include Playbook::PbKitHelper
10
+ include Playbook::Props
11
+ include Playbook::Classnames
12
+ include Playbook::Spacing
13
+ include Playbook::ZIndex
14
+
15
+ prop :id
16
+ prop :data, type: Playbook::Props::Hash, default: {}
17
+ prop :aria, type: Playbook::Props::Hash, default: {}
18
+ prop :children, type: Playbook::Props::Proc
7
19
 
8
20
  def object
9
21
  self
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ class KitResolver
5
+ def self.resolve(*args)
6
+ @resolver ||= new
7
+ @resolver.resolve(*args)
8
+ end
9
+
10
+ def initialize
11
+ @cache = Hash.new do |cache, kit_name|
12
+ is_subkit = kit_name.match(%r{[/\\]})
13
+ folder = is_subkit ? kit_name.split("/")[0] : kit_name
14
+ item = is_subkit ? kit_name.split("/")[-1] : kit_name
15
+ @cache[kit_name] = "Playbook::Pb#{folder.camelize}::#{item.camelize}"
16
+ end
17
+ end
18
+
19
+ def resolve(kit_name)
20
+ @cache[kit_name].safe_constantize
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "playbook/markdown/template_handler"
4
+ require "playbook/markdown/helper"
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redcarpet"
4
+ require "rouge"
5
+ require "rouge/plugins/redcarpet"
6
+ require "action_view"
7
+
8
+ module Playbook
9
+ module Markdown
10
+ module Helper
11
+ def markdown(text)
12
+ options = {
13
+ filter_html: false,
14
+ hard_wrap: true,
15
+ link_attributes: { rel: "nofollow", target: "_blank" },
16
+ space_after_headers: true,
17
+ fenced_code_blocks: true,
18
+ no_styles: false,
19
+ safe_links_only: true,
20
+ }
21
+
22
+ extensions = {
23
+ autolink: true,
24
+ superscript: true,
25
+ fenced_code_blocks: true,
26
+ tables: true,
27
+ disable_indented_code_blocks: false,
28
+ strikethrough: true,
29
+ underline: true,
30
+ highlight: true,
31
+ footnotes: true,
32
+ with_toc_data: true,
33
+ }
34
+
35
+ renderer = HTMLBlockCode.new(options)
36
+ markdown = Redcarpet::Markdown.new(renderer, extensions)
37
+
38
+ markdown.render(text).html_safe
39
+ end
40
+
41
+ def rouge(text, language)
42
+ formatter = Rouge::Formatters::HTML.new(scope: ".highlight")
43
+ lexer = Rouge::Lexer.find(language)
44
+ formatter.format(lexer.lex(text))
45
+ end
46
+
47
+ def rouge_markdown(text)
48
+ render_options = {
49
+ filter_html: true,
50
+ hard_wrap: true,
51
+ link_attributes: { rel: "nofollow" },
52
+ }
53
+ renderer = HTML.new(render_options)
54
+
55
+ extensions = {
56
+ autolink: true,
57
+ fenced_code_blocks: true,
58
+ lax_spacing: true,
59
+ no_intra_emphasis: true,
60
+ strikethrough: true,
61
+ superscript: true,
62
+ }
63
+ markdown = Redcarpet::Markdown.new(renderer, extensions)
64
+ markdown.render(text)
65
+ end
66
+ end
67
+
68
+ class HTML < Redcarpet::Render::HTML
69
+ include Rouge::Plugins::Redcarpet
70
+ end
71
+
72
+ class HTMLBlockCode < Redcarpet::Render::HTML
73
+ include ActionView::Helpers::AssetTagHelper
74
+ def header(title, level)
75
+ if level == 7
76
+ @headers ||= []
77
+ permalink = title.gsub(/\W+/, "-")
78
+ if @headers.include?(permalink)
79
+ permalink += "_1"
80
+ loop do
81
+ break unless @headers.include?(permalink)
82
+
83
+ permalink.gsub!(/\_(\d+)$/, "_#{Regexp.last_match(1).to_i + 1}")
84
+ end
85
+ end
86
+ @headers << permalink
87
+ %(\n<a name="#{permalink}" class="markdown-header-anchor anchor" href="##{permalink}"><span class="fa fa-link anchor-icon"></span></a><h#{level} id=\"#{permalink}\">#{title}</h#{level}>\n)
88
+ else
89
+ %(\n<h#{level}>#{title}</h#{level}>\n)
90
+ end
91
+ end
92
+
93
+ def image(link, title, alt_text)
94
+ image_tag(link, title: title, alt: alt_text, class: "imageloader lazyload")
95
+ end
96
+
97
+ def preprocess(full_document)
98
+ full_document.gsub(/\[component (.*)\]/) do
99
+ @string = Regexp.last_match(1)
100
+ @default_height = "160"
101
+ @attr = ["", @default_height]
102
+
103
+ # Set src from attributes
104
+ @string.gsub(/src="(.*?)"/) do
105
+ @attr[0] = Regexp.last_match(1)
106
+ end
107
+
108
+ # Set height from attributes
109
+ @string.gsub(/height="(.*?)"/) do
110
+ @attr[1] = (Regexp.last_match(1) || @default_height)
111
+ end
112
+
113
+ %(\n<div class="uix-component-frame"><iframe scrolling="no" id="component-preview" src="#{@attr[0]}" width="100%" height="#{@attr[1]}"></iframe><a href="#{@attr[0]}" target="_blank" class="uix-component-link">View component</a></div>\n)
114
+ end
115
+ end
116
+
117
+ def list(contents, _list_type)
118
+ @contents = contents
119
+ @list_items = contents.split("\n")
120
+
121
+ if @list_items[0].include?("[do]") || @list_items[0].include?("[dont]")
122
+ @element_items = []
123
+ @list_items.each do |item, _index|
124
+ item.gsub(%r{\<li>(.*)\</li>}) do
125
+ @element_items.push(Regexp.last_match(1))
126
+ end
127
+ end
128
+
129
+ # Doing both because we could have either/both
130
+ # clean up
131
+ @dont_items, @trash_items_dont = @element_items.partition { |x, _i| x.include? "[dont]" }
132
+ @do_items, @trash_items_do = @element_items.partition { |x, _i| x.include? "[do]" }
133
+
134
+ @do_list = []
135
+ @do_items.each do |item, _index|
136
+ @do_list.push("<li>#{item.sub('[do] ', '')}</li>")
137
+ end
138
+ @do_list = "<ul class='uix-ruleset do-list'>#{@do_list.join('')}</ul>"
139
+
140
+ @dont_list = []
141
+ @dont_items.each do |item, _index|
142
+ @dont_list.push("<li>#{item.sub('[dont] ', '')}</li>")
143
+ end
144
+ @dont_list = "<ul class='uix-ruleset dont-list'>#{@dont_list.join('')}</ul>"
145
+
146
+ "<div class='row uix-ruleset-block'><div class='col-sm-6'>#{@do_list}</div><div class='col-sm-6'>#{@dont_list}</div></div>"
147
+ else
148
+ @contents
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end