playbook_ui 8.4.0.alpha.dependencies.2 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -18
  3. data/app/pb_kits/playbook/data/menu.yml +2 -3
  4. data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +7 -0
  5. data/app/pb_kits/playbook/pb_form/docs/_description.md +2 -6
  6. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -1
  7. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -4
  8. data/app/pb_kits/playbook/pb_form/docs/example.yml +2 -4
  9. data/app/pb_kits/playbook/pb_form/form.rb +14 -20
  10. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.scss +63 -54
  11. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.jsx +2 -1
  12. data/app/pb_kits/playbook/pb_select/_select.scss +15 -5
  13. data/app/pb_kits/playbook/pb_select/docs/_select_custom_select.jsx +4 -1
  14. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +1 -1
  15. data/app/pb_kits/playbook/pb_selectable_card/docs/_selectable_card_input.jsx +145 -135
  16. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +17 -18
  17. data/app/pb_kits/playbook/pb_textarea/_textarea.scss +29 -19
  18. data/app/pb_kits/playbook/pb_textarea/_textarea_mixin.scss +9 -4
  19. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_character_counter.jsx +5 -1
  20. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_custom.jsx +4 -2
  21. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +17 -15
  22. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async_users.jsx +1 -0
  23. data/app/pb_kits/playbook/tokens/_colors.scss +1 -1
  24. data/lib/playbook.rb +4 -1
  25. data/lib/playbook/forms.rb +3 -0
  26. data/lib/playbook/forms/builder.rb +31 -0
  27. data/{app/pb_kits/playbook/pb_form/form_builder → lib/playbook/forms/builder}/action_area.rb +2 -2
  28. data/lib/playbook/forms/builder/checkbox_field.rb +32 -0
  29. data/lib/playbook/forms/builder/collection_select_field.rb +19 -0
  30. data/lib/playbook/forms/builder/date_picker_field.rb +37 -0
  31. data/{app/pb_kits/playbook/pb_form/form_builder → lib/playbook/forms/builder}/form_field_builder.rb +2 -2
  32. data/lib/playbook/forms/builder/select_field.rb +19 -0
  33. data/lib/playbook/forms/builder/typeahead_field.rb +12 -0
  34. data/lib/playbook/pb_forms_helper.rb +41 -0
  35. data/lib/playbook/pb_kit_helper.rb +2 -0
  36. data/lib/playbook/props/base.rb +1 -1
  37. data/lib/playbook/version.rb +1 -2
  38. metadata +90 -61
  39. data/app/pb_kits/playbook/pb_form/docs/_form_simple_form.html.erb +0 -60
  40. data/app/pb_kits/playbook/pb_form/docs/_form_simple_form_validate.html.erb +0 -61
  41. data/app/pb_kits/playbook/pb_form/docs/_form_simple_form_validate.md +0 -1
  42. data/app/pb_kits/playbook/pb_form/form_builder.rb +0 -31
  43. data/app/pb_kits/playbook/pb_form/form_builder/checkbox_field.rb +0 -34
  44. data/app/pb_kits/playbook/pb_form/form_builder/collection_select_field.rb +0 -21
  45. data/app/pb_kits/playbook/pb_form/form_builder/date_picker_field.rb +0 -39
  46. data/app/pb_kits/playbook/pb_form/form_builder/select_field.rb +0 -21
  47. data/app/pb_kits/playbook/pb_form/form_builder/typeahead_field.rb +0 -14
  48. data/app/pb_kits/playbook/pb_form/form_with.html.erb +0 -11
  49. data/app/pb_kits/playbook/pb_form/form_with.rb +0 -40
  50. data/app/pb_kits/playbook/pb_form/simple_form.html.erb +0 -11
  51. data/app/pb_kits/playbook/pb_form/simple_form.rb +0 -67
@@ -22,7 +22,7 @@
22
22
  overflow-wrap: break-word;
23
23
  resize: none;
24
24
  transition-property: box-shadow, color, background-color;
25
- transition-duration: .24s;
25
+ transition-duration: .3s;
26
26
  transition-timing-function: $bezier;
27
27
  &[type=number] {
28
28
  -moz-appearance:textfield;
@@ -40,9 +40,9 @@
40
40
  &:-webkit-autofill,
41
41
  &:-webkit-autofill:hover,
42
42
  &:-internal-autofill-selected {
43
- -webkit-text-fill-color: $text_color;
44
- -webkit-box-shadow: 0 0 0px 1000px transparent inset;
45
- transition: background-color 5000s ease-in-out 0s;
43
+ color: $text_color;
44
+ background-color: rgba($focus_input_light, $opacity_5);
45
+ transition: background-color 0.3s ease-in-out 0s;
46
46
  font-family: $font_family_base;
47
47
  }
48
48
  }
