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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.json +178 -5840
  3. data/app/pb_kits/playbook/pb_advanced_table/docs/_playground.overrides.json +4 -29
  4. data/app/pb_kits/playbook/pb_date/docs/_playground.json +13 -17
  5. data/app/pb_kits/playbook/pb_date/docs/_playground.overrides.json +13 -16
  6. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.html.erb +0 -2
  7. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.jsx +0 -2
  8. data/app/pb_kits/playbook/pb_date_picker/docs/_playground.json +136 -42
  9. data/app/pb_kits/playbook/pb_date_picker/docs/_playground.overrides.json +113 -45
  10. data/app/pb_kits/playbook/pb_date_range_inline/docs/_playground.json +48 -6
  11. data/app/pb_kits/playbook/pb_date_range_inline/docs/_playground.overrides.json +57 -0
  12. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_playground.json +28 -5
  13. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_playground.overrides.json +38 -0
  14. data/app/pb_kits/playbook/pb_date_stacked/docs/_playground.json +1 -1
  15. data/app/pb_kits/playbook/pb_date_stacked/docs/_playground.overrides.json +1 -1
  16. data/app/pb_kits/playbook/pb_date_time/docs/_playground.json +16 -3
  17. data/app/pb_kits/playbook/pb_date_time/docs/_playground.overrides.json +16 -3
  18. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_playground.json +11 -15
  19. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_playground.overrides.json +11 -15
  20. data/app/pb_kits/playbook/pb_date_year_stacked/docs/_playground.json +4 -4
  21. data/app/pb_kits/playbook/pb_date_year_stacked/docs/_playground.overrides.json +4 -4
  22. data/app/pb_kits/playbook/pb_detail/docs/_playground.json +12 -18
  23. data/app/pb_kits/playbook/pb_detail/docs/_playground.overrides.json +13 -12
  24. data/app/pb_kits/playbook/pb_dialog/docs/_playground.json +108 -42
  25. data/app/pb_kits/playbook/pb_dialog/docs/_playground.overrides.json +88 -40
  26. data/app/pb_kits/playbook/pb_distribution_bar/docs/_playground.json +65 -7
  27. data/app/pb_kits/playbook/pb_distribution_bar/docs/_playground.overrides.json +45 -0
  28. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.json +318 -21
  29. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.overrides.json +192 -19
  30. data/app/pb_kits/playbook/pb_empty_state/docs/_playground.json +77 -12
  31. data/app/pb_kits/playbook/pb_empty_state/docs/_playground.overrides.json +79 -0
  32. data/app/pb_kits/playbook/pb_file_upload/docs/_playground.json +98 -13
  33. data/app/pb_kits/playbook/pb_file_upload/docs/_playground.overrides.json +99 -0
  34. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_select_examples.html.erb +31 -0
  35. data/app/pb_kits/playbook/pb_form/docs/example.yml +1 -0
  36. data/app/pb_kits/playbook/pb_link/docs/_playground.json +81 -40
  37. data/app/pb_kits/playbook/pb_link/docs/_playground.overrides.json +88 -30
  38. data/app/pb_kits/playbook/pb_phone_number_input/docs/_playground.json +4 -2
  39. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_default.html.erb +1 -0
  40. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_default.md +12 -0
  41. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_simple.html.erb +9 -0
  42. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_rails_simple.md +8 -0
  43. data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +2 -0
  44. data/app/pb_kits/playbook/pb_title/docs/_playground.json +72 -23
  45. data/app/pb_kits/playbook/pb_title/docs/_playground.overrides.json +80 -16
  46. 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 %>
@@ -1,6 +1,7 @@
1
1
  examples:
2
2
 
3
3
  rails:
4
+ - form_form_with_select_examples: Select Examples
4
5
  - form_form_with: Default
5
6
  - form_form_with_validate: Default + Validation
6
7
  - form_form_with_validation_msg: Validation + Custom Validation Message
@@ -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
- "disabled",
40
- "tag"
42
+ "tag",
43
+ "dark"
41
44
  ]
42
45
  }
43
46
  ],
44
47
  "presets": [
45
48
  {
46
49
  "name": "Default",
47
- "props": {},
48
- "children": "Link text"
50
+ "props": {
51
+ "href": "#link-example",
52
+ "text": "Link text"
53
+ }
49
54
  },
50
55
  {
51
- "name": "Muted underline",
56
+ "name": "Body color",
52
57
  "props": {
53
- "color": "muted",
54
- "underline": true
55
- },
56
- "children": "Secondary link"
58
+ "color": "body",
59
+ "href": "#body-link",
60
+ "text": "Inline body link"
61
+ }
57
62
  },
