ultimate-jekyll-manager 0.0.118 → 0.0.120

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 (51) hide show
  1. package/CLAUDE.md +409 -23
  2. package/README.md +171 -2
  3. package/TODO.md +10 -2
  4. package/_backup/form-manager.backup.js +1020 -0
  5. package/dist/assets/js/core/auth.js +5 -4
  6. package/dist/assets/js/core/cookieconsent.js +24 -17
  7. package/dist/assets/js/core/exit-popup.js +15 -12
  8. package/dist/assets/js/core/social-sharing.js +8 -4
  9. package/dist/assets/js/libs/auth/pages.js +78 -149
  10. package/dist/assets/js/libs/dev.js +192 -129
  11. package/dist/assets/js/libs/form-manager.js +643 -775
  12. package/dist/assets/js/pages/account/index.js +3 -2
  13. package/dist/assets/js/pages/account/sections/api-keys.js +37 -52
  14. package/dist/assets/js/pages/account/sections/connections.js +37 -46
  15. package/dist/assets/js/pages/account/sections/delete.js +57 -78
  16. package/dist/assets/js/pages/account/sections/profile.js +37 -56
  17. package/dist/assets/js/pages/account/sections/security.js +102 -125
  18. package/dist/assets/js/pages/admin/notifications/new/index.js +73 -151
  19. package/dist/assets/js/pages/blog/index.js +33 -53
  20. package/dist/assets/js/pages/contact/index.js +112 -173
  21. package/dist/assets/js/pages/download/index.js +39 -86
  22. package/dist/assets/js/pages/oauth2/index.js +17 -17
  23. package/dist/assets/js/pages/payment/checkout/index.js +23 -36
  24. package/dist/assets/js/pages/pricing/index.js +5 -2
  25. package/dist/assets/js/pages/test/libraries/form-manager/index.js +194 -0
  26. package/dist/assets/themes/classy/css/components/_cards.scss +2 -2
  27. package/dist/defaults/_.env +6 -0
  28. package/dist/defaults/_.gitignore +7 -1
  29. package/dist/defaults/dist/_includes/core/body.html +5 -13
  30. package/dist/defaults/dist/_includes/core/foot.html +1 -0
  31. package/dist/defaults/dist/_includes/themes/classy/frontend/sections/nav.html +51 -36
  32. package/dist/defaults/dist/_layouts/blueprint/admin/notifications/new.html +13 -2
  33. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/about.html +84 -42
  34. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/account/index.html +26 -21
  35. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signin.html +2 -2
  36. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signup.html +2 -2
  37. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/blog/index.html +72 -58
  38. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/blog/post.html +46 -29
  39. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/contact.html +46 -53
  40. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/download.html +111 -73
  41. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/index.html +111 -56
  42. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/pricing.html +127 -81
  43. package/dist/defaults/dist/pages/test/libraries/form-manager.html +181 -0
  44. package/dist/defaults/dist/pages/test/libraries/lazy-loading.html +1 -1
  45. package/dist/gulp/tasks/defaults.js +210 -1
  46. package/dist/gulp/tasks/serve.js +18 -0
  47. package/dist/lib/logger.js +1 -1
  48. package/firebase-debug.log +770 -0
  49. package/package.json +6 -6
  50. package/.playwright-mcp/page-2025-10-22T19-11-27-666Z.png +0 -0
  51. package/.playwright-mcp/page-2025-10-22T19-11-57-357Z.png +0 -0
@@ -6,48 +6,52 @@ layout: themes/[ site.theme.id ]/frontend/core/base
6
6
  # Hero Section
7
7
  hero:
8
8
  headline: "About"
9
- headline_accent: "Us"
9
+ headline_accent: "us"
10
10
  description: "Learn about the people, mission, and values driving {{ site.brand.name }} forward"
11
11
 
12
12
  # Mission & Vision
13
13
  mission:
14
- title: "Our Mission"
14
+ title: "Our mission"
15
15
  description: "To empower individuals and businesses with innovative technology solutions that simplify complex challenges and unlock new possibilities for growth and success."
16
16
  icon: "bullseye"
17
17
 
18
18
  vision:
19
- title: "Our Vision"
19
+ title: "Our vision"
20
20
  description: "To become the world's most trusted platform for business transformation, where innovation meets simplicity and everyone can achieve their full potential."
21
21
  icon: "lightbulb"
22
22
 
23
23
  # Story Timeline Section
24
24
  story:
