ultimate-jekyll-manager 0.0.131 → 0.0.132

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 (37) hide show
  1. package/CLAUDE.md +19 -0
  2. package/README.md +17 -0
  3. package/dist/assets/js/libs/auth.js +23 -5
  4. package/dist/assets/js/libs/form-manager.js +6 -0
  5. package/dist/assets/themes/classy/css/layout/_navigation.scss +2 -1
  6. package/dist/commands/migrate.js +57 -0
  7. package/dist/config/_config_default.yml +1 -1
  8. package/dist/config/_config_development.yml +3 -2
  9. package/dist/defaults/dist/_includes/core/foot.html +1 -1
  10. package/dist/defaults/dist/_includes/themes/classy/frontend/sections/nav.html +5 -5
  11. package/dist/defaults/dist/_layouts/core/root.html +5 -0
  12. package/dist/defaults/dist/_layouts/modules/utilities/redirect.html +1 -1
  13. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/account/index.html +6 -6
  14. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/reset.html +1 -1
  15. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signin.html +2 -2
  16. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signup.html +2 -2
  17. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/index.html +1 -1
  18. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/pricing.html +4 -3
  19. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/team/index.html +8 -26
  20. package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/team/member.html +3 -1
  21. package/dist/defaults/dist/_team/alex-raeburn.md +11 -5
  22. package/dist/defaults/dist/_team/alfred-caufy.md +11 -6
  23. package/dist/defaults/dist/_team/ian-wiedenman.md +15 -5
  24. package/dist/defaults/dist/_team/james-oconnor.md +2 -2
  25. package/dist/defaults/dist/_team/marcus-johnson.md +4 -4
  26. package/dist/defaults/dist/_team/priya-sharma.md +3 -3
  27. package/dist/defaults/dist/_team/rare-ivy.md +5 -5
  28. package/dist/defaults/dist/_team/sarah-rodriguez.md +6 -3
  29. package/dist/defaults/dist/pages/test/libraries/form-manager.html +23 -23
  30. package/dist/defaults/src/assets/images/team/alex-raeburn/profile.jpg +0 -0
  31. package/dist/defaults/src/assets/images/team/alfred-caufy/profile.jpg +0 -0
  32. package/dist/defaults/src/assets/images/team/christina-hill/profile.jpg +0 -0
  33. package/dist/gulp/tasks/jekyll.js +2 -0
  34. package/dist/gulp/tasks/serve.js +56 -1
  35. package/firebase-debug.log +364 -0
  36. package/package.json +2 -2
  37. package/dist/defaults/src/assets/images/.gitkeep +0 -0
@@ -9,7 +9,7 @@ member:
9
9
  id: james-oconnor
10
10
  name: "James O'Connor"
11
11
  position: "Sales Lead"
12
- description: "James leads our sales efforts with enthusiasm and a consultative approach. He's helped build our sales playbook from scratch and is passionate about understanding customer needs."
12
+ description: "James leads our sales efforts with enthusiasm and a consultative approach to understanding customer needs."
13
13
  location: "Boston, MA"
14
14
  skills:
15
15
  - "B2B Sales"
@@ -25,7 +25,7 @@ member:
25
25
  links:
26
26
  - id: "linkedin"
27
27
  title: "LinkedIn"
28
- url: "https://www.linkedin.com/in/jamesoconnor"
28
+ url: "https://www.linkedin.com/in/james-oconnor"
29
29
  ---
30
30
 
31
31
  Hey! I'm James.
@@ -9,7 +9,7 @@ member:
9
9
  id: marcus-johnson
10
10
  name: "Marcus Johnson"
11
11
  position: "Product Designer"
12
- description: "Marcus is our lead Product Designer with a background in cognitive psychology and human-computer interaction. He crafts intuitive user experiences that delight our customers."
12
+ description: "Marcus is our lead Product Designer who crafts intuitive user experiences that delight our customers."
13
13
  location: "Austin, TX"
14
14
  skills:
15
15
  - "UI/UX Design"
@@ -25,13 +25,13 @@ member:
25
25
  links:
26
26
  - id: "linkedin"
27
27
  title: "LinkedIn"
