ultimate-jekyll-manager 0.0.117 → 0.0.119

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 (44) hide show
  1. package/CLAUDE.md +616 -138
  2. package/README.md +108 -0
  3. package/TODO.md +1 -1
  4. package/dist/assets/js/core/auth.js +8 -11
  5. package/dist/assets/js/core/cookieconsent.js +24 -17
  6. package/dist/assets/js/core/exit-popup.js +15 -12
  7. package/dist/assets/js/core/social-sharing.js +8 -4
  8. package/dist/assets/js/libs/auth/pages.js +14 -13
  9. package/dist/assets/js/libs/dev.js +192 -129
  10. package/dist/assets/js/libs/prerendered-icons.js +27 -0
  11. package/dist/assets/js/pages/account/index.js +4 -3
  12. package/dist/assets/js/pages/account/sections/api-keys.js +2 -6
  13. package/dist/assets/js/pages/account/sections/connections.js +101 -59
  14. package/dist/assets/js/pages/account/sections/delete.js +83 -84
  15. package/dist/assets/js/pages/account/sections/referrals.js +29 -29
  16. package/dist/assets/js/pages/account/sections/security.js +51 -71
  17. package/dist/assets/js/pages/admin/notifications/new/index.js +17 -10
  18. package/dist/assets/js/pages/blog/index.js +7 -5
  19. package/dist/assets/js/pages/contact/index.js +6 -33
  20. package/dist/assets/js/pages/download/index.js +3 -2
  21. package/dist/assets/js/pages/payment/checkout/index.js +6 -6
  22. package/dist/assets/js/pages/payment/checkout/modules/processors-main.js +2 -2
  23. package/dist/assets/js/pages/payment/checkout/modules/session.js +4 -4
  24. package/dist/assets/js/pages/pricing/index.js +5 -2
  25. package/dist/assets/themes/classy/css/components/_cards.scss +2 -2
  26. package/dist/defaults/_.env +6 -0
  27. package/dist/defaults/_.gitignore +7 -1
  28. package/dist/defaults/dist/_includes/core/body.html +18 -3
  29. package/dist/defaults/dist/_includes/core/foot.html +1 -0
  30. package/dist/defaults/dist/_includes/themes/classy/frontend/sections/nav.html +51 -36
  31. package/dist/defaults/dist/_layouts/blueprint/admin/notifications/new.html +13 -2
  32. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/about.html +84 -42
  33. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/account/index.html +67 -35
  34. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/blog/index.html +72 -58
  35. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/blog/post.html +46 -29
  36. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/contact.html +36 -16
  37. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/download.html +111 -73
  38. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/index.html +111 -56
  39. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/pricing.html +127 -81
  40. package/dist/defaults/dist/pages/pricing.md +7 -0
  41. package/dist/defaults/dist/pages/test/libraries/lazy-loading.html +1 -1
  42. package/dist/gulp/tasks/defaults.js +210 -1
  43. package/firebase-debug.log +504 -0
  44. package/package.json +5 -5