25
- superheadline: "{% uj_icon 'clock-rotate-left' %} History"
25
+ superheadline:
26
+ icon: "clock-rotate-left"
27
+ text: "History"
26
28
  headline: "Follow our"
27
- headline_accent: "Journey"
29
+ headline_accent: "journey"
28
30
  subheadline: "From humble beginnings to industry leaders"
29
31
  items:
30
32
  - year: "2017"
31
- title: "The Beginning"
33
+ title: "The beginning"
32
34
  description: "{{ site.brand.name }} was founded with a vision to revolutionize the industry"
33
35
  - year: "2018"
34
- title: "Rapid Growth"
36
+ title: "Rapid growth"
35
37
  description: "Expanded our team and launched our flagship platform to thousands of users"
36
38
  - year: "2020"
37
- title: "Global Expansion"
39
+ title: "Global expansion"
38
40
  description: "Reached customers in over 100 countries and opened international offices"
39
41
  - year: "2023"
40
- title: "Innovation Award"
42
+ title: "Innovation award"
41
43
  description: "Recognized as Industry Leader and received multiple awards for innovation"
42
44
  - year: "{{ site.uj.date.year }}"
43
- title: "The Future"
45
+ title: "The future"
44
46
  description: "Continuing to push boundaries and build the future of business technology"
45
47
 
46
48
  # Company Stats
47
49
  stats:
48
- superheadline: "{% uj_icon 'chart-line' %} Numbers"
50
+ superheadline:
51
+ icon: "chart-line"
52
+ text: "Numbers"
49
53
  headline: "Measuring our"
50
- headline_accent: "Impact"
54
+ headline_accent: "impact"
51
55
  subheadline: "The milestones that define our growth"
52
56
  items:
53
57
  - number: "2017"
@@ -65,29 +69,33 @@ stats:
65
69
 
66
70
  # Company Values Section
67
71
  values:
68
- superheadline: "{% uj_icon 'compass' %} Principles"
69
- headline: "Our Core"
70
- headline_accent: "Values"
72
+ superheadline:
73
+ icon: "compass"
74
+ text: "Principles"
75
+ headline: "Our core"
76
+ headline_accent: "values"
71
77
  subheadline: "The principles that guide everything we do"
72
78
  items:
73
- - title: "Innovation First"
79
+ - title: "Innovation first"
74
80
  description: "We push boundaries and challenge the status quo to create breakthrough solutions that transform how businesses operate"
75
81
  icon: "rocket"
76
- - title: "Customer Obsessed"
82
+ - title: "Customer obsessed"
77
83
  description: "Everything we do is focused on delivering exceptional value to our customers. Their success is our success"
78
84
  icon: "heart"
79
- - title: "Team Excellence"
85
+ - title: "Team excellence"
80
86
  description: "We hire the best talent and create an environment where everyone can thrive, learn, and make an impact"
81
87
  icon: "users"
82
- - title: "Transparent Culture"
88
+ - title: "Transparent culture"
83
89
  description: "We believe in open communication, honest feedback, and shared decision-making at every level"
84
90
  icon: "magnifying-glass"
85
91
 
86
92
  # Team CTA Section
87
93
  team_cta:
88
- superheadline: "{% uj_icon 'handshake' %} People"
89
- headline: "Meet Our Amazing"
90
- headline_accent: "Team"
94
+ superheadline:
95
+ icon: "handshake"
96
+ text: "People"
97
+ headline: "Meet our amazing"
98
+ headline_accent: "team"
91
99
  subheadline: "Get to know the passionate individuals behind {{ site.brand.name }} who work every day to make your experience exceptional"
92
100
  button:
93
101
  text: "Meet the Team"
@@ -116,8 +124,13 @@ team_cta:
116
124
  <section class="pt-0">
117
125
  <div class="container">
118
126
  <div class="text-center mb-5" data-lazy="@class animation-slide-up">
119
- {% iftruthy page.resolved.story.superheadline %}
120
- <span class="badge bg-body-tertiary border-gradient-rainbow border-1 text-body p-2 mb-1 fw-semibold small">{{ page.resolved.story.superheadline }}</span>
127
+ {% iftruthy page.resolved.story.superheadline.text %}
128
+ <span class="badge bg-body-tertiary border-gradient-rainbow border-1 text-body p-2 mb-1 fw-semibold small">
129
+ {% iftruthy page.resolved.story.superheadline.icon %}
130
+ {% uj_icon page.resolved.story.superheadline.icon, "me-1" %}
131
+ {% endiftruthy %}
132
+ {{ page.resolved.story.superheadline.text }}
133
+ </span>
121
134
  {% endiftruthy %}
