b4um_generators 0.1.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.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +28 -0
  4. data/CHANGELOG.md +5 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.de.md +821 -0
  7. data/README.md +815 -0
  8. data/Rakefile +12 -0
  9. data/b4um_generators.gemspec +30 -0
  10. data/bin/console +11 -0
  11. data/bin/setup +8 -0
  12. data/lib/b4um_generators/version.rb +5 -0
  13. data/lib/b4um_generators.rb +8 -0
  14. data/lib/generators/b4um/bento/bento_generator.rb +81 -0
  15. data/lib/generators/b4um/bento/templates/_alternating.html.erb.tt +15 -0
  16. data/lib/generators/b4um/bento/templates/_bento.html.erb.tt +26 -0
  17. data/lib/generators/b4um/bento/templates/_grid.html.erb.tt +13 -0
  18. data/lib/generators/b4um/bento/templates/_list.html.erb.tt +15 -0
  19. data/lib/generators/b4um/comments/comments_generator.rb +259 -0
  20. data/lib/generators/b4um/comments/templates/_comments.html.erb.tt +63 -0
  21. data/lib/generators/b4um/comments/templates/comment.rb.tt +5 -0
  22. data/lib/generators/b4um/comments/templates/comments_controller.rb.tt +45 -0
  23. data/lib/generators/b4um/comments/templates/create_comments.rb.tt +14 -0
  24. data/lib/generators/b4um/controller/controller_generator.rb +397 -0
  25. data/lib/generators/b4um/help/help_generator.rb +755 -0
  26. data/lib/generators/b4um/infinite_scroll/infinite_scroll_generator.rb +199 -0
  27. data/lib/generators/b4um/infinite_scroll/templates/infinite_scroll_controller.js +61 -0
  28. data/lib/generators/b4um/install/install_generator.rb +492 -0
  29. data/lib/generators/b4um/install/templates/_cookie_consent.html.erb +27 -0
  30. data/lib/generators/b4um/install/templates/_footer.html.erb +17 -0
  31. data/lib/generators/b4um/install/templates/_hero.html.erb +33 -0
  32. data/lib/generators/b4um/install/templates/_navigation.html.erb +31 -0
  33. data/lib/generators/b4um/install/templates/_sitemap.html.erb +48 -0
  34. data/lib/generators/b4um/install/templates/_theme_switcher.html.erb +57 -0
  35. data/lib/generators/b4um/install/templates/b4um/badges.css +43 -0
  36. data/lib/generators/b4um/install/templates/b4um/base.css +42 -0
  37. data/lib/generators/b4um/install/templates/b4um/callouts.css +58 -0
  38. data/lib/generators/b4um/install/templates/b4um/cards.css +401 -0
  39. data/lib/generators/b4um/install/templates/b4um/comments.css +52 -0
  40. data/lib/generators/b4um/install/templates/b4um/cookie-consent.css +83 -0
  41. data/lib/generators/b4um/install/templates/b4um/empty-state.css +26 -0
  42. data/lib/generators/b4um/install/templates/b4um/flash.css +86 -0
  43. data/lib/generators/b4um/install/templates/b4um/footer.css +338 -0
  44. data/lib/generators/b4um/install/templates/b4um/forms.css +924 -0
  45. data/lib/generators/b4um/install/templates/b4um/hero.css +149 -0
  46. data/lib/generators/b4um/install/templates/b4um/layout.css +166 -0
  47. data/lib/generators/b4um/install/templates/b4um/lightbox.css +268 -0
  48. data/lib/generators/b4um/install/templates/b4um/navigation.css +257 -0
  49. data/lib/generators/b4um/install/templates/b4um/pagination.css +85 -0
  50. data/lib/generators/b4um/install/templates/b4um/resources.css +121 -0
  51. data/lib/generators/b4um/install/templates/b4um/search.css +41 -0
  52. data/lib/generators/b4um/install/templates/b4um/tables.css +67 -0
  53. data/lib/generators/b4um/install/templates/b4um/theme-switcher.css +178 -0
  54. data/lib/generators/b4um/install/templates/b4um/theme.css +132 -0
  55. data/lib/generators/b4um/install/templates/b4um.css +20 -0
  56. data/lib/generators/b4um/install/templates/b4um.yml +12 -0
  57. data/lib/generators/b4um/install/templates/b4um_helper.rb +27 -0
  58. data/lib/generators/b4um/install/templates/cookie_consent_controller.js +76 -0
  59. data/lib/generators/b4um/install/templates/dismissible_controller.js +7 -0
  60. data/lib/generators/b4um/install/templates/image_lightbox_controller.js +414 -0
  61. data/lib/generators/b4um/install/templates/image_preview_controller.js +85 -0
  62. data/lib/generators/b4um/install/templates/navigation_controller.js +25 -0
  63. data/lib/generators/b4um/install/templates/navigation_helper.rb +26 -0
  64. data/lib/generators/b4um/install/templates/sitemap_controller.js +35 -0
  65. data/lib/generators/b4um/install/templates/theme_controller.js +122 -0
  66. data/lib/generators/b4um/pagination/pagination_generator.rb +179 -0
  67. data/lib/generators/b4um/pagination/templates/_pagination.html.erb.tt +48 -0
  68. data/lib/generators/b4um/pagination/templates/pagination.rb +36 -0
  69. data/lib/generators/b4um/scaffold/scaffold_generator.rb +333 -0
  70. data/lib/generators/b4um/scaffold/templates/_bento.html.erb.tt +26 -0
  71. data/lib/generators/b4um/scaffold/templates/_form.html.erb.tt +218 -0
  72. data/lib/generators/b4um/scaffold/templates/_resource.html.erb.tt +144 -0
  73. data/lib/generators/b4um/scaffold/templates/_table.html.erb.tt +40 -0
  74. data/lib/generators/b4um/scaffold/templates/edit.html.erb.tt +21 -0
  75. data/lib/generators/b4um/scaffold/templates/index.html.erb.tt +24 -0
  76. data/lib/generators/b4um/scaffold/templates/new.html.erb.tt +17 -0
  77. data/lib/generators/b4um/scaffold/templates/show.html.erb.tt +31 -0
  78. data/lib/generators/b4um/search/search_generator.rb +165 -0
  79. data/lib/generators/b4um/search/templates/search.rb +34 -0
  80. data/lib/generators/b4um/search/templates/search_form.html.erb.tt +15 -0
  81. data/lib/generators/b4um/table/table_generator.rb +63 -0
  82. data/lib/generators/b4um/table/templates/_table.html.erb.tt +40 -0
  83. data/lib/generators/b4um/trix/templates/b4um_rich_text_helper.rb +58 -0
  84. data/lib/generators/b4um/trix/templates/b4um_trix.js +551 -0
  85. data/lib/generators/b4um/trix/trix_generator.rb +383 -0
  86. data/sig/b4um_generators.rbs +4 -0
  87. metadata +148 -0