@@ -121,159 +121,222 @@ function setupBreakpointLogger() {
121
121
  function setupTrackingInterceptors() {
122
122
  console.log('🔍 Setting up tracking interceptors...');
123
123
 
124
- // Intercept Google Analytics (gtag)
125
- if (typeof window.gtag !== 'undefined') {
126
- const originalGtag = window.gtag;
127
- window.gtag = function() {
128
- const args = Array.from(arguments);
129
- const command = args[0];
130
- const eventNameOrParams = args[1];
131
- const params = args[2];
132
-
133
- // Log the gtag call
134
- console.log('📊 gtag:', {
135
- command: command,
136
- event: eventNameOrParams,
137
- params: params || eventNameOrParams,
138
- fullArgs: args
139
- });
140
-
141
- // Call the original gtag function
142
- return originalGtag.apply(this, arguments);
143
- };
144
- console.log('✅ gtag interceptor installed');
145
- }
124
+ // Track which interceptors have been installed
125
+ const installed = {
126
+ gtag: false,
127
+ fbq: false,
128
+ ttq: false,
129
+ };
146
130
 
147
- // Intercept Facebook Pixel (fbq)
148
- if (typeof window.fbq !== 'undefined') {
149
- const originalFbq = window.fbq;
131
+ // Try to install interceptors
132
+ const tryInstallInterceptors = () => {
133
+ // Try installing gtag if not already installed
134
+ if (!installed.gtag && typeof window.gtag !== 'undefined') {
135
+ installGtagInterceptor();
136
+ installed.gtag = true;
137
+ }
150
138
 
151
- // Create wrapper function that preserves all properties
152
- const fbqWrapper = function() {
153
- const args = Array.from(arguments);
154
- const command = args[0];
155
- const event = args[1];
156
- const params = args[2];
157
-
158
- // Log the fbq call
159
- console.log('📘 fbq:', {
160
- command: command,
161
- event: event,
162
- params: params,
163
- fullArgs: args
164
- });
165
-
166
- // Call the original fbq function
167
- return originalFbq.apply(this, arguments);
168
- };
139
+ // Try installing fbq if not already installed
140
+ if (!installed.fbq && typeof window.fbq !== 'undefined') {
141
+ installFbqInterceptor();
142
+ installed.fbq = true;
143
+ }
169
144
 
170
- // Copy all properties from original fbq to wrapper
171
- Object.keys(originalFbq).forEach(key => {
172
- fbqWrapper[key] = originalFbq[key];
173
- });
145
+ // Try installing ttq if not already installed
146
+ if (!installed.ttq && typeof window.ttq !== 'undefined' && window.ttq.track) {
147
+ // Check if it's a stub (contains 'push' in the function)
148
+ const isStub = window.ttq.track.toString().includes('push');
174
149
 
175
- // If callMethod exists, wrap it too
176
- if (originalFbq.callMethod) {
177
- const originalCallMethod = originalFbq.callMethod;
178
- fbqWrapper.callMethod = function() {
179
- const args = Array.from(arguments);
180
- console.log('📘 fbq.callMethod:', args);
181
- return originalCallMethod.apply(originalFbq, arguments);
182
- };
150
+ if (!isStub) {
151
+ installTtqInterceptor();
152
+ installed.ttq = true;
153
+ }
183
154
  }
184
155
 
185
- // Preserve queue if it exists (for stub implementation)
186
- if (originalFbq.queue) {
187
- fbqWrapper.queue = originalFbq.queue;
156
+ // Return true if all interceptors are installed
157
+ return installed.gtag && installed.fbq && installed.ttq;
158
+ };
159
+
160
+ // Try installing immediately
161
+ if (tryInstallInterceptors()) {
162
+ return;
163
+ }
164
+
165
+ // Poll every 500ms to check if tracking libraries are ready
166
+ const pollInterval = setInterval(() => {
167
+ if (tryInstallInterceptors()) {
168
+ clearInterval(pollInterval);
188
169
  }
170
+ }, 500);
171
+
172
+ // Stop polling after 10 seconds regardless
173
+ setTimeout(() => {
174
+ clearInterval(pollInterval);
175
+ console.log('⏱️ Tracking interceptor polling stopped');
189
176
 
190
- // Preserve push method if it exists (for stub implementation)
191
- if (originalFbq.push) {
192
- fbqWrapper.push = originalFbq.push;
177
+ if (!installed.gtag) {
178
+ console.log('⚠️ gtag interceptor was never installed');
193
179
  }
180
+ if (!installed.fbq) {
181
+ console.log('⚠️ fbq interceptor was never installed');
182
+ }
183
+ if (!installed.ttq) {
184
+ console.log('⚠️ ttq interceptor was never installed');
185
+ }
186
+ }, 10000);
187
+ }
194
188
 
195
- window.fbq = fbqWrapper;
196
- console.log('✅ fbq interceptor installed');
189
+ function installGtagInterceptor() {
190
+ if (typeof window.gtag === 'undefined') {
191
+ return;
197
192
  }
198
193
 
199
- // Intercept TikTok Pixel (ttq)
200
- if (typeof window.ttq !== 'undefined' && window.ttq.track) {
201
- const originalTtq = window.ttq;
202
- const originalTrack = window.ttq.track;
203
- const originalPage = window.ttq.page;
204
- const originalIdentify = window.ttq.identify;
205
- const originalLoad = window.ttq.load;
194
+ const originalGtag = window.gtag;
206
195
 
207
- // Intercept track method
208
- window.ttq.track = function() {
209
- const args = Array.from(arguments);
210
- const event = args[0];
211
- const params = args[1];
212
-
213
- // Log the ttq.track call
214
- console.log('🎵 ttq.track:', {
215
- event: event,
216
- params: params,
217
- fullArgs: args
218
- });
219
-
220
- // Call the original track function
221
- return originalTrack.apply(originalTtq, arguments);
222
- };
196
+ window.gtag = function() {
197
+ const args = Array.from(arguments);
198
+ const command = args[0];
199
+ const eventNameOrParams = args[1];
200
+ const params = args[2];
223
201
 
224
- // Intercept page method
225
- window.ttq.page = function() {
226
- const args = Array.from(arguments);
202
+ // Log the gtag call
203
+ console.log('📊 gtag:', {
204
+ command: command,
205
+ event: eventNameOrParams,
206
+ params: params || eventNameOrParams,
207
+ fullArgs: args
208
+ });
227
209
 
228
- // Log the ttq.page call
229
- console.log('🎵 ttq.page:', {
230
- fullArgs: args
231
- });
210
+ // Call the original gtag function
211
+ return originalGtag.apply(this, arguments);
212
+ };
232
213
 
233
- // Call the original page function
234
- return originalPage.apply(originalTtq, arguments);
235
- };
214
+ console.log('✅ gtag interceptor installed');
215
+ }
236
216
 
237
- // Intercept identify method
238
- window.ttq.identify = function() {
239
- const args = Array.from(arguments);
217
+ function installFbqInterceptor() {
218
+ if (typeof window.fbq === 'undefined') {
219
+ return;
220
+ }
240
221
 
241
- // Log the ttq.identify call
242
- console.log('🎵 ttq.identify:', {
243
- fullArgs: args
244
- });
222
+ const originalFbq = window.fbq;
223
+
224
+ // Create wrapper function that preserves all properties
225
+ const fbqWrapper = function() {
226
+ const args = Array.from(arguments);
227
+ const command = args[0];
228
+ const event = args[1];
229
+ const params = args[2];
230
+
231
+ // Log the fbq call
232
+ console.log('📘 fbq:', {
233
+ command: command,
234
+ event: event,
235
+ params: params,
236
+ fullArgs: args
237
+ });
245
238
 
246
- // Call the original identify function
247
- return originalIdentify.apply(originalTtq, arguments);
248
- };
239
+ // Call the original fbq function
240
+ return originalFbq.apply(this, arguments);
241
+ };
249
242
 
250
- // Intercept load method
251
- window.ttq.load = function() {
243
+ // Copy all properties from original fbq to wrapper
244
+ Object.keys(originalFbq).forEach(key => {
245
+ fbqWrapper[key] = originalFbq[key];
246
+ });
247
+
248
+ // If callMethod exists, wrap it too
249
+ if (originalFbq.callMethod) {
250
+ const originalCallMethod = originalFbq.callMethod;
251
+ fbqWrapper.callMethod = function() {
252
252
  const args = Array.from(arguments);
253
+ console.log('📘 fbq.callMethod:', args);
254
+ return originalCallMethod.apply(originalFbq, arguments);
255
+ };
256
+ }
257
+
258
+ // Preserve queue if it exists (for stub implementation)
259
+ if (originalFbq.queue) {
260
+ fbqWrapper.queue = originalFbq.queue;
261
+ }
253
262
 
254
- // Log the ttq.load call
255
- console.log('🎵 ttq.load:', {
256
- pixelId: args[0],
257
- fullArgs: args
258
- });
263
+ // Preserve push method if it exists (for stub implementation)
264
+ if (originalFbq.push) {
265
+ fbqWrapper.push = originalFbq.push;
266
+ }
259
267
 
260
- // Call the original load function
261
- return originalLoad.apply(originalTtq, arguments);
262
- };
268
+ window.fbq = fbqWrapper;
269
+ console.log('✅ fbq interceptor installed');
270
+ }
263
271
 
264
- console.log('✅ ttq interceptor installed');
272
+ function installTtqInterceptor() {
273
+ if (typeof window.ttq === 'undefined' || !window.ttq.track) {
274
+ return;
265
275
  }
266
276
 
267
- // Check again after a delay in case tracking libraries load asynchronously
268
- setTimeout(() => {
269
- if (typeof window.gtag === 'undefined') {
270
- console.log('⚠️ gtag not found - may load later');
271
- }
272
- if (typeof window.fbq === 'undefined') {
273
- console.log('⚠️ fbq not found - may load later');
274
- }
275
- if (typeof window.ttq === 'undefined' || !window.ttq.track) {
276
- console.log('⚠️ ttq not found or is a stub - may load later');
277
- }
278
- }, 3000);
277
+ const originalTtq = window.ttq;
278
+ const originalTrack = window.ttq.track;
279
+ const originalPage = window.ttq.page;
280
+ const originalIdentify = window.ttq.identify;
281
+ const originalLoad = window.ttq.load;
282
+
283
+ // Intercept track method
284
+ window.ttq.track = function() {
285
+ const args = Array.from(arguments);
286
+ const event = args[0];
287
+ const params = args[1];
288
+
289
+ // Log the ttq.track call
290
+ console.log('🎵 ttq.track:', {
291
+ event: event,
292
+ params: params,
293
+ fullArgs: args
294
+ });
295
+
296
+ // Call the original track function
297
+ return originalTrack.apply(originalTtq, arguments);
298
+ };
299
+
300
+ // Intercept page method
301
+ window.ttq.page = function() {
302
+ const args = Array.from(arguments);
303
+
304
+ // Log the ttq.page call
305
+ console.log('🎵 ttq.page:', {
306
+ fullArgs: args
307
+ });
308
+
309
+ // Call the original page function
310
+ return originalPage.apply(originalTtq, arguments);
311
+ };
312
+
313
+ // Intercept identify method
314
+ window.ttq.identify = function() {
315
+ const args = Array.from(arguments);
316
+
317
+ // Log the ttq.identify call
318
+ console.log('🎵 ttq.identify:', {
319
+ userData: args[0],
320
+ fullArgs: args
321
+ });
322
+
323
+ // Call the original identify function
324
+ return originalIdentify.apply(originalTtq, arguments);
325
+ };
326
+
327
+ // Intercept load method
328
+ window.ttq.load = function() {
329
+ const args = Array.from(arguments);
330
+
331
+ // Log the ttq.load call
332
+ console.log('🎵 ttq.load:', {
333
+ pixelId: args[0],
334
+ fullArgs: args
335
+ });
336
+
337
+ // Call the original load function
338
+ return originalLoad.apply(originalTtq, arguments);
339
+ };
340
+
341
+ console.log('✅ ttq interceptor installed');
279
342
  }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Prerendered Icons Library
3
+ * Retrieves pre-rendered icon HTML from the frontmatter icon system
4
+ */
5
+
6
+ /**
7
+ * Get pre-rendered icon by name from frontmatter icon system
8
+ * @param {string} iconName - Name of the icon to retrieve (matches data-icon attribute)
9
+ * @returns {string} Icon HTML or empty string if not found
10
+ *
11
+ * @example
12
+ * import { getPrerenderedIcon } from '__main_assets__/js/libs/prerendered-icons.js';
13
+ *
14
+ * // Get an icon
15
+ * const appleIcon = getPrerenderedIcon('apple');
16
+ */
17
+ export function getPrerenderedIcon(iconName) {
18
+ // Query the global prerendered icons container
19
+ const $iconTemplate = document.querySelector(`#prerendered-icons [data-icon="${iconName}"]`);
20
+
21
+ if ($iconTemplate) {
22
+ return $iconTemplate.innerHTML;
23
+ }
24
+
25
+ // Return empty string if not found
26
+ return '';
27
+ }
@@ -82,7 +82,7 @@ async function initializeAccount() {
82
82
  {
83
83
  // Check for test subscription parameter
84
84
  const urlParams = new URLSearchParams(window.location.search);
85
- const testSubscription = urlParams.get('_test_subscription');
85
+ const testSubscription = urlParams.get('_dev_subscription');
86
86
 
87
87
  if (testSubscription && webManager.isDevelopment()) {
88
88
  try {
@@ -338,7 +338,8 @@ function trackAccountSectionView(sectionId) {
338
338
  section: sectionId
339
339
  });
340
340
  ttq.track('ViewContent', {
341
- content_name: `Account ${sectionId}`,
342
- content_type: 'account_section'
341
+ content_id: `account-${sectionId}`,
342
+ content_type: 'product',
343
+ content_name: `Account ${sectionId}`
343
344
  });
344
345
  }
@@ -1,6 +1,6 @@
1
1
  // API Keys section module
2
2
  import { FormManager } from '__main_assets__/js/libs/form-manager.js';
3
- import fetch from 'wonderful-fetch';
3
+ import authorizedFetch from '__main_assets__/js/libs/authorized-fetch.js';
4
4
 
5
5
  let webManager = null;
6
6
  let resetApiKeyFormManager = null;
@@ -113,20 +113,16 @@ async function handleCopyApiKey() {
113
113
 
114
114
  // Handle reset API key form submission
115
115
  async function handleResetApiKeySubmit() {
116
- // Get authentication token
117
- const token = await webManager.auth().getIdToken();
118
-
119
116
  // Get server API URL
120
117
  const serverApiURL = webManager.getApiUrl() + '/backend-manager';
121
118
 
122
119
  // Make API call to reset API key
123
- const response = await fetch(serverApiURL, {
120
+ const response = await authorizedFetch(serverApiURL, {
124
121
  method: 'POST',
125
122
  timeout: 30000,
126
123
  response: 'json',
127
124
  tries: 2,
128
125
  body: {
129
- authenticationToken: token,
130
126
  command: 'user:regenerate-api-keys',
131
127
  },
132
128
  });