122
135
  <h2 class="h2 mb-2">
123
136
  {{ page.resolved.story.headline }} <span class="text-accent">{{ page.resolved.story.headline_accent }}</span>
@@ -205,8 +218,13 @@ team_cta:
205
218
  <section>
206
219
  <div class="container">
207
220
  <div class="text-center mb-5" data-lazy="@class animation-slide-up">
208
- {% iftruthy page.resolved.stats.superheadline %}
209
- <span class="badge bg-body-tertiary border-gradient-rainbow border-1 text-body p-2 mb-1 fw-semibold small">{{ page.resolved.stats.superheadline }}</span>
221
+ {% iftruthy page.resolved.stats.superheadline.text %}
222
+ <span class="badge bg-body-tertiary border-gradient-rainbow border-1 text-body p-2 mb-1 fw-semibold small">
223
+ {% iftruthy page.resolved.stats.superheadline.icon %}
224
+ {% uj_icon page.resolved.stats.superheadline.icon, "me-1" %}
225
+ {% endiftruthy %}
226
+ {{ page.resolved.stats.superheadline.text }}
227
+ </span>
210
228
  {% endiftruthy %}
211
229
  <h2 class="h2 mb-2">
212
230
  {{ page.resolved.stats.headline }}
@@ -237,8 +255,13 @@ team_cta:
237
255
  <section>
238
256
  <div class="container">
239
257
  <div class="text-center mb-5" data-lazy="@class animation-slide-up">
240
- {% iftruthy page.resolved.values.superheadline %}
241
- <span class="badge bg-body-tertiary border-gradient-rainbow border-1 text-body p-2 mb-1 fw-semibold small">{{ page.resolved.values.superheadline }}</span>
258
+ {% iftruthy page.resolved.values.superheadline.text %}
259
+ <span class="badge bg-body-tertiary border-gradient-rainbow border-1 text-body p-2 mb-1 fw-semibold small">
260
+ {% iftruthy page.resolved.values.superheadline.icon %}
261
+ {% uj_icon page.resolved.values.superheadline.icon, "me-1" %}
262
+ {% endiftruthy %}
263
+ {{ page.resolved.values.superheadline.text }}
264
+ </span>
242
265
  {% endiftruthy %}
243
266
  <h2 class="h2 mb-2">
244
267
  {{ page.resolved.values.headline }} <span class="text-accent">{{ page.resolved.values.headline_accent }}</span>
@@ -269,21 +292,40 @@ team_cta:
269
292
  <!-- Team CTA Section -->
270
293
  <section>
271
294
  <div class="container">
272
- <div class="rounded-4 p-5 bg-primary bg-gradient text-light text-center" data-lazy="@class animation-slide-up">
273
- <div class="row justify-content-center">
274
- <div class="col-lg-8">
275
- {% iftruthy page.resolved.team_cta.superheadline %}
276
- <span class="badge bg-white bg-opacity-25 text-light p-2 mb-1 fw-semibold small">{{ page.resolved.team_cta.superheadline }}</span>
277
- {% endiftruthy %}
278
- <h2 class="h2 mb-2">
279
- {{ page.resolved.team_cta.headline }} <span class="text-accent">{{ page.resolved.team_cta.headline_accent }}</span>
280
- </h2>
281
- {% iftruthy page.resolved.team_cta.subheadline %}
282
- <p class="fs-5 mb-4 opacity-90">
283
- {{ page.resolved.team_cta.subheadline }}
284
- </p>
295
+ <div class="card border-0 bg-gradient bg-primary text-white rounded-4 p-4 p-md-5 text-center position-relative overflow-hidden" data-lazy="@class animation-slide-up">
296
+ <!-- Decorative icon - top right -->
297
+ <div class="position-absolute top-0 end-0 opacity-25" style="font-size:10rem;transform:rotate(15deg)translate(30%,-30%)">
298
+ {% uj_icon "users", "text-white" %}
299
+ </div>
300
+
301
+ <!-- Decorative icon - bottom left -->
302
+ <div class="position-absolute bottom-0 start-0 opacity-25" style="font-size:8rem;transform:rotate(-20deg)translate(-30%,30%)">
303
+ {% uj_icon "heart", "text-white" %}
304
+ </div>
305
+
306
+ <div class="position-relative">
307
+ {% iftruthy page.resolved.team_cta.superheadline.text %}
308
+ <span class="badge bg-white bg-opacity-25 text-light p-2 mb-3 fw-semibold small">
309
+ {% iftruthy page.resolved.team_cta.superheadline.icon %}
310
+ {% uj_icon page.resolved.team_cta.superheadline.icon, "me-1" %}
311
+ {% endiftruthy %}
312
+ {{ page.resolved.team_cta.superheadline.text }}
313
+ </span>
314
+ {% endiftruthy %}
315
+
316
+ <h2 class="h3 fw-bold mb-3">
317
+ {{ page.resolved.team_cta.headline }}
318
+ {% iftruthy page.resolved.team_cta.headline_accent %}
319
+ {{ page.resolved.team_cta.headline_accent }}
285
320
  {% endiftruthy %}