58
63
  {
59
- "name": "Body color",
64
+ "name": "Muted underline",
60
65
  "props": {
61
- "color": "body"
62
- },
63
- "children": "Inline body link"
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
- "children": "Delete account"
75
+ "color": "destructive",
76
+ "href": "#delete-account",
77
+ "text": "Delete account"
78
+ }
71
79
  },
72
80
  {
73
- "name": "With icon",
81
+ "name": "Leading icon",
74
82
  "props": {
75
83
  "color": "default",
76
- "icon": "arrow-up-right-from-square"
77
- },
78
- "children": "Continue"
84
+ "href": "#continue",
85
+ "icon": "arrow-up-right-from-square",
86
+ "text": "Continue"
87
+ }
79
88
  },
80
89
  {
81
- "name": "Icon both sides",
90
+ "name": "Trailing icon",
82
91
  "props": {
92
+ "href": "#details",
83
93
  "icon": "plus",
84
- "iconRight": "chevron-right"
85
- },
86
- "children": "Open document"
94
+ "iconRight": "chevron-right",
95
+ "text": "Open document"
96
+ }
87
97
  },
88
98
  {
89
- "name": "As heading tag",
99
+ "name": "Disabled",
90
100
  "props": {
91
- "tag": "span"
92
- },
93
- "children": "Styled as link"
101
+ "disabled": true,
102
+ "href": "#disabled",
103
+ "text": "Disabled link"
104
+ }
94
105
  },
95
106
  {
96
- "name": "With href",
107
+ "name": "Heading tag",
97
108
  "props": {
98
- "href": "/dashboard",
99
- "color": "default"
100
- },
101
- "children": "Go to dashboard"
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
- "children": "Example.com"
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
- "target_needs_href": {
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
- "target": true
165
+ "tag": "h3"
125
166
  },
126
- "message": "The target attribute only applies when href is set.",
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", "disabled", "tag"]
24
+ "props": ["color", "underline", "tag", "dark"]
17
25
  }
18
26
  ],
19
27
  "presets": [
20
28
  {
21
29
  "name": "Default",
22
- "props": {},
23
- "children": "Link text"
30
+ "props": {
31
+ "href": "#link-example",
32
+ "text": "Link text"
33
+ }
24
34
  },
25
35
  {
26
- "name": "Muted underline",
27
- "props": { "color": "muted", "underline": true },
28
- "children": "Secondary link"
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": "Body color",
32
- "props": { "color": "body" },
33
- "children": "Inline body link"
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": { "color": "destructive" },
38
- "children": "Delete account"
54
+ "props": {
55
+ "color": "destructive",
56
+ "href": "#delete-account",
57
+ "text": "Delete account"
58
+ }
39
59
  },
40
60
  {
41
- "name": "With icon",
42
- "props": { "color": "default", "icon": "arrow-up-right-from-square" },
43
- "children": "Continue"
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": "Icon both sides",
47
- "props": { "icon": "plus", "iconRight": "chevron-right" },
48
- "children": "Open document"
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": "As heading tag",
52
- "props": { "tag": "span" },
53
- "children": "Styled as link"
79
+ "name": "Disabled",
80
+ "props": {
81
+ "disabled": true,
82
+ "href": "#disabled",
83
+ "text": "Disabled link"
84
+ }
54
85
  },
55
86
  {
56
- "name": "With href",
57
- "props": { "href": "/dashboard", "color": "default" },
58
- "children": "Go to dashboard"
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
- "children": "Example.com"
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
- "target_needs_href": {
76
- "when": { "target": true },
77
- "message": "The target attribute only applies when href is set.",
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,9 @@
1
+ <%= pb_rails("rich_text_editor", props: {
2
+ simple: true,
3
+ label: "Notes",
4
+ input_options: {
5
+ id: "rails_rte_simple_demo",
6
+ name: "content",
7
+ },
8
+ value: "<p>Use <strong>Bold</strong> and <em>Italic</em> from the toolbar.</p>",
9
+ }) %>
@@ -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.
@@ -1,6 +1,8 @@
1
1
  examples:
2
2
 
3
3
  rails:
4
+ - rich_text_editor_rails_default: "Rails (TipTap)"
5
+ - rich_text_editor_rails_simple: "Rails (TipTap — Simple toolbar)"
4
6
 
5
7
  react:
6
8
  - rich_text_editor_advanced_default: Advanced Default