28
- url: "https://www.linkedin.com/in/marcusjohnson"
28
+ url: "https://www.linkedin.com/in/marcus-johnson"
29
29
  - id: "dribbble"
30
30
  title: "Dribbble"
31
- url: "https://dribbble.com/marcusjohnson"
31
+ url: "https://dribbble.com/marcus-johnson"
32
32
  - id: "instagram"
33
33
  title: "Instagram"
34
- url: "https://www.instagram.com/marcusjohnson"
34
+ url: "https://www.instagram.com/marcus-johnson"
35
35
  ---
36
36
 
37
37
  Hey there, I'm Marcus!
@@ -9,7 +9,7 @@ member:
9
9
  id: priya-sharma
10
10
  name: "Priya Sharma"
11
11
  position: "Customer Success Manager"
12
- description: "Priya ensures our customers get maximum value from our products. With her background in consulting and customer advocacy, she bridges the gap between user needs and product development."
12
+ description: "Priya ensures our customers get maximum value from our products and bridges the gap between user needs and product development."
13
13
  location: "Chicago, IL"
14
14
  skills:
15
15
  - "Customer Relations"
@@ -25,10 +25,10 @@ member:
25
25
  links:
26
26
  - id: "linkedin"
27
27
  title: "LinkedIn"
28
- url: "https://www.linkedin.com/in/priyasharma"
28
+ url: "https://www.linkedin.com/in/priya-sharma"
29
29
  - id: "twitter"
30
30
  title: "Twitter"
31
- url: "https://twitter.com/priyasharma"
31
+ url: "https://twitter.com/priya-sharma"
32
32
  ---
33
33
 
34
34
  Hi there, I'm Priya!
@@ -9,7 +9,7 @@ member:
9
9
  id: rare-ivy
10
10
  name: "Rare Ivy"
11
11
  position: "Content Creator"
12
- description: "Ivy is our in-house content creator, producing engaging videos, graphics, and social content that brings our brand to life. Her creative vision and storytelling abilities captivate audiences across all platforms."
12
+ description: "Rare is our in-house content creator, producing engaging videos, graphics, and social content that brings our brand to life."
13
13
  location: "Brooklyn, NY"
14
14
  skills:
15
15
  - "Video Production"
@@ -25,19 +25,19 @@ member:
25
25
  links:
26
26
  - id: "linkedin"
27
27
  title: "LinkedIn"
28
- url: "https://www.linkedin.com/in/rareivy"
28
+ url: "https://www.linkedin.com/in/rare-ivy"
29
29
  - id: "instagram"
30
30
  title: "Instagram"
31
- url: "https://www.instagram.com/rareivy"
31
+ url: "https://www.instagram.com/rare.ivyyy"
32
32
  - id: "tiktok"
33
33
  title: "TikTok"
34
- url: "https://www.tiktok.com/@rareivy"
34
+ url: "https://www.tiktok.com/@rare.ivy"
35
35
  - id: "youtube"
36
36
  title: "YouTube"
37
37
  url: "https://www.youtube.com/@rareivy"
38
38
  ---
39
39
 
40
- Hey, I'm Ivy!
40
+ Hey, I'm Rare!
41
41
 
42
42
  I'm a multi-disciplinary content creator with a passion for visual storytelling. From short-form TikToks to long-form YouTube videos, I love crafting content that connects with people on an emotional level.
43
43
 
@@ -9,7 +9,7 @@ member:
9
9
  id: sarah-rodriguez
10
10
  name: "Sarah Rodriguez"
11
11
  position: "Marketing Director"
12
- description: "Sarah leads our marketing efforts with a data-driven approach and creative flair. She has scaled multiple startups from seed to Series B through innovative growth strategies."
12
+ description: "Sarah leads our marketing efforts with a data-driven approach and creative flair."
13
13
  location: "Miami, FL"
14
14
  skills:
15
15
  - "Growth Marketing"
@@ -25,10 +25,13 @@ member:
25
25
  links:
26
26
  - id: "linkedin"
27
27
  title: "LinkedIn"
28
- url: "https://www.linkedin.com/in/sarahrodriguez"
28
+ url: "https://www.linkedin.com/in/sarah-rodriguez"
29
29
  - id: "twitter"
30
30
  title: "Twitter"