286
- <a href="{{ page.resolved.team_cta.button.href }}" class="btn btn-light btn-lg px-5 py-3">
321
+ </h2>
322
+
323
+ {% iftruthy page.resolved.team_cta.subheadline %}
324
+ <p class="lead mb-4">{{ page.resolved.team_cta.subheadline }}</p>
325
+ {% endiftruthy %}
326
+
327
+ <div class="d-flex flex-column flex-sm-row gap-3 justify-content-center">
328
+ <a href="{{ page.resolved.team_cta.button.href }}" class="btn btn-light btn-lg px-4">
287
329
  {% uj_icon page.resolved.team_cta.button.icon, "me-2" %}
288
330
  {{ page.resolved.team_cta.button.text }}
289
331
  </a>
@@ -800,7 +800,7 @@ badges:
800
800
  {% endiftruthy %}
801
801
  </div>
802
802
  <div>
803
- <strong>{{ method.name }}</strong>
803
+ <h6 class="mb-0">{{ method.name }}</h6>
804
804
  <div class="text-muted small" id="{{ method.id }}-email"></div>
805
805
  </div>
806
806
  </div>
@@ -845,7 +845,18 @@ badges:
845
845
 
846
846
  <div class="card">
847
847
  <div class="card-body">
848
- <h5 class="card-title">Active Sessions</h5>
848
+ <div class="d-flex justify-content-between align-items-center mb-3">
849
+ <h5 class="card-title mb-0">Active Sessions</h5>
850
+ <form id="signout-all-sessions-form" class="d-inline" novalidate>
851
+ <input type="hidden" name="action" value="signout-all">
852
+ <button type="submit" class="btn btn-outline-danger btn-sm">
853
+ {% uj_icon "right-from-bracket", "me-1" %}
854
+ <span class="button-text">
855
+ Sign out<span class="d-none d-md-inline"> of all sessions</span>
856
+ </span>
857
+ </button>
858
+ </form>
859
+ </div>
849
860
  <p class="card-text text-muted">Manage your active sessions across devices. Review and revoke access from unrecognized devices.</p>
850
861
 
851
862
  <div id="active-sessions-list" class="list-group list-group-flush mb-3">
@@ -856,15 +867,6 @@ badges:
856
867
  </div>
857
868
  </div>
858
869
  </div>
859
-
860
- <!-- Sign out of all sessions -->
861
- <form id="signout-all-sessions-form" class="d-grid d-sm-block" novalidate>
862
- <input type="hidden" name="action" value="signout-all">
863
- <button type="submit" class="btn btn-outline-danger">
864
- {% uj_icon "right-from-bracket", "me-1" %}
865
- <span class="button-text">Sign out of all sessions</span>
866
- </button>
867
- </form>
868
870
  </div>
869
871
  </div>
870
872
  </section>
@@ -1074,7 +1076,17 @@ badges:
1074
1076
 
1075
1077
  <div class="card">
1076
1078
  <div class="card-body">
1077
- <h5 class="card-title">Your API Key</h5>
1079
+ <div class="d-flex justify-content-between align-items-center mb-3">
1080
+ <h5 class="card-title mb-0">Your API Key</h5>
1081
+ <form id="reset-api-key-form" class="d-inline" novalidate>
1082
+ <button type="submit" class="btn btn-outline-danger btn-sm" id="reset-api-key-btn">
1083
+ {% uj_icon "rotate", "me-1" %}
1084
+ <span class="button-text">
1085
+ Reset<span class="d-none d-md-inline"> API Key</span>
1086
+ </span>
1087
+ </button>
1088
+ </form>
1089
+ </div>
1078
1090
  <p class="card-text text-muted">Use this private key to authenticate API requests. Keep it secure and never share it publicly.</p>
