ultimate-jekyll-manager 0.0.96 → 0.0.98

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 (71) hide show
  1. package/.playwright-mcp/page-2025-10-22T19-11-27-666Z.png +0 -0
  2. package/.playwright-mcp/page-2025-10-22T19-11-57-357Z.png +0 -0
  3. package/CLAUDE.md +42 -0
  4. package/README.md +66 -0
  5. package/_backup/checkout copy 2.html +392 -0
  6. package/_backup/checkout copy 3.html +376 -0
  7. package/_backup/checkout copy 4.html +365 -0
  8. package/_backup/checkout copy.html +331 -0
  9. package/_backup/checkout-semi.html +331 -0
  10. package/_backup/cover-old.html +55 -0
  11. package/dist/assets/css/core/bindings.scss +7 -2
  12. package/dist/assets/css/core/utilities.scss +9 -1
  13. package/dist/assets/css/pages/payment/checkout/index.scss +52 -7
  14. package/dist/assets/js/core/complete.js +56 -0
  15. package/dist/assets/js/core/initialize.js +11 -0
  16. package/dist/assets/js/pages/app/index.js +82 -43
  17. package/dist/assets/js/pages/download/index.js +0 -6
  18. package/dist/assets/js/pages/payment/checkout/index.js +58 -52
  19. package/dist/assets/js/pages/payment/checkout/modules/discount-bindings.js +51 -0
  20. package/dist/assets/js/pages/payment/checkout/modules/pricing.js +55 -30
  21. package/dist/assets/js/pages/payment/checkout/modules/state.js +68 -14
  22. package/dist/assets/js/pages/payment/checkout/modules/ui-bindings.js +160 -0
  23. package/dist/assets/js/pages/payment/checkout/modules/ui.js +27 -42
  24. package/dist/assets/js/pages/payment/confirmation/index.js +58 -53
  25. package/dist/assets/js/pages/payment/confirmation/modules/bindings.js +28 -0
  26. package/dist/assets/js/pages/payment/confirmation/modules/state.js +19 -0
  27. package/dist/assets/js/ultimate-jekyll-manager.js +6 -2
  28. package/dist/assets/themes/classy/css/base/_spacing.scss +27 -0
  29. package/dist/defaults/dist/{redirects/authentication/helpers/well-known-change-password.html → .well-known/change-password.html} +4 -1
  30. package/dist/defaults/dist/.well-known/security.txt +15 -0
  31. package/dist/defaults/dist/_includes/core/body.html +31 -0
  32. package/dist/defaults/dist/_includes/core/foot.html +35 -0
  33. package/dist/defaults/dist/_layouts/blueprint/app.html +1 -1
  34. package/dist/defaults/dist/_layouts/blueprint/payment/checkout.html +6 -1
  35. package/dist/defaults/dist/_layouts/blueprint/payment/confirmation.html +6 -1
  36. package/dist/defaults/dist/_layouts/core/root.html +1 -0
  37. package/dist/defaults/dist/_layouts/modules/utilities/redirect.html +42 -31
  38. package/dist/defaults/dist/_layouts/themes/classy/backend/core/base.html +0 -35
  39. package/dist/defaults/dist/_layouts/themes/classy/frontend/core/base.html +0 -34
  40. package/dist/defaults/dist/_layouts/themes/classy/frontend/core/cover.html +6 -9
  41. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/404.html +35 -44
  42. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/account/index.html +1 -1
  43. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/app.html +83 -0
  44. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/oauth2.html +42 -44
  45. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/reset.html +57 -59
  46. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signin.html +67 -69
  47. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signup.html +76 -78
  48. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/download.html +1 -4
  49. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/payment/checkout.html +291 -240
  50. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/payment/confirmation.html +43 -47
  51. package/dist/defaults/dist/humans.txt +25 -0
  52. package/dist/defaults/dist/opensearch.xml +26 -0
  53. package/dist/defaults/dist/pages/test/account/dashboard.html +3 -0
  54. package/dist/defaults/dist/pages/test/index.md +2 -2
  55. package/dist/defaults/dist/pages/test/libraries/ads.html +3 -0
  56. package/dist/defaults/dist/pages/test/libraries/bootstrap-components.html +11 -2
  57. package/dist/defaults/dist/pages/test/libraries/cover.html +47 -0
  58. package/dist/defaults/dist/pages/test/libraries/error.html +3 -0
  59. package/dist/defaults/dist/pages/test/libraries/lazy-loading.html +3 -0
  60. package/dist/defaults/dist/pages/test/redirect/external.md +3 -0
  61. package/dist/defaults/dist/pages/test/redirect/internal.md +3 -0
  62. package/dist/defaults/dist/pages/test/translation/index.md +2 -2
  63. package/dist/defaults/dist/redirects/authentication/helpers/change-password.html +1 -1
  64. package/dist/defaults/dist/redirects/authentication/helpers/forgot.html +1 -1
  65. package/dist/defaults/dist/redirects/authentication/helpers/recover.html +1 -1
  66. package/dist/defaults/dist/redirects/authentication/helpers/reset-password.html +1 -1
  67. package/dist/defaults/dist/sitemap.html +112 -28
  68. package/dist/defaults/dist/sitemap.xml +6 -1
  69. package/firebase-debug.log +388 -0
  70. package/package.json +1 -1
  71. package/dist/assets/js/core/init.js +0 -36