31
- url: "https://twitter.com/sarahrodriguez"
31
+ url: "https://twitter.com/sarah-rodriguez"
32
+ - id: "instagram"
33
+ title: "Instagram"
34
+ url: "https://www.instagram.com/sarahrodriguez"
32
35
  ---
33
36
 
34
37
  Hola! I'm Sarah.
@@ -24,21 +24,21 @@ sitemap: false
24
24
  <div class="col-md-6">
25
25
  <div class="mb-3">
26
26
  <label for="main-name" class="form-label">user.name</label>
27
- <input type="text" class="form-control" id="main-name" name="user.name" value="Ian">
27
+ <input type="text" class="form-control" id="main-name" name="user.name" value="Ian" disabled autofocus>
28
28
  </div>
29
29
  <div class="mb-3">
30
30
  <label for="main-email" class="form-label">user.email</label>
31
- <input type="email" class="form-control" id="main-email" name="user.email" value="ian@example.com">
31
+ <input type="email" class="form-control" id="main-email" name="user.email" value="ian@example.com" disabled>
32
32
  </div>
33
33
  <div class="mb-3">
34
34
  <label for="main-city" class="form-label">user.address.city</label>
35
- <input type="text" class="form-control" id="main-city" name="user.address.city" value="NYC">
35
+ <input type="text" class="form-control" id="main-city" name="user.address.city" value="NYC" disabled>
36
36
  </div>
37
37
  </div>
38
38
  <div class="col-md-6">
39
39
  <div class="mb-3">
40
40
  <label for="main-outcome" class="form-label">Simulate Outcome</label>
41
- <select class="form-select" id="main-outcome" name="settings.outcome">
41
+ <select class="form-select" id="main-outcome" name="settings.outcome" disabled>
42
42
  <option value="success">Success</option>
43
43
  <option value="error">Error (throw Error)</option>
44
44
  </select>
@@ -46,43 +46,43 @@ sitemap: false
46
46
  <div class="mb-3">
47
47
  <label class="form-label d-block">preferences.notifications (radio group)</label>
48
48
  <div class="form-check form-check-inline">
49
- <input type="radio" class="form-check-input" id="notif-all" name="preferences.notifications" value="all" checked>
49
+ <input type="radio" class="form-check-input" id="notif-all" name="preferences.notifications" value="all" checked disabled>
50
50
  <label class="form-check-label" for="notif-all">All</label>
51
51
  </div>
52
52
  <div class="form-check form-check-inline">
53
- <input type="radio" class="form-check-input" id="notif-important" name="preferences.notifications" value="important">
53
+ <input type="radio" class="form-check-input" id="notif-important" name="preferences.notifications" value="important" disabled>
54
54
  <label class="form-check-label" for="notif-important">Important</label>
55
55
  </div>
56
56
  <div class="form-check form-check-inline">
57
- <input type="radio" class="form-check-input" id="notif-none" name="preferences.notifications" value="none">
57
+ <input type="radio" class="form-check-input" id="notif-none" name="preferences.notifications" value="none" disabled>
58
58
  <label class="form-check-label" for="notif-none">None</label>
59
59
  </div>
60
60
  </div>
61
61
  <div class="mb-3">
62
62
  <label class="form-label d-block">preferences.features (checkbox group)</label>
63
63
  <div class="form-check">
64
- <input type="checkbox" class="form-check-input" id="feat-darkmode" name="preferences.features" value="darkmode">
64
+ <input type="checkbox" class="form-check-input" id="feat-darkmode" name="preferences.features" value="darkmode" disabled>
65
65
  <label class="form-check-label" for="feat-darkmode">Dark Mode</label>
66
66
  </div>
67
67
  <div class="form-check">
68
- <input type="checkbox" class="form-check-input" id="feat-analytics" name="preferences.features" value="analytics">
68
+ <input type="checkbox" class="form-check-input" id="feat-analytics" name="preferences.features" value="analytics" disabled>
69
69
  <label class="form-check-label" for="feat-analytics">Analytics</label>
70
70
  </div>
71
71
  <div class="form-check">
