playbook_ui_docs 16.7.0 → 16.8.0.pre.alpha.PLAY2945selectformblankselection16424
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/app/pb_kits/playbook/pb_advanced_table/docs/_playground.json +178 -5840
- data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.overrides.json +4 -29
- data/app/pb_kits/playbook/pb_date/docs/_playground.json +13 -17
- data/app/pb_kits/playbook/pb_date/docs/_playground.overrides.json +13 -16
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.html.erb +0 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.jsx +0 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/_playground.json +136 -42
- data/app/pb_kits/playbook/pb_date_picker/docs/_playground.overrides.json +113 -45
- data/app/pb_kits/playbook/pb_date_range_inline/docs/_playground.json +48 -6
- data/app/pb_kits/playbook/pb_date_range_inline/docs/_playground.overrides.json +57 -0
- data/app/pb_kits/playbook/pb_date_range_stacked/docs/_playground.json +28 -5
- data/app/pb_kits/playbook/pb_date_range_stacked/docs/_playground.overrides.json +38 -0
- data/app/pb_kits/playbook/pb_date_stacked/docs/_playground.json +1 -1
- data/app/pb_kits/playbook/pb_date_stacked/docs/_playground.overrides.json +1 -1
- data/app/pb_kits/playbook/pb_date_time/docs/_playground.json +16 -3
- data/app/pb_kits/playbook/pb_date_time/docs/_playground.overrides.json +16 -3
- data/app/pb_kits/playbook/pb_date_time_stacked/docs/_playground.json +11 -15
- data/app/pb_kits/playbook/pb_date_time_stacked/docs/_playground.overrides.json +11 -15
- data/app/pb_kits/playbook/pb_date_year_stacked/docs/_playground.json +4 -4
- data/app/pb_kits/playbook/pb_date_year_stacked/docs/_playground.overrides.json +4 -4
- data/app/pb_kits/playbook/pb_detail/docs/_playground.json +12 -18
- data/app/pb_kits/playbook/pb_detail/docs/_playground.overrides.json +13 -12
- data/app/pb_kits/playbook/pb_dialog/docs/_playground.json +108 -42
- data/app/pb_kits/playbook/pb_dialog/docs/_playground.overrides.json +88 -40
- data/app/pb_kits/playbook/pb_distribution_bar/docs/_playground.json +65 -7
- data/app/pb_kits/playbook/pb_distribution_bar/docs/_playground.overrides.json +45 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_playground.json +318 -21
- data/app/pb_kits/playbook/pb_dropdown/docs/_playground.overrides.json +192 -19
- data/app/pb_kits/playbook/pb_empty_state/docs/_playground.json +77 -12
- data/app/pb_kits/playbook/pb_empty_state/docs/_playground.overrides.json +79 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/_playground.json +98 -13
- data/app/pb_kits/playbook/pb_file_upload/docs/_playground.overrides.json +99 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_select_examples.html.erb +31 -0
- data/app/pb_kits/playbook/pb_form/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_link/docs/_playground.json +81 -40
- data/app/pb_kits/playbook/pb_link/docs/_playground.overrides.json +88 -30
- data/app/pb_kits/playbook/pb_phone_number_input/docs/_playground.json +4 -2
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_default.html.erb +1 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_default.md +12 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_simple.html.erb +9 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_simple.md +8 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_title/docs/_playground.json +72 -23
- data/app/pb_kits/playbook/pb_title/docs/_playground.overrides.json +80 -16
- metadata +12 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"defaults": {
|
|
3
|
+
"accept": {},
|
|
4
|
+
"dark": false
|
|
5
|
+
},
|
|
6
|
+
"hiddenProps": [
|
|
7
|
+
"fileRejections",
|
|
8
|
+
"getInputProps",
|
|
9
|
+
"getRootProps",
|
|
10
|
+
"isDragActive",
|
|
11
|
+
"onFilesAccepted",
|
|
12
|
+
"onFilesRejected"
|
|
13
|
+
],
|
|
14
|
+
"groups": [
|
|
15
|
+
{
|
|
16
|
+
"name": "Guidance",
|
|
17
|
+
"props": ["customMessage", "accept", "acceptedFilesDescription", "maxSize"]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "State",
|
|
21
|
+
"props": ["error", "dark"]
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"presets": [
|
|
25
|
+
{
|
|
26
|
+
"name": "Default",
|
|
27
|
+
"props": {}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "Accepted Types",
|
|
31
|
+
"props": {
|
|
32
|
+
"accept": {
|
|
33
|
+
"image/svg+xml": [".svg", ".xml"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "Custom Description",
|
|
39
|
+
"props": {
|
|
40
|
+
"accept": {
|
|
41
|
+
"application/pdf": [".pdf"],
|
|
42
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [".xlsx"]
|
|
43
|
+
},
|
|
44
|
+
"acceptedFilesDescription": "Adobe (.pdf) and Microsoft (.xlsx)"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "Custom Message",
|
|
49
|
+
"props": {
|
|
50
|
+
"customMessage": "Playbook is awesome!"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "Max File Size",
|
|
55
|
+
"props": {
|
|
56
|
+
"accept": {
|
|
57
|
+
"application/pdf": [".pdf"]
|
|
58
|
+
},
|
|
59
|
+
"maxSize": 1000000
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "Error State",
|
|
64
|
+
"props": {
|
|
65
|
+
"error": "Please upload a valid file"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
"conditionals": {
|
|
70
|
+
"acceptedFilesDescription": { "requires": "accept" }
|
|
71
|
+
},
|
|
72
|
+
"hints": {
|
|
73
|
+
"accepted_types_info": {
|
|
74
|
+
"presetName": "Accepted Types",
|
|
75
|
+
"message": "Use MIME-type keys with extension arrays for accept, for example { image/svg+xml: ['.svg', '.xml'] }.",
|
|
76
|
+
"type": "info"
|
|
77
|
+
},
|
|
78
|
+
"custom_description_info": {
|
|
79
|
+
"presetName": "Custom Description",
|
|
80
|
+
"message": "acceptedFilesDescription only changes the helper copy. File validation still comes from the accept object.",
|
|
81
|
+
"type": "info"
|
|
82
|
+
},
|
|
83
|
+
"custom_message_info": {
|
|
84
|
+
"presetName": "Custom Message",
|
|
85
|
+
"message": "customMessage replaces the built-in guidance, including accepted types and max file size text.",
|
|
86
|
+
"type": "info"
|
|
87
|
+
},
|
|
88
|
+
"max_size_info": {
|
|
89
|
+
"presetName": "Max File Size",
|
|
90
|
+
"message": "maxSize is measured in bytes. In app code, pair it with onFilesRejected to surface rejection details.",
|
|
91
|
+
"type": "warning"
|
|
92
|
+
},
|
|
93
|
+
"error_state_info": {
|
|
94
|
+
"presetName": "Error State",
|
|
95
|
+
"message": "Use the error prop for validation or server feedback below the dropzone.",
|
|
96
|
+
"type": "info"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<%
|
|
2
|
+
example_collection = [
|
|
3
|
+
OpenStruct.new(name: "Alabama", value: 1),
|
|
4
|
+
OpenStruct.new(name: "Alaska", value: 2),
|
|
5
|
+
OpenStruct.new(name: "Arizona", value: 3),
|
|
6
|
+
OpenStruct.new(name: "Arkansas", value: 4),
|
|
7
|
+
OpenStruct.new(name: "California", value: 5),
|
|
8
|
+
OpenStruct.new(name: "Colorado", value: 6),
|
|
9
|
+
OpenStruct.new(name: "Connecticut", value: 7),
|
|
10
|
+
OpenStruct.new(name: "Delaware", value: 8),
|
|
11
|
+
OpenStruct.new(name: "Florida", value: 9),
|
|
12
|
+
OpenStruct.new(name: "Georgia", value: 10),
|
|
13
|
+
]
|
|
14
|
+
%>
|
|
15
|
+
|
|
16
|
+
<%= pb_form_with(scope: :example, url: "", method: :get) do |form| %>
|
|
17
|
+
<%= form.select :example_select, [ ["Yes", 1], ["No", 2], ["Maybe", 3] ], props: { label: "Select Default" } %>
|
|
18
|
+
<%= form.select :example_select_2, [ ["Yes", 1], ["No", 2], ["Maybe", 3] ], props: { label: "Select with Blank Selection", blank_selection: "Blank selection..." } %>
|
|
19
|
+
<%= form.select :example_select_3, [ ["Yes", 1], ["No", 2], ["Maybe", 3] ], { include_blank: "Include blank..." }, {}, props: { label: "Select with Include Blank" } %>
|
|
20
|
+
<%= form.collection_select :example_collection_select, example_collection, :value, :name, props: { label: "Collection Select Default" } %>
|
|
21
|
+
<%= form.collection_select :example_collection_select_2, example_collection, :value, :name, props: { label: "Collection Select with Blank Selection", blank_selection: "Blank selection..." } %>
|
|
22
|
+
<%= form.collection_select :example_collection_select_3, example_collection, :value, :name, { include_blank: "Include blank..." }, {}, props: { label: "Collection Select with Include Blank" } %>
|
|
23
|
+
<%= form.time_zone_select_field :example_time_zone_select, ActiveSupport::TimeZone.us_zones, props: { label: "Time Zone Select Default" } %>
|
|
24
|
+
<%= form.time_zone_select_field :example_time_zone_select_2, ActiveSupport::TimeZone.us_zones, { default: "Eastern Time (US & Canada)" }, props: { label: "Time Zone Select with a Default Selection" } %>
|
|
25
|
+
<%= form.time_zone_select_field :example_time_zone_select_3, ActiveSupport::TimeZone.us_zones, props: { label: "Time Zone Select with Blank Selection", blank_selection: "Blank selection..." } %>
|
|
26
|
+
<%= form.time_zone_select_field :example_time_zone_select_4, ActiveSupport::TimeZone.us_zones, { include_blank: "Include blank..." }, {}, props: { label: "Time Zone Select with Include Blank" } %>
|
|
27
|
+
<%= form.actions do |action| %>
|
|
28
|
+
<%= action.submit %>
|
|
29
|
+
<%= action.button props: { type: "reset", text: "Cancel", variant: "secondary" } %>
|
|
30
|
+
<% end %>
|
|
31
|
+
<% end %>
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
"color": "default",
|
|
6
6
|
"disabled": false,
|
|
7
7
|
"tag": "a",
|
|
8
|
-
"underline": false
|
|
8
|
+
"underline": false,
|
|
9
|
+
"href": "#link-example",
|
|
10
|
+
"text": "Link text"
|
|
9
11
|
},
|
|
10
12
|
"children": {
|
|
11
13
|
"editable": true,
|
|
@@ -28,6 +30,7 @@
|
|
|
28
30
|
"props": [
|
|
29
31
|
"href",
|
|
30
32
|
"target",
|
|
33
|
+
"disabled",
|
|
31
34
|
"tabIndex"
|
|
32
35
|
]
|
|
33
36
|
},
|
|
@@ -36,78 +39,95 @@
|
|
|
36
39
|
"props": [
|
|
37
40
|
"color",
|
|
38
41
|
"underline",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
42
|
+
"tag",
|
|
43
|
+
"dark"
|
|
41
44
|
]
|
|
42
45
|
}
|
|
43
46
|
],
|
|
44
47
|
"presets": [
|
|
45
48
|
{
|
|
46
49
|
"name": "Default",
|
|
47
|
-
"props": {
|
|
48
|
-
|
|
50
|
+
"props": {
|
|
51
|
+
"href": "#link-example",
|
|
52
|
+
"text": "Link text"
|
|
53
|
+
}
|
|
49
54
|
},
|
|
50
55
|
{
|
|
51
|
-
"name": "
|
|
56
|
+
"name": "Body color",
|
|
52
57
|
"props": {
|
|
53
|
-
"color": "
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
"color": "body",
|
|
59
|
+
"href": "#body-link",
|
|
60
|
+
"text": "Inline body link"
|
|
61
|
+
}
|
|
57
62
|
},
|
|
58
63
|
{
|
|
59
|
-
"name": "
|
|
64
|
+
"name": "Muted underline",
|
|
60
65
|
"props": {
|
|
61
|
-
"color": "
|
|
62
|
-
|
|
63
|
-
|
|
66
|
+
"color": "muted",
|
|
67
|
+
"href": "#secondary-link",
|
|
68
|
+
"underline": true,
|
|
69
|
+
"text": "Secondary link"
|
|
70
|
+
}
|
|
64
71
|
},
|
|
65
72
|
{
|
|
66
73
|
"name": "Destructive",
|
|
67
74
|
"props": {
|
|
68
|
-
"color": "destructive"
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
"color": "destructive",
|
|
76
|
+
"href": "#delete-account",
|
|
77
|
+
"text": "Delete account"
|
|
78
|
+
}
|
|
71
79
|
},
|
|
72
80
|
{
|
|
73
|
-
"name": "
|
|
81
|
+
"name": "Leading icon",
|
|
74
82
|
"props": {
|
|
75
83
|
"color": "default",
|
|
76
|
-
"
|
|
77
|
-
|
|
78
|
-
|
|
84
|
+
"href": "#continue",
|
|
85
|
+
"icon": "arrow-up-right-from-square",
|
|
86
|
+
"text": "Continue"
|
|
87
|
+
}
|
|
79
88
|
},
|
|
80
89
|
{
|
|
81
|
-
"name": "
|
|
90
|
+
"name": "Trailing icon",
|
|
82
91
|
"props": {
|
|
92
|
+
"href": "#details",
|
|
83
93
|
"icon": "plus",
|
|
84
|
-
"iconRight": "chevron-right"
|
|
85
|
-
|
|
86
|
-
|
|
94
|
+
"iconRight": "chevron-right",
|
|
95
|
+
"text": "Open document"
|
|
96
|
+
}
|
|
87
97
|
},
|
|
88
98
|
{
|
|
89
|
-
"name": "
|
|
99
|
+
"name": "Disabled",
|
|
90
100
|
"props": {
|
|
91
|
-
"
|
|
92
|
-
|
|
93
|
-
|
|
101
|
+
"disabled": true,
|
|
102
|
+
"href": "#disabled",
|
|
103
|
+
"text": "Disabled link"
|
|
104
|
+
}
|
|
94
105
|
},
|
|
95
106
|
{
|
|
96
|
-
"name": "
|
|
107
|
+
"name": "Heading tag",
|
|
97
108
|
"props": {
|
|
98
|
-
"href": "
|
|
99
|
-
"
|
|
100
|
-
|
|
101
|
-
|
|
109
|
+
"href": "#heading-link",
|
|
110
|
+
"icon": "arrow-up-right-from-square",
|
|
111
|
+
"tag": "h3",
|
|
112
|
+
"text": "Heading link"
|
|
113
|
+
}
|
|
102
114
|
},
|
|
103
115
|
{
|
|
104
116
|
"name": "External new tab",
|
|
105
117
|
"props": {
|
|
106
118
|
"href": "https://example.com",
|
|
107
119
|
"target": "_blank",
|
|
108
|
-
"icon": "arrow-up-right-from-square"
|
|
109
|
-
|
|
110
|
-
|
|
120
|
+
"icon": "arrow-up-right-from-square",
|
|
121
|
+
"text": "Example.com"
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"name": "Span tag",
|
|
126
|
+
"props": {
|
|
127
|
+
"href": "#span-link",
|
|
128
|
+
"tag": "span",
|
|
129
|
+
"text": "Span link example"
|
|
130
|
+
}
|
|
111
131
|
}
|
|
112
132
|
],
|
|
113
133
|
"conditionals": {
|
|
@@ -119,11 +139,32 @@
|
|
|
119
139
|
}
|
|
120
140
|
},
|
|
121
141
|
"hints": {
|
|
122
|
-
"
|
|
142
|
+
"external_target_info": {
|
|
143
|
+
"when": {
|
|
144
|
+
"target": "_blank"
|
|
145
|
+
},
|
|
146
|
+
"message": "Use target=\"_blank\" for external destinations that should open in a new tab.",
|
|
147
|
+
"type": "info"
|
|
148
|
+
},
|
|
149
|
+
"icon_pairing_info": {
|
|
150
|
+
"when": {
|
|
151
|
+
"iconRight": "chevron-right"
|
|
152
|
+
},
|
|
153
|
+
"message": "iconRight is available only when icon is also set, so the link can render a balanced icon treatment.",
|
|
154
|
+
"type": "info"
|
|
155
|
+
},
|
|
156
|
+
"disabled_info": {
|
|
157
|
+
"when": {
|
|
158
|
+
"disabled": true
|
|
159
|
+
},
|
|
160
|
+
"message": "Disabled links keep their visual treatment but should not be the only way to reach important actions.",
|
|
161
|
+
"type": "info"
|
|
162
|
+
},
|
|
163
|
+
"tag_semantics_info": {
|
|
123
164
|
"when": {
|
|
124
|
-
"
|
|
165
|
+
"tag": "h3"
|
|
125
166
|
},
|
|
126
|
-
"message": "
|
|
167
|
+
"message": "Use tag to borrow link styling on semantic headings or inline text, but keep href when the element should still navigate.",
|
|
127
168
|
"type": "info"
|
|
128
169
|
}
|
|
129
170
|
}
|
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
"children": {
|
|
3
3
|
"default": "Link text"
|
|
4
4
|
},
|
|
5
|
+
"defaults": {
|
|
6
|
+
"color": "default",
|
|
7
|
+
"disabled": false,
|
|
8
|
+
"href": "#link-example",
|
|
9
|
+
"tag": "a",
|
|
10
|
+
"text": "Link text",
|
|
11
|
+
"underline": false
|
|
12
|
+
},
|
|
5
13
|
"groups": [
|
|
6
14
|
{
|
|
7
15
|
"name": "Content",
|
|
@@ -9,62 +17,97 @@
|
|
|
9
17
|
},
|
|
10
18
|
{
|
|
11
19
|
"name": "Behavior",
|
|
12
|
-
"props": ["href", "target", "tabIndex"]
|
|
20
|
+
"props": ["href", "target", "disabled", "tabIndex"]
|
|
13
21
|
},
|
|
14
22
|
{
|
|
15
23
|
"name": "Appearance",
|
|
16
|
-
"props": ["color", "underline", "
|
|
24
|
+
"props": ["color", "underline", "tag", "dark"]
|
|
17
25
|
}
|
|
18
26
|
],
|
|
19
27
|
"presets": [
|
|
20
28
|
{
|
|
21
29
|
"name": "Default",
|
|
22
|
-
"props": {
|
|
23
|
-
|
|
30
|
+
"props": {
|
|
31
|
+
"href": "#link-example",
|
|
32
|
+
"text": "Link text"
|
|
33
|
+
}
|
|
24
34
|
},
|
|
25
35
|
{
|
|
26
|
-
"name": "
|
|
27
|
-
"props": {
|
|
28
|
-
|
|
36
|
+
"name": "Body color",
|
|
37
|
+
"props": {
|
|
38
|
+
"color": "body",
|
|
39
|
+
"href": "#body-link",
|
|
40
|
+
"text": "Inline body link"
|
|
41
|
+
}
|
|
29
42
|
},
|
|
30
43
|
{
|
|
31
|
-
"name": "
|
|
32
|
-
"props": {
|
|
33
|
-
|
|
44
|
+
"name": "Muted underline",
|
|
45
|
+
"props": {
|
|
46
|
+
"color": "muted",
|
|
47
|
+
"href": "#secondary-link",
|
|
48
|
+
"underline": true,
|
|
49
|
+
"text": "Secondary link"
|
|
50
|
+
}
|
|
34
51
|
},
|
|
35
52
|
{
|
|
36
53
|
"name": "Destructive",
|
|
37
|
-
"props": {
|
|
38
|
-
|
|
54
|
+
"props": {
|
|
55
|
+
"color": "destructive",
|
|
56
|
+
"href": "#delete-account",
|
|
57
|
+
"text": "Delete account"
|
|
58
|
+
}
|
|
39
59
|
},
|
|
40
60
|
{
|
|
41
|
-
"name": "
|
|
42
|
-
"props": {
|
|
43
|
-
|
|
61
|
+
"name": "Leading icon",
|
|
62
|
+
"props": {
|
|
63
|
+
"color": "default",
|
|
64
|
+
"href": "#continue",
|
|
65
|
+
"icon": "arrow-up-right-from-square",
|
|
66
|
+
"text": "Continue"
|
|
67
|
+
}
|
|
44
68
|
},
|
|
45
69
|
{
|
|
46
|
-
"name": "
|
|
47
|
-
"props": {
|
|
48
|
-
|
|
70
|
+
"name": "Trailing icon",
|
|
71
|
+
"props": {
|
|
72
|
+
"href": "#details",
|
|
73
|
+
"icon": "plus",
|
|
74
|
+
"iconRight": "chevron-right",
|
|
75
|
+
"text": "Open document"
|
|
76
|
+
}
|
|
49
77
|
},
|
|
50
78
|
{
|
|
51
|
-
"name": "
|
|
52
|
-
"props": {
|
|
53
|
-
|
|
79
|
+
"name": "Disabled",
|
|
80
|
+
"props": {
|
|
81
|
+
"disabled": true,
|
|
82
|
+
"href": "#disabled",
|
|
83
|
+
"text": "Disabled link"
|
|
84
|
+
}
|
|
54
85
|
},
|
|
55
86
|
{
|
|
56
|
-
"name": "
|
|
57
|
-
"props": {
|
|
58
|
-
|
|
87
|
+
"name": "Heading tag",
|
|
88
|
+
"props": {
|
|
89
|
+
"href": "#heading-link",
|
|
90
|
+
"icon": "arrow-up-right-from-square",
|
|
91
|
+
"tag": "h3",
|
|
92
|
+
"text": "Heading link"
|
|
93
|
+
}
|
|
59
94
|
},
|
|
60
95
|
{
|
|
61
96
|
"name": "External new tab",
|
|
62
97
|
"props": {
|
|
63
98
|
"href": "https://example.com",
|
|
64
99
|
"target": "_blank",
|
|
65
|
-
"icon": "arrow-up-right-from-square"
|
|
66
|
-
|
|
67
|
-
|
|
100
|
+
"icon": "arrow-up-right-from-square",
|
|
101
|
+
"text": "Example.com"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "Span tag",
|
|
106
|
+
"props": {
|
|
107
|
+
"href": "#span-link",
|
|
108
|
+
"tag": "span",
|
|
109
|
+
"text": "Span link example"
|
|
110
|
+
}
|
|
68
111
|
}
|
|
69
112
|
],
|
|
70
113
|
"conditionals": {
|
|
@@ -72,9 +115,24 @@
|
|
|
72
115
|
"iconRight": { "requires": "icon" }
|
|
73
116
|
},
|
|
74
117
|
"hints": {
|
|
75
|
-
"
|
|
76
|
-
"when": { "target":
|
|
77
|
-
"message": "
|
|
118
|
+
"external_target_info": {
|
|
119
|
+
"when": { "target": "_blank" },
|
|
120
|
+
"message": "Use target=\"_blank\" for external destinations that should open in a new tab.",
|
|
121
|
+
"type": "info"
|
|
122
|
+
},
|
|
123
|
+
"icon_pairing_info": {
|
|
124
|
+
"when": { "iconRight": "chevron-right" },
|
|
125
|
+
"message": "iconRight is available only when icon is also set, so the link can render a balanced icon treatment.",
|
|
126
|
+
"type": "info"
|
|
127
|
+
},
|
|
128
|
+
"disabled_info": {
|
|
129
|
+
"when": { "disabled": true },
|
|
130
|
+
"message": "Disabled links keep their visual treatment but should not be the only way to reach important actions.",
|
|
131
|
+
"type": "info"
|
|
132
|
+
},
|
|
133
|
+
"tag_semantics_info": {
|
|
134
|
+
"when": { "tag": "h3" },
|
|
135
|
+
"message": "Use tag to borrow link styling on semantic headings or inline text, but keep href when the element should still navigate.",
|
|
78
136
|
"type": "info"
|
|
79
137
|
}
|
|
80
138
|
}
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"value": "",
|
|
14
14
|
"formatAsYouType": false,
|
|
15
15
|
"strictMode": false,
|
|
16
|
-
"countrySearch": false
|
|
16
|
+
"countrySearch": false,
|
|
17
|
+
"showPlaceholder": false
|
|
17
18
|
},
|
|
18
19
|
"groups": [
|
|
19
20
|
{
|
|
@@ -37,7 +38,8 @@
|
|
|
37
38
|
"value",
|
|
38
39
|
"formatAsYouType",
|
|
39
40
|
"strictMode",
|
|
40
|
-
"countrySearch"
|
|
41
|
+
"countrySearch",
|
|
42
|
+
"showPlaceholder"
|
|
41
43
|
]
|
|
42
44
|
}
|
|
43
45
|
],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= pb_rails("rich_text_editor", props: { input_options: { id: 'hidden_input_id', name: "hidden_input_name" }, value: "Add your text here. You can format your text, add links, quotes, and bullets." }) %>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
The Rails rich text editor is a TipTap surface with no React. The UI (toolbar, block-style menu, formatting actions) is rendered with Playbook Rails kits (`pb_rails`). The editor document is a vanilla TipTap `Editor` instance; HTML is synced to a hidden `<input>` so standard Rails forms can submit the value.
|
|
2
|
+
|
|
3
|
+
### How TipTap is loaded (Rails)
|
|
4
|
+
|
|
5
|
+
- The kit’s module script (`rich_text_editor_rails.js`) uses `import()` with **full URLs** on [esm.sh](https://esm.sh) (e.g. `@tiptap/core@2.8.0`). esm.sh resolves dependencies server-side, so **no `<script type="importmap">`** is required—this avoids conflicts when the host page already has an import map (e.g. Vite in dev, or another app map) because Firefox only applies one native map.
|
|
6
|
+
- You do not need TipTap in your app’s npm dependencies or Gemfile for this kit; the browser loads modules from esm.sh when the page runs.
|
|
7
|
+
- Ensure **CSP** allows loading scripts from `https://esm.sh` (and esm.sh’s redirected module URLs) if you use a strict `script-src` / `connect-src`.
|
|
8
|
+
|
|
9
|
+
### Relation to the React implementation
|
|
10
|
+
|
|
11
|
+
- Same core: both use TipTap v2 on top of ProseMirror; styling lives in Playbook SCSS (`_tiptap_styles.scss`) so the editor chrome lines up between platforms.
|
|
12
|
+
- Different shell: Rails uses ERB + Playbook Rails components + inline module script. React uses `RichTextEditor` / `_tiptap_editor.tsx` and TipTap wired through the bundled Playbook React package—see Advanced Default for that stack and when you need TipTap installed in your JavaScript bundle.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
### Simple toolbar (`simple: true`)
|
|
2
|
+
|
|
3
|
+
Pass **`simple: true`** for a compact toolbar: **Bold**, **Italic**, **Undo**, and **Redo** (same history controls as the full toolbar—plain buttons, not popovers).
|
|
4
|
+
|
|
5
|
+
- No block-style dropdown (no “Paragraph” / headings / lists in the menu).
|
|
6
|
+
- No **`pb_popover`** on the toolbar—useful in **native `<dialog>`** modals, turbo-loaded panels, or other tight layouts where the full block menu is awkward to position.
|
|
7
|
+
|
|
8
|
+
The underlying TipTap document still accepts the same HTML as the default Rails editor; `simple` only changes which **toolbar controls** are shown.
|