ultimate-jekyll-manager 0.0.130 → 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.
- 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 +72 -1
- 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 +8 -26
- package/dist/defaults/dist/_team/alex-raeburn.md +39 -0
- package/dist/defaults/dist/_team/alfred-caufy.md +40 -0
- package/dist/defaults/dist/_team/ian-wiedenman.md +46 -0
- package/dist/defaults/dist/_team/james-oconnor.md +39 -0
- package/dist/defaults/dist/_team/marcus-johnson.md +43 -0
- package/dist/defaults/dist/_team/priya-sharma.md +42 -0
- package/dist/defaults/dist/_team/rare-ivy.md +48 -0
- package/dist/defaults/dist/_team/sarah-rodriguez.md +45 -0
- 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/defaults/src/assets/images/team/james-oconnor/profile.jpg +0 -0
- package/dist/defaults/src/assets/images/team/marcus-johnson/profile.jpg +0 -0
- package/dist/defaults/src/assets/images/team/priya-sharma/profile.jpg +0 -0
- package/dist/defaults/src/assets/images/team/rare-ivy/profile.jpg +0 -0
- package/dist/defaults/src/assets/images/team/sarah-rodriguez/profile.jpg +0 -0
- package/dist/gulp/tasks/jekyll.js +2 -0
- package/dist/gulp/tasks/serve.js +56 -1
- package/firebase-debug.log +392 -0
- package/package.json +2 -2
- package/dist/defaults/dist/_team/alex.md +0 -27
- package/dist/defaults/dist/_team/ian.md +0 -29
- package/dist/defaults/src/assets/images/.gitkeep +0 -0
- package/dist/defaults/src/assets/images/team/alex/profile.jpg +0 -0
- /package/dist/defaults/src/assets/images/team/{ian → ian-wiedenman}/profile.jpg +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
### ALL PAGES ###
|
|
3
|
+
layout: blueprint/team/member
|
|
4
|
+
sitemap:
|
|
5
|
+
include: true
|
|
6
|
+
|
|
7
|
+
### TEAM MEMBER PAGES ###
|
|
8
|
+
member:
|
|
9
|
+
id: alfred-caufy
|
|
10
|
+
name: "Alfred Caufy"
|
|
11
|
+
position: "Lead Developer"
|
|
12
|
+
description: "Alfred leads our development team and is dedicated to crafting elegant solutions to complex problems."
|
|
13
|
+
location: "San Francisco, CA"
|
|
14
|
+
skills:
|
|
15
|
+
- "JavaScript"
|
|
16
|
+
- "Python"
|
|
17
|
+
- "Cloud Architecture"
|
|
18
|
+
- "DevOps"
|
|
19
|
+
hobbies:
|
|
20
|
+
- "Open Source"
|
|
21
|
+
- "Chess"
|
|
22
|
+
- "Hiking"
|
|
23
|
+
joined: 2019-03-15
|
|
24
|
+
links:
|
|
25
|
+
- id: "linkedin"
|
|
26
|
+
title: "LinkedIn"
|
|
27
|
+
url: "https://www.linkedin.com/in/alfred-caufy"
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
Hey there, I'm Alfred!
|
|
31
|
+
|
|
32
|
+
I bring a wealth of technical expertise and leadership to our team. With a background in computer science from Stanford University, I've spent over 8 years building scalable web applications and leading engineering teams at several tech startups before joining this incredible team.
|
|
33
|
+
|
|
34
|
+
My journey into software development started in high school when I built my first website. That spark turned into a full-blown obsession with understanding how things work under the hood. I love diving deep into complex systems and finding elegant solutions that stand the test of time.
|
|
35
|
+
|
|
36
|
+
As Lead Developer, I'm passionate about clean code, best practices, and establishing development standards that help the entire team succeed. I believe great software is built by great teams, so mentorship and knowledge sharing are core to how I work. There's nothing more rewarding than watching a junior developer have that "aha" moment.
|
|
37
|
+
|
|
38
|
+
When I'm not coding, you'll find me contributing to open-source projects - I believe in giving back to the community that taught me so much. I'm also an avid chess player (always looking for a worthy opponent!) and love exploring the hiking trails around the Bay Area. There's something about being in nature that helps me think through tough technical problems.
|
|
39
|
+
|
|
40
|
+
I'm excited to be part of this team and can't wait to see what we build together.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
### ALL PAGES ###
|
|
3
|
+
layout: blueprint/team/member
|
|
4
|
+
sitemap:
|
|
5
|
+
include: true
|
|
6
|
+
|
|
7
|
+
### TEAM MEMBER PAGES ###
|
|
8
|
+
member:
|
|
9
|
+
id: ian-wiedenman
|
|
10
|
+
name: "Ian Wiedenman"
|
|
11
|
+
position: "CEO"
|
|
12
|
+
description: "Ian is the founder and CEO of our company. He has a passion for technology and is always looking for ways to improve our products."
|
|
13
|
+
location: "Los Angeles, CA"
|
|
14
|
+
skills:
|
|
15
|
+
- "Software Development"
|
|
16
|
+
- "Business Management"
|
|
17
|
+
hobbies:
|
|
18
|
+
- "Music"
|
|
19
|
+
- "DJing"
|
|
20
|
+
joined: 2017-04-20
|
|
21
|
+
links:
|
|
22
|
+
- id: "website"
|
|
23
|
+
title: "Website"
|
|
24
|
+
url: "https://ianwiedenman.com"
|
|
25
|
+
- id: "linkedin"
|
|
26
|
+
title: "LinkedIn"
|
|
27
|
+
url: "https://www.linkedin.com/in/ian-wiedenman"
|
|
28
|
+
- id: "github"
|
|
29
|
+
title: "GitHub"
|
|
30
|
+
url: "https://github.com/ianwieds"
|
|
31
|
+
- id: "instagram"
|
|
32
|
+
title: "Instagram"
|
|
33
|
+
url: "https://www.instagram.com/kiruemusic"
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
Hey everyone, I'm Ian!
|
|
37
|
+
|
|
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.
|
|
39
|
+
|
|
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.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
### ALL PAGES ###
|
|
3
|
+
layout: blueprint/team/member
|
|
4
|
+
sitemap:
|
|
5
|
+
include: true
|
|
6
|
+
|
|
7
|
+
### TEAM MEMBER PAGES ###
|
|
8
|
+
member:
|
|
9
|
+
id: james-oconnor
|
|
10
|
+
name: "James O'Connor"
|
|
11
|
+
position: "Sales Lead"
|
|
12
|
+
description: "James leads our sales efforts with enthusiasm and a consultative approach to understanding customer needs."
|
|
13
|
+
location: "Boston, MA"
|
|
14
|
+
skills:
|
|
15
|
+
- "B2B Sales"
|
|
16
|
+
- "Negotiation"
|
|
17
|
+
- "CRM Management"
|
|
18
|
+
- "Pipeline Development"
|
|
19
|
+
- "Demos"
|
|
20
|
+
hobbies:
|
|
21
|
+
- "Golf"
|
|
22
|
+
- "Boston Sports"
|
|
23
|
+
- "Cooking"
|
|
24
|
+
joined: 2019-11-01
|
|
25
|
+
links:
|
|
26
|
+
- id: "linkedin"
|
|
27
|
+
title: "LinkedIn"
|
|
28
|
+
url: "https://www.linkedin.com/in/james-oconnor"
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
Hey! I'm James.
|
|
32
|
+
|
|
33
|
+
I've been in B2B sales for over 8 years, and what I love most is helping businesses find solutions that genuinely make their lives easier. I'm not about the hard sell - I believe in understanding what customers actually need and being honest about whether we're the right fit.
|
|
34
|
+
|
|
35
|
+
Before joining the team, I was at a SaaS company in the HR tech space where I consistently exceeded quota and helped train new sales reps. When I saw the opportunity to join an early-stage startup and build a sales function from the ground up, I jumped at it.
|
|
36
|
+
|
|
37
|
+
I've helped develop our sales playbook, demo scripts, and qualification criteria. I work closely with our marketing and product teams to make sure we're telling a consistent story and learning from every customer interaction.
|
|
38
|
+
|
|
39
|
+
Outside of work, I'm a die-hard Boston sports fan (go Celtics!) and spend my weekends on the golf course trying to break 80. I also love to cook - my Sunday sauce recipe has been passed down for three generations.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
### ALL PAGES ###
|
|
3
|
+
layout: blueprint/team/member
|
|
4
|
+
sitemap:
|
|
5
|
+
include: true
|
|
6
|
+
|
|
7
|
+
### TEAM MEMBER PAGES ###
|
|
8
|
+
member:
|
|
9
|
+
id: marcus-johnson
|
|
10
|
+
name: "Marcus Johnson"
|
|
11
|
+
position: "Product Designer"
|
|
12
|
+
description: "Marcus is our lead Product Designer who crafts intuitive user experiences that delight our customers."
|
|
13
|
+
location: "Austin, TX"
|
|
14
|
+
skills:
|
|
15
|
+
- "UI/UX Design"
|
|
16
|
+
- "Figma"
|
|
17
|
+
- "User Research"
|
|
18
|
+
- "Prototyping"
|
|
19
|
+
- "Design Systems"
|
|
20
|
+
hobbies:
|
|
21
|
+
- "Photography"
|
|
22
|
+
- "Vinyl Collecting"
|
|
23
|
+
- "Cycling"
|
|
24
|
+
joined: 2019-06-01
|
|
25
|
+
links:
|
|
26
|
+
- id: "linkedin"
|
|
27
|
+
title: "LinkedIn"
|
|
28
|
+
url: "https://www.linkedin.com/in/marcus-johnson"
|
|
29
|
+
- id: "dribbble"
|
|
30
|
+
title: "Dribbble"
|
|
31
|
+
url: "https://dribbble.com/marcus-johnson"
|
|
32
|
+
- id: "instagram"
|
|
33
|
+
title: "Instagram"
|
|
34
|
+
url: "https://www.instagram.com/marcus-johnson"
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
Hey there, I'm Marcus!
|
|
38
|
+
|
|
39
|
+
Design has always been my way of solving problems. With a Master's in Human-Computer Interaction from Carnegie Mellon and 7 years of product design experience, I've learned that great design is invisible - it just works.
|
|
40
|
+
|
|
41
|
+
Before joining the team, I led design at a health-tech startup where I redesigned their patient portal, increasing user satisfaction by 40%. That experience taught me the power of user research and iterative design.
|
|
42
|
+
|
|
43
|
+
I'm passionate about building design systems that scale and mentoring junior designers. Outside of work, I'm an amateur street photographer and have an ever-growing collection of jazz vinyl. You might also catch me on the trails around Austin on my gravel bike.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
### ALL PAGES ###
|
|
3
|
+
layout: blueprint/team/member
|
|
4
|
+
sitemap:
|
|
5
|
+
include: true
|
|
6
|
+
|
|
7
|
+
### TEAM MEMBER PAGES ###
|
|
8
|
+
member:
|
|
9
|
+
id: priya-sharma
|
|
10
|
+
name: "Priya Sharma"
|
|
11
|
+
position: "Customer Success Manager"
|
|
12
|
+
description: "Priya ensures our customers get maximum value from our products and bridges the gap between user needs and product development."
|
|
13
|
+
location: "Chicago, IL"
|
|
14
|
+
skills:
|
|
15
|
+
- "Customer Relations"
|
|
16
|
+
- "Onboarding"
|
|
17
|
+
- "Training"
|
|
18
|
+
- "Product Feedback"
|
|
19
|
+
- "Account Management"
|
|
20
|
+
hobbies:
|
|
21
|
+
- "Yoga"
|
|
22
|
+
- "Volunteering"
|
|
23
|
+
- "Podcasts"
|
|
24
|
+
joined: 2020-05-20
|
|
25
|
+
links:
|
|
26
|
+
- id: "linkedin"
|
|
27
|
+
title: "LinkedIn"
|
|
28
|
+
url: "https://www.linkedin.com/in/priya-sharma"
|
|
29
|
+
- id: "twitter"
|
|
30
|
+
title: "Twitter"
|
|
31
|
+
url: "https://twitter.com/priya-sharma"
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
Hi there, I'm Priya!
|
|
35
|
+
|
|
36
|
+
I'm passionate about helping customers succeed. After 5 years in management consulting at Deloitte, I realized my favorite part of the job was working directly with clients to solve their problems. That's what led me to customer success.
|
|
37
|
+
|
|
38
|
+
In my role, I'm the voice of the customer within our company. I work closely with our users to understand their needs, help them get the most out of our products, and bring their feedback to our product and engineering teams.
|
|
39
|
+
|
|
40
|
+
I believe that customer success isn't just about solving problems - it's about building relationships and truly understanding what our users are trying to achieve. Every customer interaction is an opportunity to learn and improve.
|
|
41
|
+
|
|
42
|
+
When I'm not on calls with customers, I teach yoga classes at a local community center and volunteer with a nonprofit that provides tech education to underserved youth. I'm also a podcast addict - always happy to share recommendations!
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
### ALL PAGES ###
|
|
3
|
+
layout: blueprint/team/member
|
|
4
|
+
sitemap:
|
|
5
|
+
include: true
|
|
6
|
+
|
|
7
|
+
### TEAM MEMBER PAGES ###
|
|
8
|
+
member:
|
|
9
|
+
id: rare-ivy
|
|
10
|
+
name: "Rare Ivy"
|
|
11
|
+
position: "Content Creator"
|
|
12
|
+
description: "Rare is our in-house content creator, producing engaging videos, graphics, and social content that brings our brand to life."
|
|
13
|
+
location: "Brooklyn, NY"
|
|
14
|
+
skills:
|
|
15
|
+
- "Video Production"
|
|
16
|
+
- "Graphic Design"
|
|
17
|
+
- "Social Media"
|
|
18
|
+
- "Adobe Creative Suite"
|
|
19
|
+
- "Storytelling"
|
|
20
|
+
hobbies:
|
|
21
|
+
- "Film Photography"
|
|
22
|
+
- "Thrifting"
|
|
23
|
+
- "DJing"
|
|
24
|
+
joined: 2021-04-12
|
|
25
|
+
links:
|
|
26
|
+
- id: "linkedin"
|
|
27
|
+
title: "LinkedIn"
|
|
28
|
+
url: "https://www.linkedin.com/in/rare-ivy"
|
|
29
|
+
- id: "instagram"
|
|
30
|
+
title: "Instagram"
|
|
31
|
+
url: "https://www.instagram.com/rare.ivyyy"
|
|
32
|
+
- id: "tiktok"
|
|
33
|
+
title: "TikTok"
|
|
34
|
+
url: "https://www.tiktok.com/@rare.ivy"
|
|
35
|
+
- id: "youtube"
|
|
36
|
+
title: "YouTube"
|
|
37
|
+
url: "https://www.youtube.com/@rareivy"
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
Hey, I'm Rare!
|
|
41
|
+
|
|
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
|
+
|
|
44
|
+
Before going in-house, I built my own following as an independent creator, which taught me what resonates with audiences and how to stay authentic while meeting brand goals. I studied film at NYU and worked at a creative agency before joining the team.
|
|
45
|
+
|
|
46
|
+
My role spans everything creative - shooting and editing videos, designing graphics for social, writing scripts, and constantly experimenting with new formats and platforms. I believe the best content comes from genuine curiosity and a willingness to try things that might not work.
|
|
47
|
+
|
|
48
|
+
When I'm not behind a camera or in Premiere Pro, you'll find me hunting for vintage gems at Brooklyn thrift stores, shooting 35mm film around the city, or DJing at local venues. Always looking for the next creative spark!
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
### ALL PAGES ###
|
|
3
|
+
layout: blueprint/team/member
|
|
4
|
+
sitemap:
|
|
5
|
+
include: true
|
|
6
|
+
|
|
7
|
+
### TEAM MEMBER PAGES ###
|
|
8
|
+
member:
|
|
9
|
+
id: sarah-rodriguez
|
|
10
|
+
name: "Sarah Rodriguez"
|
|
11
|
+
position: "Marketing Director"
|
|
12
|
+
description: "Sarah leads our marketing efforts with a data-driven approach and creative flair."
|
|
13
|
+
location: "Miami, FL"
|
|
14
|
+
skills:
|
|
15
|
+
- "Growth Marketing"
|
|
16
|
+
- "Content Strategy"
|
|
17
|
+
- "SEO"
|
|
18
|
+
- "Analytics"
|
|
19
|
+
- "Brand Development"
|
|
20
|
+
hobbies:
|
|
21
|
+
- "Salsa Dancing"
|
|
22
|
+
- "Travel"
|
|
23
|
+
- "Creative Writing"
|
|
24
|
+
joined: 2019-09-10
|
|
25
|
+
links:
|
|
26
|
+
- id: "linkedin"
|
|
27
|
+
title: "LinkedIn"
|
|
28
|
+
url: "https://www.linkedin.com/in/sarah-rodriguez"
|
|
29
|
+
- id: "twitter"
|
|
30
|
+
title: "Twitter"
|
|
31
|
+
url: "https://twitter.com/sarah-rodriguez"
|
|
32
|
+
- id: "instagram"
|
|
33
|
+
title: "Instagram"
|
|
34
|
+
url: "https://www.instagram.com/sarahrodriguez"
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
Hola! I'm Sarah.
|
|
38
|
+
|
|
39
|
+
Marketing is storytelling backed by data, and I love both equally. With 8 years in growth marketing, I've helped startups find their voice and reach the customers who need them most.
|
|
40
|
+
|
|
41
|
+
I started my career at a digital agency in New York before catching the startup bug. Since then, I've been hooked on the energy of building something from the ground up. I joined the team to build a world-class marketing engine and tell our story to the world.
|
|
42
|
+
|
|
43
|
+
My approach combines creative brand-building with rigorous analytics. I believe every marketing dollar should be accountable, but that doesn't mean we can't have fun along the way.
|
|
44
|
+
|
|
45
|
+
When I'm not optimizing funnels or crafting campaigns, you'll find me on the dance floor - I've been doing salsa for over 10 years. I also have a goal to visit 50 countries before 40 (currently at 34!).
|
|
@@ -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
|
|
Binary file
|
|
Binary file
|
|
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
|
|