flatten new-site/ to repo root and remove old hugo site
Moves the Next.js app's contents from new-site/ to the repository root and deletes the previous Hugo site (assets/, content/, themes/, hugo.toml, etc.). Also retires the AWS Amplify config and old Netlify _redirects file — the new site deploys to Vercel. Updates STRATEGY.md path references to drop the new-site/ prefix. LICENSE preserved. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
58
.gitignore
vendored
Executable file → Normal file
@@ -1,19 +1,41 @@
|
||||
Thumbs.db
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.*
|
||||
.yarn/*
|
||||
!.yarn/patches
|
||||
!.yarn/plugins
|
||||
!.yarn/releases
|
||||
!.yarn/versions
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
.dist
|
||||
.tmp
|
||||
.lock
|
||||
.sass-cache
|
||||
npm-debug.log
|
||||
node_modules
|
||||
builds
|
||||
package-lock.json
|
||||
public
|
||||
resources
|
||||
.hugo_build.lock
|
||||
jsconfig.json
|
||||
hugo_stats.json
|
||||
go.sum
|
||||
yarn.lock
|
||||
.idea
|
||||
.vscode
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# env files (can opt-in for committing if needed)
|
||||
.env*
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
||||
59
.jshintrc
@@ -1,59 +0,0 @@
|
||||
{
|
||||
"maxerr": 50,
|
||||
"bitwise": true,
|
||||
"camelcase": false,
|
||||
"curly": true,
|
||||
"eqeqeq": true,
|
||||
"forin": true,
|
||||
"freeze": true,
|
||||
"immed": true,
|
||||
"indent": 2,
|
||||
"latedef": true,
|
||||
"newcap": false,
|
||||
"noarg": true,
|
||||
"noempty": true,
|
||||
"nonbsp": true,
|
||||
"nonew": true,
|
||||
"plusplus": false,
|
||||
"undef": true,
|
||||
"unused": false,
|
||||
"strict": true,
|
||||
"maxparams": false,
|
||||
"maxdepth": 4,
|
||||
"maxstatements": false,
|
||||
"maxcomplexity": false,
|
||||
"maxlen": 400,
|
||||
"browser": true,
|
||||
"devel": true,
|
||||
"asi": false,
|
||||
"boss": false,
|
||||
"debug": false,
|
||||
"eqnull": false,
|
||||
"es3": false,
|
||||
"es5": false,
|
||||
"esversion": 12,
|
||||
"moz": false,
|
||||
"evil": true,
|
||||
"expr": true,
|
||||
"funcscope": false,
|
||||
"globalstrict": false,
|
||||
"iterator": false,
|
||||
"lastsemic": false,
|
||||
"laxbreak": false,
|
||||
"laxcomma": false,
|
||||
"loopfunc": true,
|
||||
"multistr": true,
|
||||
"noyield": false,
|
||||
"notypeof": false,
|
||||
"proto": false,
|
||||
"scripturl": false,
|
||||
"shadow": false,
|
||||
"sub": false,
|
||||
"supernew": false,
|
||||
"validthis": false,
|
||||
"globals": {
|
||||
"jQuery": false,
|
||||
"google": false,
|
||||
"$": false
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"MD033": false,
|
||||
"MD034": false,
|
||||
"MD013": false
|
||||
}
|
||||
13
.prettierrc
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"plugins": ["prettier-plugin-go-template"],
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["*.html"],
|
||||
"options": {
|
||||
"parser": "go-template",
|
||||
"goTemplateBracketSpacing": true,
|
||||
"bracketSameLine": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -160,7 +160,7 @@ These are placeholders / wiring tasks I couldn't do without you:
|
||||
requirements — ask first.
|
||||
- **Source the assets.** Download proper SVGs from each brand's
|
||||
press kit / "About Us" media page, drop into
|
||||
`new-site/public/logos/<slug>.svg`, then update
|
||||
`public/logos/<slug>.svg`, then update
|
||||
`src/components/client-logos.tsx` to render `<img>` for entries
|
||||
with a `logo` field. Style: grayscale by default, brighten on
|
||||
hover, max-height ~32px.
|
||||
@@ -304,7 +304,7 @@ The faster you can say "no" cleanly, the easier "yes" gets.
|
||||
blog/work registries (`src/app/sitemap.ts`)
|
||||
- **`/robots.txt`** — allows everything except `/thank-you`; points at
|
||||
the sitemap (`src/app/robots.ts`)
|
||||
- **`/llms.txt`** at site root (`new-site/public/llms.txt`) — the
|
||||
- **`/llms.txt`** at site root (`public/llms.txt`) — the
|
||||
emerging convention for telling LLM crawlers what to index. Update
|
||||
this when you add or rename pages.
|
||||
- **OG metadata** — title/description templates set in root layout.
|
||||
@@ -328,12 +328,12 @@ Four are wired and visible on Home (full section) and Services
|
||||
3. One-business-day response
|
||||
4. You own everything (full IP transfer, no subcontracting)
|
||||
|
||||
Edit them in `new-site/src/components/guarantees.tsx`.
|
||||
Edit them in `src/components/guarantees.tsx`.
|
||||
|
||||
## "How I work" principles
|
||||
|
||||
Five principles render on the About page (`HowIWork` component).
|
||||
Edit in `new-site/src/components/how-i-work.tsx`.
|
||||
Edit in `src/components/how-i-work.tsx`.
|
||||
|
||||
---
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
/* /en/404.html 404
|
||||
29
amplify.yml
@@ -1,29 +0,0 @@
|
||||
version: 1
|
||||
frontend:
|
||||
phases:
|
||||
preBuild:
|
||||
commands:
|
||||
- yum install -y curl
|
||||
- curl -LO "https://github.com/gohugoio/hugo/releases/download/v0.134.3/hugo_extended_0.134.3_Linux-64bit.tar.gz"
|
||||
- tar -xvf hugo_extended_0.134.3_Linux-64bit.tar.gz
|
||||
- mv hugo /usr/local/bin/
|
||||
- rm hugo_extended_0.134.3_Linux-64bit.tar.gz
|
||||
- echo "HUGO 0.134.3 INSTALLED"
|
||||
- curl -LO "https://dl.google.com/go/go1.22.2.linux-amd64.tar.gz"
|
||||
- tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz
|
||||
- export PATH=$PATH:/usr/local/go/bin
|
||||
- rm go1.22.2.linux-amd64.tar.gz
|
||||
- echo "GO 1.22.2 INSTALLED"
|
||||
- npm install
|
||||
build:
|
||||
commands:
|
||||
- npm run project-setup
|
||||
- npm run build
|
||||
artifacts:
|
||||
# IMPORTANT - Please verify your build output directory
|
||||
baseDirectory: /public
|
||||
files:
|
||||
- "**/*"
|
||||
cache:
|
||||
paths:
|
||||
- node_modules/**/*
|
||||
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 16 KiB |
@@ -1 +0,0 @@
|
||||
// Add your own custom styles here
|
||||
@@ -1,6 +0,0 @@
|
||||
################ English language ##################
|
||||
[en]
|
||||
languageName = "En"
|
||||
languageCode = "en-us"
|
||||
contentDir = "content/english"
|
||||
weight = 1
|
||||
@@ -1,24 +0,0 @@
|
||||
############# English navigation ##############
|
||||
|
||||
# main menu
|
||||
[[main]]
|
||||
name = "Home"
|
||||
url = "/"
|
||||
weight = 1
|
||||
|
||||
[[main]]
|
||||
name = "About"
|
||||
url = "about/"
|
||||
weight = 2
|
||||
|
||||
|
||||
# footer menu
|
||||
[[footer]]
|
||||
name = "About"
|
||||
url = "about/"
|
||||
weight = 1
|
||||
|
||||
[[footer]]
|
||||
name = "Privacy Policy"
|
||||
url = "privacy-policy/"
|
||||
weight = 3
|
||||
@@ -1,87 +0,0 @@
|
||||
[hugoVersion]
|
||||
extended = true
|
||||
min = "0.134.3"
|
||||
|
||||
# [[imports]]
|
||||
# path = "github.com/zeon-studio/hugoplate"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/search"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/pwa"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/images"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/videos"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/icons/font-awesome"
|
||||
|
||||
# [[imports]]
|
||||
# path = "github.com/gethugothemes/hugo-modules/icons/themify-icons"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/gzip-caching"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/adsense"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/accordion"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/table-of-contents"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/tab"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/modal"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/gallery-slider"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/components/preloader"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/components/social-share"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/components/cookie-consent"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/components/announcement"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/components/custom-script"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/components/render-link"
|
||||
|
||||
# [[imports]]
|
||||
# path = "github.com/gethugothemes/hugo-modules/components/valine-comment"
|
||||
|
||||
# [[imports]]
|
||||
# path = "github.com/gethugothemes/hugo-modules/components/crisp-chat"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/shortcodes/button"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/shortcodes/notice"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/seo-tools/basic-seo"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/seo-tools/site-verifications"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/gethugothemes/hugo-modules/seo-tools/google-tag-manager"
|
||||
|
||||
[[imports]]
|
||||
path = "github.com/hugomods/mermaid"
|
||||
@@ -1,101 +0,0 @@
|
||||
#################### default parameters ################################
|
||||
# favicon module: https://github.com/gethugothemes/hugo-modules/tree/master/images#favicon-implementation
|
||||
favicon = "images/favicon.png"
|
||||
# logo module: https://github.com/gethugothemes/hugo-modules/tree/master/images#logo-implementation
|
||||
logo = "images/logo.png"
|
||||
logo_darkmode = "images/logo-darkmode.png"
|
||||
# use `px` or `x` with logo_width, example: "100px".
|
||||
# Note: logo_width is not work with .svg file
|
||||
logo_width = "160px"
|
||||
logo_height = "32px"
|
||||
# if logo_webp set false, will not generate WEBP version of logo | default is true
|
||||
logo_webp = true
|
||||
# logo text will only show when logo is missing.
|
||||
logo_text = "Hugoplate"
|
||||
# navbar fixed to top
|
||||
navbar_fixed = true
|
||||
# theme-mode
|
||||
theme_switcher = true
|
||||
theme_default = "system" # available options [light/dark/system]
|
||||
# Main Sections
|
||||
mainSections = ["blog"]
|
||||
# contact form action
|
||||
contact_form_action = "https://formspree.io/f/myyrgrdd" # contact form works with [https://airform.io/] or [https://formspree.io]
|
||||
# google tag manager, see https://developers.google.com/tag-manager/
|
||||
google_tag_manager = "" # example: G-XXXXXXXXXX
|
||||
google_adsense = "" # example: ca-pub-xxxxxxxxxxxxxxxx
|
||||
# custom script on header, example: custom_script= "<script>console.log(\"Hello World\")</script>"
|
||||
custom_script = ""
|
||||
# copyright
|
||||
copyright = "© 2024 Five Devs, LLC"
|
||||
|
||||
# Preloader
|
||||
# preloader module: https://github.com/gethugothemes/hugo-modules/tree/master/components/preloader
|
||||
[preloader]
|
||||
enable = false
|
||||
preloader = "" # use jpg, png, svg or gif format.
|
||||
|
||||
# Navigation button
|
||||
[navigation_button]
|
||||
enable = true
|
||||
label = "get a quote"
|
||||
link = "contact"
|
||||
|
||||
# search
|
||||
# search module: https://github.com/gethugothemes/hugo-modules/tree/master/search
|
||||
[search]
|
||||
enable = false
|
||||
primary_color = "#121212"
|
||||
include_sections = ["blog"]
|
||||
show_image = true
|
||||
show_description = true
|
||||
show_tags = true
|
||||
show_categories = true
|
||||
|
||||
|
||||
# seo meta data for OpenGraph / Twitter Card
|
||||
# seo module: https://github.com/gethugothemes/hugo-modules/tree/master/seo-tools/basic-seo
|
||||
[metadata]
|
||||
keywords = ["Boilerplate", "Hugo"]
|
||||
description = "Hugo & Tailwindcss Starter"
|
||||
author = "zeon.studio"
|
||||
image = "images/og-image.png"
|
||||
|
||||
|
||||
# site verifications
|
||||
# verification module: https://github.com/gethugothemes/hugo-modules/tree/master/seo-tools/site-verifications
|
||||
[site_verification]
|
||||
google = "" # Your verification code
|
||||
bing = "" # Your verification code
|
||||
baidu = "" # Your verification code
|
||||
facebook = "" # Your verification code
|
||||
mastodon = "" # Your verification code
|
||||
|
||||
# cookies
|
||||
# cookies module: https://github.com/gethugothemes/hugo-modules/tree/master/components/cookie-consent
|
||||
[cookies]
|
||||
enable = false
|
||||
expire_days = 60
|
||||
content = "This site uses cookies. By continuing to use this website, you agree to their use."
|
||||
button = "I Accept"
|
||||
|
||||
######################## sidebar widgets #########################
|
||||
[widgets]
|
||||
sidebar = ["categories", "tags"]
|
||||
|
||||
|
||||
# google map
|
||||
[google_map]
|
||||
enable = false
|
||||
map_api_key = "AIzaSyCcABaamniA6OL5YvYSpB3pFMNrXwXnLwU"
|
||||
map_latitude = "51.5223477"
|
||||
map_longitude = "-0.1622023"
|
||||
map_marker = "images/marker.png"
|
||||
|
||||
|
||||
# Subscription
|
||||
[subscription]
|
||||
enable = false
|
||||
# mailchimp subsciption
|
||||
mailchimp_form_action = "https://gmail.us4.list-manage.com/subscribe/post?u=463ee871f45d2d93748e77cad&id=a0a2c6d074" # replace this url with yours
|
||||
mailchimp_form_name = "b_463ee871f45d2d93748e77cad_a0a2c6d074"
|
||||
@@ -1,13 +0,0 @@
|
||||
# defaultContentLanguageInSubdir must be true for this to work.
|
||||
|
||||
# Other languages redirects
|
||||
# [[redirects]]
|
||||
# from = '/fr/**'
|
||||
# to = '/fr/404.html'
|
||||
# status = 404
|
||||
|
||||
# Default language must be last.
|
||||
[[redirects]]
|
||||
from = '/**'
|
||||
to = '/en/404.html'
|
||||
status = 404
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
# Banner
|
||||
banner:
|
||||
title: "PHP Experts Helping Small Shops or Large Fortune 500 Companies"
|
||||
content: "Five Devs specializes in software development. We fix small issues and tackle large projects to help you save valuable time."
|
||||
image: "/images/banner.png"
|
||||
button:
|
||||
enable: true
|
||||
label: "Let's Talk!"
|
||||
link: "/contact"
|
||||
|
||||
---
|
||||
@@ -1,24 +0,0 @@
|
||||
---
|
||||
title: "👋 I'm Chris!"
|
||||
meta_title: "About"
|
||||
description: "this is meta description"
|
||||
image: "/images/avatar.png"
|
||||
draft: false
|
||||
---
|
||||
|
||||
I have been doing software development **since 2010**. I started working with PHP with local businesses and joined
|
||||
multiple teams. I started **Five Devs, LLC** to help small and large businesses streamline their operations. If you have
|
||||
a project that is just at the idea stage or an existing problem on a large application - I can help!
|
||||
|
||||
### 📬 Sending a letter?
|
||||
|
||||
Prefer to do things the old fashioned way? Sure thing! Just no fax 📠
|
||||
|
||||
```php
|
||||
/**
|
||||
Five Devs, LLC
|
||||
1887 Whitney Mesa Dr. Pmb 7325
|
||||
Henderson, NV 89014
|
||||
USA
|
||||
*/
|
||||
```
|
||||
@@ -1,3 +0,0 @@
|
||||
---
|
||||
title: "Authors"
|
||||
---
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
title: "Blog Posts"
|
||||
meta_title: ""
|
||||
description: "this is meta description"
|
||||
---
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
title: "How to build an Application with modern Technology"
|
||||
meta_title: ""
|
||||
description: "this is meta description"
|
||||
date: 2022-04-04T05:00:00Z
|
||||
image: "/images/image-placeholder.png"
|
||||
categories: ["Application", "Data"]
|
||||
author: "John Doe"
|
||||
tags: ["nextjs", "tailwind"]
|
||||
draft: false
|
||||
---
|
||||
|
||||
Nemo vel ad consectetur namut rutrum ex, venenatis sollicitudin urna. Aliquam erat volutpat. Integer eu ipsum sem. Ut bibendum lacus vestibulum maximus suscipit. Quisque vitae nibh iaculis neque blandit euismod.
|
||||
|
||||
Lorem ipsum dolor sit amet consectetur adipisicing elit. Nemo vel ad consectetur ut aperiam. Itaque eligendi natus aperiam? Excepturi repellendus consequatur quibusdam optio expedita praesentium est adipisci dolorem ut eius!
|
||||
|
||||
## Creative Design
|
||||
|
||||
Nam ut rutrum ex, venenatis sollicitudin urna. Aliquam erat volutpat. Integer eu ipsum sem. Ut bibendum lacus vestibulum maximus suscipit. Quisque vitae nibh iaculis neque blandit euismod.
|
||||
|
||||
> Lorem ipsum dolor sit amet consectetur adipisicing elit. Nemo vel ad consectetur ut aperiam. Itaque eligendi natus aperiam? Excepturi repellendus consequatur quibusdam optio expedita praesentium est adipisci dolorem ut eius!
|
||||
|
||||
Lorem ipsum dolor sit amet consectetur adipisicing elit. Nemo vel ad consectetur ut aperiam. Itaque eligendi natus aperiam? Excepturi repellendus consequatur quibusdam optio expedita praesentium est adipisci dolorem ut eius!
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
title: "Contact"
|
||||
meta_title: ""
|
||||
description: "this is meta description"
|
||||
draft: false
|
||||
---
|
||||
@@ -1,42 +0,0 @@
|
||||
---
|
||||
title: "Privacy Policy"
|
||||
# meta title
|
||||
meta_title: ""
|
||||
# meta description
|
||||
description: "This is our company privacy policy"
|
||||
# save as draft
|
||||
draft: false
|
||||
---
|
||||
|
||||
|
||||
Five Devs, LLC takes your privacy seriously. To better protect your privacy we provide this privacy policy notice explaining the way your personal information is collected and used.
|
||||
|
||||
## Collection of Routine Information
|
||||
|
||||
This website track basic information about their visitors. This information includes, but is not limited to, IP addresses, browser details, timestamps and referring pages. None of this information can personally identify specific visitors to this website. The information is tracked for routine administration and maintenance purposes. We use Amazon Amplify for site hosting if you're super curious and want to check out their privacy policies.
|
||||
|
||||
## Cookies
|
||||
|
||||
We don't use cookies. They are tasty though.
|
||||
|
||||
## Advertisement and Other Third Parties
|
||||
|
||||
We don't use advertising or have third party tracking. The pages are just HTML pages rendered by Amazon Amplify when updated on GitHub.
|
||||
|
||||
## Links to Third Party Websites
|
||||
|
||||
We have included links on this website for your use and reference. We are not responsible for the privacy policies on these websites. You should be aware that the privacy policies of these websites may differ from our own.
|
||||
|
||||
## Security
|
||||
|
||||
The security of your personal information is important to us, but remember that no method of transmission over the Internet, or method of electronic storage, is 100% secure. While we strive to use commercially acceptable means to protect your personal information, we cannot guarantee its absolute security.
|
||||
|
||||
## Changes To This Privacy Policy
|
||||
|
||||
This Privacy Policy is effective as of June 27, 2024 and will remain in effect except with respect to any changes in its provisions in the future, which will be in effect immediately after being posted on this page.
|
||||
|
||||
We reserve the right to update or change our Privacy Policy at any time and you should check this Privacy Policy periodically. If we make any material changes to this Privacy Policy, we will notify you by placing a prominent notice on our website.
|
||||
|
||||
## Contact Information
|
||||
|
||||
For any questions or concerns regarding the privacy policy, please send us an email using the contact form on our website or by mailing to a letter to our address.
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
enable: true
|
||||
title: "Ready to build your next project with Hugo?"
|
||||
image: "/images/call-to-action.png"
|
||||
description: "Experience the future of web development with Hugoplate and Hugo. Build lightning-fast static sites with ease and flexibility."
|
||||
button:
|
||||
enable: true
|
||||
label: "Get Started Now"
|
||||
link: "https://github.com/zeon-studio/hugoplate"
|
||||
|
||||
# don't create a separate page
|
||||
_build:
|
||||
render: "never"
|
||||
---
|
||||
@@ -1,31 +0,0 @@
|
||||
---
|
||||
enable: true
|
||||
title: "What Others Are Saying About Five Devs"
|
||||
description: "Don't just take our word for it - hear from some of our satisfied users! Check out some of our testimonials below to see what others are saying about Hugoplate."
|
||||
|
||||
# Testimonials
|
||||
testimonials:
|
||||
- name: "Emil Boschert"
|
||||
designation: "Pritikin Foods"
|
||||
avatar: "/images/avatar-sm.png"
|
||||
content: "I have worked together with Chris and Five Devs for several years now on our shipping and order parsing process. They are vital for our e-commerce site and our 3PL."
|
||||
|
||||
- name: "Katie Allen"
|
||||
designation: "Fortune Fulfillment"
|
||||
avatar: "/images/avatar-sm.png"
|
||||
content: "I have been working with this Five Devs on multiple customer accounts for several years. Chris makes the set-up process flow so much easier!"
|
||||
|
||||
- name: "Tom Deppe"
|
||||
designation: "HD Financial"
|
||||
avatar: "/images/avatar-sm.png"
|
||||
content: "Five Devs is an integral part of my business. Their tech support keeps us up and running. Promptly returns phone calls and is a pleasure to work with."
|
||||
|
||||
- name: "Timothy Dorcas"
|
||||
designation: "Americold"
|
||||
avatar: "/images/avatar-sm.png"
|
||||
content: "I cannot say enough good things about the team at Five Devs. They are solution oriented, customer focused, and consistently deliver at a high level. Highly recommended."
|
||||
|
||||
# don't create a separate page
|
||||
_build:
|
||||
render: "never"
|
||||
---
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"main": [
|
||||
{
|
||||
"name": "twitter",
|
||||
"icon": "fab fa-x-twitter",
|
||||
"link": "https://twitter.com/cgsmith105"
|
||||
},
|
||||
{
|
||||
"name": "github",
|
||||
"icon": "fab fa-github",
|
||||
"link": "https://github.com/cgsmith/fivedevs.com"
|
||||
},
|
||||
{
|
||||
"name": "linkedin",
|
||||
"icon": "fab fa-linkedin",
|
||||
"link": "https://www.linkedin.com/in/phpguy"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
{
|
||||
"colors": {
|
||||
"default": {
|
||||
"theme_color": {
|
||||
"primary": "#121212",
|
||||
"body": "#fff",
|
||||
"border": "#eaeaea",
|
||||
"theme_light": "#f6f6f6",
|
||||
"theme_dark": ""
|
||||
},
|
||||
"text_color": {
|
||||
"default": "#444444",
|
||||
"dark": "#040404",
|
||||
"light": "#717171"
|
||||
}
|
||||
},
|
||||
"darkmode": {
|
||||
"theme_color": {
|
||||
"primary": "#fff",
|
||||
"body": "#1c1c1c",
|
||||
"border": "#3E3E3E",
|
||||
"theme_light": "#222222",
|
||||
"theme_dark": ""
|
||||
},
|
||||
"text_color": {
|
||||
"default": "#B4AFB6",
|
||||
"dark": "#fff",
|
||||
"light": "#B4AFB6"
|
||||
}
|
||||
}
|
||||
},
|
||||
"fonts": {
|
||||
"font_family": {
|
||||
"primary": "Heebo:wght@400;600",
|
||||
"primary_type": "sans-serif",
|
||||
"secondary": "Signika:wght@500;700",
|
||||
"secondary_type": "sans-serif"
|
||||
},
|
||||
"font_size": {
|
||||
"base": "16",
|
||||
"scale": "1.250"
|
||||
}
|
||||
}
|
||||
}
|
||||
31
go.mod
@@ -1,31 +0,0 @@
|
||||
module hugoplate.netlify.app
|
||||
|
||||
go 1.21
|
||||
|
||||
require (
|
||||
github.com/gethugothemes/hugo-modules/accordion v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/adsense v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/components/announcement v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/components/cookie-consent v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/components/custom-script v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/components/preloader v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/components/render-link v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/components/social-share v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/gallery-slider v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/gzip-caching v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/icons/font-awesome v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/images v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/modal v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/pwa v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/search v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/seo-tools/basic-seo v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/seo-tools/google-tag-manager v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/seo-tools/site-verifications v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/shortcodes/button v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/shortcodes/notice v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/tab v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/table-of-contents v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/gethugothemes/hugo-modules/videos v0.0.0-20240925042433-d2b5d05977e8 // indirect
|
||||
github.com/hugomods/mermaid v0.1.4 // indirect
|
||||
github.com/zeon-studio/hugoplate v0.0.0-20240925044951-fe74d0e62893 // indirect
|
||||
)
|
||||
178
hugo.toml
@@ -1,178 +0,0 @@
|
||||
######################## default configuration ####################
|
||||
# The base URL of your site (required). This will be prepended to all relative URLs.
|
||||
baseURL = "/"
|
||||
# Title of your website (required).
|
||||
title = "Five Devs"
|
||||
# Your theme name
|
||||
theme = "hugoplate"
|
||||
# Default time zone for time stamps; use any valid tz database name: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
|
||||
timeZone = "America/Chicago"
|
||||
# post excerpt
|
||||
summaryLength = 10 # see https://gohugo.io/content-management/excerpts/
|
||||
# disable language
|
||||
disableLanguages = [
|
||||
] # example: ["fr"] for disable french language. see https://gohugo.io/content-management/multilingual/
|
||||
hasCJKLanguage = false # If hasCJKLanguage true, auto-detect Chinese/Japanese/Korean Languages in the content. see: https://gohugo.io/getting-started/configuration/#hascjklanguage
|
||||
# default language
|
||||
defaultContentLanguage = 'en'
|
||||
# defaultContentLanguageInSubdir need to be true if you want to use the language code as a subdirectory and language specific 404 page
|
||||
defaultContentLanguageInSubdir = false
|
||||
|
||||
########################### Services #############################
|
||||
[services]
|
||||
[services.googleAnalytics]
|
||||
ID = 'G-MEASUREMENT_ID' # see https://gohugo.io/templates/internal/#configure-google-analytics
|
||||
|
||||
[services.disqus]
|
||||
shortname = 'themefisher-template' # we use disqus to show comments in blog posts . To install disqus please follow this tutorial https://portfolio.peter-baumgartner.net/2017/09/10/how-to-install-disqus-on-hugo/
|
||||
|
||||
########################## Permalinks ############################
|
||||
[permalinks.page]
|
||||
"pages" = "/:slugorfilename/"
|
||||
|
||||
|
||||
########################## Pagination ############################
|
||||
[pagination]
|
||||
disableAliases = false
|
||||
pagerSize = 10
|
||||
path = 'page'
|
||||
|
||||
|
||||
############################# Modules ############################
|
||||
[module]
|
||||
[[module.mounts]]
|
||||
source = "assets"
|
||||
target = "assets"
|
||||
|
||||
[[module.mounts]]
|
||||
source = "hugo_stats.json"
|
||||
target = "assets/watching/hugo_stats.json"
|
||||
|
||||
############################# Build ##############################
|
||||
[build]
|
||||
noJSConfigInAssets = false
|
||||
useResourceCacheWhen = 'fallback'
|
||||
[build.buildStats]
|
||||
enable = true
|
||||
[[build.cachebusters]]
|
||||
source = 'assets/watching/hugo_stats\.json'
|
||||
target = 'style\.css'
|
||||
[[build.cachebusters]]
|
||||
source = '(postcss|tailwind)\.config\.js'
|
||||
target = 'css'
|
||||
[[build.cachebusters]]
|
||||
source = 'assets/.*\.(js|ts|jsx|tsx)'
|
||||
target = 'js'
|
||||
[[build.cachebusters]]
|
||||
source = 'assets/.*\.(css|scss|sass)'
|
||||
target = 'css'
|
||||
[[build.cachebusters]]
|
||||
source = 'data/.*\.(.*)$'
|
||||
target = 'css'
|
||||
[[build.cachebusters]]
|
||||
source = 'assets/.*\.(.*)$'
|
||||
target = '$1'
|
||||
|
||||
|
||||
############################# Outputs ############################
|
||||
[outputs]
|
||||
home = ["HTML", "RSS", "WebAppManifest", "SearchIndex"]
|
||||
|
||||
############################# Imaging ############################
|
||||
[imaging]
|
||||
# See https://github.com/disintegration/imaging
|
||||
# Default JPEG or WebP quality setting. Default is 75.
|
||||
quality = 80
|
||||
resampleFilter = "Lanczos"
|
||||
|
||||
############################ Caches ##############################
|
||||
[caches]
|
||||
[caches.images]
|
||||
dir = ":resourceDir/_gen"
|
||||
maxAge = "720h"
|
||||
|
||||
[caches.assets]
|
||||
dir = ":resourceDir/_gen"
|
||||
maxAge = "720h"
|
||||
|
||||
|
||||
############################ Markup ##############################
|
||||
[markup]
|
||||
[markup.goldmark.renderer]
|
||||
unsafe = true
|
||||
|
||||
[markup.highlight]
|
||||
style = 'monokai' # see https://xyproto.github.io/splash/docs/all.html
|
||||
|
||||
[markup.tableOfContents]
|
||||
startLevel = 2
|
||||
endLevel = 5
|
||||
ordered = true
|
||||
|
||||
|
||||
########################### Media types ###########################
|
||||
[mediaTypes]
|
||||
[mediaTypes."application/manifest+json"]
|
||||
suffixes = ["webmanifest"]
|
||||
|
||||
|
||||
########################### Output Format ##########################
|
||||
[outputFormats]
|
||||
[outputFormats.WebAppManifest]
|
||||
mediaType = "application/manifest+json"
|
||||
rel = "manifest"
|
||||
|
||||
[outputFormats.SearchIndex]
|
||||
mediaType = "application/json"
|
||||
baseName = "searchindex"
|
||||
isPlainText = true
|
||||
notAlternative = true
|
||||
|
||||
|
||||
############################# Plugins ##############################
|
||||
|
||||
# CSS Plugins
|
||||
[[params.plugins.css]]
|
||||
link = "plugins/swiper/swiper-bundle.css"
|
||||
lazy = true
|
||||
[[params.plugins.css]]
|
||||
link = "plugins/glightbox/glightbox.css"
|
||||
lazy = true
|
||||
[[params.plugins.css]]
|
||||
link = "plugins/font-awesome/v6/brands.css"
|
||||
lazy = true
|
||||
[[params.plugins.css]]
|
||||
link = "plugins/font-awesome/v6/solid.css"
|
||||
lazy = true
|
||||
[[params.plugins.css]]
|
||||
link = "plugins/font-awesome/v6/icons.css"
|
||||
lazy = true
|
||||
|
||||
# JS Plugins
|
||||
[[params.plugins.js]]
|
||||
link = "js/search.js"
|
||||
lazy = false
|
||||
[[params.plugins.js]]
|
||||
link = "plugins/swiper/swiper-bundle.js"
|
||||
lazy = false
|
||||
[[params.plugins.js]]
|
||||
link = "plugins/cookie.js"
|
||||
lazy = false
|
||||
[[params.plugins.js]]
|
||||
link = "plugins/glightbox/glightbox.js"
|
||||
lazy = true
|
||||
[[params.plugins.js]]
|
||||
link = "js/gallery-slider.js"
|
||||
lazy = true
|
||||
[[params.plugins.js]]
|
||||
link = "js/accordion.js"
|
||||
lazy = true
|
||||
[[params.plugins.js]]
|
||||
link = "js/tab.js"
|
||||
lazy = true
|
||||
[[params.plugins.js]]
|
||||
link = "js/modal.js"
|
||||
lazy = true
|
||||
[[params.plugins.js]]
|
||||
link = "plugins/youtube-lite.js"
|
||||
lazy = true
|
||||
14
i18n/en.yaml
@@ -1,14 +0,0 @@
|
||||
home: Home
|
||||
read_more: Read More
|
||||
send: Send
|
||||
related_posts: Related Posts
|
||||
categories: Categories
|
||||
tags: Tags
|
||||
toc: Table of Contents
|
||||
share: Share
|
||||
search_input_placeholder: Search Post...
|
||||
search_no_results: No results for
|
||||
search_initial_message: Type something to search..
|
||||
search_navigate: to navigate
|
||||
search_select: to select
|
||||
search_close: to close
|
||||
@@ -1,16 +0,0 @@
|
||||
# Stripe Payment Link URLs.
|
||||
# Create each Payment Link in your Stripe Dashboard:
|
||||
# Dashboard -> Payment Links -> + New
|
||||
# Then paste the resulting URL (looks like https://buy.stripe.com/abc123)
|
||||
# into the matching variable below.
|
||||
#
|
||||
# When the website-redesign-launch sale is active (see
|
||||
# src/lib/pricing.ts), each Payment Link should be configured at the
|
||||
# sale price (50% of the regular price shown on the site). When you
|
||||
# end the sale, swap each URL to a Payment Link priced at the regular
|
||||
# amount.
|
||||
|
||||
NEXT_PUBLIC_STRIPE_RETAINER=
|
||||
NEXT_PUBLIC_STRIPE_BLOCK_5=
|
||||
NEXT_PUBLIC_STRIPE_BLOCK_10=
|
||||
NEXT_PUBLIC_STRIPE_BLOCK_20=
|
||||
41
new-site/.gitignore
vendored
@@ -1,41 +0,0 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.*
|
||||
.yarn/*
|
||||
!.yarn/patches
|
||||
!.yarn/plugins
|
||||
!.yarn/releases
|
||||
!.yarn/versions
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# env files (can opt-in for committing if needed)
|
||||
.env*
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"name": "new-site",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "eslint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@mdx-js/loader": "^3.1.1",
|
||||
"@mdx-js/react": "^3.1.1",
|
||||
"@next/mdx": "^16.2.4",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"@vercel/analytics": "^2.0.1",
|
||||
"gray-matter": "^4.0.3",
|
||||
"next": "16.2.4",
|
||||
"react": "19.2.4",
|
||||
"react-dom": "19.2.4",
|
||||
"remark-gfm": "^4.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/postcss": "^4",
|
||||
"@tailwindcss/typography": "^0.5.19",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"eslint": "^9",
|
||||
"eslint-config-next": "16.2.4",
|
||||
"tailwindcss": "^4",
|
||||
"typescript": "^5"
|
||||
}
|
||||
}
|
||||
61
package.json
@@ -1,39 +1,34 @@
|
||||
{
|
||||
"name": "hugoplate",
|
||||
"description": "hugo tailwindcss boilerplate",
|
||||
"version": "1.17.0",
|
||||
"license": "MIT",
|
||||
"author": "zeon.studio",
|
||||
"name": "new-site",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "hugo server",
|
||||
"build": "hugo --gc --minify --templateMetrics --templateMetricsHints --forceSyncStatic",
|
||||
"preview": "hugo server --disableFastRender --navigateToChanged --templateMetrics --templateMetricsHints --watch --forceSyncStatic -e production --minify",
|
||||
"dev:example": "cd exampleSite && hugo server",
|
||||
"build:example": "cd exampleSite && hugo --gc --minify --templateMetrics --templateMetricsHints --forceSyncStatic",
|
||||
"preview:example": "cd exampleSite && hugo server --disableFastRender --navigateToChanged --templateMetrics --templateMetricsHints --watch --forceSyncStatic -e production --minify",
|
||||
"update-modules": "node ./scripts/clearModules.js && hugo mod clean --all && hugo mod get -u ./... && hugo mod tidy",
|
||||
"remove-darkmode": "node ./scripts/removeDarkmode.js && yarn format",
|
||||
"project-setup": "node ./scripts/projectSetup.js",
|
||||
"theme-setup": "node ./scripts/themeSetup.js",
|
||||
"update-theme": "node ./scripts/themeUpdate.js",
|
||||
"format": "prettier -w ."
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "eslint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@mdx-js/loader": "^3.1.1",
|
||||
"@mdx-js/react": "^3.1.1",
|
||||
"@next/mdx": "^16.2.4",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"@vercel/analytics": "^2.0.1",
|
||||
"gray-matter": "^4.0.3",
|
||||
"next": "16.2.4",
|
||||
"react": "19.2.4",
|
||||
"react-dom": "19.2.4",
|
||||
"remark-gfm": "^4.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/forms": "^0.5.9",
|
||||
"@tailwindcss/typography": "^0.5.15",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"postcss": "^8.4.47",
|
||||
"postcss-cli": "^11.0.0",
|
||||
"prettier": "^3.3.3",
|
||||
"prettier-plugin-go-template": "0.0.15",
|
||||
"prettier-plugin-tailwindcss": "^0.6.8",
|
||||
"tailwind-bootstrap-grid": "^5.1.0",
|
||||
"tailwindcss": "^3.4.13"
|
||||
},
|
||||
"postcss": {
|
||||
"plugins": {
|
||||
"tailwindcss": {},
|
||||
"autoprefixer": {}
|
||||
}
|
||||
"@tailwindcss/postcss": "^4",
|
||||
"@tailwindcss/typography": "^0.5.19",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"eslint": "^9",
|
||||
"eslint-config-next": "16.2.4",
|
||||
"tailwindcss": "^4",
|
||||
"typescript": "^5"
|
||||
}
|
||||
}
|
||||
|
||||
0
new-site/pnpm-lock.yaml → pnpm-lock.yaml
generated
@@ -1,44 +0,0 @@
|
||||
const purgecss = {
|
||||
content: ["./hugo_stats.json"],
|
||||
defaultExtractor: (content) => {
|
||||
const elements = JSON.parse(content).htmlElements;
|
||||
return [
|
||||
...(elements.tags || []),
|
||||
...(elements.classes || []),
|
||||
...(elements.ids || []),
|
||||
];
|
||||
},
|
||||
safelist: [
|
||||
/^swiper-/,
|
||||
/^lb-/,
|
||||
/^gl/,
|
||||
/^go/,
|
||||
/^gc/,
|
||||
/^gs/,
|
||||
/^gi/,
|
||||
/^gz/,
|
||||
/^gprev/,
|
||||
/^gnext/,
|
||||
/^desc/,
|
||||
/^zoom/,
|
||||
/^search/,
|
||||
/^:is/,
|
||||
/dark/,
|
||||
/show/,
|
||||
/dragging/,
|
||||
/fullscreen/,
|
||||
/loaded/,
|
||||
/visible/,
|
||||
/current/,
|
||||
/active/,
|
||||
],
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
"@fullhuman/postcss-purgecss":
|
||||
process.env.HUGO_ENVIRONMENT === "production" ? purgecss : false,
|
||||
autoprefixer: process.env.HUGO_ENVIRONMENT === "production" ? {} : false,
|
||||
},
|
||||
};
|
||||
34
public/llms.txt
Normal file
@@ -0,0 +1,34 @@
|
||||
# Five Devs
|
||||
|
||||
> Senior PHP help for the unglamorous, mission-critical glue between your store, your warehouse, and your books. Fifteen years of e-commerce and 3PL/logistics integration work.
|
||||
|
||||
Five Devs is the freelance PHP practice of Chris Smith, operating as Five Devs, LLC out of Henderson, Nevada. Engagements are structured as monthly retainers, time blocks (5/10/20 hours), or fixed-price project sprints, primarily for companies running e-commerce, third-party logistics (3PL), or operational tooling on PHP-based stacks.
|
||||
|
||||
Long-term clients have included Pritikin Foods, Americold, Fortune Fulfillment, HD Financial, Butcher Box, Perfect Bar, Vanderose Farms, Potawatomi Business Development, and PERC Engage.
|
||||
|
||||
## Pages
|
||||
|
||||
- [Home](https://fivedevs.com/): Service overview and positioning
|
||||
- [About](https://fivedevs.com/about): Background, principles, and how Chris works
|
||||
- [Services](https://fivedevs.com/services): Engagement options, pricing, and self-serve checkout
|
||||
- [Work](https://fivedevs.com/work): Selected client engagements and case studies
|
||||
- [Contact](https://fivedevs.com/contact): Book an intro call or send a message
|
||||
|
||||
## Writing
|
||||
|
||||
- [Why I take 'glue work' seriously (and you should too)](https://fivedevs.com/blog/the-glue-job): On the integration code that quietly keeps small businesses shipping
|
||||
- [How to hire a senior PHP developer (without getting burned)](https://fivedevs.com/blog/how-to-hire-a-php-dev): Practical buyer's guide for non-technical founders
|
||||
- [A pre-launch checklist for connecting your store to a 3PL](https://fivedevs.com/blog/three-pl-integration-checklist): Twelve things to verify before flipping the switch on a new fulfillment integration
|
||||
|
||||
## Case studies
|
||||
|
||||
- [Pritikin Foods](https://fivedevs.com/work/pritikin-foods): Multi-year e-commerce + 3PL shipping and order parsing pipeline
|
||||
- [Americold](https://fivedevs.com/work/americold): Senior PHP work on customer-facing logistics tooling for one of the largest cold-chain warehousing networks in the US
|
||||
|
||||
## Contact
|
||||
|
||||
- Email: chris@fivedevs.com
|
||||
- LinkedIn: https://www.linkedin.com/in/phpguy
|
||||
- GitHub: https://github.com/cgsmith
|
||||
- Twitter / X: https://twitter.com/cgsmith105
|
||||
- Languages: English, German
|
||||
239
readme.md
@@ -1,239 +0,0 @@
|
||||
<h1 align="center">Hugo + Tailwind CSS Starter and Boilerplate</h1>
|
||||
|
||||
<p align="center">Hugoplate is a free starter template built with Hugo, and TailwindCSS, providing everything you need to jumpstart your Hugo project and save valuable time.</p>
|
||||
|
||||
<p align="center">Made with ♥ by <a href="https://zeon.studio/"> Zeon Studio</a></p>
|
||||
<p align=center> If you find this project useful, please give it a ⭐ to show your support.</p>
|
||||
|
||||
<h2 align="center"> <a target="_blank" href="https://zeon.studio/preview?project=hugoplate" rel="nofollow">👀 Demo</a> | <a target="_blank" href="https://pagespeed.web.dev/analysis/https-hugoplate-netlify-app/6lyxjw6t4r?form_factor=desktop">Page Speed (95+)🚀</a>
|
||||
</h2>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/gohugoio/hugo/releases/tag/v0.126.0" alt="Contributors">
|
||||
<img src="https://img.shields.io/static/v1?label=min-HUGO-version&message=0.126.0&color=f00&logo=hugo" />
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/zeon-studio/hugoplate/blob/main/LICENSE">
|
||||
<img src="https://img.shields.io/github/license/zeon-studio/hugoplate" alt="license">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/zeon-studio/hugoplate">
|
||||
<img src="https://img.shields.io/github/languages/code-size/zeon-studio/hugoplate" alt="code size">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/zeon-studio/hugoplate/graphs/contributors">
|
||||
<img src="https://img.shields.io/github/contributors/zeon-studio/hugoplate" alt="contributors">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## 🎁 What's Included
|
||||
|
||||
We have included almost everything you need to start your Hugo project. Let's see what's included in this template:
|
||||
|
||||
### 📌 Key Features
|
||||
|
||||
- 👥 Multi-Authors
|
||||
- 🎯 Similar Posts Suggestion
|
||||
- 🔍 Search Functionality
|
||||
- 🌑 Dark Mode
|
||||
- 🏷️ Tags & Categories
|
||||
- 🔗 Netlify setting pre-configured
|
||||
- 📞 Support contact form
|
||||
- 📱 Fully responsive
|
||||
- 📝 Write and update content in Markdown
|
||||
- 💬 Disqus Comment
|
||||
- 🔳 Syntax Highlighting
|
||||
|
||||
### 📄 15+ Pre-designed Pages
|
||||
|
||||
- 🏠 Homepage
|
||||
- 👤 About
|
||||
- 📞 Contact
|
||||
- 👥 Authors
|
||||
- 👤 Author Single
|
||||
- 📝 Blog
|
||||
- 📝 Blog Single
|
||||
- 🚫 Custom 404
|
||||
- 💡 Elements
|
||||
- 📄 Privacy Policy
|
||||
- 🏷️ Tags
|
||||
- 🏷️ Tag Single
|
||||
- 🗂️ Categories
|
||||
- 🗂️ Category Single
|
||||
- 🔍 Search
|
||||
|
||||
### 📦 Tech Stack
|
||||
|
||||
- [Hugo](https://gohugo.io/)
|
||||
- [Tailwind CSS](https://tailwindcss.com/)
|
||||
- [PostCSS](https://postcss.org/)
|
||||
- [PurgeCSS](https://purgecss.com/)
|
||||
- [AutoPrefixer](https://autoprefixer.github.io/)
|
||||
- [Hugo Modules](https://gohugo.io/hugo-modules/) by [Gethugothemes](https://gethugothemes.com/hugo-modules)
|
||||
- [Markdown](https://markdownguide.org/)
|
||||
- [Prettier](https://prettier.io/)
|
||||
- [Jshint](https://jshint.com/)
|
||||
- [Netlify](https://www.netlify.com/)
|
||||
- [Vercel](https://vercel.com/)
|
||||
- [Github Actions](https://github.com/features/actions)
|
||||
- [Gitlab Ci](https://docs.gitlab.com/ee/ci/)
|
||||
- [AWS Amplify](https://aws.amazon.com/amplify/)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Getting Started
|
||||
|
||||
First you need to [clone](https://github.com/zeon-studio/hugoplate) or [download](https://github.com/zeon-studio/hugoplate/archive/refs/heads/main.zip) the template repository, and then let's get started with the following process:
|
||||
|
||||
### ⚙️ Prerequisites
|
||||
|
||||
To start using this template, you need to have some prerequisites installed on your machine.
|
||||
|
||||
- [Hugo Extended v0.124+](https://gohugo.io/installation/)
|
||||
- [Node v20+](https://nodejs.org/en/download/)
|
||||
- [Go v1.22+](https://go.dev/doc/install)
|
||||
|
||||
### 👉 Project Setup
|
||||
|
||||
We build this custom script to make your project setup easier. It will create a new Hugo theme folder, and clone the Hugoplate theme into it. Then move the exampleSite folder into the root directory. So that you can start your Hugo server without going into the exampleSite folder. Use the following command to setup your project.
|
||||
|
||||
```bash
|
||||
npm run project-setup
|
||||
```
|
||||
|
||||
### 👉 Install Dependencies
|
||||
|
||||
Install all the dependencies using the following command.
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
### 👉 Development Command
|
||||
|
||||
Start the development server using the following command.
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 🎬 Still Confused? Watch a Quick Video
|
||||
|
||||
https://github.com/zeon-studio/hugoplate/assets/58769763/c260c0ae-91be-42ce-b8db-aa7f11f777bd
|
||||
|
||||
---
|
||||
|
||||
## 📝 Customization
|
||||
|
||||
This template has been designed with a lot of customization options in mind. You can customize almost anything you want, including:
|
||||
|
||||
### 👉 Site Config
|
||||
|
||||
You can change the site title, base URL, language, theme, plugins, and more from the `hugo.toml` file.
|
||||
|
||||
### 👉 Site Params
|
||||
|
||||
You can customize all the parameters from the `config/_default/params.toml` file. This includes the logo, favicon, search, SEO metadata, and more.
|
||||
|
||||
### 👉 Colors and Fonts
|
||||
|
||||
You can change the colors and fonts from the `data/theme.json` file. This includes the primary color, secondary color, font family, and font size.
|
||||
|
||||
### 👉 Social Links
|
||||
|
||||
You can change the social links from the `data/social.json` file. Add your social links here, and they will automatically be displayed on the site.
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Advanced Usage
|
||||
|
||||
We have added some custom scripts to make your life easier. You can use these scripts to help you with your development.
|
||||
|
||||
### 👉 Update Theme
|
||||
|
||||
If you want to update the theme, then you can use the following command. It will update the theme to the latest version.
|
||||
|
||||
```bash
|
||||
npm run update-theme
|
||||
```
|
||||
|
||||
> **Note:** This command will work after running `project-setup` script.
|
||||
|
||||
### 👉 Update Modules
|
||||
|
||||
We have added a lot of modules to this template. You can update all the modules using the following command.
|
||||
|
||||
```bash
|
||||
npm run update-modules
|
||||
```
|
||||
|
||||
### 👉 Remove Dark Mode
|
||||
|
||||
If you want to remove dark mode from your project, you can use the following command to remove dark mode from your project.
|
||||
|
||||
```bash
|
||||
npm run remove-darkmode
|
||||
```
|
||||
|
||||
> **Note:** This command will work before running `project-setup` script. If you already run the `project-setup` command, then you have to run `npm run theme-setup` first, and then you can run this command. afterward, you can run `npm run project-setup` again.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Build And Deploy
|
||||
|
||||
After you finish your development, you can build or deploy your project almost everywhere. Let's see the process:
|
||||
|
||||
### 👉 Build Command
|
||||
|
||||
To build your project locally, you can use the following command. It will purge all the unused CSS and minify all the files.
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
### 👉 Deploy Site
|
||||
|
||||
We have provided 5 different deploy platform configurations with this template, so you can deploy easily.
|
||||
|
||||
- [Netlify](https://www.netlify.com/)
|
||||
- [Vercel](https://vercel.com/)
|
||||
- [Github Actions](https://github.com/features/actions)
|
||||
- [Gitlab Ci](https://docs.gitlab.com/ee/ci/)
|
||||
- [AWS Amplify](https://aws.amazon.com/amplify/)
|
||||
|
||||
And if you want to Host some other hosting platforms. then you can build your project, and you will get a `public` folder. that you can copy and paste on your hosting platform.
|
||||
|
||||
> **Note:** You must change the `baseURL` in the `hugo.toml` file. Otherwise, your site will not work properly.
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Guide to Staying Compliant
|
||||
|
||||
### 🐞 Reporting Issues
|
||||
|
||||
We use GitHub Issues as the official bug tracker for this Template. Please Search [existing issues](https://github.com/zeon-studio/hugoplate/issues). It’s possible someone has already reported the same problem.
|
||||
If your problem or idea has not been addressed yet, feel free to [open a new issue](https://github.com/zeon-studio/hugoplate/issues).
|
||||
|
||||
### 📝 License
|
||||
|
||||
Copyright (c) 2023 - Present, Designed & Developed by [Zeon Studio](https://zeon.studio/)
|
||||
|
||||
**Code License:** Released under the [MIT](https://github.com/zeon-studio/hugoplate/blob/main/LICENSE) license.
|
||||
|
||||
**Image license:** The images are only for demonstration purposes. They have their license, we don't have permission to share those images.
|
||||
|
||||
---
|
||||
|
||||
## 🖼️ Showcase
|
||||
|
||||
List of some projects people are building with **Hugoplate**!
|
||||
|
||||
| [](https://open-neuromorphic.org/) | [](https://aimodels.org/) | [](https://www.hugobricks.preview.usecue.com/) | [](https://ono.day/)
|
||||
|:---:|:---:|:---:|:---:|
|
||||
| **Open Neuromorphic** | **AI Models** | **Hugobricks** | **ONO LLC** |
|
||||
|
||||
---
|
||||
|
||||
## 💻 Need Customization?
|
||||
|
||||
If you need a custom theme, theme customization, or complete website development services from scratch you can [Hire Us](https://zeon.studio/estimate-project).
|
||||
@@ -1,14 +0,0 @@
|
||||
const fs = require("fs");
|
||||
|
||||
const clearModules = (filePath) => {
|
||||
if (fs.existsSync(filePath)) {
|
||||
let fileContent = fs.readFileSync(filePath, "utf8");
|
||||
fileContent = fileContent.replace(/require\s*\([\s\S]*?\)/, "");
|
||||
fs.writeFileSync(filePath, fileContent, "utf8");
|
||||
} else {
|
||||
console.log("File does not exist.");
|
||||
}
|
||||
};
|
||||
|
||||
clearModules("go.mod");
|
||||
clearModules("exampleSite/go.mod");
|
||||
@@ -1,116 +0,0 @@
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const toggleComment = ({ filepath, regex }) => {
|
||||
let updatedContent = fs.readFileSync(filepath, "utf8");
|
||||
const match = updatedContent.match(regex);
|
||||
|
||||
if (match) {
|
||||
const matchedContent = match[0];
|
||||
const hasComment = matchedContent.startsWith("# ");
|
||||
if (hasComment) {
|
||||
updatedContent = updatedContent.replace(
|
||||
regex,
|
||||
matchedContent.replace("# ", ""),
|
||||
);
|
||||
fs.writeFileSync(filepath, updatedContent, "utf8");
|
||||
} else {
|
||||
const hasBreakline = matchedContent.includes("\n");
|
||||
if (hasBreakline) {
|
||||
const content = matchedContent
|
||||
.split("\n")
|
||||
.map((line) => "# " + line)
|
||||
.join("\n");
|
||||
updatedContent = updatedContent.replace(regex, content);
|
||||
fs.writeFileSync(filepath, updatedContent, "utf8");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const getFolderName = (rootfolder) => {
|
||||
const configPath = path.join(rootfolder, "exampleSite/hugo.toml");
|
||||
const getConfig = fs.readFileSync(configPath, "utf8");
|
||||
const match = getConfig.match(/theme\s*=\s*\[?"([^"\]]+)"\]?/);
|
||||
let selectedTheme = null;
|
||||
if (match && match[1]) {
|
||||
selectedTheme = match[1];
|
||||
}
|
||||
return selectedTheme;
|
||||
};
|
||||
|
||||
const deleteFolder = (folderPath) => {
|
||||
if (fs.existsSync(folderPath)) {
|
||||
fs.rmSync(folderPath, { recursive: true, force: true });
|
||||
}
|
||||
};
|
||||
|
||||
const createNewfolder = (rootfolder, folderName) => {
|
||||
const newFolder = path.join(rootfolder, folderName);
|
||||
fs.mkdirSync(newFolder, { recursive: true });
|
||||
return newFolder;
|
||||
};
|
||||
|
||||
const iterateFilesAndFolders = (rootFolder, { destinationRoot }) => {
|
||||
const directory = path.join(rootFolder);
|
||||
const items = fs.readdirSync(directory, { withFileTypes: true });
|
||||
items.forEach((item) => {
|
||||
if (item.isDirectory()) {
|
||||
createNewfolder(destinationRoot, item.name);
|
||||
iterateFilesAndFolders(path.join(directory, item.name), {
|
||||
currentFolder: item.name,
|
||||
destinationRoot: path.join(destinationRoot, item.name),
|
||||
});
|
||||
} else {
|
||||
const sourceFile = path.join(directory, item.name);
|
||||
const destinationFile = path.join(destinationRoot, item.name);
|
||||
fs.renameSync(sourceFile, destinationFile);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const setupProject = () => {
|
||||
const rootfolder = path.join(__dirname, "../");
|
||||
if (!fs.existsSync(path.join(rootfolder, "themes"))) {
|
||||
// remove this part if you don't using theme demo as a module
|
||||
[
|
||||
{
|
||||
filepath: path.join(rootfolder, "exampleSite/hugo.toml"),
|
||||
regex: /^.*theme\s*=\s*("[^"\]]+"|\S+)/m,
|
||||
},
|
||||
{
|
||||
filepath: path.join(
|
||||
rootfolder,
|
||||
"exampleSite/config/_default/module.toml",
|
||||
),
|
||||
regex: /\[\[imports\]\]\s*\r?\npath = "([^"]+)"/,
|
||||
},
|
||||
].forEach(toggleComment);
|
||||
|
||||
const folderList = ["layouts", "assets", "static"];
|
||||
const folderName = getFolderName(rootfolder);
|
||||
const newfolderName = createNewfolder(
|
||||
path.join(rootfolder, "themes"),
|
||||
folderName,
|
||||
);
|
||||
|
||||
folderList.forEach((folder) => {
|
||||
const source = path.join(rootfolder, folder);
|
||||
const destination = path.join(newfolderName, folder);
|
||||
if (fs.existsSync(source)) {
|
||||
fs.mkdirSync(destination, { recursive: true });
|
||||
iterateFilesAndFolders(source, {
|
||||
currentFolder: folder,
|
||||
destinationRoot: destination,
|
||||
});
|
||||
deleteFolder(source);
|
||||
}
|
||||
});
|
||||
|
||||
const exampleSite = path.join(rootfolder, "exampleSite");
|
||||
iterateFilesAndFolders(exampleSite, { destinationRoot: rootfolder });
|
||||
deleteFolder(exampleSite);
|
||||
}
|
||||
};
|
||||
|
||||
setupProject();
|
||||
@@ -1,69 +0,0 @@
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const rootDirs = ["assets/scss", "layouts"];
|
||||
const configFiles = [
|
||||
{
|
||||
filePath: "exampleSite/tailwind.config.js",
|
||||
patterns: ["darkmode:\\s*{[^}]*},", 'darkMode:\\s*"class",'],
|
||||
},
|
||||
{
|
||||
filePath: "exampleSite/data/theme.json",
|
||||
patterns: ["colors.darkmode"],
|
||||
},
|
||||
];
|
||||
|
||||
rootDirs.forEach(removeDarkModeFromPages);
|
||||
configFiles.forEach(removeDarkMode);
|
||||
|
||||
function removeDarkModeFromFiles(filePath, regexPatterns) {
|
||||
const fileContent = fs.readFileSync(filePath, "utf8");
|
||||
let updatedContent = fileContent;
|
||||
regexPatterns.forEach((pattern) => {
|
||||
const regex = new RegExp(pattern, "g");
|
||||
updatedContent = updatedContent.replace(regex, "");
|
||||
});
|
||||
fs.writeFileSync(filePath, updatedContent, "utf8");
|
||||
}
|
||||
|
||||
function removeDarkModeFromPages(directoryPath) {
|
||||
const files = fs.readdirSync(directoryPath);
|
||||
|
||||
files.forEach((file) => {
|
||||
const filePath = path.join(directoryPath, file);
|
||||
const stats = fs.statSync(filePath);
|
||||
if (stats.isDirectory()) {
|
||||
removeDarkModeFromPages(filePath);
|
||||
} else if (stats.isFile()) {
|
||||
removeDarkModeFromFiles(filePath, [
|
||||
'(?:(?!["])\\S)*dark:(?:(?![,;"])\\S)*',
|
||||
"@apply?(\\s)*;",
|
||||
]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function removeDarkMode(configFile) {
|
||||
const { filePath, patterns } = configFile;
|
||||
if (filePath === "exampleSite/tailwind.config.js") {
|
||||
removeDarkModeFromFiles(filePath, patterns);
|
||||
} else {
|
||||
const contentFile = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
||||
patterns.forEach((pattern) => deleteNestedProperty(contentFile, pattern));
|
||||
fs.writeFileSync(filePath, JSON.stringify(contentFile));
|
||||
}
|
||||
}
|
||||
|
||||
function deleteNestedProperty(obj, propertyPath) {
|
||||
const properties = propertyPath.split(".");
|
||||
let currentObj = obj;
|
||||
for (let i = 0; i < properties.length - 1; i++) {
|
||||
const property = properties[i];
|
||||
if (currentObj.hasOwnProperty(property)) {
|
||||
currentObj = currentObj[property];
|
||||
} else {
|
||||
return; // Property not found, no need to continue
|
||||
}
|
||||
}
|
||||
delete currentObj[properties[properties.length - 1]];
|
||||
}
|
||||
@@ -1,125 +0,0 @@
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const toggleComment = ({ filepath, regex }) => {
|
||||
let updatedContent = fs.readFileSync(filepath, "utf8");
|
||||
const match = updatedContent.match(regex);
|
||||
|
||||
if (match) {
|
||||
const matchedContent = match[0];
|
||||
const hasComment = matchedContent.startsWith("# ");
|
||||
if (hasComment) {
|
||||
const hasBreakline = matchedContent.includes("\n");
|
||||
if (hasBreakline) {
|
||||
updatedContent = updatedContent.replace(
|
||||
regex,
|
||||
matchedContent.replace(/# /gm, ""),
|
||||
);
|
||||
fs.writeFileSync(filepath, updatedContent, "utf8");
|
||||
}
|
||||
} else {
|
||||
updatedContent = updatedContent.replace(regex, "# " + matchedContent);
|
||||
fs.writeFileSync(filepath, updatedContent, "utf8");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const createNewfolder = (rootfolder, folderName) => {
|
||||
const newFolder = path.join(rootfolder, folderName);
|
||||
fs.mkdirSync(newFolder, { recursive: true });
|
||||
return newFolder;
|
||||
};
|
||||
|
||||
const deleteFolder = (folderPath) => {
|
||||
if (fs.existsSync(folderPath)) {
|
||||
fs.rmSync(folderPath, { recursive: true, force: true });
|
||||
}
|
||||
};
|
||||
|
||||
const getFolderName = (rootfolder) => {
|
||||
const configPath = path.join(rootfolder, "exampleSite/hugo.toml");
|
||||
const getConfig = fs.readFileSync(configPath, "utf8");
|
||||
const match = getConfig.match(/theme\s*=\s*\[?"([^"\]]+)"\]?/);
|
||||
let selectedTheme = null;
|
||||
if (match && match[1]) {
|
||||
selectedTheme = match[1];
|
||||
}
|
||||
return selectedTheme;
|
||||
};
|
||||
|
||||
const iterateFilesAndFolders = (rootFolder, { destinationRoot }) => {
|
||||
const directory = path.join(rootFolder);
|
||||
const items = fs.readdirSync(directory, { withFileTypes: true });
|
||||
items.forEach((item) => {
|
||||
if (item.isDirectory()) {
|
||||
createNewfolder(destinationRoot, item.name);
|
||||
iterateFilesAndFolders(path.join(directory, item.name), {
|
||||
currentFolder: item.name,
|
||||
destinationRoot: path.join(destinationRoot, item.name),
|
||||
});
|
||||
} else {
|
||||
const sourceFile = path.join(directory, item.name);
|
||||
const destinationFile = path.join(destinationRoot, item.name);
|
||||
fs.renameSync(sourceFile, destinationFile);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const setupTheme = () => {
|
||||
const rootFolder = path.join(__dirname, "../");
|
||||
|
||||
if (!fs.existsSync(path.join(rootFolder, "exampleSite"))) {
|
||||
// remove this part if you don't using theme demo as a module
|
||||
[
|
||||
{
|
||||
filepath: path.join(rootFolder, "config/_default/module.toml"),
|
||||
regex: /# \[\[imports\]\]\s*\r?\n# path = "([^"]+)"/,
|
||||
},
|
||||
{
|
||||
filepath: path.join(rootFolder, "hugo.toml"),
|
||||
regex: /^.*theme\s*=\s*("[^"\]]+"|\S+)/m,
|
||||
},
|
||||
].forEach(toggleComment);
|
||||
|
||||
const includesFiles = [
|
||||
"tailwind.config.js",
|
||||
"postcss.config.js",
|
||||
"go.mod",
|
||||
"hugo.toml",
|
||||
"assets",
|
||||
"config",
|
||||
"data",
|
||||
"content",
|
||||
"i18n",
|
||||
"static",
|
||||
];
|
||||
|
||||
const folder = createNewfolder(rootFolder, "exampleSite");
|
||||
|
||||
fs.readdirSync(rootFolder, { withFileTypes: true }).forEach((file) => {
|
||||
if (includesFiles.includes(file.name)) {
|
||||
if (file.isDirectory()) {
|
||||
const destination = path.join(rootFolder, "exampleSite", file.name);
|
||||
fs.mkdirSync(destination, { recursive: true });
|
||||
iterateFilesAndFolders(path.join(rootFolder, file.name), {
|
||||
destinationRoot: destination,
|
||||
});
|
||||
deleteFolder(path.join(rootFolder, file.name));
|
||||
} else {
|
||||
fs.renameSync(
|
||||
path.join(rootFolder, file.name),
|
||||
path.join(folder, file.name),
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const themes = path.join(rootFolder, "themes");
|
||||
iterateFilesAndFolders(path.join(themes, getFolderName(rootFolder)), {
|
||||
destinationRoot: rootFolder,
|
||||
});
|
||||
deleteFolder(themes);
|
||||
}
|
||||
};
|
||||
|
||||
setupTheme();
|
||||
@@ -1,19 +0,0 @@
|
||||
const { exec } = require("child_process");
|
||||
|
||||
const repositoryUrl = "https://github.com/zeon-studio/hugoplate";
|
||||
const localDirectory = "./themes/hugoplate";
|
||||
const foldersToFetch = ["assets", "layouts"];
|
||||
const foldersToSkip = ["exampleSite"];
|
||||
|
||||
const fetchFolder = (folder) => {
|
||||
exec(
|
||||
`curl -L ${repositoryUrl}/tarball/main | tar -xz --strip-components=1 --directory=${localDirectory} --exclude=$(curl -sL ${repositoryUrl}/tarball/main | tar -tz | grep -E "/(${foldersToSkip.join(
|
||||
"|",
|
||||
)})/") */${folder}`,
|
||||
);
|
||||
};
|
||||
|
||||
// Fetch each specified folder
|
||||
foldersToFetch.forEach((folder) => {
|
||||
fetchFolder(folder);
|
||||
});
|
||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
@@ -1,103 +0,0 @@
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const themePath = path.join(__dirname, "data/theme.json");
|
||||
const themeRead = fs.readFileSync(themePath, "utf8");
|
||||
const theme = JSON.parse(themeRead);
|
||||
|
||||
let font_base = Number(theme.fonts.font_size.base.replace("px", ""));
|
||||
let font_scale = Number(theme.fonts.font_size.scale);
|
||||
let h6 = font_scale;
|
||||
let h5 = h6 * font_scale;
|
||||
let h4 = h5 * font_scale;
|
||||
let h3 = h4 * font_scale;
|
||||
let h2 = h3 * font_scale;
|
||||
let h1 = h2 * font_scale;
|
||||
let fontPrimary, fontPrimaryType, fontSecondary, fontSecondaryType;
|
||||
if (theme.fonts.font_family.primary) {
|
||||
fontPrimary = theme.fonts.font_family.primary
|
||||
.replace(/\+/g, " ")
|
||||
.replace(/:[ital,]*[ital@]*[wght@]*[0-9,;.]+/gi, "");
|
||||
fontPrimaryType = theme.fonts.font_family.primary_type;
|
||||
}
|
||||
if (theme.fonts.font_family.secondary) {
|
||||
fontSecondary = theme.fonts.font_family.secondary
|
||||
.replace(/\+/g, " ")
|
||||
.replace(/:[ital,]*[ital@]*[wght@]*[0-9,;.]+/gi, "");
|
||||
fontSecondaryType = theme.fonts.font_family.secondary_type;
|
||||
}
|
||||
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: ["./hugo_stats.json"],
|
||||
safelist: [{ pattern: /^swiper-/ }],
|
||||
darkMode: "class",
|
||||
theme: {
|
||||
screens: {
|
||||
sm: "540px",
|
||||
md: "768px",
|
||||
lg: "1024px",
|
||||
xl: "1280px",
|
||||
"2xl": "1536px",
|
||||
},
|
||||
container: {
|
||||
center: true,
|
||||
padding: "2rem",
|
||||
},
|
||||
extend: {
|
||||
colors: {
|
||||
text: theme.colors.default.text_color.default,
|
||||
light: theme.colors.default.text_color.light,
|
||||
dark: theme.colors.default.text_color.dark,
|
||||
primary: theme.colors.default.theme_color.primary,
|
||||
secondary: theme.colors.default.theme_color.secondary,
|
||||
body: theme.colors.default.theme_color.body,
|
||||
border: theme.colors.default.theme_color.border,
|
||||
"theme-light": theme.colors.default.theme_color.theme_light,
|
||||
"theme-dark": theme.colors.default.theme_color.theme_dark,
|
||||
darkmode: {
|
||||
text: theme.colors.darkmode.text_color.default,
|
||||
light: theme.colors.darkmode.text_color.light,
|
||||
dark: theme.colors.darkmode.text_color.dark,
|
||||
primary: theme.colors.darkmode.theme_color.primary,
|
||||
secondary: theme.colors.darkmode.theme_color.secondary,
|
||||
body: theme.colors.darkmode.theme_color.body,
|
||||
border: theme.colors.darkmode.theme_color.border,
|
||||
"theme-light": theme.colors.darkmode.theme_color.theme_light,
|
||||
"theme-dark": theme.colors.darkmode.theme_color.theme_dark,
|
||||
},
|
||||
},
|
||||
fontSize: {
|
||||
base: font_base + "px",
|
||||
"base-sm": font_base * 0.8 + "px",
|
||||
h1: h1 + "rem",
|
||||
"h1-sm": h1 * 0.9 + "rem",
|
||||
h2: h2 + "rem",
|
||||
"h2-sm": h2 * 0.9 + "rem",
|
||||
h3: h3 + "rem",
|
||||
"h3-sm": h3 * 0.9 + "rem",
|
||||
h4: h4 + "rem",
|
||||
h5: h5 + "rem",
|
||||
h6: h6 + "rem",
|
||||
},
|
||||
fontFamily: {
|
||||
primary: [fontPrimary, fontPrimaryType],
|
||||
secondary: [fontSecondary, fontSecondaryType],
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
require("@tailwindcss/typography"),
|
||||
require("@tailwindcss/forms"),
|
||||
require("tailwind-bootstrap-grid")({
|
||||
generateContainer: false,
|
||||
gridGutterWidth: "2rem",
|
||||
gridGutters: {
|
||||
1: "0.25rem",
|
||||
2: "0.5rem",
|
||||
3: "1rem",
|
||||
4: "1.5rem",
|
||||
5: "3rem",
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
||||
29
theme.toml
@@ -1,29 +0,0 @@
|
||||
name = "Five Devs"
|
||||
license = "MIT"
|
||||
licenselink = "https://github.com/zeon-studio/hugoplate/blob/main/LICENSE"
|
||||
description = "Hugoplate is a free starter template built with Hugo, and TailwindCSS, providing everything you need to jumpstart your Hugo project and save valuable time."
|
||||
homepage = "https://github.com/zeon-studio/hugoplate"
|
||||
demosite = "https://zeon.studio/preview?project=hugoplate"
|
||||
min_version = "0.134.3"
|
||||
|
||||
tags = [
|
||||
"blog",
|
||||
"responsive",
|
||||
"minimal",
|
||||
"personal",
|
||||
"light",
|
||||
"dark",
|
||||
"multilingual",
|
||||
"landing",
|
||||
"contact",
|
||||
"dark mode",
|
||||
"tailwindcss",
|
||||
]
|
||||
|
||||
features = [
|
||||
"Multi-Authors",
|
||||
"Search",
|
||||
"Multilingual",
|
||||
"Dark Mode",
|
||||
"Taxonomies",
|
||||
]
|
||||
@@ -1,36 +0,0 @@
|
||||
// main script
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
// Dropdown Menu Toggler For Mobile
|
||||
// ----------------------------------------
|
||||
const dropdownMenuToggler = document.querySelectorAll(
|
||||
".nav-dropdown > .nav-link",
|
||||
);
|
||||
|
||||
dropdownMenuToggler.forEach((toggler) => {
|
||||
toggler?.addEventListener("click", (e) => {
|
||||
e.target.parentElement.classList.toggle("active");
|
||||
});
|
||||
});
|
||||
|
||||
// Testimonial Slider
|
||||
// ----------------------------------------
|
||||
new Swiper(".testimonial-slider", {
|
||||
spaceBetween: 24,
|
||||
loop: true,
|
||||
pagination: {
|
||||
el: ".testimonial-slider-pagination",
|
||||
type: "bullets",
|
||||
clickable: true,
|
||||
},
|
||||
breakpoints: {
|
||||
768: {
|
||||
slidesPerView: 2,
|
||||
},
|
||||
992: {
|
||||
slidesPerView: 3,
|
||||
},
|
||||
},
|
||||
});
|
||||
})();
|
||||
@@ -1,179 +0,0 @@
|
||||
/*!***************************************************
|
||||
* Google Map
|
||||
*****************************************************/
|
||||
|
||||
window.marker = null;
|
||||
|
||||
function initialize() {
|
||||
var map,
|
||||
mapId = document.getElementById("map");
|
||||
var latitude = mapId.getAttribute("data-latitude");
|
||||
var longitude = mapId.getAttribute("data-longitude");
|
||||
var mapMarker = mapId.getAttribute("data-marker");
|
||||
var mapMarkerName = mapId.getAttribute("data-marker-name");
|
||||
var nottingham = new google.maps.LatLng(latitude, longitude);
|
||||
var style = [
|
||||
{
|
||||
featureType: "administrative",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
saturation: "-100",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "administrative.province",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
visibility: "off",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "landscape",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
saturation: -100,
|
||||
},
|
||||
{
|
||||
lightness: 65,
|
||||
},
|
||||
{
|
||||
visibility: "on",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "poi",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
saturation: -100,
|
||||
},
|
||||
{
|
||||
lightness: "50",
|
||||
},
|
||||
{
|
||||
visibility: "simplified",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "road",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
saturation: "-100",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "road.highway",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
visibility: "simplified",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "road.arterial",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
lightness: "30",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "road.local",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
lightness: "40",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "transit",
|
||||
elementType: "all",
|
||||
stylers: [
|
||||
{
|
||||
saturation: -100,
|
||||
},
|
||||
{
|
||||
visibility: "simplified",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "water",
|
||||
elementType: "geometry",
|
||||
stylers: [
|
||||
{
|
||||
hue: "#ffff00",
|
||||
},
|
||||
{
|
||||
lightness: -25,
|
||||
},
|
||||
{
|
||||
saturation: -97,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
featureType: "water",
|
||||
elementType: "labels",
|
||||
stylers: [
|
||||
{
|
||||
lightness: -25,
|
||||
},
|
||||
{
|
||||
saturation: -100,
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
var mapOptions = {
|
||||
center: nottingham,
|
||||
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
||||
backgroundColor: "#000",
|
||||
zoom: 15,
|
||||
panControl: !1,
|
||||
zoomControl: !0,
|
||||
mapTypeControl: !1,
|
||||
scaleControl: !1,
|
||||
streetViewControl: !1,
|
||||
overviewMapControl: !1,
|
||||
zoomControlOptions: {
|
||||
style: google.maps.ZoomControlStyle.LARGE,
|
||||
},
|
||||
};
|
||||
map = new google.maps.Map(document.getElementById("map"), mapOptions);
|
||||
var mapType = new google.maps.StyledMapType(style, {
|
||||
name: "Grayscale",
|
||||
});
|
||||
map.mapTypes.set("grey", mapType);
|
||||
map.setMapTypeId("grey");
|
||||
var marker_image = mapMarker;
|
||||
var pinIcon = new google.maps.MarkerImage(
|
||||
marker_image,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
new google.maps.Size(30, 50),
|
||||
);
|
||||
marker = new google.maps.Marker({
|
||||
position: nottingham,
|
||||
map: map,
|
||||
icon: pinIcon,
|
||||
title: mapMarkerName,
|
||||
});
|
||||
}
|
||||
var map = document.getElementById("map");
|
||||
if (map != null) {
|
||||
google.maps.event.addDomListener(window, "load", initialize);
|
||||
}
|
||||