@@ -0,0 +1,19 @@
1
+ // Confirmation state management
2
+ // This is the SINGLE source of truth - structure matches bindings exactly
3
+ export const state = {
4
+ confirmation: {
5
+ order: {
6
+ id: 'Loading...',
7
+ productName: 'Product',
8
+ total: '$0.00',
9
+ currency: 'USD'
10
+ },
11
+ subscription: {
12
+ show: false,
13
+ hasFreeTrial: false,
14
+ billingCycle: '',
15
+ infoText: ''
16
+ },
17
+ loaded: false
18
+ }
19
+ };
@@ -1,9 +1,10 @@
1
1
  // Static imports for core modules (bundled together for efficiency)
2
- import initModule from '__main_assets__/js/core/init.js';
2
+ // import initializeModule from '__main_assets__/js/core/initialize.js';
3
3
  import authModule from '__main_assets__/js/core/auth.js';
4
4
  import lazyLoadingModule from '__main_assets__/js/core/lazy-loading.js';
5
5
  import queryStringsModule from '__main_assets__/js/core/query-strings.js';
6
6
  import serviceWorkerModule from '__main_assets__/js/core/service-worker.js';
7
+ import completeModule from '__main_assets__/js/core/complete.js';
7
8
 
8
9
  // Ultimate Jekyll Manager Module