72
- <input type="checkbox" class="form-check-input" id="feat-beta" name="preferences.features" value="beta">
72
+ <input type="checkbox" class="form-check-input" id="feat-beta" name="preferences.features" value="beta" disabled>
73
73
  <label class="form-check-label" for="feat-beta">Beta Features</label>
74
74
  </div>
75
75
  </div>
76
76
  <div class="mb-3 form-check">
77
- <input type="checkbox" class="form-check-input" id="main-subscribe" name="settings.subscribe">
77
+ <input type="checkbox" class="form-check-input" id="main-subscribe" name="settings.subscribe" disabled>
78
78
  <label class="form-check-label" for="main-subscribe">settings.subscribe (single checkbox)</label>
79
79
  </div>
80
80
  </div>
81
81
  </div>
82
82
  <div class="d-flex gap-2">
83
- <button type="submit" data-action="save" class="btn btn-primary">Save</button>
84
- <button type="submit" data-action="draft" class="btn btn-outline-secondary">Save as Draft</button>
85
- <button type="button" id="main-set-data" class="btn btn-outline-info">Set Data</button>
83
+ <button type="submit" data-action="save" class="btn btn-primary" disabled>Save</button>
84
+ <button type="submit" data-action="draft" class="btn btn-outline-secondary" disabled>Save as Draft</button>
85
+ <button type="button" id="main-set-data" class="btn btn-outline-info" disabled>Set Data</button>
86
86
  </div>
87
87
  </form>
88
88
  <div class="mt-3 d-flex gap-3">
@@ -110,21 +110,21 @@ sitemap: false
110
110
  <form id="test-form-validation">
111
111
  <div class="mb-3">
112
112
  <label for="validation-name" class="form-label">Name (required)</label>
113
- <input type="text" class="form-control" id="validation-name" name="name" required>
113
+ <input type="text" class="form-control" id="validation-name" name="name" required disabled>
114
114
  </div>
115
115
  <div class="mb-3">
116
116
  <label for="validation-email" class="form-label">Email (required, valid format)</label>
117
- <input type="email" class="form-control" id="validation-email" name="email" required>
117
+ <input type="email" class="form-control" id="validation-email" name="email" required disabled>
118
118
  </div>
119
119
  <div class="mb-3">
120
120
  <label for="validation-age" class="form-label">Age (required, must be 18+)</label>
121
- <input type="number" class="form-control" id="validation-age" name="age" required min="1">
121
+ <input type="number" class="form-control" id="validation-age" name="age" required min="1" disabled>
122
122
  </div>
123
123
  <div class="mb-3 form-check">
124
- <input type="checkbox" class="form-check-input" id="validation-terms" name="terms" required>
124
+ <input type="checkbox" class="form-check-input" id="validation-terms" name="terms" required disabled>
125
125
  <label class="form-check-label" for="validation-terms">I agree to the terms (required)</label>
126
126
  </div>
127
- <button type="submit" class="btn btn-primary">Submit</button>
127
+ <button type="submit" class="btn btn-primary" disabled>Submit</button>
128
128
  </form>
129
129
  <div class="mt-2">
130
130
  <small class="text-muted" id="validation-status">Status: ready</small>
@@ -144,9 +144,9 @@ sitemap: false
144
144
  <form id="test-form-contact">
145
145
  <div class="mb-3">
146
146
  <label for="contact-message" class="form-label">Message</label>
147
- <textarea class="form-control" id="contact-message" name="message" rows="2">Hello!</textarea>
147
+ <textarea class="form-control" id="contact-message" name="message" rows="2" disabled>Hello!</textarea>
148
148
  </div>
149
- <button type="submit" class="btn btn-primary">Send Message</button>
149
+ <button type="submit" class="btn btn-primary" disabled>Send Message</button>
150
150
  </form>
151
151
  <div class="mt-2">
152
152
  <small class="text-muted" id="contact-status">Status: ready</small>
@@ -166,9 +166,9 @@ sitemap: false
166
166
  <form id="test-form-manual">
167
167
  <div class="mb-3">
168
168
  <label for="manual-data" class="form-label">Data</label>
169
- <input type="text" class="form-control" id="manual-data" name="data">
169
+ <input type="text" class="form-control" id="manual-data" name="data" disabled>
170
170
  </div>