@@ -68,3 +68,8 @@
68
68
  @mixin pb_textarea_focus_dark {
69
69
  @include pb_textarea_focus($focus_input_dark);
70
70
  }
71
+
72
+ // Transitions ======================
73
+ @mixin transition_default{
74
+ transition: background-color 0.3s ease-in-out 0s, border-color 0.3s ease-in-out 0s;
75
+ }
@@ -1,7 +1,7 @@
1
1
  import React, { useState } from 'react'
2
2
  import { Textarea } from '../../'
3
3
 
4
- const TextareaCharacterCounter = () => {
4
+ const TextareaCharacterCounter = (props) => {
5
5
  const [value1, setValue1] = useState('Counting characters!')
6
6
  const [value2, setValue2] = useState('This counter prevents the user from exceeding the maximum number of allowed characters. Just try it!')
7
7
  const [value3, setValue3] = useState('This counter alerts the user that they have exceeded the maximum number of allowed characters.')
@@ -41,6 +41,7 @@ const TextareaCharacterCounter = () => {
41
41
  label="Count Only"
42
42
  onChange={(event) => setCount1(event.target.value.length)}
43
43
  rows={4}
44
+ {...props}
44
45
  />
45
46
 
46
47
  <br />
@@ -52,6 +53,7 @@ const TextareaCharacterCounter = () => {
52
53
  onChange={() => handleMaxCount(event)}
53
54
  rows={4}
54
55
  value={value1}
56
+ {...props}
55
57
  />
56
58
 
57
59
  <br />
@@ -63,6 +65,7 @@ const TextareaCharacterCounter = () => {
63
65
  onChange={() => handleMaxCountWithBlocker(event, 100)}
64
66
  rows={4}
65
67
  value={value2}
68
+ {...props}
66
69
  />
67
70
 
68
71
  <br />
@@ -75,6 +78,7 @@ const TextareaCharacterCounter = () => {
75
78
  onChange={() => handleMaxCountWithError(event, 75)}
76
79
  rows={4}
77
80
  value={value3}
81
+ {...props}
78
82
  />
79
83
  </>
80
84
  )
@@ -4,12 +4,14 @@ import { Textarea } from '../../'
4
4
  const TextareaCustom = (props) => {
5
5
  return (
6
6
  <div>
7
- <Textarea label="Label">
7
+ <Textarea
8
+ label="Label"
9
+ {...props}
10
+ >
8
11
  <textarea
9
12
  className="my_custom_class"
10
13
  name="custom_textarea"
11
14
  rows={4}
12
- {...props}
13
15
  >
14
16
  {'Content goes here.'}
15
17
  </textarea>
@@ -4,9 +4,18 @@
4
4
  @import "../tokens/shadows";
5
5
 
6
6
  [class^=pb_typeahead_kit] {
7
+ .typeahead-kit-select__option {
8
+ cursor: pointer;
9
+ }
7
10
  .pb_typeahead_wrapper {
8
11
  position: relative;
9
-
12
+ .text_input_value_container{
13
+ cursor: text;
14
+ }
15
+ .text_input_indicators,
16
+ .pb_list_kit {
17
+ cursor: pointer;
18
+ }
10
19
  .pb_typeahead_loading_indicator {
11
20
  position: absolute;
12
21
  width: min-content;
@@ -17,7 +26,6 @@
17
26
  transition: opacity .15s ease-in-out;
18
27
  }
19
28
  }
20
-
21
29
  [class^=pb_text_input_kit] {
22
30
  .text_input_wrapper {
23
31
  & > input:first-child {
@@ -25,7 +33,6 @@
25
33
  }
26
34
  }
27
35
  }
28
-
29
36
  .pb_item_kit {
30
37
  padding: ($space_xs + 2) 0;
31
38
 
@@ -35,7 +42,6 @@
35
42
  }
36
43
  }
37
44
  }
38
-
39
45
  [class^=pb_list_kit] {
40
46
  max-height: 18em;
41
47
  overflow-y: auto;
@@ -49,17 +55,14 @@
49
55
  border-radius: $border_rad_heavier;
50
56
  transition: opacity .25s ease-in-out;
51
57
  }
52
-
53
58
  &:focus-within [class^=pb_list_kit] {
54
59
  display: block;
55
60
  opacity: 1;
56
61
  }
57
-
58
62
  &:not(:focus-within) [class^=pb_list_kit] {
59
63
  display: none;
60
64
  opacity: 0;
61
65
  }
62
-
63
66
  [class^=pb_list_kit] {
64
67
  margin-top: -$space-sm;
65
68
  li {
@@ -69,7 +72,6 @@
69
72
  &:focus-within {
70
73
  background-color: $active_light;
71
74
  }
72
-
73
75
  > button {
74
76
  background: none;
75
77
  color: $text_lt_default;
@@ -84,7 +86,6 @@
84
86
  }
85
87
  }
86
88
  }
87
-
88
89
  &[class*=dark] {
89
90
  .pb_typeahead_wrapper .pb_typeahead_loading_indicator {
90
91
  color: $text_dk_light;
@@ -97,7 +98,10 @@
97
98
  color: $white;
98
99
  }
99
100
  .typeahead-kit-select__option:hover {
100
- background-color: tint($focus_input_dark, 5%);
101
+ background-color: $active_dark;
102
+ }
103
+ .typeahead-kit-select__indicator:hover {
104
+ color: $white;
101
105
  }
102
106
  .typeahead-kit-select__input {
103
107
  color: white;
@@ -105,13 +109,12 @@
105
109
  box-shadow: none;
106
110
  }
107
111
  }
108
- .typeahead-kit-select__single-value{
112
+ .typeahead-kit-select__single-value {
109
113
  color: white;
110
114
  }
111
115
  .typeahead-kit-select__option--is-focused {
112
- background-color: tint($focus_input_dark, 5%);
116
+ background-color: $active_dark;
113
117
  }
114
-
115
118
  [class^=pb_list_kit] {
116
119
  background-color: $bg_dark;
117
120
  }
@@ -121,12 +124,11 @@
121
124
  }
122
125
  @media (hover:hover) {
123
126
  &:hover {
124
- background-color: tint($focus_input_dark, 5%);
127
+ background-color: rgba($white,.1);
125
128
  }
126
129
  }
127
130
  }
128
131
  }
129
-
130
132
  &.react-select, &.react-select .dark {
131
133
  .text_input {
132
134
  display: inherit;
@@ -90,6 +90,7 @@ const TypeaheadWithPillsAsyncUsers = (props) => {
90
90
  isMulti
91
91
  label="Github Users"
92
92
  loadOptions={promiseOptions}
93
+ noOptionsMessage={() => 'Type to Search'}
93
94
  onChange={handleOnChange}
94
95
  onMultiValueClick={handleOnMultiValueClick}
95
96
  placeholder="type the name of a Github user"
@@ -114,7 +114,7 @@ $shadow_colors: (
114
114
 
115
115
  /* Text colors ------------------------*/
116
116
  $text_lt_default: $charcoal;
117
- $text_lt_light: #919EAB;
117
+ $text_lt_light: #687887;
118
118
  $text_lt_lighter: $slate;
119
119
  $text_dk_default: $white;
120
120
  $text_dk_light: rgba($white, $opacity_6);
data/lib/playbook.rb CHANGED
@@ -6,8 +6,11 @@ require "webpacker"
6
6
  require "webpacker/react"
7
7
  require "view_component/engine"
8
8
 
9
- require "playbook/props"
10
9
  require "playbook/version"
10
+
11
+ require "playbook/props"
12
+ require "playbook/forms"
13
+ require "playbook/pb_forms_helper"
11
14
  require "playbook/pb_kit_helper"
12
15
  require "playbook/pb_doc_helper"
13
16
  require "playbook/kit_base"
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "forms/builder"
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Forms
5
+ class Builder < ::ActionView::Helpers::FormBuilder
6
+ require_relative "builder/action_area"
7
+ require_relative "builder/checkbox_field"
8
+ require_relative "builder/collection_select_field"
9
+ require_relative "builder/date_picker_field"
10
+ require_relative "builder/form_field_builder"
11
+ require_relative "builder/select_field"
12
+ require_relative "builder/typeahead_field"
13
+
14
+ prepend(FormFieldBuilder.new(:email_field, kit_name: "text_input"))
15
+ prepend(FormFieldBuilder.new(:number_field, kit_name: "text_input"))
16
+ prepend(FormFieldBuilder.new(:search_field, kit_name: "text_input"))
17
+ prepend(FormFieldBuilder.new(:telephone_field, kit_name: "text_input"))
18
+ prepend(FormFieldBuilder.new(:text_field, kit_name: "text_input"))
19
+ prepend(FormFieldBuilder.new(:password_field, kit_name: "text_input"))
20
+ prepend(FormFieldBuilder.new(:url_field, kit_name: "text_input"))
21
+ prepend(FormFieldBuilder.new(:text_area, kit_name: "textarea"))
22
+
23
+ def actions
24
+ context = @template.respond_to?(:view_context) ? @template.view_context : @template
25
+ context.content_tag :ol, class: "pb-form-actions" do
26
+ yield ActionArea.new(@template, submit_default_value)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playbook
4
- module PbForm
5
- module FormBuilder
4
+ module Forms
5
+ class Builder
6
6
  class ActionArea
7
7
  def initialize(view_context, submit_default_value)
8
8
  self.view_context = view_context
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Forms
5
+ class Builder
6
+ def check_box(name, props: {}, **options)
7
+ label_text = @template.label(@object_name, name) if props[:label] == true
8
+ options[:required] = true if props[:required]
9
+ props[:margin_bottom] = "sm"
10
+ props[:form_spacing] = true
11
+
12
+ checked_value = options[:checked_value]
13
+ unchecked_value = options[:unchecked_value]
14
+ options.delete(:checked_value)
15
+ options.delete(:unchecked_value)
16
+
17
+ input = super(name, options, checked_value, unchecked_value)
18
+
19
+ if props[:label]
20
+ @template.pb_rails("caption", props: { text: label_text, margin_bottom: "xs" }) +
21
+ @template.pb_rails("checkbox", props: props) do
22
+ input
23
+ end
24
+ else
25
+ @template.pb_rails("checkbox", props: props) do
26
+ input
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Forms
5
+ class Builder
6
+ def collection_select(name, collection, value_method, text_method, options = {}, html_options = {}, props: {} )
7
+ props[:label] = @template.label(@object_name, name) if props[:label] == true
8
+ options[:skip_default_ids] = false unless options.has_key?(:skip_default_ids)
9
+ options[:prompt] = props[:blank_selection] || ""
10
+ html_options[:required] = "required" if props[:required]
11
+ input = super(name, collection, value_method, text_method, options, html_options)
12
+
13
+ @template.pb_rails("select", props: props) do
14
+ input
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Forms
5
+ class Builder
6
+ def date_picker(name, props: {})
7
+ prefix = @object_name
8
+ html_attribute_name = "#{prefix}[#{name}]"
9
+ html_id = "#{prefix}_#{name}"
10
+
11
+ props[:label] = @template.label(@object_name, name) if props[:label] == true
12
+ props[:label] = "Date Picker" if props[:label].nil?
13
+
14
+ props[:name] = html_attribute_name
15
+ props[:picker_id] = html_id
16
+
17
+ input = text_field(
18
+ name,
19
+ autocomplete: "off",
20
+ disabled: props[:disable_input],
21
+ data: props[:input_data],
22
+ aria: props[:input_aria],
23
+ props: {
24
+ error: props[:error],
25
+ label: props[:hide_label] ? nil : props[:label],
26
+ placeholder: props[:placeholder],
27
+ required: props[:required],
28
+ }
29
+ )
30
+
31
+ @template.pb_rails("date_picker", props: props) do
32
+ input
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playbook
4
- module PbForm
5
- module FormBuilder
4
+ module Forms
5
+ class Builder
6
6
  class FormFieldBuilder < Module
7
7
  def initialize(method_name, kit_name:)
8
8
  define_method method_name do |name, props: {}, **options, &block|
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Forms
5
+ class Builder
6
+ def select(name, choices = nil, options = {}, html_options = {}, props: {}, &block)
7
+ props[:label] = @template.label(@object_name, name) if props[:label] == true
8
+ options[:skip_default_ids] = false unless options.has_key?(:skip_default_ids)
9
+ options[:prompt] = props[:blank_selection] || ""
10
+ html_options[:required] = "required" if props[:required]
11
+ input = super(name, choices, options, html_options, &block)
12
+
13
+ @template.pb_rails("select", props: props) do
14
+ input
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Forms
5
+ class Builder
6
+ def typeahead(name, _options = {}, _html_options = {}, props: {})
7
+ props[:name] = name
8
+ @template.pb_rails("typeahead", props: props)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbFormsHelper
5
+ # Renders a pb form with ::Playbook::Forms::Builder, that can render
6
+ # Playbook kits in the most railsie way.
7
+ #
8
+ # I.e.:
9
+ #
10
+ # pb_form_with model: @user do |f|
11
+ # f.text_field :name
12
+ # end
13
+ #
14
+ # The form can also validate the fields, and trigger the validation automatically:
15
+ #
16
+ # I.e.:
17
+ #
18
+ # pb_form_with model: @user, validate: true do |f|
19
+ # f.text_field :name, required: true
20
+ # end
21
+ #
22
+ # @param data [Hash] hash of data attributes
23
+ # @param validate [Boolean] whether validation should be triggered or not
24
+ # @see [#form_with] for other options
25
+ def pb_form_with(data: {}, validate: false, **kwargs, &block)
26
+ data = data.merge("pb-form-validation" => validate)
27
+ classname = ["pb-form", kwargs[:class]].join(" ")
28
+ options = kwargs.merge(
29
+ class: classname,
30
+ data: data,
31
+ builder: ::Playbook::Forms::Builder
32
+ )
33
+
34
+ content_for(:pb_js, javascript_tag(<<~JS))
35
+ window.addEventListener("DOMContentLoaded", function() { PbFormValidation.start() })
36
+ JS
37
+
38
+ form_with(**options, &block)
39
+ end
40
+ end
41
+ end