@@ -0,0 +1,257 @@
1
+ /* -------------------------------------------------------
2
+ Navigation
3
+ ------------------------------------------------------- */
4
+
5
+ .navigation {
6
+ position: sticky;
7
+ top: 0;
8
+ z-index: 1000;
9
+
10
+ width: 100%;
11
+ background-color: var(--b4um-surface);
12
+ box-shadow: 0 2px 8px var(--b4um-primary-shadow-soft);
13
+ }
14
+
15
+ .navigation__inner {
16
+ width: 75%;
17
+ margin: 0 auto;
18
+ padding: 14px 40px;
19
+ box-sizing: border-box;
20
+
21
+ display: flex;
22
+ align-items: center;
23
+ justify-content: space-between;
24
+ gap: 2rem;
25
+ }
26
+
27
+ .navigation__brand {
28
+ color: var(--b4um-primary);
29
+ font-size: 1.2rem;
30
+ font-weight: 700;
31
+ text-decoration: none;
32
+ }
33
+
34
+ .navigation__brand:visited {
35
+ color: var(--b4um-primary);
36
+ }
37
+
38
+ .navigation__brand:hover {
39
+ color: var(--b4um-primary-hover);
40
+ }
41
+
42
+ .navigation__menu {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: 1.5rem;
46
+ }
47
+
48
+ .navigation__link {
49
+ position: relative;
50
+ padding: 0.5rem 0;
51
+ color: var(--b4um-text);
52
+ font-weight: 500;
53
+ text-decoration: none;
54
+ transition:
55
+ color 0.18s ease,
56
+ background-color 0.18s ease,
57
+ transform 0.18s ease;
58
+ }
59
+
60
+ .navigation__link:visited {
61
+ color: var(--b4um-text);
62
+ }
63
+
64
+ .navigation__link:hover {
65
+ color: var(--b4um-primary);
66
+ transform: scale(1.04);
67
+ }
68
+
69
+ .navigation__link::after {
70
+ position: absolute;
71
+ right: 0;
72
+ bottom: 0;
73
+ left: 0;
74
+
75
+ height: 2px;
76
+
77
+ background-color: var(--b4um-primary);
78
+
79
+ content: '';
80
+
81
+ transform: scaleX(0);
82
+ transform-origin: center;
83
+
84
+ transition: transform 0.18s ease;
85
+ }
86
+
87
+ .navigation__link:hover::after {
88
+ transform: scaleX(1);
89
+ }
90
+
91
+ .navigation__toggle {
92
+ display: none;
93
+ }
94
+
95
+ .navigation__link--active {
96
+ color: var(--b4um-primary);
97
+ font-weight: 600;
98
+ }
99
+
100
+ .navigation__link--active::after {
101
+ transform: scaleX(1);
102
+ }
103
+
104
+ @media (max-width: 768px) {
105
+ .navigation__inner {
106
+ position: relative;
107
+
108
+ width: 100%;
109
+ padding: 14px 20px;
110
+ }
111
+
112
+ .navigation__toggle {
113
+ display: flex;
114
+ flex-direction: column;
115
+ justify-content: center;
116
+ gap: 5px;
117
+
118
+ width: 32px;
119
+ height: 32px;
120
+ padding: 4px;
121
+
122
+ border: 0;
123
+
124
+ background: transparent;
125
+
126
+ cursor: pointer;
127
+ }
128
+
129
+ .navigation__toggle:focus-visible {
130
+ outline: 3px solid var(--b4um-primary-focus);
131
+ outline-offset: 2px;
132
+ }
133
+
134
+ .navigation__toggle-line {
135
+ display: block;
136
+
137
+ width: 100%;
138
+ height: 2px;
139
+
140
+ border-radius: 2px;
141
+ background-color: var(--b4um-primary);
142
+
143
+ transition:
144
+ transform 0.18s ease,
145
+ opacity 0.18s ease;
146
+ }
147
+
148
+ .navigation__menu {
149
+ position: absolute;
150
+ top: 100%;
151
+ right: 0;
152
+ left: 0;
153
+ z-index: 100;
154
+
155
+ display: flex;
156
+ flex-direction: column;
157
+ align-items: stretch;
158
+ gap: 0;
159
+
160
+ padding: 8px 20px 20px;
161
+
162
+ background-color: var(--b4um-surface);
163
+ box-shadow: 0 8px 24px var(--b4um-primary-shadow);
164
+
165
+ clip-path: inset(0 0 100% 0);
166
+
167
+ pointer-events: none;
168
+
169
+ transition: clip-path 0.42s cubic-bezier(0.4, 0, 0.2, 1);
170
+ }
171
+
172
+ .navigation--open .navigation__menu {
173
+ clip-path: inset(0 0 0 0);
174
+
175
+ pointer-events: auto;
176
+
177
+ transition-duration: 0.52s;
178
+ transition-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
179
+ }
180
+
181
+ .navigation--open .navigation__link {
182
+ position: relative;
183
+
184
+ display: flex;
185
+ align-items: center;
186
+
187
+ width: 100%;
188
+ padding: 15px 44px 15px 12px;
189
+ box-sizing: border-box;
190
+
191
+ border-radius: 8px;
192
+
193
+ font-size: 1.15rem;
194
+ text-align: left;
195
+ }
196
+
197
+ .navigation--open .navigation__link::before {
198
+ position: absolute;
199
+ top: 50%;
200
+ right: 14px;
201
+
202
+ width: 7px;
203
+ height: 7px;
204
+
205
+ border-top: 1.5px solid var(--b4um-border-hover);
206
+ border-right: 1.5px solid var(--b4um-border-hover);
207
+
208
+ content: '';
209
+
210
+ transform: translateY(-50%) rotate(45deg);
211
+
212
+ transition:
213
+ border-color 0.18s ease,
214
+ transform 0.18s ease;
215
+ }
216
+
217
+ .navigation--open .navigation__link:hover::before {
218
+ border-color: var(--b4um-primary);
219
+
220
+ transform: translateY(-50%) translateX(2px) rotate(45deg) scale(1.08);
221
+ }
222
+
223
+ .navigation--open .navigation__link:hover {
224
+ background-color: var(--b4um-surface-soft);
225
+ color: var(--b4um-primary);
226
+ }
227
+
228
+ .navigation--open .navigation__link::after {
229
+ display: none;
230
+ }
231
+
232
+ .navigation--open .navigation__toggle-line:nth-child(1) {
233
+ transform: translateY(7px) rotate(45deg);
234
+ }
235
+
236
+ .navigation--open .navigation__toggle-line:nth-child(2) {
237
+ opacity: 0;
238
+ }
239
+
240
+ .navigation--open .navigation__toggle-line:nth-child(3) {
241
+ transform: translateY(-7px) rotate(-45deg);
242
+ }
243
+
244
+ .navigation--open .navigation__link--active {
245
+ background-color: var(--b4um-surface-soft);
246
+ color: var(--b4um-primary);
247
+ font-weight: 600;
248
+ }
249
+
250
+ .navigation--open .navigation__link--active::after {
251
+ display: none;
252
+ }
253
+
254
+ .navigation--open .navigation__link--active::before {
255
+ border-color: var(--b4um-primary);
256
+ }
257
+ }
@@ -0,0 +1,85 @@
1
+ /* -------------------------------------------------------
2
+ B4UM Pagination
3
+ ------------------------------------------------------- */
4
+
5
+ .b4um-pagination {
6
+ display: grid;
7
+ grid-template-columns: 1fr auto 1fr;
8
+ align-items: center;
9
+ gap: 1rem;
10
+
11
+ margin-top: 2rem;
12
+ }
13
+
14
+ .b4um-pagination__previous {
15
+ display: flex;
16
+ justify-content: flex-start;
17
+ }
18
+
19
+ .b4um-pagination__next {
20
+ display: flex;
21
+ justify-content: flex-end;
22
+ }
23
+
24
+ .b4um-pagination__pages {
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: center;
28
+ gap: 0.4rem;
29
+ }
30
+
31
+ .b4um-pagination__page,
32
+ .b4um-pagination__current {
33
+ display: inline-flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+
37
+ min-width: 2.5rem;
38
+ min-height: 2.5rem;
39
+ padding: 0.4rem 0.7rem;
40
+
41
+ border-radius: var(--b4um-radius);
42
+ text-decoration: none;
43
+ }
44
+
45
+ .b4um-pagination__page {
46
+ border: 1px solid var(--b4um-border);
47
+ background: var(--b4um-surface);
48
+ color: var(--b4um-text);
49
+ }
50
+
51
+ .b4um-pagination__page:hover {
52
+ background: var(--b4um-surface-soft);
53
+ }
54
+
55
+ .b4um-pagination__current {
56
+ background: var(--b4um-accent);
57
+ color: #fff;
58
+ font-weight: 600;
59
+ }
60
+
61
+ .b4um-pagination__ellipsis {
62
+ padding: 0 0.25rem;
63
+ color: var(--b4um-text-muted);
64
+ }
65
+
66
+ @media (max-width: 640px) {
67
+ .b4um-pagination {
68
+ grid-template-columns: 1fr 1fr;
69
+ }
70
+
71
+ .b4um-pagination__pages {
72
+ grid-column: 1 / -1;
73
+ grid-row: 1;
74
+
75
+ flex-wrap: wrap;
76
+ }
77
+
78
+ .b4um-pagination__previous {
79
+ grid-column: 1;
80
+ }
81
+
82
+ .b4um-pagination__next {
83
+ grid-column: 2;
84
+ }
85
+ }
@@ -0,0 +1,121 @@
1
+ /* -------------------------------------------------------
2
+ Resource details
3
+ ------------------------------------------------------- */
4
+
5
+ .resource {
6
+ width: 100%;
7
+ margin: 20px 0 24px;
8
+ }
9
+
10
+ .resource-field {
11
+ display: grid;
12
+ grid-template-columns: max-content minmax(0, 1fr);
13
+ column-gap: 1.5rem;
14
+
15
+ padding: 10px 0;
16
+
17
+ border-bottom: 1px solid var(--b4um-border-light);
18
+ }
19
+
20
+ .resource-field:last-child {
21
+ border-bottom: none;
22
+ }
23
+
24
+ .resource-label {
25
+ margin: 0;
26
+
27
+ color: var(--b4um-text-secondary);
28
+ font-weight: 600;
29
+ }
30
+
31
+ .resource-value {
32
+ min-width: 0;
33
+
34
+ color: var(--b4um-text);
35
+
36
+ overflow-wrap: anywhere;
37
+ }
38
+
39
+ .b4um-rich-text-preview {
40
+ display: block;
41
+ }
42
+
43
+ .b4um-rich-text-preview__heading {
44
+ display: block;
45
+ margin-bottom: 0.25rem;
46
+
47
+ font-weight: 700;
48
+ line-height: 1.25;
49
+ }
50
+
51
+ .b4um-rich-text-preview__text {
52
+ display: block;
53
+ }
54
+
55
+ /* -------------------------------------------------------
56
+ Resource images
57
+ ------------------------------------------------------- */
58
+
59
+ .resource-image {
60
+ width: 100%;
61
+ min-width: 0;
62
+ }
63
+
64
+ .resource-image__image {
65
+ display: block;
66
+
67
+ width: auto;
68
+ max-width: 100%;
69
+ max-height: 420px;
70
+
71
+ border-radius: 12px;
72
+
73
+ object-fit: contain;
74
+ }
75
+
76
+ .resource-images {
77
+ display: flex;
78
+ flex-wrap: wrap;
79
+ gap: 12px;
80
+
81
+ width: 100%;
82
+ min-width: 0;
83
+ }
84
+
85
+ .resource-images__image {
86
+ display: block;
87
+
88
+ width: 160px;
89
+ height: 120px;
90
+
91
+ border: 1px solid var(--b4um-border-light);
92
+ border-radius: 10px;
93
+
94
+ object-fit: contain;
95
+ }
96
+
97
+ .resource-value--empty {
98
+ color: var(--b4um-text-muted);
99
+ font-style: italic;
100
+ }
101
+
102
+ /* -------------------------------------------------------
103
+ Resource lists
104
+ ------------------------------------------------------- */
105
+
106
+ .resource-list {
107
+ margin: 20px 0;
108
+ }
109
+
110
+ .resource-list .resource-field {
111
+ border-bottom: none;
112
+ }
113
+
114
+ .resource-list-item {
115
+ padding: 20px 0;
116
+ border-bottom: 1px solid var(--b4um-border-list);
117
+ }
118
+
119
+ .resource-list-item:last-child {
120
+ border-bottom: none;
121
+ }
@@ -0,0 +1,41 @@
1
+ /* -------------------------------------------------------
2
+ Search
3
+ ------------------------------------------------------- */
4
+
5
+ .b4um-search {
6
+ width: 100%;
7
+ margin-bottom: 2rem;
8
+ }
9
+
10
+ .b4um-search__form {
11
+ display: flex;
12
+ align-items: center;
13
+ gap: 0.75rem;
14
+
15
+ width: 100%;
16
+ }
17
+
18
+ .b4um-search__form .form-field {
19
+ flex: 1;
20
+
21
+ margin: 0;
22
+ }
23
+
24
+ .b4um-search__form .button {
25
+ flex: 0 0 auto;
26
+ }
27
+
28
+ /* -------------------------------------------------------
29
+ Responsive
30
+ ------------------------------------------------------- */
31
+
32
+ @media (max-width: 640px) {
33
+ .b4um-search__form {
34
+ align-items: stretch;
35
+ flex-direction: column;
36
+ }
37
+
38
+ .b4um-search__form .button {
39
+ width: 100%;
40
+ }
41
+ }
@@ -0,0 +1,67 @@
1
+ /* -------------------------------------------------------
2
+ Tables
3
+ ------------------------------------------------------- */
4
+
5
+ .b4um-table-wrapper {
6
+ width: 100%;
7
+
8
+ overflow-x: auto;
9
+
10
+ background-color: var(--b4um-surface);
11
+ border: 1px solid var(--b4um-border-light);
12
+ border-radius: var(--b4um-radius);
13
+ }
14
+
15
+ .b4um-table {
16
+ width: 100%;
17
+ min-width: 640px;
18
+
19
+ border-collapse: collapse;
20
+
21
+ color: var(--b4um-text);
22
+ }
23
+
24
+ .b4um-table th,
25
+ .b4um-table td {
26
+ padding: 0.9rem 1rem;
27
+
28
+ text-align: left;
29
+ vertical-align: middle;
30
+
31
+ border-bottom: 1px solid var(--b4um-border-light);
32
+ }
33
+
34
+ .b4um-table th {
35
+ color: var(--b4um-text-secondary);
36
+ background-color: var(--b4um-surface-soft);
37
+
38
+ font-size: 0.85rem;
39
+ font-weight: 600;
40
+ white-space: nowrap;
41
+ }
42
+
43
+ .b4um-table tbody tr {
44
+ transition: background-color 0.18s ease;
45
+ }
46
+
47
+ .b4um-table tbody tr:hover {
48
+ background-color: var(--b4um-surface-soft);
49
+ }
50
+
51
+ .b4um-table tbody tr:last-child td {
52
+ border-bottom: 0;
53
+ }
54
+
55
+ .b4um-table__actions {
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: flex-end;
59
+ gap: 0.5rem;
60
+
61
+ white-space: nowrap;
62
+ }
63
+
64
+ .b4um-table th:last-child,
65
+ .b4um-table td:last-child {
66
+ padding-right: 1.25rem;
67
+ }