9
10
  export default async function (Manager, options) {
@@ -17,7 +18,7 @@ export default async function (Manager, options) {
17
18
  console.log('Global module loaded successfully (assets/js/ultimate-jekyll-manager.js)');
18
19
 
19
20
  // Initialize fixed modules synchronously (already loaded via static imports)
20
- initModule(Manager, options);
21
+ // initializeModule(Manager, options);
21
22
  authModule(Manager, options);
22
23
  lazyLoadingModule(Manager, options);
23
24
  queryStringsModule(Manager, options);
@@ -56,4 +57,7 @@ export default async function (Manager, options) {
56
57
 
57
58
  // Wait for all conditional modules to load
58
59
  await Promise.all(modulePromises);
60
+
61
+ // Run the complete module to finalize page load state
62
+ completeModule(Manager, options);
59
63
  }
@@ -35,3 +35,30 @@
35
35
  .min-vh-80 { min-height: 80vh !important; }
36
36
  .min-vh-90 { min-height: 90vh !important; }
37
37
  .min-vh-100 { min-height: 100vh !important; }
38
+
39
+ // ============================================
40
+ // Max Width Utilities (Bootstrap Breakpoints)
41
+ // ============================================
42
+ // Max width utility classes based on Bootstrap grid breakpoints
43
+ // Usage: mw-sm, mw-md, mw-lg, mw-xl, mw-xxl
44
+ // These set the max-width to match Bootstrap's container breakpoints
45
+
46
+ .mw-sm {
47
+ max-width: 576px !important;
48
+ }
49
+
50
+ .mw-md {
51
+ max-width: 768px !important;
52
+ }
53
+
54
+ .mw-lg {
55
+ max-width: 992px !important;
56
+ }
57
+
58
+ .mw-xl {
59
+ max-width: 1200px !important;
60
+ }
61
+
62
+ .mw-xxl {
63
+ max-width: 1400px !important;
64
+ }
@@ -4,6 +4,9 @@ layout: modules/utilities/redirect
4
4
  permalink: /.well-known/change-password
5
5
 
6
6
  ### REGULAR PAGES ###
7
+ sitemap:
8
+ include: false
9
+
7
10
  redirect:
8
- url: /reset?signout=true
11
+ url: /reset?authSignout=true
9
12
  ---
@@ -0,0 +1,15 @@
1
+ ---
2
+ ### ALL PAGES ###
3
+ layout: null
4
+ permalink: /.well-known/security.txt
5
+
6
+ ### REGULAR PAGES ###
7
+ sitemap:
8
+ include: false
9
+ ---
10
+ Contact: mailto:{{ site.brand.email }}
11
+ Contact: {{ site.url }}/contact
12
+ Preferred-Languages: en
13
+ Canonical: {{ site.url }}/.well-known/security.txt
14
+ Policy: {{ site.url }}/privacy
15
+ Expires: {{ site.time | date: "%Y" | plus: 1 }}-12-31T23:59:59.000Z
@@ -34,3 +34,34 @@
34
34
  Save <strong>15%</strong> at checkout—today only! <a href="{{ site.url }}/pricing" target="_blank">Claim discount</a>.
35
35
  </div>
36
36
  </div>
37
+
38
+ <!-- Script to prevent clicks on disabled elements during page load -->
39
+ <script type="text/javascript">
40
+ (function() {
41
+ 'use strict';
42
+ // Attach click listener immediately to prevent clicks on disabled elements
43
+ document.addEventListener('click', function(e) {
44
+ var target = e.target;
45
+
46
+ // Check if click is on a disabled element OR a button/form element during page load
47
+ if (
48
+ target.closest('*[disabled], *.disabled, :disabled')
49
+ || (
50
+ document.documentElement.hasAttribute('data-page-loading')
51
+ && target.closest('button, input[type="submit"], input[type="button"], input[type="reset"], .btn-action')
52
+ )
53
+ ) {
54
+ // Log disabled click attempt in development
55
+ if (window.location.hostname === 'localhost' || window.location.hostname.startsWith('192.168')) {
56
+ console.log('Click prevented (disabled):', target);
57
+ }
58
+
59
+ // Prevent all actions
60
+ e.preventDefault();
61
+ e.stopImmediatePropagation();
62
+ e.stopPropagation();
63
+ return false;
64
+ }
65
+ }, { capture: true });
66
+ }());
67
+ </script>
@@ -78,6 +78,41 @@
78
78
  <!-- JS Bundle -->
79
79
  <script type="text/javascript" src="{{ site.url }}/assets/js/main.bundle.js?cb={{ site.uj.cache_breaker }}" async></script>
80
80
 
81
+ <!-- Script to quickly handle nav user state -->
82
+ <script type="text/javascript">
83
+ try {
84
+ (function() {
85
+ 'use strict';
86
+ // Read and parse localStorage data
87
+ var managerData = localStorage.getItem('_manager');
88
+ var parsedData = managerData ? JSON.parse(managerData) : null;
89
+ var isLoggedIn = !!(parsedData && parsedData.auth && parsedData.auth.user && parsedData.auth.user.uid);
90
+
91
+ // Quit if NOT logged in
92
+ if (!isLoggedIn) {
93
+ return;
94
+ }
95
+
96
+ // Process binds
97
+ var $bindElements = document.querySelectorAll('[data-wm-bind]');
98
+
99
+ $bindElements.forEach(function($el) {
100
+ var bindValue = $el.getAttribute('data-wm-bind');
101
+
102
+ if (bindValue === '@show auth.user') {
103
+ // Show element when user is logged in
104
+ $el.removeAttribute('hidden');
105
+ } else if (bindValue === '@show !auth.user') {
106
+ // Hide element when user is logged in (show when not logged in)
107
+ $el.setAttribute('hidden', '');
108
+ }
109
+ });
110
+ }());
111
+ } catch (error) {
112
+ console.error('Error occurred while selecting elements:', error);
113
+ }
114
+ </script>
115
+
81
116
  <!-- Script - Google Analytics Tracking Script -->
82
117
  {% iftruthy page.resolved.tracking.google-analytics %}
83
118
  <script type="text/javascript" src="https://www.googletagmanager.com/gtag/js?id={{ site.tracking.google-analytics }}" async></script>
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  ### ALL PAGES ###
3
- layout: themes/[ site.theme.id ]/frontend/core/cover
3
+ layout: themes/[ site.theme.id ]/frontend/pages/app
4
4
 
5
5
  ### REGULAR PAGES ###
6
6
  meta:
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  ### ALL PAGES ###
3
- layout: themes/[ site.theme.id ]/frontend/pages/payment/checkout
3
+ layout: themes/classy/frontend/pages/payment/checkout
4
+
5
+ ### THEME CONFIG ###
6
+ theme:
7
+ css:
8
+ bundle: "classy"
4
9
 
5
10
  ### REGULAR PAGES ###
6
11
  meta:
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  ### ALL PAGES ###
3
- layout: themes/[ site.theme.id ]/frontend/pages/payment/confirmation
3
+ layout: themes/classy/frontend/pages/payment/confirmation
4
+
5
+ ### THEME CONFIG ###
6
+ theme:
7
+ css:
8
+ bundle: "classy"
4
9
 
5
10
  ### REGULAR PAGES ###
6
11
  meta:
@@ -18,6 +18,7 @@ layout: null
18
18
  data-asset-path="{{ page.resolved.asset_path }}"
19
19
 
20
20
  data-page-loading="true"
21
+ aria-busy="true"
21
22
  >
22
23
  <head>
23
24
  <!-- Head -->
@@ -13,40 +13,51 @@ meta:
13
13
  {% capture querystring %}{{ page.resolved.redirect.querystring }}{% endcapture %}
14
14
  {% capture modifier %}{{ page.resolved.redirect.modifier | default: "" }}{% endcapture %}
15
15
 
16
- <div class="d-flex justify-content-center align-items-center flex-column">
17
- <div class="mb-3">
18
- <a href="{{ site.url }}">
19
- <div class="avatar avatar-xl">
20
- <img id="main-logo" src="{{ site.brand.images.brandmark }}?cb={{ site.uj.cache_breaker }}" alt="{{ site.brand.name }}"/>
16
+ <section class="col-12 col-md-8 col-lg-6 col-xl-5 mw-sm">
17
+ <div class="card border-0 shadow-lg">
18
+ <div class="card-body p-3 p-md-5">
19
+ <!-- Logo -->
20
+ <div class="text-center mb-3">
21
+ <a href="{{ site.url }}">
22
+ <div class="avatar avatar-xl">
23
+ <img src="{{ site.brand.images.brandmark }}?cb={{ site.uj.cache_breaker }}" alt="{{ site.brand.name }}"/>
24
+ </div>
25
+ </a>
26
+ </div>
27
+
28
+ <!-- Header -->
29
+ <div class="text-center mb-4">
30
+ <div class="d-inline-flex align-items-center">
31
+ <h1 class="h3 mb-0">Redirecting...</h1>
32
+ <div class="spinner-border spinner-border-sm text-primary ms-3" role="status">
33
+ <span class="visually-hidden">Loading...</span>
34
+ </div>
35
+ </div>
36
+ <p class="text-muted mt-2 mb-0">
37
+ Taking you to the page you requested
38
+ </p>
39
+ </div>
40
+
41
+ <!-- Action Buttons -->
42
+ <div class="d-grid gap-2 d-sm-block text-center">
43
+ <a id="home-button" class="btn btn-outline-adaptive btn-lg mb-2 mb-sm-0 me-sm-2" href="{{ site.url }}">
44
+ <span class="d-inline-flex align-items-center">
45
+ {% uj_icon "house", "fa-lg me-2" %}
46
+ Return home
47
+ </span>
48
+ </a>
49
+ <noscript>
50
+ <a id="redirect-button" class="btn btn-adaptive btn-lg mb-2 mb-sm-0" href="{{ url }}">
51
+ <span class="d-inline-flex align-items-center">
52
+ {% uj_icon "rocket", "fa-lg me-2" %}
53
+ Take me there
54
+ </span>
55
+ </a>
56
+ </noscript>
21
57
  </div>
22
- </a>
23
- </div>
24
- <div class="d-inline-flex justify-content-between align-items-center">
25
- <h1 class="h1">Redirecting...</h1>
26
- <div class="spinner-border spinner-border-md text-primary ms-3" role="status">
27
- <span class="visually-hidden">Loading...</span>
28
58
  </div>
29
59
  </div>
30
- <p class="lead mb-3">
31
- Taking you to the page you requested.
32
- </p>
33
- <div class="d-grid gap-2 d-sm-block">
34
- <a id="home-button" class="btn btn-outline-primary btn-lg mb-2 mb-sm-0 me-md-2" href="{{ site.url }}">
35
- <span class="d-inline-flex align-items-center">
36
- {% uj_icon "house", "fa-lg me-2" %}
37
- Return home
38
- </span>
39
- </a>
40
- <noscript>
41
- <a id="redirect-button" class="btn btn-primary btn-lg mb-2 mb-sm-0 me-md-2" href="{{ url }}">
42
- <span class="d-inline-flex align-items-center">
43
- {% uj_icon "rocket", "fa-lg me-2" %}
44
- Take me there
45
- </span>
46
- </a>
47
- </noscript>
48
- </div>
49
- </div>
60
+ </section>
50
61
 
51
62
  <!-- Redirect configuration for external script -->
52
63
  <div id="redirect-config" style="display: none;"
@@ -53,38 +53,3 @@ web_manager:
53
53
  </main>
54
54
  </div>
55
55
  </div>
56
-
57
- <!-- Script to quickly handle user state -->
58
- <script type="text/javascript">
59
- try {
60
- (function() {
61
- 'use strict';
62
- // Read and parse localStorage data
63
- var managerData = localStorage.getItem('_manager');
64
- var parsedData = managerData ? JSON.parse(managerData) : null;
65
- var isLoggedIn = !!(parsedData && parsedData.auth && parsedData.auth.user && parsedData.auth.user.uid);
66
-
67
- // Quit if NOT logged in
68
- if (!isLoggedIn) {
69
- return;
70
- }
71
-
72
- // Process binds
73
- var $bindElements = document.querySelectorAll('[data-wm-bind]');
74
-
75
- $bindElements.forEach(function($el) {
76
- var bindValue = $el.getAttribute('data-wm-bind');
77
-
78
- if (bindValue === '@show auth.user') {
79
- // Show element when user is logged in
80
- $el.removeAttribute('hidden');
81
- } else if (bindValue === '@show !auth.user') {
82
- // Hide element when user is logged in (show when not logged in)
83
- $el.setAttribute('hidden', '');
84
- }
85
- });
86
- }());
87
- } catch (error) {
88
- console.error('Error occurred while selecting elements:', error);
89
- }
90
- </script>
@@ -30,37 +30,3 @@ theme:
30
30
  {%- include /frontend/sections/footer.html -%}
31
31
  {% endunless %}
32
32
 
33
- <!-- Script to quickly handle nav user state -->
34
- <script type="text/javascript">
35
- try {
36
- (function() {
37
- 'use strict';
38
- // Read and parse localStorage data
39
- var managerData = localStorage.getItem('_manager');
40
- var parsedData = managerData ? JSON.parse(managerData) : null;
41
- var isLoggedIn = !!(parsedData && parsedData.auth && parsedData.auth.user && parsedData.auth.user.uid);
42
-
43
- // Quit if NOT logged in
44
- if (!isLoggedIn) {
45
- return;
46
- }
47
-
48
- // Process binds
49
- var $bindElements = document.querySelectorAll('[data-wm-bind]');
50
-
51
- $bindElements.forEach(function($el) {
52
- var bindValue = $el.getAttribute('data-wm-bind');
53
-
54
- if (bindValue === '@show auth.user') {
55
- // Show element when user is logged in
56
- $el.removeAttribute('hidden');
57
- } else if (bindValue === '@show !auth.user') {
58
- // Hide element when user is logged in (show when not logged in)
59
- $el.setAttribute('hidden', '');
60
- }
61
- });
62
- }());
63
- } catch (error) {
64
- console.error('Error occurred while selecting elements:', error);
65
- }
66
- </script>
@@ -7,13 +7,9 @@ theme:
7
7
  nav:
8
8
  enabled: false
9
9
  main:
10
- class: "d-flex align-items-{{ page.resolved.theme.main.align | default: 'center' }} justify-content-center"
10
+ class: "d-flex align-items-{{ page.resolved.theme.main.align | default: 'center' }} py-5"
11
11
  footer:
12
12
  enabled: false
13
- ### CORE CONFIG ###
14
- # core:
15
- # cover:
16
- # class: "align-top" # USED TO HAVE {{ page.resolved.theme.core.cover.class }} IN THE TOP LEVEL CLASS WITH w-100
17
13
  ---
18
14
 
19
15
  <!-- Critical inline CSS to prevent FOUC on cover pages -->
@@ -32,10 +28,11 @@ theme:
32
28
  }
33
29
  </style>
34
30
 
35
- <div class="w-100">
31
+ <!-- Cover container with flexible column sizing -->
32
+ <div class="container-fluid">
36
33
  <div class="row justify-content-center">
37
- <div class="col-12 text-center">
38
- {{ content | uj_content_format }}
39
- </div>
34
+ {{ content | uj_content_format }}
40
35
  </div>
41
36
  </div>
37
+
38
+
@@ -22,56 +22,47 @@ suggested_pages:
22
22
  link: "/team"
23
23
  ---
24
24
 
25
- <div class="d-flex justify-content-center align-items-center flex-column">
26
- <div class="col-12 col-lg-8">
27
- <!-- Logo -->
28
- <div class="mb-3">
29
- <a href="{{ site.url }}">
30
- <div class="avatar avatar-xl">
31
- <img id="main-logo" src="{{ site.brand.images.brandmark }}?cb={{ site.uj.cache_breaker }}" alt="{{ site.brand.name }}"/>
32
- </div>
33
- </a>
34
- </div>
35
-
36
- <!-- Main Content -->
37
- <h1 class="h1 text-primary mb-3">
38
- 404
39
- </h1>
40
- <h2 class="h3 mb-3">Oops! Page Not Found</h2>
41
- <p class="fs-5 text-muted mb-4">
42
- Sorry, the page you're looking for doesn't exist or has been moved. Don't worry, it happens to the best of us!
43
- </p>
25
+ <section class="col-12 col-md-10 col-lg-8 col-xl-6 mw-md">
26
+ <div class="card border-0 shadow-lg">
27
+ <div class="card-body p-3 p-md-5">
28
+ <!-- Header -->
29
+ <div class="text-center mb-4">
30
+ <h1 class="display-1 mb-3">404</h1>
31
+ <!-- <h2 class="h3 mb-3">Oops! Page Not Found</h2> -->
32
+ <p class="text-muted">
33
+ Sorry, the page you're looking for doesn't exist or has been moved. Don't worry, it happens to the best of us!
34
+ </p>
35
+ </div>
44
36
 
45
- <!-- URL Display -->
46
- <div class="card border-0 shadow-sm mb-4">
47
- <div class="card-body p-3">
48
- <small class="text-muted">
49
- <strong>Requested URL:</strong> <code id="page-url">{{ page.canonical.url }}</code>
37
+ <!-- URL Display -->
38
+ <div class="alert alert-warning text-center mb-4" role="alert">
39
+ <small class="text-body">
40
+ <strong>Requested URL:</strong> <span id="page-url" class="text-break">{{ page.canonical.url }}</span>
50
41
  </small>
51
42
  </div>
52
- </div>
53
43
 
54
- <!-- Primary CTA -->
55
- <div class="mb-5">
56
- <a href="{{ site.url }}" class="btn btn-primary btn-lg px-5 py-3 me-3">
57
- {% uj_icon "house", "me-2" %}
58
- Back to Home
59
- </a>
60
- <button class="btn btn-outline-primary btn-lg px-4 py-3" onclick="window.history.back()">
61
- {% uj_icon "arrow-left", "me-2" %}
62
- Go Back
63
- </button>
64
- </div>
44
+ <!-- Primary Actions -->
45
+ <div class="d-grid gap-2 d-sm-block text-center mb-4">
46
+ <a href="{{ site.url }}" class="btn btn-adaptive btn-lg mb-2 mb-sm-0 me-sm-2">
47
+ {% uj_icon "house", "me-2" %}
48
+ Back to Home
49
+ </a>
50
+ <button class="btn btn-outline-adaptive btn-lg mb-2 mb-sm-0" onclick="window.history.back()">
51
+ {% uj_icon "arrow-left", "me-2" %}
52
+ Go Back
53
+ </button>
54
+ </div>
65
55
 
66
- <!-- Help Section -->
67
- <div class="mt-5 pt-4 border-top">
68
- <p class="text-muted">
69
- Still can't find what you're looking for?
70
- <a href="/contact" class="text-decoration-none fw-semibold">Contact our support team</a>
71
- and we'll help you out!
72
- </p>
56
+ <!-- Help Section -->
57
+ <div class="text-center pt-4 border-top">
58
+ <p class="text-muted mb-0">
59
+ Still can't find what you're looking for?
60
+ <a href="/contact" class="text-decoration-none fw-semibold">Contact our support team</a>
61
+ and we'll help you out!
62
+ </p>
63
+ </div>
73
64
  </div>
74
65
  </div>
75
- </div>
66
+ </section>
76
67
 
77
68
  {{ content | uj_content_format }}
@@ -101,7 +101,7 @@ badges:
101
101
  ---
102
102
 
103
103
  <!-- Fixed Header -->
104
- <header class="position-fixed top-0 start-0 w-100 bg-body-secondary border-bottom" style="z-index: 1030;">
104
+ <header class="position-fixed top-0 start-0 w-100 bg-body-secondary border-bottom shadow-sm" style="z-index: 1030;">
105
105
  <div class="container-fluid px-4">
106
106
  <div class="d-flex align-items-center justify-content-between py-3">
107
107
  <!-- Left: Brand -->
@@ -0,0 +1,83 @@
1
+ ---
2
+ ### ALL PAGES ###
3
+ layout: themes/[ site.theme.id ]/frontend/core/cover
4
+ asset_path: app/index
5
+
6
+ ### PAGE CONFIG ###
7
+ app:
8
+ protocol: "{{ site.brand.id | default: site.brand.name | slugify }}://"
9
+ ---
10
+
11
+ <!-- App Launch Section -->
12
+ <section class="col-12 col-md-8 col-lg-6 col-xl-5 mw-sm">
13
+ <div class="card border-0 shadow-lg">
14
+ <div class="card-body p-3 p-md-5">
15
+ <!-- Logo -->
16
+ <div class="text-center mb-3">
17
+ <div class="avatar avatar-xl">
18
+ <img src="{{ site.brand.images.brandmark }}?cb={{ site.uj.cache_breaker }}" alt="{{ site.brand.name }} Logo"/>
19
+ </div>
20
+ </div>
21
+
22
+ <!-- Header -->
23
+ <div class="text-center mb-4">
24
+ <h1 class="h3 mb-2">Opening {{ site.brand.name }}...</h1>
25
+ <p class="text-muted">Launching your desktop application</p>
26
+ </div>
27
+
28
+ <!-- Loading Spinner -->
29
+ <div class="text-center mb-4">
30
+ <div class="spinner-border text-primary" role="status">
31
+ <span class="visually-hidden">Loading...</span>
32
+ </div>
33
+ </div>
34
+
35
+ <!-- Error Alert (Hidden by default) -->
36
+ <div id="error-alert" class="alert alert-warning mb-4" role="alert" hidden>
37
+ <div class="d-flex align-items-center">
38
+ {% uj_icon "triangle-exclamation", "me-2" %}
39
+ <div>
40
+ <strong>App not installed?</strong><br>
41
+ <small>Download {{ site.brand.name }} for your platform below.</small>
42
+ </div>
43
+ </div>
44
+ </div>
45
+
46
+ <!-- Action Buttons -->
47
+ <div class="d-grid gap-2 mb-4">
48
+ <a id="launch-button" href="{{ page.resolved.app.protocol }}" class="btn btn-primary">
49
+ {% uj_icon "rocket", "me-2" %}
50
+ <span>Launch App</span>
51
+ </a>
52
+ </div>
53
+
54
+ <!-- Download Section -->
55
+ <div class="text-center">
56
+ <p class="text-muted small mb-3">Don't have the app?</p>
57
+
58
+ <a id="download-button" href="/download" class="btn btn-adaptive">
59
+ {% uj_icon "download", "me-2" %}
60
+ <span>Download App</span>
61
+ </a>
62
+ </div>
63
+
64
+ <!-- Alternative Actions -->
65
+ <div class="mt-4 pt-4 border-top text-center">
66
+ <p class="text-muted small mb-2">Having trouble?</p>
67
+ <div class="btn-group" role="group">
68
+ <a href="/" class="btn btn-sm btn-outline-adaptive">
69
+ {% uj_icon "house", "me-1" %}
70
+ <span>Go to Website</span>
71
+ </a>
72
+ <a href="/contact" class="btn btn-sm btn-outline-adaptive">
73
+ {% uj_icon "headset", "me-1" %}
74
+ <span>Get Help</span>
75
+ </a>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </section>
81
+
82
+ {{ content | uj_content_format }}
83
+