1079
1091
 
1080
1092
  <!-- API Key Display -->
@@ -1090,21 +1102,14 @@ badges:
1090
1102
  </div>
1091
1103
 
1092
1104
  <!-- Reset API Key -->
1093
- <div class="alert alert-warning d-flex align-items-start" role="alert">
1105
+ <div class="alert alert-warning d-flex align-items-center" role="alert">
1094
1106
  <div class="me-3">
1095
- {% uj_icon "triangle-exclamation", "fa-lg" %}
1107
+ {% uj_icon "triangle-exclamation", "fa-2xl" %}
1096
1108
  </div>
1097
1109
  <div class="flex-grow-1">
1098
1110
  <strong>Warning:</strong> Resetting your API key will invalidate the current key. Any applications using the old key will stop working.
1099
1111
  </div>
1100
1112
  </div>
1101
-
1102
- <form id="reset-api-key-form" class="d-grid d-sm-block" novalidate>
1103
- <button type="submit" class="btn btn-danger" id="reset-api-key-btn">
1104
- {% uj_icon "rotate", "me-2" %}
1105
- <span class="button-text">Reset API Key</span>
1106
- </button>
1107
- </form>
1108
1113
  </div>
1109
1114
  </div>
1110
1115
  </section>
@@ -63,7 +63,7 @@ social_signin:
63
63
  <label for="email" class="form-label fw-semibold">
64
64
  Email <span class="text-danger">*</span>
65
65
  </label>
66
- <input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus required>
66
+ <input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus>
67
67
  </div>
68
68
 
69
69
  <div class="mb-3 text-start">
@@ -71,7 +71,7 @@ social_signin:
71
71
  Password <span class="text-danger">*</span>
72
72
  </label>
73
73
  <div class="input-group">
74
- <input type="password" class="form-control form-control-md" id="password" name="password" placeholder="Enter your password" autocomplete="current-password" required>
74
+ <input type="password" class="form-control form-control-md" id="password" name="password" placeholder="Enter your password" autocomplete="current-password">
75
75
  <button class="btn border uj-password-toggle px-3" type="button" aria-label="Toggle password visibility">
76
76
  <span class="uj-password-show">{% uj_icon "eye", "fa-fw" %}</span>
77
77
  <span class="uj-password-hide d-none">{% uj_icon "eye-slash", "fa-fw" %}</span>
@@ -73,7 +73,7 @@ social_signup:
73
73
  <label for="email" class="form-label fw-semibold">
74
74
  Email <span class="text-danger">*</span>
75
75
  </label>
76
- <input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus required>
76
+ <input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus>
77
77
  </div>
78
78
 
79
79
  <div class="mb-3 text-start">
@@ -81,7 +81,7 @@ social_signup:
81
81
  Password <span class="text-danger">*</span>
82
82
  </label>
83
83
  <div class="input-group">
84
- <input type="password" class="form-control form-control-md" id="password" name="password" placeholder="Create a strong password" autocomplete="new-password" required>
84
+ <input type="password" class="form-control form-control-md" id="password" name="password" placeholder="Create a strong password" autocomplete="new-password">
85
85
  <button class="btn border uj-password-toggle px-3" type="button" aria-label="Toggle password visibility">
86
86
  <span class="uj-password-show">{% uj_icon "eye", "fa-fw" %}</span>
87
87
  <span class="uj-password-hide d-none">{% uj_icon "eye-slash", "fa-fw" %}</span>
@@ -6,14 +6,16 @@ layout: themes/[ site.theme.id ]/frontend/core/base
6
6
  # Hero Section
7
7
  hero:
8
8
  headline: "The {{ site.brand.name }}"
9
- headline_accent: "Blog"
9
+ headline_accent: "blog"
10
10
  subheadline: "Discover insights, tutorials, and news from our team"
11
11
 
12
12
  # Newsletter CTA Section
13
13
  newsletter_cta:
14
- superheadline: "{% uj_icon 'envelope' %} Newsletter"
15
- headline: "Never Miss a"
16
- headline_accent: "Post"
14
+ superheadline:
15
+ icon: "envelope"
16
+ text: "Newsletter"
17
+ headline: "Never miss a"
18
+ headline_accent: "post"
17
19
  subheadline: "Get the latest insights delivered straight to your inbox. No spam, unsubscribe anytime."
