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,149 @@
1
+ /* -------------------------------------------------------
2
+ Hero
3
+ ------------------------------------------------------- */
4
+
5
+ .b4um-hero {
6
+ position: relative;
7
+
8
+ display: grid;
9
+ grid-template-columns: minmax(0, 1fr) minmax(280px, 0.8fr);
10
+ align-items: center;
11
+ gap: 3rem;
12
+
13
+ width: 100%;
14
+ margin: 0;
15
+ padding: 48px;
16
+
17
+ box-sizing: border-box;
18
+
19
+ border-radius: 24px;
20
+
21
+ background-color: var(--b4um-surface);
22
+ box-shadow: 0 8px 28px var(--b4um-primary-shadow-soft);
23
+
24
+ overflow: hidden;
25
+ }
26
+
27
+ .b4um-hero__content {
28
+ position: relative;
29
+ z-index: 1;
30
+
31
+ min-width: 0;
32
+ }
33
+
34
+ .b4um-hero__eyebrow {
35
+ margin: 0 0 10px;
36
+
37
+ color: var(--b4um-primary);
38
+
39
+ font-size: 0.85rem;
40
+ font-weight: 700;
41
+ letter-spacing: 0.08em;
42
+ text-transform: uppercase;
43
+ }
44
+
45
+ .b4um-hero__title {
46
+ margin: 0;
47
+
48
+ color: var(--b4um-text);
49
+
50
+ font-size: clamp(2rem, 5vw, 4rem);
51
+ line-height: 1.05;
52
+ letter-spacing: -0.04em;
53
+ }
54
+
55
+ .b4um-hero__text {
56
+ max-width: 60ch;
57
+ margin: 20px 0 0;
58
+
59
+ color: var(--b4um-text-secondary);
60
+
61
+ font-size: 1.1rem;
62
+ line-height: 1.65;
63
+ }
64
+
65
+ .b4um-hero__actions {
66
+ display: flex;
67
+ flex-wrap: wrap;
68
+ gap: 12px;
69
+
70
+ margin-top: 28px;
71
+ }
72
+
73
+ .b4um-hero__media {
74
+ min-width: 0;
75
+ }
76
+
77
+ .b4um-hero__image {
78
+ display: block;
79
+
80
+ width: 100%;
81
+ max-height: 420px;
82
+
83
+ border-radius: 18px;
84
+
85
+ object-fit: cover;
86
+ }
87
+
88
+ /* Hero without image */
89
+
90
+ .b4um-hero--text-only {
91
+ grid-template-columns: minmax(0, 1fr);
92
+ }
93
+
94
+ .b4um-hero--text-only .b4um-hero__content {
95
+ max-width: 850px;
96
+ }
97
+
98
+ /* -------------------------------------------------------
99
+ Responsive
100
+ ------------------------------------------------------- */
101
+
102
+ @media (max-width: 900px) {
103
+ .b4um-hero {
104
+ grid-template-columns: minmax(0, 1fr);
105
+
106
+ gap: 28px;
107
+
108
+ padding: 36px;
109
+ }
110
+
111
+ .b4um-hero__media {
112
+ order: -1;
113
+ }
114
+
115
+ .b4um-hero__image {
116
+ max-height: 340px;
117
+ }
118
+ }
119
+
120
+ @media (max-width: 600px) {
121
+ .b4um-hero {
122
+ padding: 28px 22px;
123
+
124
+ border-radius: 18px;
125
+ }
126
+
127
+ .b4um-hero__title {
128
+ font-size: clamp(2rem, 11vw, 3rem);
129
+ }
130
+
131
+ .b4um-hero__text {
132
+ font-size: 1rem;
133
+ }
134
+
135
+ .b4um-hero__actions {
136
+ align-items: stretch;
137
+ flex-direction: column;
138
+ }
139
+
140
+ .b4um-hero__actions .button {
141
+ width: 100%;
142
+ }
143
+
144
+ .b4um-hero__image {
145
+ max-height: 280px;
146
+
147
+ border-radius: 14px;
148
+ }
149
+ }
@@ -0,0 +1,166 @@
1
+ /* -------------------------------------------------------
2
+ Layout
3
+ ------------------------------------------------------- */
4
+
5
+ .container {
6
+ width: 75%;
7
+ margin: 40px auto 0;
8
+ padding: 0;
9
+
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ /* -------------------------------------------------------
14
+ Page layout
15
+ ------------------------------------------------------- */
16
+
17
+ .page-header {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: space-between;
21
+ gap: 1rem;
22
+
23
+ margin: 20px 0;
24
+ }
25
+
26
+ .page-header h1 {
27
+ margin: 0;
28
+ }
29
+
30
+ /* -------------------------------------------------------
31
+ Buttons and actions
32
+ ------------------------------------------------------- */
33
+
34
+ .resource-actions {
35
+ display: flex;
36
+ flex-wrap: wrap;
37
+ gap: 0.75rem;
38
+
39
+ margin-top: 10px;
40
+ }
41
+
42
+ .form-submit,
43
+ .button {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+
48
+ min-width: 160px;
49
+ min-height: 40px;
50
+ padding: 0.7rem 1rem;
51
+
52
+ box-sizing: border-box;
53
+
54
+ border: 1px solid transparent;
55
+ border-radius: 8px;
56
+
57
+ font: inherit;
58
+ font-weight: 500;
59
+ line-height: 1;
60
+
61
+ text-decoration: none;
62
+
63
+ cursor: pointer;
64
+
65
+ transition:
66
+ background-color 0.18s ease,
67
+ border-color 0.18s ease,
68
+ color 0.18s ease,
69
+ box-shadow 0.18s ease,
70
+ transform 0.12s ease;
71
+ }
72
+
73
+ .form-submit {
74
+ margin-top: 10px;
75
+
76
+ background-color: var(--b4um-primary);
77
+ border-color: var(--b4um-primary);
78
+ color: var(--b4um-text-on-primary);
79
+ }
80
+
81
+ .form-submit:hover {
82
+ background-color: var(--b4um-primary-hover);
83
+ border-color: var(--b4um-primary-hover);
84
+
85
+ box-shadow: 0 4px 12px var(--b4um-primary-shadow);
86
+ }
87
+
88
+ .form-submit:active {
89
+ transform: translateY(1px);
90
+ }
91
+
92
+ .button--primary {
93
+ background-color: var(--b4um-primary);
94
+ border-color: var(--b4um-primary);
95
+ color: var(--b4um-text-on-primary);
96
+ }
97
+
98
+ .button--primary:visited {
99
+ color: var(--b4um-text-on-primary);
100
+ }
101
+
102
+ .button--primary:hover {
103
+ background-color: var(--b4um-primary-hover);
104
+ border-color: var(--b4um-primary-hover);
105
+ color: var(--b4um-text-on-primary);
106
+
107
+ box-shadow: 0 4px 12px var(--b4um-primary-shadow);
108
+ }
109
+
110
+ .button--secondary {
111
+ background-color: var(--b4um-surface);
112
+ border-color: var(--b4um-primary);
113
+ color: var(--b4um-primary);
114
+ }
115
+
116
+ .button--secondary:visited {
117
+ color: var(--b4um-primary);
118
+ }
119
+
120
+ .button--secondary:hover {
121
+ background-color: var(--b4um-surface-soft);
122
+ border-color: var(--b4um-primary-hover);
123
+ color: var(--b4um-primary-hover);
124
+
125
+ box-shadow: 0 3px 10px var(--b4um-primary-shadow-soft);
126
+ }
127
+
128
+ .button--danger {
129
+ background-color: var(--b4um-danger);
130
+ border-color: var(--b4um-danger);
131
+ color: var(--b4um-text-on-primary);
132
+ }
133
+
134
+ .button--danger:visited {
135
+ color: var(--b4um-text-on-primary);
136
+ }
137
+
138
+ .button--danger:hover {
139
+ background-color: var(--b4um-danger-hover);
140
+ border-color: var(--b4um-danger-hover);
141
+ color: var(--b4um-text-on-primary);
142
+
143
+ box-shadow: 0 4px 12px var(--b4um-danger-shadow);
144
+ }
145
+
146
+ .button:active {
147
+ transform: translateY(1px);
148
+ }
149
+
150
+ .form-submit:focus-visible,
151
+ .button:focus-visible {
152
+ outline: 3px solid var(--b4um-primary-focus);
153
+ outline-offset: 2px;
154
+ }
155
+
156
+ /* -------------------------------------------------------
157
+ Responsive
158
+ ------------------------------------------------------- */
159
+
160
+ @media (max-width: 768px) {
161
+ .container {
162
+ width: calc(100% - 32px);
163
+ margin: 24px 16px 0;
164
+ padding: 0;
165
+ }
166
+ }
@@ -0,0 +1,268 @@
1
+ /* -------------------------------------------------------
2
+ Image lightbox
3
+ ------------------------------------------------------- */
4
+
5
+ .resource-image__button,
6
+ .resource-images__button {
7
+ display: block;
8
+
9
+ margin: 0;
10
+ padding: 0;
11
+
12
+ border: 0;
13
+
14
+ background: transparent;
15
+
16
+ font: inherit;
17
+
18
+ cursor: zoom-in;
19
+ }
20
+
21
+ .resource-image__button:focus-visible,
22
+ .resource-images__button:focus-visible {
23
+ outline: 3px solid var(--b4um-primary-focus);
24
+ outline-offset: 3px;
25
+
26
+ border-radius: 10px;
27
+ }
28
+
29
+ .image-lightbox {
30
+ position: fixed;
31
+ inset: 0;
32
+ z-index: 10000;
33
+
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+
38
+ padding: 70px 90px 110px;
39
+ box-sizing: border-box;
40
+
41
+ background-color: rgba(0, 0, 0, 0.92);
42
+ }
43
+
44
+ .image-lightbox[hidden] {
45
+ display: none;
46
+ }
47
+
48
+ body.image-lightbox-open {
49
+ overflow: hidden;
50
+ }
51
+
52
+ .image-lightbox__stage {
53
+ position: relative;
54
+
55
+ width: 100%;
56
+ height: calc(100vh - 180px);
57
+
58
+ overflow: hidden;
59
+
60
+ touch-action: pan-y;
61
+ cursor: grab;
62
+ user-select: none;
63
+ }
64
+
65
+ .image-lightbox__stage:active {
66
+ cursor: grabbing;
67
+ }
68
+
69
+ .image-lightbox__image {
70
+ position: absolute;
71
+ inset: 0;
72
+
73
+ display: block;
74
+
75
+ width: 100%;
76
+ height: 100%;
77
+
78
+ margin: auto;
79
+
80
+ border-radius: var(--b4um-radius);
81
+
82
+ object-fit: contain;
83
+
84
+ pointer-events: none;
85
+ user-select: none;
86
+ -webkit-user-drag: none;
87
+
88
+ transform: translateX(0);
89
+ }
90
+
91
+ .image-lightbox__image--dragging {
92
+ transition: none;
93
+ }
94
+
95
+ .image-lightbox__image--sliding {
96
+ transition: transform 0.36s cubic-bezier(0.4, 0, 0.2, 1);
97
+ }
98
+
99
+ .image-lightbox__image--waiting-right {
100
+ transform: translateX(100%);
101
+ }
102
+
103
+ .image-lightbox__image--waiting-left {
104
+ transform: translateX(-100%);
105
+ }
106
+
107
+ .image-lightbox__image--active {
108
+ transform: translateX(0);
109
+ }
110
+
111
+ .image-lightbox__image--exit-left {
112
+ transform: translateX(-100%);
113
+ }
114
+
115
+ .image-lightbox__image--exit-right {
116
+ transform: translateX(100%);
117
+ }
118
+
119
+ .image-lightbox__counter {
120
+ position: absolute;
121
+ top: 28px;
122
+ left: 28px;
123
+
124
+ color: #ffffff;
125
+
126
+ font-size: 0.9rem;
127
+ font-weight: 500;
128
+ line-height: 1;
129
+
130
+ user-select: none;
131
+ }
132
+
133
+ .image-lightbox__close {
134
+ position: absolute;
135
+ top: 20px;
136
+ right: 24px;
137
+
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+
142
+ width: 48px;
143
+ height: 48px;
144
+ padding: 0;
145
+
146
+ border: 0;
147
+
148
+ background: transparent;
149
+ color: #ffffff;
150
+
151
+ font: inherit;
152
+ font-size: 2.5rem;
153
+ font-weight: 300;
154
+ line-height: 1;
155
+
156
+ cursor: pointer;
157
+ }
158
+
159
+ .image-lightbox__navigation {
160
+ position: absolute;
161
+ top: 50%;
162
+
163
+ display: flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+
167
+ width: 56px;
168
+ height: 72px;
169
+ padding: 0;
170
+
171
+ border: 0;
172
+ border-radius: 8px;
173
+
174
+ background-color: rgba(0, 0, 0, 0.35);
175
+ color: #ffffff;
176
+
177
+ font: inherit;
178
+ font-size: 3.5rem;
179
+ font-weight: 300;
180
+ line-height: 1;
181
+
182
+ cursor: pointer;
183
+
184
+ transform: translateY(-50%);
185
+
186
+ transition:
187
+ background-color 0.18s ease,
188
+ transform 0.18s ease;
189
+ }
190
+
191
+ .image-lightbox__navigation:hover {
192
+ background-color: rgba(255, 255, 255, 0.16);
193
+ }
194
+
195
+ .image-lightbox__navigation--previous {
196
+ left: 20px;
197
+ }
198
+
199
+ .image-lightbox__navigation--next {
200
+ right: 20px;
201
+ }
202
+
203
+ .image-lightbox__close:focus-visible,
204
+ .image-lightbox__navigation:focus-visible {
205
+ outline: 3px solid #ffffff;
206
+ outline-offset: 3px;
207
+ }
208
+
209
+ .image-lightbox__caption {
210
+ position: absolute;
211
+ right: 20px;
212
+ bottom: 24px;
213
+ left: 20px;
214
+
215
+ color: #ffffff;
216
+
217
+ font-size: 0.85rem;
218
+ text-align: center;
219
+
220
+ overflow-wrap: anywhere;
221
+ }
222
+
223
+ @media (prefers-reduced-motion: reduce) {
224
+ .image-lightbox__image--sliding {
225
+ transition: none;
226
+ }
227
+ }
228
+
229
+ @media (max-width: 768px) {
230
+ .image-lightbox {
231
+ padding: 70px 54px 100px;
232
+ }
233
+
234
+ .image-lightbox__stage {
235
+ height: calc(100vh - 170px);
236
+ }
237
+
238
+ .image-lightbox__counter {
239
+ top: 24px;
240
+ left: 16px;
241
+ }
242
+
243
+ .image-lightbox__close {
244
+ top: 12px;
245
+ right: 12px;
246
+ }
247
+
248
+ .image-lightbox__navigation {
249
+ width: 44px;
250
+ height: 60px;
251
+
252
+ font-size: 2.8rem;
253
+ }
254
+
255
+ .image-lightbox__navigation--previous {
256
+ left: 4px;
257
+ }
258
+
259
+ .image-lightbox__navigation--next {
260
+ right: 4px;
261
+ }
262
+
263
+ .image-lightbox__caption {
264
+ right: 12px;
265
+ bottom: 18px;
266
+ left: 12px;
267
+ }
268
+ }