ultimate-jekyll-manager 0.0.154 → 0.0.156

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.
package/CLAUDE.md CHANGED
@@ -319,6 +319,26 @@ Inserts Font Awesome icons:
319
319
  1. Icon name (string or variable, without "fa-" prefix)
320
320
  2. CSS classes (optional, defaults to "fa-3xl")
321
321
 
322
+ **Available Icon Sizes:**
323
+ - `fa-2xs` - Extra extra small
324
+ - `fa-xs` - Extra small
325
+ - `fa-sm` - Small
326
+ - `fa-md` - Medium (default base size)
327
+ - `fa-lg` - Large
328
+ - `fa-xl` - Extra large
329
+ - `fa-2xl` - 2x extra large
330
+ - `fa-3xl` - 3x extra large
331
+ - `fa-4xl` - 4x extra large
332
+ - `fa-5xl` - 5x extra large
333
+
334
+ **Size Examples:**
335
+ ```liquid
336
+ {% uj_icon "check", "fa-sm" %} <!-- Small inline icon -->
337
+ {% uj_icon "star", "fa-lg" %} <!-- Slightly larger -->
338
+ {% uj_icon "rocket", "fa-2xl" %} <!-- Hero/feature icons -->
339
+ {% uj_icon "chart-pie", "fa-4xl" %}<!-- Large placeholder icons -->
340
+ ```
341
+
322
342
  #### `asset_path` Override
323
343
  Override default page-specific CSS/JS path derivation:
324
344
 
package/README.md CHANGED
@@ -355,6 +355,18 @@ prerender_icons:
355
355
  ---