18
20
  button:
19
21
  text: "Subscribe"
@@ -32,7 +34,7 @@ newsletter_cta:
32
34
  {{ page.resolved.hero.headline }} <span class="text-gradient-rainbow">{{ page.resolved.hero.headline_accent }}</span>
33
35
  </h1>
34
36
  {% iftruthy page.resolved.hero.subheadline %}
35
- <p class="fs-5 text-muted mb-0">
37
+ <p class="fs-5 text-muted">
36
38
  {{ page.resolved.hero.subheadline }}
37
39
  </p>
38
40
  {% endiftruthy %}
@@ -229,64 +231,76 @@ newsletter_cta:
229
231
 
230
232
  <!-- Newsletter CTA -->
231
233
  <section>
232
- <div class="container" data-lazy="@class animation-slide-up">
233
- <div class="rounded-4 p-5 position-relative overflow-hidden bg-primary bg-gradient">
234
- <div class="row align-items-center py-4">
235
- <div class="col-lg-6 text-light">
236
- {% iftruthy page.resolved.newsletter_cta.superheadline %}
237
- <span class="badge bg-white bg-opacity-25 text-light p-2 mb-1 fw-semibold small">{{ page.resolved.newsletter_cta.superheadline }}</span>
238
- {% endiftruthy %}
239
- <h2 class="h2 mb-2">
240
- {{ page.resolved.newsletter_cta.headline }}
241
- {% iftruthy page.resolved.newsletter_cta.headline_accent %}
242
- <span class="text-accent">{{ page.resolved.newsletter_cta.headline_accent }}</span>
234
+ <div class="container">
235
+ <div class="card border-0 bg-gradient bg-primary text-white rounded-4 p-4 p-md-5 text-center position-relative overflow-hidden" data-lazy="@class animation-slide-up">
236
+ <!-- Decorative icon - top right -->
237
+ <div class="position-absolute top-0 end-0 opacity-25" style="font-size:10rem;transform:rotate(15deg)translate(30%,-30%)">
238
+ {% uj_icon "pen-nib", "text-white" %}
239
+ </div>
240
+
241
+ <!-- Decorative icon - bottom left -->
242
+ <div class="position-absolute bottom-0 start-0 opacity-25" style="font-size:8rem;transform:rotate(-20deg)translate(-30%,30%)">
243
+ {% uj_icon "book-open", "text-white" %}
244
+ </div>
245
+
246
+ <div class="position-relative">
247
+ {% iftruthy page.resolved.newsletter_cta.superheadline.text %}
248
+ <span class="badge bg-white bg-opacity-25 text-light p-2 mb-3 fw-semibold small">
249
+ {% iftruthy page.resolved.newsletter_cta.superheadline.icon %}
250
+ {% uj_icon page.resolved.newsletter_cta.superheadline.icon, "me-1" %}
243
251
  {% endiftruthy %}
244
- </h2>
245
- {% iftruthy page.resolved.newsletter_cta.subheadline %}
246
- <p class="fs-5 mb-4 opacity-90">
247
- {{ page.resolved.newsletter_cta.subheadline }}
248
- </p>
252
+ {{ page.resolved.newsletter_cta.superheadline.text }}
253
+ </span>
254
+ {% endiftruthy %}
255
+
256
+ <h2 class="h3 fw-bold mb-3">
257
+ {{ page.resolved.newsletter_cta.headline }}
258
+ {% iftruthy page.resolved.newsletter_cta.headline_accent %}
259
+ {{ page.resolved.newsletter_cta.headline_accent }}
249
260
  {% endiftruthy %}
250
- </div>
251
- <div class="col-lg-6">
252
- <!-- Newsletter Form -->
253
- <form id="newsletter-form" class="newsletter-form">
254
- <div class="row g-2">
255
- <div class="col-md-8">
256
- <input
257
- type="email"
258
- class="form-control form-control-lg"
259
- placeholder="{{ page.resolved.newsletter_cta.form.placeholder }}"
260
- name="email"
261
- required
262
- pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"
263
- autocomplete="email"
264
- >
265
- <div class="invalid-feedback text-start">
266
- Please enter a valid email address.
267
- </div>
268
- </div>
269
- <div class="col-md-4">
270
- <button type="submit" class="btn btn-adaptive btn-lg px-4 w-100">
271
- {{ page.resolved.newsletter_cta.button.text }}
272
- <span class="spinner-border spinner-border-sm ms-2 d-none" role="status">
273
- <span class="visually-hidden">Loading...</span>
274
- </span>
275
- </button>
276
- </div>
277
- </div>
261
+ </h2>
262
+
263
+ {% iftruthy page.resolved.newsletter_cta.subheadline %}
264
+ <p class="lead mb-4">{{ page.resolved.newsletter_cta.subheadline }}</p>
265
+ {% endiftruthy %}
278
266
 