171
- <button type="submit" class="btn btn-primary">Submit</button>
171
+ <button type="submit" class="btn btn-primary" disabled>Submit</button>
172
172
  </form>
173
173
  <div class="mt-2">
174
174
  <small class="text-muted" id="manual-status">Status: initializing</small>
@@ -81,6 +81,8 @@ async function jekyll(complete) {
81
81
 
82
82
  // Build Jekyll
83
83
  const command = [
84
+ // Set JEKYLL_ENV to production when in build mode
85
+ Manager.isBuildMode() ? 'JEKYLL_ENV=production' : '',
84
86
  // Jekyll command
85
87
  'bundle exec jekyll build',
86
88
  '--source dist',
@@ -33,12 +33,15 @@ module.exports = async function serve(complete) {
33
33
  https: await getHttpsConfig(), // Enable HTTPS with mkcert or self-signed certificates
34
34
  server: {
35
35
  baseDir: '_site',
36
+ routes: {
37
+ '/src': 'src' // Allow serving from src/ for media fallback
38
+ },
36
39
  middleware: [
37
40
  // require('compression')({
38
41
  // threshold: 0, // Compress all files regardless of size
39
42
  // level: 9 // Maximum compression (1-9)
40
43
  // }),
41
- processRequestMiddleware
44
+ processRequestMiddleware,
42
45
  ],
43
46
  },
44
47
  }
@@ -216,6 +219,58 @@ async function processRequestMiddleware(req, res, next) {
216
219
  logger.log(`Serving ${pathname}`);
217
220
  }
218
221
 
222
+ // Fallback for media files: serve from src/ if not in _site/
223
+ // This handles cases where imagemin hasn't run and optimized variants don't exist
224
+ const isMedia = pathname.startsWith('/assets/images/') || pathname.startsWith('/assets/videos/');
225
+ if (isMedia) {
226
+ const startTime = Date.now();
227
+ const cleanPath = pathname.split('?')[0];
228
+ const siteFilePath = path.join(rootPathProject, '_site', cleanPath);
229
+
230
+ // If file exists in _site, serve normally
231
+ if (jetpack.exists(siteFilePath)) {
232
+ logger.log(`[media] Found in _site: ${cleanPath} (${Date.now() - startTime}ms)`);
233
+ return next();
234
+ }
235
+
236
+ // Try to find the original file in src/
237
+ // First, try the exact path
238
+ let srcFilePath = path.join(rootPathProject, 'src', cleanPath);
239
+
240
+ // If not found, try stripping imagemin suffixes (-320px, -640px, -1024px) and .webp extension
241
+ if (!jetpack.exists(srcFilePath)) {
242
+ let originalPath = cleanPath;
243
+
244
+ // Remove size suffix (e.g., -320px, -640px, -1024px)
245
+ originalPath = originalPath.replace(/-\d+px(\.[^.]+)$/, '$1');
246
+
247
+ // If it's a .webp, try original extensions
248
+ if (originalPath.endsWith('.webp')) {
249
+ const basePath = originalPath.replace(/\.webp$/, '');
250
+ const possibleExts = ['.jpg', '.jpeg', '.png', '.gif'];
251
+
252
+ for (const ext of possibleExts) {
253
+ const testPath = path.join(rootPathProject, 'src', basePath + ext);
254
+ if (jetpack.exists(testPath)) {
255
+ srcFilePath = testPath;
256
+ break;
257
+ }
258
+ }
259
+ } else {
260
+ srcFilePath = path.join(rootPathProject, 'src', originalPath);
261
+ }
262
+ }
263
+
264
+ // Serve from src if found
265
+ if (jetpack.exists(srcFilePath)) {
266
+ const relativeSrcPath = path.relative(rootPathProject, srcFilePath);
267
+ logger.log(`[media] Serving from src: ${cleanPath} -> ${relativeSrcPath} (${Date.now() - startTime}ms)`);
268
+ req.url = '/' + relativeSrcPath;
269
+ } else {
270
+ logger.log(`[media] Not found: ${cleanPath} (${Date.now() - startTime}ms)`);
271
+ }
272
+ }
273
+
219
274
  // Run middleware:request hook to allow custom URL rewriting
220
275
  await hook('middleware:request', { req, res, pathname });
221
276