💠 Qwind
Qwind is a free and open-source template to make your website using Qwik + Tailwind CSS. Ready to start a new project and designed taking into account best practices.
Features
- ✅ Integration with Tailwind CSS supporting Dark mode.
- ✅ Production-ready scores in Lighthouse and PageSpeed Insights reports.
- ✅ Image optimization and Font optimization.
Table of Contents
Demo
Getting started
This project is using Qwik with QwikCity. QwikCity is just a extra set of tools on top of Qwik to make it easier to build a full site, including directory-based routing, layouts, and more.
Project structure
Inside Qwind template, you'll see the following folders and files:
/
├── adaptors/
| └── static/
| └── vite.config.ts
├── public/
│ ├── favicon.svg
│ ├── manifest.json
│ └── robots.txt
├── src/
│ ├── assets/
│ │ ├── images/
| | └── styles/
| | └── global.css
│ ├── components/
│ │ ├── atoms/
│ │ ├── core/
│ │ ├── icons/
| | └── widgets/
| | ├── Header.astro
| | ├── Footer.astro
| | └── ...
│ ├── routes/
│ | ├── blog/
│ | ├── index.astro
| | ├── layout.tsx
| | └-- service-worker.ts
│ ├── config.mjs
│ ├── entry.dev.tsx
│ ├── entry.preview.tsx
│ ├── entry.ssr.tsx
│ └── root.tsx
├── package.json
└── ...
-
src/routes: Provides the directory based routing, which can include a hierarchy oflayout.tsxlayout files, and anindex.tsxfile as the page. Additionally,index.tsfiles are endpoints. Please see the routing docs for more info. -
src/components: Recommended directory for components. -
public: Any static assets, like images, can be placed in the public directory. Please see the Vite public directory for more info.
Seasoned qwik expert? Delete this file. Update
config.mjsand contents. Have fun!
Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
|---|---|
npm install |
Installs dependencies |
npm run dev |
Starts local dev server at 127.0.0.1:5173/ |
npm run build |
Build your production site to ./dist/ |
npm run preview |
Preview your build locally, before deploying |
npm run fmt |
Format codes with Prettier |
npm run lint |
Run Eslint |
npm run qwik ... |
Run CLI commands like qwik add, qwik build |
Configuration
Basic configuration file: ./src/config.mjs
export const SITE = {
name: 'Example',
origin: 'https://example.com',
basePathname: '/', // Change this if you need to deploy to Github Pages, for example
trailingSlash: true, // Generate permalinks with or without "/" at the end
};
Deploy
Deploy to production (manual)
You can create an optimized production build with:
npm run build
Now, your website is ready to be deployed. All generated files are located at
dist folder, which you can deploy the folder to any hosting service you
prefer.
Deploy to Netlify
Clone this repository on own GitHub account and deploy to Netlify:
Deploy to Vercel
Clone this repository on own GitHub account and deploy to Vercel:
Roadmap
Base
- Create utilities to generate permalinks tailored to the domain and base pathname.
- Simplify the way to optimize images.
- Create component to make SEO simpler and more intuitive.
- Create configurable blog with categories, tags and authors using MDX.
- Add more frequently used pages (Portfolio, Services, Contact, Docs ...).
- Find or create a library to have more icon sources available.
- Refactor some code that doesn't follow Qwik conventions yet.
Advanced
- Achieve perfect 100% Google Page Speed score.
- Insert complex javascript example widget on home page to demonstrate Qwik features.
- Create small illustrative admin backend.
Contributing
If you have any idea, suggestions or find any bugs, feel free to open a discussion, an issue or create a pull request. That would be very useful for all of us and we would be happy to listen and take action.
Acknowledgements
Initially created by onWidget and maintained by a community of contributors.
License
Qwind is licensed under the MIT license — see the LICENSE file for details.
Cloudflare Pages
Cloudflare's wrangler CLI can be used to preview a production build locally. To start a local server, run:
npm run serve
Then visit http://localhost:8787/
Deployments
Cloudflare Pages are deployable through their Git provider integrations.
If you don't already have an account, then create a Cloudflare account here. Next go to your dashboard and follow the Cloudflare Pages deployment guide.
Within the projects "Settings" for "Build and deployments", the "Build command" should be npm run build, and the "Build output directory" should be set to dist.
Function Invocation Routes
Cloudflare Page's function-invocation-routes config can be used to include, or exclude, certain paths to be used by the worker functions. Having a _routes.json file gives developers more granular control over when your Function is invoked.
This is useful to determine if a page response should be Server-Side Rendered (SSR) or if the response should use a static-site generated (SSG) index.html file.
By default, the Cloudflare pages adaptor does not include a public/_routes.json config, but rather it is auto-generated from the build by the Cloudflare adaptor. An example of an auto-generate dist/_routes.json would be:
{
"include": [
"/*"
],
"exclude": [
"/_headers",
"/_redirects",
"/build/*",
"/favicon.ico",
"/manifest.json",
"/service-worker.js",
"/about"
],
"version": 1
}
In the above example, it's saying all pages should be SSR'd. However, the root static files such as /favicon.ico and any static assets in /build/* should be excluded from the Functions, and instead treated as a static file.
In most cases the generated dist/_routes.json file is ideal. However, if you need more granular control over each path, you can instead provide you're own public/_routes.json file. When the project provides its own public/_routes.json file, then the Cloudflare adaptor will not auto-generate the routes config and instead use the committed one within the public directory.
Cloudflare Pages
Cloudflare's wrangler CLI can be used to preview a production build locally. To start a local server, run:
npm run serve
Then visit http://localhost:8787/
Deployments
Cloudflare Pages are deployable through their Git provider integrations.
If you don't already have an account, then create a Cloudflare account here. Next go to your dashboard and follow the Cloudflare Pages deployment guide.
Within the projects "Settings" for "Build and deployments", the "Build command" should be npm run build, and the "Build output directory" should be set to dist.
Function Invocation Routes
Cloudflare Page's function-invocation-routes config can be used to include, or exclude, certain paths to be used by the worker functions. Having a _routes.json file gives developers more granular control over when your Function is invoked.
This is useful to determine if a page response should be Server-Side Rendered (SSR) or if the response should use a static-site generated (SSG) index.html file.
By default, the Cloudflare pages adaptor does not include a public/_routes.json config, but rather it is auto-generated from the build by the Cloudflare adaptor. An example of an auto-generate dist/_routes.json would be:
{
"include": [
"/*"
],
"exclude": [
"/_headers",
"/_redirects",
"/build/*",
"/favicon.ico",
"/manifest.json",
"/service-worker.js",
"/about"
],
"version": 1
}
In the above example, it's saying all pages should be SSR'd. However, the root static files such as /favicon.ico and any static assets in /build/* should be excluded from the Functions, and instead treated as a static file.
In most cases the generated dist/_routes.json file is ideal. However, if you need more granular control over each path, you can instead provide you're own public/_routes.json file. When the project provides its own public/_routes.json file, then the Cloudflare adaptor will not auto-generate the routes config and instead use the committed one within the public directory.