├── public ├── robots.txt ├── _headers └── decapcms │ ├── index.html │ └── config.yml ├── .prettierignore ├── .dockerignore ├── .npmrc ├── .stackblitzrc ├── src ├── assets │ ├── favicons │ │ ├── favicon.ico │ │ ├── apple-touch-icon.png │ │ └── favicon.svg │ ├── images │ │ ├── app-store.png │ │ ├── default.png │ │ ├── google-play.png │ │ └── hero-image.png │ └── styles │ │ └── tailwind.css ├── components │ ├── common │ │ ├── SiteVerification.astro │ │ ├── CommonMeta.astro │ │ ├── SplitbeeAnalytics.astro │ │ ├── Analytics.astro │ │ ├── ToggleTheme.astro │ │ ├── ApplyColorMode.astro │ │ ├── ToggleMenu.astro │ │ ├── Image.astro │ │ ├── SocialShare.astro │ │ └── Metadata.astro │ ├── Logo.astro │ ├── ui │ │ ├── Background.astro │ │ ├── DListItem.astro │ │ ├── Headline.astro │ │ ├── WidgetWrapper.astro │ │ ├── Button.astro │ │ ├── ItemGrid2.astro │ │ ├── Timeline.astro │ │ ├── ItemGrid.astro │ │ └── Form.astro │ ├── blog │ │ ├── Grid.astro │ │ ├── List.astro │ │ ├── Headline.astro │ │ ├── ToBlogLink.astro │ │ ├── RelatedPosts.astro │ │ ├── Pagination.astro │ │ ├── Tags.astro │ │ ├── GridItem.astro │ │ ├── SinglePost.astro │ │ └── ListItem.astro │ ├── Favicons.astro │ ├── widgets │ │ ├── Note.astro │ │ ├── Announcement.astro │ │ ├── FAQs.astro │ │ ├── Features.astro │ │ ├── Contact.astro │ │ ├── Brands.astro │ │ ├── Features2.astro │ │ ├── Stats.astro │ │ ├── CallToAction.astro │ │ ├── BlogLatestPosts.astro │ │ ├── BlogHighlightedPosts.astro │ │ ├── Steps.astro │ │ ├── Features3.astro │ │ ├── Testimonials.astro │ │ ├── Steps2.astro │ │ ├── HeroText.astro │ │ ├── Content.astro │ │ ├── Hero.astro │ │ ├── Hero2.astro │ │ ├── Footer.astro │ │ ├── Pricing.astro │ │ └── Header.astro │ └── CustomStyles.astro ├── env.d.ts ├── utils │ ├── directories.ts │ ├── frontmatter.ts │ ├── utils.ts │ ├── permalinks.ts │ └── images.ts ├── layouts │ ├── PageLayout.astro │ ├── LandingLayout.astro │ ├── MarkdownLayout.astro │ └── Layout.astro ├── pages │ ├── 404.astro │ ├── rss.xml.ts │ ├── [...blog] │ │ ├── [tag] │ │ │ └── [...page].astro │ │ ├── [category] │ │ │ └── [...page].astro │ │ ├── [...page].astro │ │ └── index.astro │ ├── landing │ │ ├── sales.astro │ │ ├── click-through.astro │ │ ├── pre-launch.astro │ │ ├── product.astro │ │ ├── subscription.astro │ │ └── lead-generation.astro │ ├── contact.astro │ ├── pricing.astro │ └── about.astro ├── content │ └── config.ts ├── config.yaml ├── data │ └── post │ │ └── astrowind-template-in-depth.mdx ├── navigation.ts └── types.d.ts ├── docker-compose.yml ├── vendor ├── README.md └── integration │ ├── types.d.ts │ ├── utils │ ├── loadConfig.ts │ └── configBuilder.ts │ └── index.ts ├── netlify.toml ├── .editorconfig ├── sandbox.config.json ├── .vscode ├── launch.json ├── extensions.json ├── settings.json └── astrowind │ └── config-schema.json ├── tsconfig.json ├── vercel.json ├── .gitignore ├── .prettierrc.cjs ├── vscode.tailwind.json ├── Dockerfile ├── nginx └── nginx.conf ├── .github └── workflows │ └── actions.yaml ├── LICENSE.md ├── tailwind.config.js ├── eslint.config.js ├── package.json └── astro.config.ts /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .github 4 | .changeset -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | .vscode/ 4 | .github/ 5 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # Expose Astro dependencies for `pnpm` users 2 | shamefully-hoist=true -------------------------------------------------------------------------------- /public/_headers: -------------------------------------------------------------------------------- 1 | /_astro/* 2 | Cache-Control: public, max-age=31536000, immutable -------------------------------------------------------------------------------- /.stackblitzrc: -------------------------------------------------------------------------------- 1 | { 2 | "startCommand": "npm start", 3 | "env": { 4 | "ENABLE_CJS_IMPORTS": true 5 | } 6 | } -------------------------------------------------------------------------------- /src/assets/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthelokyo/astrowind/HEAD/src/assets/favicons/favicon.ico -------------------------------------------------------------------------------- /src/assets/images/app-store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthelokyo/astrowind/HEAD/src/assets/images/app-store.png -------------------------------------------------------------------------------- /src/assets/images/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthelokyo/astrowind/HEAD/src/assets/images/default.png -------------------------------------------------------------------------------- /src/assets/images/google-play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthelokyo/astrowind/HEAD/src/assets/images/google-play.png -------------------------------------------------------------------------------- /src/assets/images/hero-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthelokyo/astrowind/HEAD/src/assets/images/hero-image.png -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | astrowind: 3 | build: . 4 | container_name: astrowind 5 | ports: 6 | - 8080:8080 7 | -------------------------------------------------------------------------------- /src/assets/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthelokyo/astrowind/HEAD/src/assets/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /vendor/README.md: -------------------------------------------------------------------------------- 1 | This folder will become an integration for **AstroWind**. 2 | 3 | We are working to allow updates to template instances. 4 | These are changes on the way to new **AstroWind v2** 5 | -------------------------------------------------------------------------------- /src/components/common/SiteVerification.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { SITE } from 'astrowind:config'; 3 | --- 4 | 5 | {SITE.googleSiteVerificationId && } 6 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "dist" 3 | command = "npm run build" 4 | [build.processing.html] 5 | pretty_urls = false 6 | [[headers]] 7 | for = "/_astro/*" 8 | [headers.values] 9 | Cache-Control = "public, max-age=31536000, immutable" 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | end_of_line = lf 9 | indent_size = 2 10 | indent_style = space 11 | insert_final_newline = true 12 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /sandbox.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "infiniteLoopProtection": true, 3 | "hardReloadOnChange": false, 4 | "view": "browser", 5 | "template": "node", 6 | "container": { 7 | "port": 3000, 8 | "startScript": "start", 9 | "node": "18" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/components/Logo.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { SITE } from 'astrowind:config'; 3 | --- 4 | 5 | 8 | 🚀 {SITE?.name} 9 | 10 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/components/common/CommonMeta.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { getAsset } from '~/utils/permalinks'; 3 | --- 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/components/ui/Background.astro: -------------------------------------------------------------------------------- 1 | --- 2 | export interface Props { 3 | isDark?: boolean; 4 | } 5 | 6 | const { isDark = false } = Astro.props; 7 | --- 8 | 9 |
10 | 11 |
12 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/triple-slash-reference 2 | /// 3 | /// 4 | /// 5 | /// 6 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "astro-build.astro-vscode", 4 | "bradlc.vscode-tailwindcss", 5 | "dbaeumer.vscode-eslint", 6 | "esbenp.prettier-vscode", 7 | "unifiedjs.vscode-mdx" 8 | ], 9 | "unwantedRecommendations": [] 10 | } 11 | -------------------------------------------------------------------------------- /src/components/common/SplitbeeAnalytics.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { doNotTrack = true, noCookieMode = false, url = 'https://cdn.splitbee.io/sb.js' } = Astro.props; 3 | --- 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/base", 3 | "compilerOptions": { 4 | "strictNullChecks": true, 5 | "allowJs": true, 6 | "baseUrl": ".", 7 | "paths": { 8 | "~/*": ["src/*"] 9 | } 10 | }, 11 | "include": [".astro/types.d.ts", "**/*"], 12 | "exclude": ["dist/"] 13 | } 14 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "cleanUrls": true, 3 | "trailingSlash": false, 4 | "headers": [ 5 | { 6 | "source": "/_astro/(.*)", 7 | "headers": [ 8 | { 9 | "key": "Cache-Control", 10 | "value": "public, max-age=31536000, immutable" 11 | } 12 | ] 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | .output/ 4 | 5 | # dependencies 6 | node_modules/ 7 | 8 | # logs 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | pnpm-debug.log* 13 | 14 | 15 | # environment variables 16 | .env 17 | .env.production 18 | 19 | # macOS-specific files 20 | .DS_Store 21 | 22 | pnpm-lock.yaml 23 | 24 | .astro -------------------------------------------------------------------------------- /.prettierrc.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('prettier').Config} */ 2 | module.exports = { 3 | printWidth: 120, 4 | semi: true, 5 | singleQuote: true, 6 | tabWidth: 2, 7 | trailingComma: 'es5', 8 | useTabs: false, 9 | 10 | plugins: [require.resolve('prettier-plugin-astro')], 11 | 12 | overrides: [{ files: '*.astro', options: { parser: 'astro' } }], 13 | }; 14 | -------------------------------------------------------------------------------- /vscode.tailwind.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1.1, 3 | "atDirectives": [ 4 | { 5 | "name": "@tailwind", 6 | "description": "@tailwind tailwindcss" 7 | }, 8 | { 9 | "name": "@layer", 10 | "description": "@layer tailwindcss" 11 | }, 12 | { 13 | "name": "@apply", 14 | "description": "@apply tailwindcss" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /src/components/blog/Grid.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Item from '~/components/blog/GridItem.astro'; 3 | import type { Post } from '~/types'; 4 | 5 | export interface Props { 6 | posts: Array; 7 | } 8 | 9 | const { posts } = Astro.props; 10 | --- 11 | 12 |
13 | {posts.map((post) => )} 14 |
15 | -------------------------------------------------------------------------------- /src/components/common/Analytics.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { GoogleAnalytics } from '@astrolib/analytics'; 3 | import { ANALYTICS } from 'astrowind:config'; 4 | --- 5 | 6 | { 7 | ANALYTICS?.vendors?.googleAnalytics?.id ? ( 8 | 12 | ) : null 13 | } 14 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts AS base 2 | WORKDIR /app 3 | 4 | FROM base AS deps 5 | COPY package*.json ./ 6 | RUN npm install 7 | 8 | FROM base AS build 9 | COPY --from=deps /app/node_modules ./node_modules 10 | COPY . . 11 | RUN npm run build 12 | 13 | FROM nginx:stable-alpine AS deploy 14 | COPY --from=build /app/dist /usr/share/nginx/html 15 | COPY ./nginx/nginx.conf /etc/nginx/nginx.conf 16 | 17 | EXPOSE 8080 18 | -------------------------------------------------------------------------------- /src/components/blog/List.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Item from '~/components/blog/ListItem.astro'; 3 | import type { Post } from '~/types'; 4 | 5 | export interface Props { 6 | posts: Array; 7 | } 8 | 9 | const { posts } = Astro.props; 10 | --- 11 | 12 |
    13 | { 14 | posts.map((post) => ( 15 |
  • 16 | 17 |
  • 18 | )) 19 | } 20 |
