playbook_ui 8.4.0.alpha.dependencies.2 → 9.0.0
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.
- checksums.yaml +4 -4
- data/Rakefile +1 -18
- data/app/pb_kits/playbook/data/menu.yml +2 -3
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +7 -0
- data/app/pb_kits/playbook/pb_form/docs/_description.md +2 -6
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -1
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -4
- data/app/pb_kits/playbook/pb_form/docs/example.yml +2 -4
- data/app/pb_kits/playbook/pb_form/form.rb +14 -20
- data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.scss +63 -54
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.jsx +2 -1
- data/app/pb_kits/playbook/pb_select/_select.scss +15 -5
- data/app/pb_kits/playbook/pb_select/docs/_select_custom_select.jsx +4 -1
- data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +1 -1
- data/app/pb_kits/playbook/pb_selectable_card/docs/_selectable_card_input.jsx +145 -135
- data/app/pb_kits/playbook/pb_text_input/_text_input.scss +17 -18
- data/app/pb_kits/playbook/pb_textarea/_textarea.scss +29 -19
- data/app/pb_kits/playbook/pb_textarea/_textarea_mixin.scss +9 -4
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_character_counter.jsx +5 -1
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_custom.jsx +4 -2
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +17 -15
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async_users.jsx +1 -0
- data/app/pb_kits/playbook/tokens/_colors.scss +1 -1
- data/lib/playbook.rb +4 -1
- data/lib/playbook/forms.rb +3 -0
- data/lib/playbook/forms/builder.rb +31 -0
- data/{app/pb_kits/playbook/pb_form/form_builder → lib/playbook/forms/builder}/action_area.rb +2 -2
- data/lib/playbook/forms/builder/checkbox_field.rb +32 -0
- data/lib/playbook/forms/builder/collection_select_field.rb +19 -0
- data/lib/playbook/forms/builder/date_picker_field.rb +37 -0
- data/{app/pb_kits/playbook/pb_form/form_builder → lib/playbook/forms/builder}/form_field_builder.rb +2 -2
- data/lib/playbook/forms/builder/select_field.rb +19 -0
- data/lib/playbook/forms/builder/typeahead_field.rb +12 -0
- data/lib/playbook/pb_forms_helper.rb +41 -0
- data/lib/playbook/pb_kit_helper.rb +2 -0
- data/lib/playbook/props/base.rb +1 -1
- data/lib/playbook/version.rb +1 -2
- metadata +90 -61
- data/app/pb_kits/playbook/pb_form/docs/_form_simple_form.html.erb +0 -60
- data/app/pb_kits/playbook/pb_form/docs/_form_simple_form_validate.html.erb +0 -61
- data/app/pb_kits/playbook/pb_form/docs/_form_simple_form_validate.md +0 -1
- data/app/pb_kits/playbook/pb_form/form_builder.rb +0 -31
- data/app/pb_kits/playbook/pb_form/form_builder/checkbox_field.rb +0 -34
- data/app/pb_kits/playbook/pb_form/form_builder/collection_select_field.rb +0 -21
- data/app/pb_kits/playbook/pb_form/form_builder/date_picker_field.rb +0 -39
- data/app/pb_kits/playbook/pb_form/form_builder/select_field.rb +0 -21
- data/app/pb_kits/playbook/pb_form/form_builder/typeahead_field.rb +0 -14
- data/app/pb_kits/playbook/pb_form/form_with.html.erb +0 -11
- data/app/pb_kits/playbook/pb_form/form_with.rb +0 -40
- data/app/pb_kits/playbook/pb_form/simple_form.html.erb +0 -11
- 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: .
|
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
|
-
|
44
|
-
-
|
45
|
-
transition: background-color
|
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
|
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:
|
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:
|
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:
|
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: #
|
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,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
|
@@ -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
|
@@ -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,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
|