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,178 @@
1
+ /* -------------------------------------------------------
2
+ Theme switcher
3
+ ------------------------------------------------------- */
4
+
5
+ .b4um-theme-switcher {
6
+ position: fixed;
7
+ right: 1.25rem;
8
+ bottom: 1.25rem;
9
+ z-index: 1000;
10
+
11
+ display: flex;
12
+ flex-direction: column;
13
+ align-items: flex-end;
14
+ gap: 0.5rem;
15
+ }
16
+
17
+ /* -------------------------------------------------------
18
+ Toggle
19
+ ------------------------------------------------------- */
20
+
21
+ .b4um-theme-switcher__toggle {
22
+ display: inline-flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+
26
+ width: 40px;
27
+ height: 40px;
28
+ padding: 0;
29
+
30
+ border: 1px solid var(--b4um-border);
31
+ border-radius: 50%;
32
+
33
+ background-color: var(--b4um-surface);
34
+ color: var(--b4um-text-secondary);
35
+
36
+ font: inherit;
37
+ font-size: 1rem;
38
+ line-height: 1;
39
+
40
+ box-shadow: 0 2px 8px var(--b4um-primary-shadow-soft);
41
+
42
+ cursor: pointer;
43
+
44
+ transition:
45
+ background-color 0.18s ease,
46
+ border-color 0.18s ease,
47
+ color 0.18s ease,
48
+ box-shadow 0.18s ease,
49
+ transform 0.18s ease;
50
+ }
51
+
52
+ .b4um-theme-switcher__toggle:hover {
53
+ border-color: var(--b4um-primary);
54
+ background-color: var(--b4um-surface-soft);
55
+ color: var(--b4um-primary);
56
+
57
+ transform: translateY(-1px);
58
+ }
59
+
60
+ .b4um-theme-switcher__toggle:focus-visible {
61
+ outline: none;
62
+
63
+ border-color: var(--b4um-primary);
64
+
65
+ box-shadow:
66
+ 0 0 0 3px var(--b4um-primary-soft),
67
+ 0 2px 8px var(--b4um-primary-shadow-soft);
68
+ }
69
+
70
+ /* -------------------------------------------------------
71
+ Menu
72
+ ------------------------------------------------------- */
73
+
74
+ .b4um-theme-switcher__menu {
75
+ min-width: 148px;
76
+ padding: 0.4rem;
77
+
78
+ border: 1px solid var(--b4um-border);
79
+ border-radius: 10px;
80
+
81
+ background-color: var(--b4um-surface);
82
+ color: var(--b4um-text);
83
+
84
+ box-shadow: 0 4px 16px var(--b4um-primary-shadow-soft);
85
+ }
86
+
87
+ .b4um-theme-switcher__menu[hidden] {
88
+ display: none;
89
+ }
90
+
91
+ .b4um-theme-switcher__title {
92
+ padding: 0.35rem 0.6rem 0.45rem;
93
+
94
+ color: var(--b4um-text-muted);
95
+
96
+ font-size: 0.68rem;
97
+ font-weight: 600;
98
+ letter-spacing: 0.055em;
99
+ text-transform: uppercase;
100
+ }
101
+
102
+ /* -------------------------------------------------------
103
+ Options
104
+ ------------------------------------------------------- */
105
+
106
+ .b4um-theme-switcher__option {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 0.55rem;
110
+
111
+ width: 100%;
112
+ padding: 0.48rem 0.6rem;
113
+
114
+ border: 0;
115
+ border-radius: 6px;
116
+
117
+ background-color: transparent;
118
+ color: var(--b4um-text-secondary);
119
+
120
+ font: inherit;
121
+ font-size: 0.84rem;
122
+ text-align: left;
123
+
124
+ cursor: pointer;
125
+
126
+ transition:
127
+ background-color 0.15s ease,
128
+ color 0.15s ease;
129
+ }
130
+
131
+ .b4um-theme-switcher__option:hover {
132
+ background-color: var(--b4um-surface-soft);
133
+ color: var(--b4um-text);
134
+ }
135
+
136
+ .b4um-theme-switcher__option.is-active {
137
+ background-color: var(--b4um-primary-soft);
138
+ color: var(--b4um-primary);
139
+ }
140
+
141
+ /* -------------------------------------------------------
142
+ Selection indicator
143
+ ------------------------------------------------------- */
144
+
145
+ .b4um-theme-switcher__indicator {
146
+ width: 7px;
147
+ height: 7px;
148
+
149
+ flex: 0 0 7px;
150
+
151
+ border: 1px solid var(--b4um-border-hover);
152
+ border-radius: 50%;
153
+
154
+ transition:
155
+ border-color 0.15s ease,
156
+ background-color 0.15s ease;
157
+ }
158
+
159
+ .b4um-theme-switcher__option.is-active .b4um-theme-switcher__indicator {
160
+ border-color: var(--b4um-primary);
161
+ background-color: var(--b4um-primary);
162
+ }
163
+
164
+ /* -------------------------------------------------------
165
+ Mobile
166
+ ------------------------------------------------------- */
167
+
168
+ @media (max-width: 48rem) {
169
+ .b4um-theme-switcher {
170
+ right: 0.9rem;
171
+ bottom: 0.9rem;
172
+ }
173
+
174
+ .b4um-theme-switcher__toggle {
175
+ width: 38px;
176
+ height: 38px;
177
+ }
178
+ }
@@ -0,0 +1,132 @@
1
+ /* -------------------------------------------------------
2
+ Theme
3
+ ------------------------------------------------------- */
4
+
5
+ :root {
6
+ /* Backgrounds */
7
+ --b4um-page-background: #c2e7ff;
8
+ --b4um-surface: #ffffff;
9
+ --b4um-surface-soft: #f3f5ff;
10
+
11
+ /* Text */
12
+ --b4um-text: #222222;
13
+ --b4um-text-secondary: #555d6b;
14
+ --b4um-text-muted: #666666;
15
+ --b4um-text-checkbox: #333333;
16
+ --b4um-text-on-primary: #ffffff;
17
+
18
+ /* Primary color */
19
+ --b4um-primary: #2e47d2;
20
+ --b4um-primary-hover: #243bb8;
21
+ --b4um-primary-soft: rgba(46, 71, 210, 0.12);
22
+ --b4um-primary-focus: rgba(46, 71, 210, 0.22);
23
+
24
+ /* Links */
25
+ --b4um-link: #0000ff;
26
+ --b4um-link-visited: #2e47d2;
27
+
28
+ /* Borders */
29
+ --b4um-border: #b9bec8;
30
+ --b4um-border-hover: #8d95a3;
31
+ --b4um-border-checkbox: #aeb5c0;
32
+ --b4um-border-light: #e5e7eb;
33
+ --b4um-border-list: #dddddd;
34
+ --b4um-radius: 20px;
35
+
36
+ /* Success */
37
+ --b4um-success-background: #ccffcc;
38
+ --b4um-success-border: #66cc66;
39
+
40
+ /* Warning */
41
+ --b4um-warning: #854d0e;
42
+ --b4um-warning-background: #fef9c3;
43
+ --b4um-warning-border: #fde68a;
44
+
45
+ /* Danger */
46
+ --b4um-danger: #cc0000;
47
+ --b4um-danger-hover: #990000;
48
+ --b4um-danger-border: #cf0000;
49
+ --b4um-danger-soft-border: #cc6666;
50
+ --b4um-danger-background: #ffcccc;
51
+
52
+ /* Neutral */
53
+ --b4um-neutral-background: #f0f0f0;
54
+
55
+ /* Code */
56
+ --b4um-code-background: #1e293b;
57
+ --b4um-code-text: #f8fafc;
58
+ --b4um-code-border: #334155;
59
+
60
+ /* Shadows */
61
+ --b4um-container-shadow: rgba(1, 1, 1, 0.7);
62
+ --b4um-primary-shadow: rgba(46, 71, 210, 0.22);
63
+ --b4um-primary-shadow-soft: rgba(46, 71, 210, 0.12);
64
+ --b4um-danger-shadow: rgba(204, 0, 0, 0.18);
65
+ }
66
+
67
+ /* -------------------------------------------------------
68
+ Dark theme
69
+ ------------------------------------------------------- */
70
+
71
+ [data-b4um-theme='dark'] {
72
+ /* Backgrounds */
73
+ --b4um-page-background: #11151c;
74
+ --b4um-surface: #1c222b;
75
+ --b4um-surface-soft: #252c36;
76
+
77
+ /* Text */
78
+ --b4um-text: #f1f3f5;
79
+ --b4um-text-secondary: #c3c8d0;
80
+ --b4um-text-muted: #a8afb9;
81
+ --b4um-text-checkbox: #e5e7eb;
82
+ --b4um-text-on-primary: #ffffff;
83
+
84
+ /* Primary color */
85
+ --b4um-primary: #8ea2ff;
86
+ --b4um-primary-hover: #a9b8ff;
87
+ --b4um-primary-soft: rgba(142, 162, 255, 0.16);
88
+ --b4um-primary-focus: rgba(142, 162, 255, 0.32);
89
+
90
+ /* Links */
91
+ --b4um-link: #9aabff;
92
+ --b4um-link-visited: #b1a7ff;
93
+
94
+ /* Borders */
95
+ --b4um-border: #555c66;
96
+ --b4um-border-hover: #737c89;
97
+ --b4um-border-checkbox: #666e79;
98
+ --b4um-border-light: #383d45;
99
+ --b4um-border-list: #444a53;
100
+
101
+ /* Success */
102
+ --b4um-success-background: #173c2b;
103
+ --b4um-success-border: #3c8c65;
104
+
105
+ /* Warning */
106
+ --b4um-warning: #f6cf73;
107
+ --b4um-warning-background: #3b3217;
108
+ --b4um-warning-border: #756323;
109
+
110
+ /* Danger */
111
+ --b4um-danger: #ff8585;
112
+ --b4um-danger-hover: #ffa0a0;
113
+ --b4um-danger-border: #d65f5f;
114
+ --b4um-danger-soft-border: #8f4c4c;
115
+ --b4um-danger-background: #452323;
116
+
117
+ /* Neutral */
118
+ --b4um-neutral-background: #30343a;
119
+
120
+ /* Code */
121
+ --b4um-code-background: #0f1115;
122
+ --b4um-code-text: #f8fafc;
123
+ --b4um-code-border: #3b424d;
124
+
125
+ /* Shadows */
126
+ --b4um-container-shadow: rgba(0, 0, 0, 0.55);
127
+ --b4um-primary-shadow: rgba(142, 162, 255, 0.24);
128
+ --b4um-primary-shadow-soft: rgba(142, 162, 255, 0.14);
129
+ --b4um-danger-shadow: rgba(255, 133, 133, 0.18);
130
+
131
+ color-scheme: dark;
132
+ }
@@ -0,0 +1,20 @@
1
+ @import 'b4um/theme.css';
2
+ @import 'b4um/base.css';
3
+ @import 'b4um/layout.css';
4
+ @import 'b4um/navigation.css';
5
+ @import 'b4um/forms.css';
6
+ @import 'b4um/search.css';
7
+ @import 'b4um/resources.css';
8
+ @import 'b4um/lightbox.css';
9
+ @import 'b4um/hero.css';
10
+ @import 'b4um/cards.css';
11
+ @import 'b4um/tables.css';
12
+ @import 'b4um/pagination.css';
13
+ @import 'b4um/badges.css';
14
+ @import 'b4um/callouts.css';
15
+ @import 'b4um/empty-state.css';
16
+ @import 'b4um/flash.css';
17
+ @import 'b4um/comments.css';
18
+ @import 'b4um/footer.css';
19
+ @import 'b4um/cookie-consent.css';
20
+ @import 'b4um/theme-switcher.css';
@@ -0,0 +1,12 @@
1
+ sitemap:
2
+ - key: column_1
3
+ title: Kontakt
4
+ - key: column_2
5
+ title: Inhalte
6
+ - key: column_3
7
+ title: Service
8
+ - key: column_4
9
+ title: Mehr
10
+
11
+ legal_links:
12
+ placement: footer
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ module B4umHelper
6
+ def b4um_sitemap_columns
7
+ config_path = Rails.root.join("config/b4um.yml")
8
+
9
+ return [] unless File.exist?(config_path)
10
+
11
+ config = YAML.safe_load_file(config_path) || {}
12
+
13
+ Array(config["sitemap"])
14
+ end
15
+
16
+ def b4um_sitemap_path(route)
17
+ route_name = route.to_s
18
+
19
+ return unless route_name.match?(/\A[a-z0-9_]+_path\z/)
20
+
21
+ route_helpers = Rails.application.routes.url_helpers
22
+
23
+ return unless route_helpers.respond_to?(route_name)
24
+
25
+ route_helpers.public_send(route_name)
26
+ end
27
+ end
@@ -0,0 +1,76 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ const STORAGE_KEY = 'b4um-cookie-consent'
4
+ const OPEN_EVENT = 'b4um:cookie-consent-open'
5
+
6
+ export default class extends Controller {
7
+ static targets = ['banner']
8
+
9
+ connect() {
10
+ this.open = this.open.bind(this)
11
+
12
+ window.addEventListener(OPEN_EVENT, this.open)
13
+ document.addEventListener('click', this.handleSettingsClick)
14
+
15
+ const consent = window.localStorage.getItem(STORAGE_KEY)
16
+
17
+ if (consent === null) {
18
+ this.show()
19
+ return
20
+ }
21
+
22
+ this.dispatchConsentEvent(consent)
23
+ }
24
+
25
+ disconnect() {
26
+ window.removeEventListener(OPEN_EVENT, this.open)
27
+ document.removeEventListener('click', this.handleSettingsClick)
28
+ }
29
+
30
+ accept() {
31
+ this.storeConsent('accepted')
32
+ this.hide()
33
+ }
34
+
35
+ reject() {
36
+ this.storeConsent('rejected')
37
+ this.hide()
38
+ }
39
+
40
+ handleSettingsClick(event) {
41
+ const trigger = event.target.closest('[data-b4um-cookie-consent-open]')
42
+
43
+ if (!trigger) return
44
+
45
+ event.preventDefault()
46
+
47
+ window.dispatchEvent(new CustomEvent(OPEN_EVENT))
48
+ }
49
+
50
+ open() {
51
+ this.show()
52
+ }
53
+
54
+ show() {
55
+ this.bannerTarget.hidden = false
56
+ }
57
+
58
+ hide() {
59
+ this.bannerTarget.hidden = true
60
+ }
61
+
62
+ storeConsent(consent) {
63
+ window.localStorage.setItem(STORAGE_KEY, consent)
64
+ this.dispatchConsentEvent(consent)
65
+ }
66
+
67
+ dispatchConsentEvent(consent) {
68
+ if (consent === 'accepted') {
69
+ window.dispatchEvent(new CustomEvent('b4um:cookie-consent-accepted'))
70
+ }
71
+
72
+ if (consent === 'rejected') {
73
+ window.dispatchEvent(new CustomEvent('b4um:cookie-consent-rejected'))
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,7 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+
3
+ export default class extends Controller {
4
+ dismiss() {
5
+ this.element.remove()
6
+ }
7
+ }