21 | -------------------------------------------------------------------------------- /vendor/integration/types.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'astrowind:config' { 2 | import type { SiteConfig, I18NConfig, MetaDataConfig, AppBlogConfig, UIConfig, AnalyticsConfig } from './config'; 3 | 4 | export const SITE: SiteConfig; 5 | export const I18N: I18NConfig; 6 | export const METADATA: MetaDataConfig; 7 | export const APP_BLOG: AppBlogConfig; 8 | export const UI: UIConfig; 9 | export const ANALYTICS: AnalyticsConfig; 10 | } 11 | -------------------------------------------------------------------------------- /src/components/Favicons.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import favIcon from '~/assets/favicons/favicon.ico'; 3 | import favIconSvg from '~/assets/favicons/favicon.svg'; 4 | import appleTouchIcon from '~/assets/favicons/apple-touch-icon.png'; 5 | --- 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "css.customData": ["./vscode.tailwind.json"], 3 | "eslint.validate": ["javascript", "javascriptreact", "astro", "typescript", "typescriptreact"], 4 | "files.associations": { 5 | "*.mdx": "markdown" 6 | }, 7 | "prettier.documentSelectors": ["**/*.astro"], 8 | "[astro]": { 9 | "editor.defaultFormatter": "astro-build.astro-vscode" 10 | }, 11 | "yaml.schemas": { 12 | "./.vscode/astrowind/config-schema.json": "/src/config.yaml" 13 | }, 14 | "eslint.useFlatConfig": true 15 | } 16 | -------------------------------------------------------------------------------- /src/components/blog/Headline.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { title = await Astro.slots.render('default'), subtitle = await Astro.slots.render('subtitle') } = Astro.props; 3 | --- 4 | 5 |
6 |

