ultimate-jekyll-manager 0.0.131 → 0.0.133
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 +19 -0
- package/README.md +17 -0
- package/dist/assets/js/libs/auth.js +23 -5
- package/dist/assets/js/libs/form-manager.js +6 -0
- package/dist/assets/themes/classy/css/layout/_navigation.scss +2 -1
- package/dist/commands/migrate.js +62 -4
- package/dist/config/_config_default.yml +1 -1
- package/dist/config/_config_development.yml +3 -2
- package/dist/defaults/dist/_includes/core/foot.html +1 -1
- package/dist/defaults/dist/_includes/themes/classy/frontend/sections/nav.html +5 -5
- package/dist/defaults/dist/_layouts/core/root.html +5 -0
- package/dist/defaults/dist/_layouts/modules/utilities/redirect.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/account/index.html +6 -6
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/reset.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signin.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signup.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/index.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/pricing.html +4 -3
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/team/index.html +8 -26
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/team/member.html +3 -1
- package/dist/defaults/dist/_team/alex-raeburn.md +11 -5
- package/dist/defaults/dist/_team/alfred-caufy.md +11 -6
- package/dist/defaults/dist/_team/christina-hill.md +41 -0
- package/dist/defaults/dist/_team/ian-wiedenman.md +15 -5
- package/dist/defaults/dist/_team/james-oconnor.md +2 -2
- package/dist/defaults/dist/_team/marcus-johnson.md +4 -4
- package/dist/defaults/dist/_team/priya-sharma.md +3 -3
- package/dist/defaults/dist/_team/rare-ivy.md +5 -5
- package/dist/defaults/dist/_team/sarah-rodriguez.md +6 -3
- package/dist/defaults/dist/pages/test/libraries/form-manager.html +23 -23
- package/dist/defaults/src/assets/images/team/alex-raeburn/profile.jpg +0 -0
- package/dist/defaults/src/assets/images/team/alfred-caufy/profile.jpg +0 -0
- package/dist/defaults/src/assets/images/team/christina-hill/profile.jpg +0 -0
- package/dist/gulp/tasks/jekyll.js +2 -0
- package/dist/gulp/tasks/serve.js +56 -1
- package/firebase-debug.log +462 -0
- package/package.json +2 -2
- package/dist/defaults/src/assets/images/.gitkeep +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
### ALL PAGES ###
|
|
3
|
+
layout: blueprint/team/member
|
|
4
|
+
sitemap:
|
|
5
|
+
include: true
|
|
6
|
+
|
|
7
|
+
### TEAM MEMBER PAGES ###
|
|
8
|
+
member:
|
|
9
|
+
id: christina-hill
|
|
10
|
+
name: "Christina Hill"
|
|
11
|
+
position: "Community Manager"
|
|
12
|
+
description: "Christina builds and nurtures our user community, fostering meaningful connections and conversations."
|
|
13
|
+
location: "Seattle, WA"
|
|
14
|
+
skills:
|
|
15
|
+
- "Community Building"
|
|
16
|
+
- "Content Writing"
|
|
17
|
+
- "Event Planning"
|
|
18
|
+
- "User Engagement"
|
|
19
|
+
hobbies:
|
|
20
|
+
- "Reading"
|
|
21
|
+
- "Hiking"
|
|
22
|
+
- "Board Games"
|
|
23
|
+
joined: 2021-08-15
|
|
24
|
+
links:
|
|
25
|
+
- id: "linkedin"
|
|
26
|
+
title: "LinkedIn"
|
|
27
|
+
url: "https://www.linkedin.com/in/christina-hill"
|
|
28
|
+
- id: "twitter"
|
|
29
|
+
title: "Twitter"
|
|
30
|
+
url: "https://twitter.com/christina-hill"
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
Hey there, I'm Christina!
|
|
34
|
+
|
|
35
|
+
I'm passionate about bringing people together and creating spaces where our users can connect, learn, and grow. There's nothing quite like seeing a community member help another one out - that's when you know you've built something special.
|
|
36
|
+
|
|
37
|
+
Before joining the team, I managed online communities for a gaming company and a nonprofit organization. Those experiences taught me that every community is unique, and the best ones are built on genuine relationships rather than metrics.
|
|
38
|
+
|
|
39
|
+
My role spans everything from moderating discussions and organizing virtual events to writing blog posts and gathering feedback from our users. I love being the bridge between our community and the rest of the team - making sure user voices are heard and celebrated.
|
|
40
|
+
|
|
41
|
+
When I'm not online engaging with our community, you'll find me curled up with a good book, exploring the Pacific Northwest trails, or hosting board game nights with friends. I firmly believe that the best ideas come from diverse perspectives coming together.
|
|
@@ -16,6 +16,7 @@ member:
|
|
|
16
16
|
- "Business Management"
|
|
17
17
|
hobbies:
|
|
18
18
|
- "Music"
|
|
19
|
+
- "DJing"
|
|
19
20
|
joined: 2017-04-20
|
|
20
21
|
links:
|
|
21
22
|
- id: "website"
|
|
@@ -23,14 +24,23 @@ member:
|
|
|
23
24
|
url: "https://ianwiedenman.com"
|
|
24
25
|
- id: "linkedin"
|
|
25
26
|
title: "LinkedIn"
|
|
26
|
-
url: "https://www.linkedin.com/in/
|
|
27
|
+
url: "https://www.linkedin.com/in/ian-wiedenman"
|
|
28
|
+
- id: "github"
|
|
29
|
+
title: "GitHub"
|
|
30
|
+
url: "https://github.com/ianwieds"
|
|
27
31
|
- id: "instagram"
|
|
28
32
|
title: "Instagram"
|
|
29
|
-
url: "https://www.instagram.com/
|
|
33
|
+
url: "https://www.instagram.com/kiruemusic"
|
|
30
34
|
---
|
|
31
35
|
|
|
32
|
-
Hey everyone, I'm Ian
|
|
36
|
+
Hey everyone, I'm Ian!
|
|
33
37
|
|
|
34
|
-
I'm an innovative business owner and electronic music artist from Los Angeles, CA.
|
|
38
|
+
I'm an innovative business owner and electronic music artist from Los Angeles, CA. Technology and creativity have always driven me - whether I'm building software or producing electronic beats.
|
|
35
39
|
|
|
36
|
-
I quit the corporate 9-5 lifestyle in 2017 to embark on my risky yet rewarding entrepreneurial journey.
|
|
40
|
+
I quit the corporate 9-5 lifestyle in 2017 to embark on my risky yet rewarding entrepreneurial journey. After years of working in traditional tech roles, I realized I wanted to create things that truly mattered to me. Taking that leap was terrifying, but it turned out to be the best decision I ever made.
|
|
41
|
+
|
|
42
|
+
Today, I work for myself building projects I'm passionate about. I'm proud to say that millions of people now use my creations to enhance their productivity and innovation. From browser extensions to web applications, I love solving problems that make people's lives a little easier.
|
|
43
|
+
|
|
44
|
+
When I'm not coding, you'll find me in my home studio producing electronic music under my artist name. Music has been a lifelong passion - it's the perfect creative outlet that balances the logical side of software development. There's something magical about crafting sounds and melodies that move people.
|
|
45
|
+
|
|
46
|
+
I believe in building things that last and treating users with respect. No dark patterns, no shady practices - just honest products that deliver real value. That philosophy has guided every project I've built, and I'm excited to continue this journey.
|
|
@@ -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
|
|
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/
|
|
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
|
|
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/
|
|
28
|
+
url: "https://www.linkedin.com/in/marcus-johnson"
|
|
29
29
|
- id: "dribbble"
|
|
30
30
|
title: "Dribbble"
|
|
31
|
-
url: "https://dribbble.com/
|
|
31
|
+
url: "https://dribbble.com/marcus-johnson"
|
|
32
32
|
- id: "instagram"
|
|
33
33
|
title: "Instagram"
|
|
34
|
-
url: "https://www.instagram.com/
|
|
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
|
|
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/
|
|
28
|
+
url: "https://www.linkedin.com/in/priya-sharma"
|
|
29
29
|
- id: "twitter"
|
|
30
30
|
title: "Twitter"
|
|
31
|
-
url: "https://twitter.com/
|
|
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: "
|
|
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/
|
|
28
|
+
url: "https://www.linkedin.com/in/rare-ivy"
|
|
29
29
|
- id: "instagram"
|
|
30
30
|
title: "Instagram"
|
|
31
|
-
url: "https://www.instagram.com/
|
|
31
|
+
url: "https://www.instagram.com/rare.ivyyy"
|
|
32
32
|
- id: "tiktok"
|
|
33
33
|
title: "TikTok"
|
|
34
|
-
url: "https://www.tiktok.com/@
|
|
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
|
|
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.
|
|
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/
|
|
28
|
+
url: "https://www.linkedin.com/in/sarah-rodriguez"
|
|
29
29
|
- id: "twitter"
|
|
30
30
|
title: "Twitter"
|
|
31
|
-
url: "https://twitter.com/
|
|
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>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/gulp/tasks/serve.js
CHANGED
|
@@ -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
|
|