279
- <!-- Success/Error Messages -->
280
- <div class="newsletter-success-alert alert alert-success mt-3 d-none" role="alert">
281
- {% uj_icon "check-circle", "me-2" %}
282
- {{ page.resolved.newsletter_cta.form.success_message }}
267
+ <!-- Newsletter Form -->
268
+ <form id="newsletter-form" class="newsletter-form">
269
+ <div class="row g-3 justify-content-center">
270
+ <div class="col-md-7">
271
+ <input
272
+ type="email"
273
+ class="form-control form-control-lg"
274
+ placeholder="{{ page.resolved.newsletter_cta.form.placeholder }}"
275
+ name="email"
276
+ required
277
+ pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"
278
+ autocomplete="email"
279
+ >
280
+ <div class="invalid-feedback text-start">
281
+ Please enter a valid email address.
282
+ </div>
283
283
  </div>
284
- <div class="newsletter-error-alert alert alert-danger mt-3 d-none" role="alert">
285
- {% uj_icon "exclamation-circle", "me-2" %}
286
- <span class="error-message">{{ page.resolved.newsletter_cta.form.error_message }}</span>
284
+ <div class="col-md-auto">
285
+ <button type="submit" class="btn btn-light btn-lg px-4">
286
+ {{ page.resolved.newsletter_cta.button.text }}
287
+ <span class="spinner-border spinner-border-sm ms-2 d-none" role="status">
288
+ <span class="visually-hidden">Loading...</span>
289
+ </span>
290
+ </button>
287
291
  </div>
288
- </form>
289
- </div>
292
+ </div>
293
+
294
+ <!-- Success/Error Messages -->
295
+ <div class="newsletter-success-alert alert alert-success mt-3 d-none" role="alert">
296
+ {% uj_icon "check-circle", "me-2" %}
297
+ {{ page.resolved.newsletter_cta.form.success_message }}
298
+ </div>
299
+ <div class="newsletter-error-alert alert alert-danger mt-3 d-none" role="alert">
300
+ {% uj_icon "exclamation-circle", "me-2" %}
301
+ <span class="error-message">{{ page.resolved.newsletter_cta.form.error_message }}</span>
302
+ </div>
303
+ </form>
290
304
  </div>
291
305
  </div>
292
306
  </div>
@@ -20,13 +20,15 @@ author_section:
20
20
 
21
21
  related_posts:
22
22
  headline: "Related"
23
- headline_accent: "Posts"
23
+ headline_accent: "posts"
24
24
  limit: 3
25
25
 
26
26
  newsletter:
27
- superheadline: "{% uj_icon 'envelope' %} Newsletter"
27
+ superheadline:
28
+ icon: "envelope"
29
+ text: "Newsletter"
28
30
  headline: "Stay in the"
29
- headline_accent: "Loop"
31
+ headline_accent: "loop"
30
32
  subheadline: "Join our newsletter and get resources, curated content, and inspiration delivered straight to your inbox."
31
33
  button:
32
34
  text: "Submit"
@@ -39,7 +41,7 @@ newsletter:
39
41
  <div class="container">
40
42
  <div class="row justify-content-center mb-3">
41
43
  <div class="col-xl-8 col-lg-8 col-md-12 col-12">
42
- <header class="text-center mb-4" data-lazy="@class animation-slide-up">
44
+ <header class="text-center mb-5" data-lazy="@class animation-slide-up">
43
45
  <h1 class="h1 fw-bold mb-0">{{ page.post.title }}</h1>
44
46
  </header>
45
47
 
@@ -257,32 +259,47 @@ newsletter:
257
259
  <section>
258
260
  <div class="container">
259
261
  <div class="row justify-content-center">