7 | { 8 | subtitle && ( 9 |
10 | ) 11 | } 12 |

13 | -------------------------------------------------------------------------------- /vendor/integration/utils/loadConfig.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | import yaml from 'js-yaml'; 3 | 4 | const loadConfig = async (configPathOrData: string | object) => { 5 | if (typeof configPathOrData === 'string') { 6 | const content = fs.readFileSync(configPathOrData, 'utf8'); 7 | if (configPathOrData.endsWith('.yaml') || configPathOrData.endsWith('.yml')) { 8 | return yaml.load(content); 9 | } 10 | return content; 11 | } 12 | 13 | return configPathOrData; 14 | }; 15 | 16 | export default loadConfig; 17 | -------------------------------------------------------------------------------- /public/decapcms/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Content Manager 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/utils/directories.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { fileURLToPath } from 'url'; 3 | 4 | const __dirname = path.dirname(fileURLToPath(import.meta.url)); 5 | 6 | /** */ 7 | export const getProjectRootDir = (): string => { 8 | const mode = import.meta.env.MODE; 9 | 10 | return mode === 'production' ? path.join(__dirname, '../') : path.join(__dirname, '../../'); 11 | }; 12 | 13 | const __srcFolder = path.join(getProjectRootDir(), '/src'); 14 | 15 | /** */ 16 | export const getRelativeUrlByFilePath = (filepath: string): string => { 17 | return filepath.replace(__srcFolder, ''); 18 | }; 19 | -------------------------------------------------------------------------------- /src/components/ui/DListItem.astro: -------------------------------------------------------------------------------- 1 | --- 2 | // component: DListItem 3 | // 4 | // Mimics the html 'dl' (description list) 5 | // 6 | // The 'dt' item is the item 'term' and is inserted into an 'h6' tag. 7 | // Caller needs to style the 'h6' tag appropriately. 8 | // 9 | // You can put pretty much any content you want between the open and 10 | // closing tags - it's simply contained in an enclosing div with a 11 | // margin left. No need for 'dd' items. 12 | // 13 | const { dt } = Astro.props; 14 | interface Props { 15 | dt: string; 16 | } 17 | 18 | const content: string = await Astro.slots.render('default'); 19 | --- 20 | 21 |
22 |
23 | -------------------------------------------------------------------------------- /src/components/widgets/Note.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | 4 | export interface Props { 5 | icon?: string; 6 | title?: string; 7 | description?: string; 8 | } 9 | 10 | const { 11 | icon = 'tabler:info-square', 12 | title = await Astro.slots.render('title'), 13 | description = await Astro.slots.render('description'), 14 | } = Astro.props; 15 | --- 16 | 17 |
18 |
19 | 20 | 21 | 22 |
23 |
24 | -------------------------------------------------------------------------------- /src/components/blog/ToBlogLink.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Icon } from 'astro-icon/components'; 3 | import { getBlogPermalink } from '~/utils/permalinks'; 4 | import { I18N } from 'astrowind:config'; 5 | import Button from '~/components/ui/Button.astro'; 6 | 7 | const { textDirection } = I18N; 8 | --- 9 | 10 |
11 | 20 |
21 | -------------------------------------------------------------------------------- /src/assets/favicons/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /src/layouts/PageLayout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from '~/layouts/Layout.astro'; 3 | import Header from '~/components/widgets/Header.astro'; 4 | import Footer from '~/components/widgets/Footer.astro'; 5 | import Announcement from '~/components/widgets/Announcement.astro'; 6 | 7 | import { headerData, footerData } from '~/navigation'; 8 | 9 | import type { MetaData } from '~/types'; 10 | 11 | export interface Props { 12 | metadata?: MetaData; 13 | } 14 | 15 | const { metadata } = Astro.props; 16 | --- 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 |
26 | 27 |
28 | 29 |