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
@@ -32,7 +32,7 @@ export default function (Manager, options) {
32
32
  console.log('[Auth] state changed:', state);
33
33
 
34
34
  // Set user ID for analytics tracking
35
- setAnalyticsUserId(user);
35
+ setAnalyticsUserId(user, webManager);
36
36
 
37
37
  // Check if we're in the process of signing out
38
38
  if (authSignout === 'true' && user) {
@@ -119,9 +119,10 @@ function redirect(url, returnUrl) {
119
119
  window.location.href = newURL;
120
120
  }
121
121
 
122
- function setAnalyticsUserId(user) {
122
+ function setAnalyticsUserId(user, webManager) {
123
123
  const userId = user?.uid;
124
124
  const email = user?.email;
125
+ const metaPixelId = webManager.config.tracking['meta-pixel'];
125
126
 
126
127
  // Short-circuit if no user
127
128
  if (!userId) {
@@ -129,7 +130,7 @@ function setAnalyticsUserId(user) {
129
130
  gtag('set', { user_id: null });
130
131
 
131
132
  // Facebook Pixel - Clear advanced matching
132
- fbq('init', fbq.pixelId, {});
133
+ fbq('init', metaPixelId, {});
133
134
 
134
135
  // TikTok Pixel - Clear user data
135
136
  ttq.identify({});
@@ -147,7 +148,7 @@ function setAnalyticsUserId(user) {
147
148
  });
148
149
 
149
150
  // Facebook Pixel - Set advanced matching with user data
150
- fbq('init', fbq.pixelId, {
151
+ fbq('init', metaPixelId, {
151
152
  external_id: userId,
152
153
  // em: email ? btoa(email.toLowerCase().trim()) : undefined,
153
154
  em: email,
@@ -310,59 +310,66 @@ export default function (Manager, options) {
310
310
 
311
311
  // Tracking functions
312
312
  function trackCookieBannerShown() {
313
- gtag('event', 'cookie_banner_shown', {
313
+ gtag('event', 'cookie_banner_show', {
314
314
  event_category: 'consent'
315
315
  });
316
- fbq('trackCustom', 'CookieBannerShown');
316
+ fbq('trackCustom', 'CookieBannerShow');
317
317
  ttq.track('ViewContent', {
318
- content_name: 'Cookie Banner'
318
+ content_id: 'cookie-banner-show',
319
+ content_type: 'product',
320
+ content_name: 'Cookie Banner Show'
319
321
  });
320
322
  }
321
323
 
322
324
  function trackCookieAccepted() {
323
- gtag('event', 'cookie_consent_accepted', {
325
+ gtag('event', 'cookie_consent_accept', {
324
326
  event_category: 'consent',
325
327
  consent_type: config.type
326
328
  });
327
- fbq('trackCustom', 'CookieConsentAccepted');
329
+ fbq('trackCustom', 'CookieConsentAccept');
328
330
  ttq.track('ClickButton', {
329
- content_name: 'Cookie Consent Accept',
330
- content_type: 'consent'
331
+ content_id: 'cookie-consent-accept',
332
+ content_type: 'product',
333
+ content_name: 'Cookie Consent Accept'
331
334
  });
332
335
  }
333
336
 
334
337
  function trackCookieDenied() {
335
- gtag('event', 'cookie_consent_denied', {
338
+ gtag('event', 'cookie_consent_deny', {
336
339
  event_category: 'consent',
337
340
  consent_type: config.type
338
341
  });
339
- fbq('trackCustom', 'CookieConsentDenied');
342
+ fbq('trackCustom', 'CookieConsentDeny');
340
343
  ttq.track('ClickButton', {
341
- content_name: 'Cookie Consent Deny',
342
- content_type: 'consent'
344
+ content_id: 'cookie-consent-deny',
345
+ content_type: 'product',
346
+ content_name: 'Cookie Consent Deny'
343
347
  });
344
348
  }
345
349
 
346
350
  function trackCookieAutoAccepted(trigger) {
347
- gtag('event', 'cookie_consent_auto_accepted', {
351
+ gtag('event', 'cookie_consent_auto_accept', {
348
352
  event_category: 'consent',
349
353
  trigger: trigger
350
354
  });
351
- fbq('trackCustom', 'CookieConsentAutoAccepted', {
355
+ fbq('trackCustom', 'CookieConsentAutoAccept', {
352
356
  trigger: trigger
353
357
  });
354
358
  ttq.track('ViewContent', {
355
- content_name: 'Cookie Consent Auto Accept',
356
- content_type: trigger
359
+ content_id: 'cookie-consent-auto-accept',
360
+ content_type: 'product',
361
+ content_name: 'Cookie Consent Auto Accept'
357
362
  });
358
363
  }
359
364
 
360
365
  function trackCookiePolicyReopened() {
361
- gtag('event', 'cookie_policy_reopened', {
366
+ gtag('event', 'cookie_policy_reopen', {
362
367
  event_category: 'consent'
363
368
  });
364
- fbq('trackCustom', 'CookiePolicyReopened');
369
+ fbq('trackCustom', 'CookiePolicyReopen');
365
370
  ttq.track('ClickButton', {
371
+ content_id: 'cookie-policy-reopen',
372
+ content_type: 'product',
366
373
  content_name: 'Cookie Policy Reopen'
367
374
  });
368
375
  }
@@ -177,20 +177,21 @@ export default function (Manager, options) {
177
177
 
178
178
  // Tracking functions
179
179
  function trackExitPopupShown() {
180
- gtag('event', 'exit_popup_shown', {
180
+ gtag('event', 'exit_popup_show', {
181
181
  event_category: 'engagement',
182
182
  event_label: config.title,
183
183
  page_path: window.location.pathname
184
184
  });
185
185
 
186
- fbq('trackCustom', 'ExitPopupShown', {
187
- content_name: config.title,
186
+ fbq('trackCustom', 'ExitPopupShow', {
187
+ content_name: 'Exit Popup Show',
188
188
  page_path: window.location.pathname
189
189
  });
190
190
 
191
191
  ttq.track('ViewContent', {
192
- content_name: 'Exit Popup',
193
- content_type: config.title
192
+ content_id: 'exit-popup-show',
193
+ content_type: 'product',
194
+ content_name: 'Exit Popup Show'
194
195
  });
195
196
  }
196
197
 
@@ -207,24 +208,26 @@ export default function (Manager, options) {
207
208
  });
208
209
 
209
210
  ttq.track('ClickButton', {
210
- content_name: 'Exit Popup CTA',
211
- content_type: config.okButton?.text || 'OK'
211
+ content_id: 'exit-popup-click',
212
+ content_type: 'product',
213
+ content_name: 'Exit Popup Click'
212
214
  });
213
215
  }
214
216
 
215
217
  function trackExitPopupDismissed() {
216
- gtag('event', 'exit_popup_dismissed', {
218
+ gtag('event', 'exit_popup_dismiss', {
217
219
  event_category: 'engagement',
218
220
  event_label: config.title
219
221
  });
220
222
 
221
- fbq('trackCustom', 'ExitPopupDismissed', {
222
- content_name: config.title
223
+ fbq('trackCustom', 'ExitPopupDismiss', {
224
+ content_name: 'Exit Popup Dismiss'
223
225
  });
224
226
 
225
227
  ttq.track('ViewContent', {
226
- content_name: 'Exit Popup Dismissed',
227
- content_type: config.title
228
+ content_id: 'exit-popup-dismiss',
229
+ content_type: 'product',
230
+ content_name: 'Exit Popup Dismiss'
228
231
  });
229
232
  }
230
233
  };
@@ -289,6 +289,8 @@ export default function (Manager, options) {
289
289
 
290
290
  // Tracking functions
291
291
  function trackShare(platformKey, shareConfig) {
292
+ const platformName = platforms[platformKey]?.name || platformKey;
293
+
292
294
  gtag('event', 'share', {
293
295
  method: platformKey,
294
296
  content_type: 'article',
@@ -302,9 +304,9 @@ export default function (Manager, options) {
302
304
  });
303
305
 
304
306
  ttq.track('Share', {
305
- content_name: shareConfig.title,
306
- content_url: shareConfig.url,
307
- share_method: platformKey
307
+ content_id: `social-share-${platformKey}`,
308
+ content_type: 'product',
309
+ content_name: `Social Share ${platformName}`
308
310
  });
309
311
  }
310
312
 
@@ -319,7 +321,9 @@ export default function (Manager, options) {
319
321
  });
320
322
 
321
323
  ttq.track('ClickButton', {
322
- content_name: 'Copy Link'
324
+ content_id: 'social-share-copy-link',
325
+ content_type: 'product',
326
+ content_name: 'Social Share Copy Link'
323
327
  });
324
328
  }
325
329
  };
@@ -9,12 +9,6 @@ export default function (Manager) {
9
9
  // Form manager instance
10
10
  let formManager = null;
11
11
 
12
- // Shared FormManager configuration
13
- const formManagerConfig = {
14
- allowMultipleSubmissions: false,
15
- validateOnSubmit: true,
16
- };
17
-
18
12
  // Check query string for popup parameter
19
13
  const url = new URL(window.location.href);
20
14
  const useAuthPopup = url.searchParams.get('authPopup') === 'true' || window !== window.top;
@@ -61,125 +55,66 @@ export default function (Manager) {
61
55
  }
62
56
  }
63
57
 
64
- // Initialize signin form
65
- function initializeSigninForm() {
66
- formManager = new FormManager('#signin-form', {
67
- ...formManagerConfig,
68
- submitButtonLoadingText: 'Signing in...'
69
- });
58
+ // Shared validation for signin/signup forms - only validate when email provider is selected
59
+ function validateEmailProvider({ data, setError, $submitButton }) {
60
+ const provider = $submitButton?.getAttribute('data-provider');
70
61
 
71
- // Handle form submission
72
- formManager.addEventListener('submit', async (e) => {
73
- // Prevent FormManager's default submit handler
74
- e.preventDefault();
62
+ if (provider === 'email') {
63
+ if (!data.email?.trim()) {
64
+ setError('email', 'Email is required');
65
+ }
66
+ if (!data.password) {
67
+ setError('password', 'Password is required');
68
+ }
69
+ }
70
+ }
75
71
 
76
- const { submitButton, data } = e.detail;
77
- const provider = submitButton?.getAttribute('data-provider');
72
+ // Shared submit handler factory for signin/signup forms
73
+ function createAuthSubmitHandler(action, emailHandler) {
74
+ return async ({ data, $submitButton }) => {
75
+ const provider = $submitButton?.getAttribute('data-provider');
78
76
 
79
- // Only validate for email provider
80
77
  if (provider === 'email') {
81
- const validation = formManager.validate(data);
82
- if (!validation.isValid) {
83
- formManager.showErrors(validation.errors);
84
- formManager.setFormState('ready');
85
- return;
86
- }
78
+ await emailHandler(data);
79
+ } else if (provider) {
80
+ await signInWithProvider(provider, action);
87
81
  }
82
+ };
83
+ }
88
84
 
89
- try {
90
- if (provider === 'email') {
91
- // Pass the already collected data to avoid re-collecting from disabled fields
92
- await handleEmailSignin(data);
93
- } else if (provider) {
94
- await signInWithProvider(provider, 'signin');
95
- }
96
- } catch (error) {
97
- // Set form back to ready state
98
- formManager.setFormState('ready');
99
-
100
- // Show the error to the user
101
- formManager.showError(error.message || 'An error occurred during sign in');
102
-
103
- // Log for debugging
104
- console.error('Signin error:', error);
105
- }
85
+ // Initialize signin form
86
+ function initializeSigninForm() {
87
+ formManager = new FormManager('#signin-form', {
88
+ allowResubmit: false,
89
+ submittingText: 'Signing in...',
90
+ submittedText: 'Signed In!',
106
91
  });
92
+
93
+ formManager.on('validation', validateEmailProvider);
94
+ formManager.on('submit', createAuthSubmitHandler('signin', handleEmailSignin));
107
95
  }
108
96
 
109
97
  // Initialize signup form
110
98
  function initializeSignupForm() {
111
99
  formManager = new FormManager('#signup-form', {
112
- ...formManagerConfig,
113
- submitButtonLoadingText: 'Creating account...'
100
+ allowResubmit: false,
101
+ submittingText: 'Creating account...',
102
+ submittedText: 'Account Created!',
114
103
  });
115
104
 
116
- // Handle form submission
117
- formManager.addEventListener('submit', async (e) => {
118
- // Prevent FormManager's default submit handler
119
- e.preventDefault();
120
-
121
- const { submitButton, data } = e.detail;
122
- const provider = submitButton?.getAttribute('data-provider');
123
-
124
- // Only validate for email provider
125
- if (provider === 'email') {
126
- const validation = formManager.validate(data);
127
- if (!validation.isValid) {
128
- formManager.showErrors(validation.errors);
129
- formManager.setFormState('ready');
130
- return;
131
- }
132
- }
133
-
134
- try {
135
- if (provider === 'email') {
136
- // Pass the already collected data to avoid re-collecting from disabled fields
137
- await handleEmailSignup(data);
138
- } else if (provider) {
139
- await signInWithProvider(provider, 'signup');
140
- }
141
- } catch (error) {
142
- // Set form back to ready state
143
- formManager.setFormState('ready');
144
-
145
- // Show the error to the user
146
- formManager.showError(error.message || 'An error occurred during sign up');
147
-
148
- // Log for debugging
149
- console.error('Signup error:', error);
150
- }
151
- });
105
+ formManager.on('validation', validateEmailProvider);
106
+ formManager.on('submit', createAuthSubmitHandler('signup', handleEmailSignup));
152
107
  }
153
108
 
154
109
  // Initialize reset form
155
110
  function initializeResetForm() {
156
111
  formManager = new FormManager('#reset-form', {
157
- ...formManagerConfig,
158
- submitButtonLoadingText: 'Sending...',
159
- submitButtonSuccessText: 'Email Sent!'
112
+ allowResubmit: false,
113
+ submittingText: 'Sending...',
114
+ submittedText: 'Email Sent!',
160
115
  });
161
116
 
162
- // Handle form submission
163
- formManager.addEventListener('submit', async (e) => {
164
- // Prevent FormManager's default submit handler
165
- e.preventDefault();
166
-
167
- const { data } = e.detail;
168
-
169
- try {
170
- // Pass the already collected data to avoid re-collecting from disabled fields
171
- await handlePasswordReset(data);
172
- } catch (error) {
173
- // Set form back to ready state
174
- formManager.setFormState('ready');
175
-
176
- // Show the error to the user
177
- formManager.showError(error.message || 'An error occurred during password reset');
178
-
179
- // Log for debugging
180
- console.error('Reset error:', error);
181
- }
182
- });
117
+ formManager.on('submit', ({ data }) => handlePasswordReset(data));
183
118
  }
184
119
 
185
120
  async function handleRedirectResult() {
@@ -211,14 +146,10 @@ export default function (Manager) {
211
146
 
212
147
  if (isNewUser || isSignupPage) {
213
148
  trackSignup(providerId, result.user);
214
- // Show success message
215
149
  formManager.showSuccess('Account created successfully!');
216
- formManager.setFormState('submitted');
217
150
  } else {
218
151
  trackLogin(providerId, result.user);
219
- // Show success message
220
152
  formManager.showSuccess('Successfully signed in!');
221
- formManager.setFormState('submitted');
222
153
  }
223
154
  } catch (error) {
224
155
  // Only capture unexpected errors to Sentry
@@ -353,9 +284,6 @@ export default function (Manager) {
353
284
 
354
285
  // Show success message
355
286
  formManager.showSuccess('Account created successfully!');
356
-
357
- // FormManager will handle the success state
358
- formManager.setFormState('submitted');
359
287
  } catch (error) {
360
288
  // Handle Firebase-specific errors
361
289
  if (error.code === 'auth/email-already-in-use') {
@@ -370,9 +298,6 @@ export default function (Manager) {
370
298
 
371
299
  // Show success message
372
300
  formManager.showSuccess('Successfully signed in!');
373
-
374
- // Set success state
375
- formManager.setFormState('submitted');
376
301
  return;
377
302
  } catch (signInError) {
378
303
  // Throw error for outer catch to handle
@@ -403,9 +328,6 @@ export default function (Manager) {
403
328
 
404
329
  // Show success message
405
330
  formManager.showSuccess('Successfully signed in!');
406
-
407
- // FormManager will handle the success state
408
- formManager.setFormState('submitted');
409
331
  }
410
332
 
411
333
  async function handlePasswordReset(formData) {
@@ -429,9 +351,6 @@ export default function (Manager) {
429
351
 
430
352
  // Show success message
431
353
  formManager.showSuccess(`Password reset email sent to ${email}. Please check your inbox.`);
432
-
433
- // Set form to submitted state
434
- formManager.setFormState('submitted');
435
354
  } catch (error) {
436
355
  // Handle Firebase-specific errors
437
356
  if (error.code === 'auth/user-not-found') {
@@ -439,7 +358,6 @@ export default function (Manager) {
439
358
  // Still show success to prevent email enumeration
440
359
  trackPasswordReset(email); // Track as success for security
441
360
  formManager.showSuccess(`If an account exists for ${email}, a password reset email has been sent.`);
442
- formManager.setFormState('submitted');
443
361
  return;
444
362
  }
445
363
 
@@ -484,19 +402,32 @@ export default function (Manager) {
484
402
  throw new Error(`Unsupported provider: ${providerName}`);
485
403
  }
486
404
 
487
- // Show warning in dev mode when using redirect
488
- if (webManager.isDevelopment() && !useAuthPopup) {
489
- webManager.utilities().showNotification(
490
- 'OAuth redirect may fail in development. Use localhost:4000 or add ?authPopup=true to the URL',
491
- {
492
- type: 'warning',
493
- timeout: 10000 // Show for 10 seconds
494
- }
495
- );
496
-
497
- // Wait
498
- await new Promise(resolve => setTimeout(resolve, 1000));
405
+ /* @dev-only:start */
406
+ {
407
+ // // Add device_id and device_name for private IP addresses (required by Firebase)
408
+ // const deviceId = webManager.storage().get('devDeviceId') || crypto.randomUUID();
409
+ // webManager.storage().set('devDeviceId', deviceId);
410
+
411
+ // provider.setCustomParameters({
412
+ // device_id: deviceId,
413
+ // device_name: navigator.userAgent.substring(0, 100),
414
+ // });
415
+
416
+ // Show warning in dev mode when using redirect
417
+ if (!useAuthPopup) {
418
+ webManager.utilities().showNotification(
419
+ 'OAuth redirect may fail in development. Use localhost:4000 or add ?authPopup=true to the URL',
420
+ {
421
+ type: 'warning',
422
+ timeout: 10000 // Show for 10 seconds
423
+ }
424
+ );
425
+
426
+ // Wait
427
+ await new Promise(resolve => setTimeout(resolve, 2000));
428
+ }
499
429
  }
430
+ /* @dev-only:end */
500
431
 
501
432
  // Use popup if query parameter is set, otherwise use redirect
502
433
  if (useAuthPopup) {
@@ -516,9 +447,6 @@ export default function (Manager) {
516
447
  // Show success message
517
448
  formManager.showSuccess('Successfully signed in!');
518
449
  }
519
-
520
- // Set form to submitted state
521
- formManager.setFormState('submitted');
522
450
  } catch (popupError) {
523
451
  // Check if popup was blocked or failed
524
452
  if (popupError.code === 'auth/popup-blocked' ||
@@ -620,6 +548,7 @@ export default function (Manager) {
620
548
 
621
549
  function trackLogin(method, user) {
622
550
  const userId = user.uid;
551
+ const methodName = method.charAt(0).toUpperCase() + method.slice(1);
623
552
 
624
553
  // Google Analytics 4
625
554
  gtag('event', 'login', {
@@ -629,21 +558,22 @@ export default function (Manager) {
629
558
 
630
559
  // Facebook Pixel
631
560
  fbq('trackCustom', 'Login', {
561
+ content_name: `Account Login ${methodName}`,
632
562
  method: method,
633
- status: 'success'
634
563
  });
635
564
 
636
565
  // TikTok Pixel
637
566
  ttq.track('Login', {
638
- content_name: 'Account',
639
- content_id: userId,
640
- status: 'success'
567
+ content_id: `account-login-${method}`,
568
+ content_type: 'product',
569
+ content_name: `Account Login ${methodName}`
641
570
  });
642
571
  }
643
572
 
644
573
  // Analytics tracking functions
645
574
  function trackSignup(method, user) {
646
575
  const userId = user.uid;
576
+ const methodName = method.charAt(0).toUpperCase() + method.slice(1);
647
577
 
648
578
  // Google Analytics 4
649
579
  gtag('event', 'sign_up', {
@@ -653,17 +583,15 @@ export default function (Manager) {
653
583
 
654
584
  // Facebook Pixel
655
585
  fbq('track', 'CompleteRegistration', {
656
- content_name: 'Account',
657
- status: 'success',
658
- value: 0,
659
- currency: 'USD'
586
+ content_name: `Account Registration ${methodName}`,
587
+ method: method,
660
588
  });
661
589
 
662
590
  // TikTok Pixel
663
591
  ttq.track('CompleteRegistration', {
664
- content_name: 'Account',
665
- content_id: userId,
666
- status: 'success'
592
+ content_id: `account-registration-${method}`,
593
+ content_type: 'product',
594
+ content_name: `Account Registration ${methodName}`
667
595
  });
668
596
  }
669
597
 
@@ -683,8 +611,9 @@ export default function (Manager) {
683
611
 
684
612
  // TikTok Pixel
685
613
  ttq.track('SubmitForm', {
686
- content_name: 'Password Reset',
687
- content_type: 'account_recovery'
614
+ content_id: 'password-reset',
615
+ content_type: 'product',
616
+ content_name: 'Password Reset'
688
617
  });
689
618
  }
690
619
  }