260
- <div class="col-xl-8 col-lg-8 col-md-12 col-12" data-lazy="@class animation-slide-up">
261
- <div class="card">
262
- <div class="card-body p-5">
263
- <div class="text-center mb-4">
264
- {% iftruthy page.resolved.newsletter.superheadline %}
265
- <span class="badge bg-body-tertiary border-gradient-rainbow border-1 text-body p-2 mb-1 fw-semibold small">
266
- {{ page.resolved.newsletter.superheadline }}
267
- </span>
268
- {% endiftruthy %}
269
- {% iftruthy page.resolved.newsletter.headline %}
270
- <h2 class="h2 fw-bold mb-2">
271
- {{ page.resolved.newsletter.headline }}{% iftruthy page.resolved.newsletter.headline_accent %} <span class="text-accent">{{ page.resolved.newsletter.headline_accent }}</span>{% endiftruthy %}
272
- </h2>
273
- {% endiftruthy %}
274
- {% iftruthy page.resolved.newsletter.subheadline %}
275
- <p class="mb-0 lead">
276
- {{ page.resolved.newsletter.subheadline }}
277
- </p>
278
- {% endiftruthy %}
279
- </div>
280
- <form class="row px-md-8 mx-md-8 gx-2 needs-validation" action="{{ site.url }}/email-subscription">
281
- <div class="col">
282
- <input type="email" name="email" class="form-control" placeholder="{% iftruthy page.resolved.newsletter.form.placeholder %}{{ page.resolved.newsletter.form.placeholder }}{% endiftruthy %}" autocomplete="email" required>
262
+ <div class="col-xl-8 col-lg-8 col-md-12 col-12">
263
+ <div class="card border-0 bg-gradient bg-primary text-white rounded-4 p-4 p-md-5 text-center position-relative overflow-hidden" data-lazy="@class animation-slide-up">
264
+ <!-- Decorative icon - top right -->
265
+ <div class="position-absolute top-0 end-0 opacity-25" style="font-size:10rem;transform:rotate(15deg)translate(30%,-30%)">
266
+ {% uj_icon "comments", "text-white" %}
267
+ </div>
268
+
269
+ <!-- Decorative icon - bottom left -->
270
+ <div class="position-absolute bottom-0 start-0 opacity-25" style="font-size:8rem;transform:rotate(-20deg)translate(-30%,30%)">
271
+ {% uj_icon "rss", "text-white" %}
272
+ </div>
273
+
274
+ <div class="position-relative">
275
+ {% iftruthy page.resolved.newsletter.superheadline.text %}
276
+ <span class="badge bg-white bg-opacity-25 text-light p-2 mb-3 fw-semibold small">
277
+ {% iftruthy page.resolved.newsletter.superheadline.icon %}
278
+ {% uj_icon page.resolved.newsletter.superheadline.icon, "me-1" %}
279
+ {% endiftruthy %}
280
+ {{ page.resolved.newsletter.superheadline.text }}
281
+ </span>
282
+ {% endiftruthy %}
283
+
284
+ {% iftruthy page.resolved.newsletter.headline %}
285
+ <h2 class="h3 fw-bold mb-3">
286
+ {{ page.resolved.newsletter.headline }}
287
+ {% iftruthy page.resolved.newsletter.headline_accent %}
288
+ {{ page.resolved.newsletter.headline_accent }}
289
+ {% endiftruthy %}
290
+ </h2>
291
+ {% endiftruthy %}
292
+
293
+ {% iftruthy page.resolved.newsletter.subheadline %}
294
+ <p class="lead mb-4">{{ page.resolved.newsletter.subheadline }}</p>
295
+ {% endiftruthy %}
296
+
297
+ <form class="row g-3 justify-content-center needs-validation" action="{{ site.url }}/email-subscription">
298
+ <div class="col-md-7">
299
+ <input type="email" name="email" class="form-control form-control-lg" placeholder="{% iftruthy page.resolved.newsletter.form.placeholder %}{{ page.resolved.newsletter.form.placeholder }}{% endiftruthy %}" autocomplete="email" required>
283
300
  </div>
284
- <div class="col-auto">
285
- <button type="submit" class="btn btn-primary">{% iftruthy page.resolved.newsletter.button.text %}{{ page.resolved.newsletter.button.text }}{% endiftruthy %}</button>
301
+ <div class="col-md-auto">
302
+ <button type="submit" class="btn btn-light btn-lg px-4">{% iftruthy page.resolved.newsletter.button.text %}{{ page.resolved.newsletter.button.text }}{% endiftruthy %}</button>
286
303
  </div>
287
304
  </form>
288
305
  </div>