356
356
  ```
357
357
 
358
+ **Available Icon Sizes:**
359
+ - `fa-2xs` - Extra extra small
360
+ - `fa-xs` - Extra small
361
+ - `fa-sm` - Small
362
+ - `fa-md` - Medium (default base size)
363
+ - `fa-lg` - Large
364
+ - `fa-xl` - Extra large
365
+ - `fa-2xl` - 2x extra large
366
+ - `fa-3xl` - 3x extra large
367
+ - `fa-4xl` - 4x extra large
368
+ - `fa-5xl` - 5x extra large
369
+
358
370
  Icons are automatically rendered in the page HTML and can be retrieved by importing the library function.
359
371
 
360
372
  #### Authorized Fetch Library
@@ -1,3 +1,6 @@
1
+ // Libraries
2
+ import merge from 'lodash/merge.js';
3
+
1
4
  // Exit Popup Module
2
5
  export default function (Manager, options) {
3
6
  // Shortcuts
@@ -23,54 +26,47 @@ export default function (Manager, options) {
23
26
  setupExitIntentDetection();
24
27
  });
25
28
 
26
- // Make this available on window object in DEV mode for testing
27
- /* @dev-only:start */
28
- {
29
- window.showExitPopup = showExitPopup;
30
- }
31
- /* @dev-only:end */
32
-
33
29
  // Register showExitPopup on the UJ library for programmatic access
34
30
  // Usage: webManager.uj().showExitPopup()
35
31
  if (webManager._ujLibrary) {
36
32
  webManager._ujLibrary.showExitPopup = showExitPopup;
37
33
  }
38
34
 
39
- function updateModalContent($modal) {
35
+ function updateModalContent($modal, effectiveConfig) {
40
36
  // Update title
41
37
  const $title = $modal.querySelector('.modal-exit-title');
42
- if ($title && config.title) {
43
- $title.textContent = config.title;
38
+ if ($title && effectiveConfig.title) {
39
+ $title.textContent = effectiveConfig.title;
44
40
  }
45
41
 
46
42
  // Update main message
47
43
  const $message = $modal.querySelector('.modal-exit-message');
48
- if ($message && config.message) {
49
- $message.textContent = config.message;
44
+ if ($message && effectiveConfig.message) {
45
+ $message.textContent = effectiveConfig.message;
50
46
  }
51
47
 
52
48
  // Update offer title
53
49
  const $offerTitleText = $modal.querySelector('.modal-exit-offer-title-text');
54
- if ($offerTitleText && config.offerTitle) {
55
- $offerTitleText.textContent = config.offerTitle;
50
+ if ($offerTitleText && effectiveConfig.offerTitle) {
51
+ $offerTitleText.textContent = effectiveConfig.offerTitle;
56
52
  }
57
53
 
58
54
  // Update offer description
59
55
  const $offerDesc = $modal.querySelector('.modal-exit-offer-description');
60
- if ($offerDesc && config.offerDescription) {
61
- $offerDesc.textContent = config.offerDescription;
56
+ if ($offerDesc && effectiveConfig.offerDescription) {
57
+ $offerDesc.textContent = effectiveConfig.offerDescription;
62
58
  }
63
59
 
64
60
  // Update main button
65
61
  const $button = $modal.querySelector('.modal-exit-button');
66
62
  const $buttonText = $modal.querySelector('.modal-exit-button-text');
67
- if ($button && config.okButton) {
68
- if ($buttonText && config.okButton.text) {
69
- $buttonText.textContent = config.okButton.text;
63
+ if ($button && effectiveConfig.okButton) {
64
+ if ($buttonText && effectiveConfig.okButton.text) {
65
+ $buttonText.textContent = effectiveConfig.okButton.text;
70
66
  }
71
- if (config.okButton.link) {
67
+ if (effectiveConfig.okButton.link) {
72
68
  // Add UTM parameters to track exit popup conversions
73
- const url = new URL(config.okButton.link, window.location.origin);
69
+ const url = new URL(effectiveConfig.okButton.link, window.location.origin);
74
70
  url.searchParams.set('itm_source', 'exit-popup');
75
71
  url.searchParams.set('itm_medium', 'popup');
76
72
  url.searchParams.set('itm_campaign', window.location.pathname);
@@ -80,8 +76,8 @@ export default function (Manager, options) {
80
76
 
81
77
  // Update "Maybe later" link text if configured
82
78
  const $dismissLink = $modal.querySelector('.modal-exit-dismiss');
83
- if ($dismissLink && config.dismissText) {
84
- $dismissLink.textContent = config.dismissText;
79
+ if ($dismissLink && effectiveConfig.dismissText) {
80
+ $dismissLink.textContent = effectiveConfig.dismissText;
85
81
  }
86
82
 
87
83
  // Remove hidden attribute to make modal available
@@ -167,10 +163,13 @@ export default function (Manager, options) {
167
163
  // }, { passive: true });
168
164
  }
169
165
 
170
- function showExitPopup() {
166
+ function showExitPopup(overrides) {
167
+ // Deep merge overrides with config (without mutating original)
168
+ const effectiveConfig = merge({}, config, overrides);
169
+
171
170
  /* @dev-only:start */
172
171
  {
173
- console.log('Showing exit popup:', config.title, 'after', timeSinceLastShown, 'ms since last shown');
172
+ console.log('Showing exit popup:', effectiveConfig.title, 'after', timeSinceLastShown, 'ms since last shown');
174
173
  }
175
174
  /* @dev-only:end */
176
175
 
@@ -187,8 +186,8 @@ export default function (Manager, options) {
187
186
  return;
188
187
  }
189
188
 
190
- // Update modal content with config
191
- updateModalContent($modalElement);
189
+ // Update modal content with effectiveConfig
190
+ updateModalContent($modalElement, effectiveConfig);
192
191
 
193
192
  // Check if Bootstrap is available
194
193
  if (!window.bootstrap || !window.bootstrap.Modal) {
@@ -115,7 +115,7 @@ meta:
115
115
  <div class="card-body">
116
116
  <div style="height: 300px; display: flex; align-items: center; justify-content: center;">
117
117
  <div class="text-center text-muted">
118
- {% uj_icon "chart-area", "fa-4x mb-3" %}
118
+ {% uj_icon "chart-area", "fa-4xl mb-3" %}
119
119
  <p>Chart will be rendered here</p>
120
120
  </div>
121
121
  </div>
@@ -131,7 +131,7 @@ meta:
131
131
  <div class="card-body">
132
132
  <div style="height: 300px; display: flex; align-items: center; justify-content: center;">
133
133
  <div class="text-center text-muted">
134
- {% uj_icon "chart-pie", "fa-4x mb-3" %}
134
+ {% uj_icon "chart-pie", "fa-4xl mb-3" %}
135
135
  <p>Pie chart will be rendered here</p>
136
136
  </div>
137
137
  </div>
@@ -125,7 +125,7 @@ hero:
125
125
  <div class="row justify-content-center">
126
126
  <div class="col-lg-6 text-center" data-lazy="@class animation-slide-up">
127
127
  <div class="py-5">
128
- {% uj_icon "file-lines", "fa-4x text-muted mb-3" %}
128
+ {% uj_icon "file-lines", "fa-4xl text-muted mb-3" %}
129
129
  <h2 class="h4 text-muted">No posts in this category</h2>
130
130
  <p class="text-muted">Check back soon for new content.</p>
131
131
  <a href="{{ site.url }}/blog/categories" class="btn btn-primary">
@@ -77,7 +77,7 @@ hero:
77
77
  <div class="row justify-content-center">
78
78
  <div class="col-lg-6 text-center" data-lazy="@class animation-slide-up">
79
79
  <div class="py-5">
80
- {% uj_icon "folder-open", "fa-4x text-muted mb-3" %}
80
+ {% uj_icon "folder-open", "fa-4xl text-muted mb-3" %}
81
81
  <h2 class="h4 text-muted">No categories yet</h2>
82
82
  <p class="text-muted">Check back soon for categorized content.</p>
83
83
  <a href="{{ site.url }}/blog" class="btn btn-primary">
@@ -73,7 +73,7 @@ hero:
73
73
  <div class="row justify-content-center">
74
74
  <div class="col-lg-6 text-center" data-lazy="@class animation-slide-up">
75
75
  <div class="py-5">
76
- {% uj_icon "tags", "fa-4x text-muted mb-3" %}
76
+ {% uj_icon "tags", "fa-4xl text-muted mb-3" %}
77
77
  <h2 class="h4 text-muted">No tags yet</h2>
78
78
  <p class="text-muted">Check back soon for tagged content.</p>
79
79
  <a href="{{ site.url }}/blog" class="btn btn-primary">
@@ -126,7 +126,7 @@ hero:
126
126
  <div class="row justify-content-center">
127
127
  <div class="col-lg-6 text-center" data-lazy="@class animation-slide-up">
128
128
  <div class="py-5">
129
- {% uj_icon "file-lines", "fa-4x text-muted mb-3" %}
129
+ {% uj_icon "file-lines", "fa-4xl text-muted mb-3" %}
130
130
  <h2 class="h4 text-muted">No posts with this tag</h2>
131
131
  <p class="text-muted">Check back soon for new content.</p>
132
132
  <a href="{{ site.url }}/blog/tags" class="btn btn-primary">
@@ -70,7 +70,7 @@ meta:
70
70
  <div class="col-md-6">
71
71
  <div class="card animation-hover-up">
72
72
  <div class="card-body text-center">
73
- {% uj_icon "rocket", "fa-3x mb-2" %}
73
+ {% uj_icon "rocket", "fa-3xl mb-2" %}
74
74
  <h5>Hover Up</h5>
75
75
  <p class="small">.animation-hover-up</p>
76
76
  </div>
@@ -79,7 +79,7 @@ meta:
79
79
  <div class="col-md-6">
80
80
  <div class="card animation-hover-flex">
81
81
  <div class="card-body text-center">
82
- {% uj_icon "expand", "fa-3x mb-2" %}
82
+ {% uj_icon "expand", "fa-3xl mb-2" %}
83
83
  <h5>Hover Zoom</h5>
84
84
  <p class="small">.animation-hover-flex</p>
85
85
  </div>
@@ -91,31 +91,31 @@ meta:
91
91
  <div class="row g-3 align-items-center">
92
92
  <div class="col-md-2 text-center">
93
93
  <div class="animation-pulse p-3 bg-danger text-light rounded">
94
- {% uj_icon "heart", "fa-2x" %}
94
+ {% uj_icon "heart", "fa-2xl" %}
95
95
  <p class="mb-0 mt-2">.animation-pulse</p>
96
96
  </div>
97
97
  </div>
98
98
  <div class="col-md-2 text-center">
99
99
  <div class="animation-wiggle p-3 bg-warning text-dark rounded">
100
- {% uj_icon "bell", "fa-2x" %}
100
+ {% uj_icon "bell", "fa-2xl" %}
101
101
  <p class="mb-0 mt-2">.animation-wiggle</p>
102
102
  </div>
103
103
  </div>
104
104
  <div class="col-md-2 text-center">
105
105
  <div class="animation-flex p-3 bg-primary text-light rounded">
106
- {% uj_icon "sync", "fa-2x" %}
106
+ {% uj_icon "sync", "fa-2xl" %}
107
107
  <p class="mb-0 mt-2">.animation-flex</p>
108
108
  </div>
109
109
  </div>
110
110
  <div class="col-md-2 text-center">
111
111
  <div class="animation-up-down p-3 bg-success text-light rounded">
112
- {% uj_icon "arrow-up", "fa-2x" %}
112
+ {% uj_icon "arrow-up", "fa-2xl" %}
113
113
  <p class="mb-0 mt-2">.animation-up-down</p>
114
114
  </div>
115
115
  </div>
116
116
  <div class="col-md-2 text-center">
117
117
  <div class="animation-shimmer p-3 bg-gradient-rainbow text-light rounded">
118
- {% uj_icon "star", "fa-2x" %}
118
+ {% uj_icon "star", "fa-2xl" %}
119
119
  <p class="mb-0 mt-2">.animation-shimmer</p>
120
120
  </div>
121
121
  </div>
@@ -42,7 +42,7 @@ meta:
42
42
  <!-- Spacer to push content below fold -->
43
43
  <div class="d-flex align-items-center justify-content-center text-muted vh-100">
44
44
  <div class="text-center">
45
- {% uj_icon "arrow-down", "fa-3x mb-3" %}
45
+ {% uj_icon "arrow-down", "fa-3xl mb-3" %}
46
46
  <p class="h4">Scroll down to trigger lazy loading...</p>
47
47
  </div>
48
48
  </div>
@@ -102,12 +102,17 @@ class GitHubCache {
102
102
  this.logger.log(`📂 Extract directory: ${extractDir}`);
103
103
  this.logger.log(`📁 Directory contents: ${JSON.stringify(dirContents)}`);
104
104
 
105
+ // GitHub zipball format: {owner}-{repo}-{sha}
106
+ // Match this pattern to avoid picking up other cache directories (like imagemin, translation)
107
+ const githubZipPattern = new RegExp(`^${this.owner}-${this.repo}-[a-f0-9]+$`, 'i');
108
+
105
109
  const extractedRoot = dirContents.find(name => {
106
110
  const fullPath = path.join(extractDir, name);
107
111
  const isDir = jetpack.exists(fullPath) === 'dir';
108
112
  const isNotZip = name !== zipFileName;
109
- this.logger.log(` - ${name}: isDir=${isDir}, isNotZip=${isNotZip}`);
110
- return isNotZip && isDir;
113
+ const matchesGitHubPattern = githubZipPattern.test(name);
114
+ this.logger.log(` - ${name}: isDir=${isDir}, isNotZip=${isNotZip}, matchesGitHubPattern=${matchesGitHubPattern}`);
115
+ return isNotZip && isDir && matchesGitHubPattern;
111
116
  });
112
117
 
113
118
  this.logger.log(`✅ Found extracted root: ${extractedRoot || 'NONE'}`);
@@ -3294,3 +3294,31 @@
3294
3294
  [debug] [2025-12-11T08:34:28.905Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3295
3295
  [debug] [2025-12-11T08:34:28.906Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3296
3296
  [debug] [2025-12-11T08:34:28.906Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3297
+ [debug] [2025-12-11T09:13:42.648Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3298
+ [debug] [2025-12-11T09:13:42.648Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3299
+ [debug] [2025-12-11T09:13:42.650Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3300
+ [debug] [2025-12-11T09:13:42.650Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3301
+ [debug] [2025-12-11T09:13:42.650Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3302
+ [debug] [2025-12-11T09:13:42.658Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3303
+ [debug] [2025-12-11T09:13:42.659Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3304
+ [debug] [2025-12-11T09:13:42.650Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3305
+ [debug] [2025-12-11T09:13:42.650Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3306
+ [debug] [2025-12-11T09:13:42.650Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3307
+ [debug] [2025-12-11T09:13:42.658Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3308
+ [debug] [2025-12-11T09:13:42.659Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3309
+ [debug] [2025-12-11T09:13:42.745Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3310
+ [debug] [2025-12-11T09:13:42.745Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3311
+ [debug] [2025-12-11T09:13:42.746Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3312
+ [debug] [2025-12-11T09:13:42.746Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3313
+ [debug] [2025-12-11T09:13:42.748Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3314
+ [debug] [2025-12-11T09:13:42.748Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3315
+ [debug] [2025-12-11T09:13:42.749Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3316
+ [debug] [2025-12-11T09:13:42.749Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3317
+ [debug] [2025-12-11T09:13:42.751Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3318
+ [debug] [2025-12-11T09:13:42.751Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3319
+ [debug] [2025-12-11T09:13:42.752Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3320
+ [debug] [2025-12-11T09:13:42.752Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3321
+ [debug] [2025-12-11T09:13:42.754Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3322
+ [debug] [2025-12-11T09:13:42.754Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
3323
+ [debug] [2025-12-11T09:13:42.755Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
3324
+ [debug] [2025-12-11T09:13:42.755Z] > authorizing via signed-in user (ian.wiedenman@gmail.com)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ultimate-jekyll-manager",
3
- "version": "0.0.154",
3
+ "version": "0.0.156",
4
4
  "description": "Ultimate Jekyll dependency manager",
5
5
  "main": "dist/index.js",
6
6
  "exports": {