├── .npmrc ├── src ├── components │ ├── ui │ │ ├── icons │ │ │ ├── index.js │ │ │ └── tick.astro │ │ ├── button.astro │ │ └── link.astro │ ├── container.astro │ ├── sectionhead.astro │ ├── cta.astro │ ├── footer.astro │ ├── logos.astro │ ├── pricing.astro │ ├── navbar │ │ ├── dropdown.astro │ │ └── navbar.astro │ ├── hero.astro │ ├── features.astro │ └── contactform.astro ├── assets │ ├── hero.png │ ├── hero-alt.png │ └── hero-source.svg ├── env.d.ts ├── utils │ └── all.js ├── content │ ├── team │ │ ├── janette-lynch.md │ │ ├── robert-palmer.md │ │ └── marcell-ziemann.md │ ├── config.ts │ └── blog │ │ ├── complete-guide-fullstack-development.md │ │ ├── essential-data-structures-algorithms.md │ │ ├── how-to-become-frontend-master.md │ │ └── kitchensink.mdx ├── pages │ ├── index.astro │ ├── 404.astro │ ├── contact.astro │ ├── pricing.astro │ ├── blog │ │ └── [slug].astro │ ├── about.astro │ └── blog.astro ├── styles │ └── global.css └── layouts │ ├── BlogLayout.astro │ └── Layout.astro ├── .prettierrc ├── public ├── opengraph.jpg ├── robots.txt └── favicon.svg ├── .vscode ├── extensions.json └── launch.json ├── tsconfig.json ├── .gitignore ├── astro.config.mjs ├── package.json ├── README.md └── LICENSE /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true -------------------------------------------------------------------------------- /src/components/ui/icons/index.js: -------------------------------------------------------------------------------- 1 | export { default as Tick } from "./tick.astro"; 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false, 4 | "bracketSameLine": true 5 | } -------------------------------------------------------------------------------- /public/opengraph.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surjithctly/astroship/HEAD/public/opengraph.jpg -------------------------------------------------------------------------------- /src/assets/hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surjithctly/astroship/HEAD/src/assets/hero.png -------------------------------------------------------------------------------- /src/assets/hero-alt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/surjithctly/astroship/HEAD/src/assets/hero-alt.png -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | 4 | Sitemap: http://astroship.web3templates.com/sitemap-index.xml -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /src/components/container.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className } = Astro.props; 3 | --- 4 | 5 |
6 | 7 |
8 | -------------------------------------------------------------------------------- /src/utils/all.js: -------------------------------------------------------------------------------- 1 | /** */ 2 | export const getFormattedDate = (date) => 3 | date 4 | ? new Date(date).toLocaleDateString("en-us", { 5 | year: "numeric", 6 | month: "short", 7 | day: "numeric", 8 | }) 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 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/base", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "strictNullChecks": true, 6 | "types": ["astro/client"], 7 | "paths": { 8 | "@/*": ["src/*"], 9 | "~/*": ["./*"] 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/content/team/janette-lynch.md: -------------------------------------------------------------------------------- 1 | --- 2 | draft: false 3 | name: "Janette Lynch" 4 | title: "Senior Director" 5 | avatar: { 6 | src: "https://images.unsplash.com/photo-1580489944761-15a19d654956?&fit=crop&w=280", 7 | alt: "Janette Lynch" 8 | } 9 | publishDate: "2022-11-07 15:39" 10 | --- 11 | -------------------------------------------------------------------------------- /src/content/team/robert-palmer.md: -------------------------------------------------------------------------------- 1 | --- 2 | draft: false 3 | name: "Robert Palmer" 4 | title: "Marketing Engineer" 5 | avatar: { 6 | src: "https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?&fit=crop&w=280", 7 | alt: "Robert Palmer" 8 | } 9 | publishDate: "2022-11-09 15:39" 10 | --- 11 | -------------------------------------------------------------------------------- /src/content/team/marcell-ziemann.md: -------------------------------------------------------------------------------- 1 | --- 2 | draft: false 3 | name: "Marcell Ziemann" 4 | title: "Principal Strategist" 5 | avatar: { 6 | src: "https://images.unsplash.com/photo-1633332755192-727a05c4013d?&fit=crop&w=280", 7 | alt: "Marcell Ziemann" 8 | } 9 | publishDate: "2022-11-08 15:39" 10 | --- 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | .output/ 4 | .astro 5 | 6 | # dependencies 7 | node_modules/ 8 | 9 | # logs 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | pnpm-debug.log* 14 | 15 | 16 | # environment variables 17 | .env 18 | .env.production 19 | 20 | # macOS-specific files 21 | .DS_Store 22 | -------------------------------------------------------------------------------- /src/components/sectionhead.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { align = "center" } = Astro.props; 3 | --- 4 | 5 |
6 |

7 | Title 8 |

9 |

10 | Some description goes here 11 |

12 |
13 | -------------------------------------------------------------------------------- /astro.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "astro/config"; 2 | import tailwindcss from "@tailwindcss/vite"; 3 | import mdx from "@astrojs/mdx"; 4 | import sitemap from "@astrojs/sitemap"; 5 | import icon from "astro-icon"; 6 | 7 | // https://astro.build/config 8 | export default defineConfig({ 9 | site: "https://astroship.web3templates.com", 10 | integrations: [mdx(), sitemap(), icon()], 11 | vite: { 12 | plugins: [tailwindcss()], 13 | }, 14 | }); 15 | -------------------------------------------------------------------------------- /src/pages/index.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Container from "@/components/container.astro"; 3 | import Cta from "@/components/cta.astro"; 4 | import Features from "@/components/features.astro"; 5 | import Hero from "@/components/hero.astro"; 6 | import Logos from "@/components/logos.astro"; 7 | import Layout from "@/layouts/Layout.astro"; 8 | --- 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/pages/404.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Container from "@/components/container.astro"; 3 | import Layout from "@/layouts/Layout.astro"; 4 | --- 5 | 6 | 7 | 8 |
9 |
10 |

404

11 |

Page not found.

12 |
13 |
14 |
15 |
16 | -------------------------------------------------------------------------------- /src/components/cta.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Link from "./ui/link.astro"; 3 | --- 4 | 5 |
7 |

8 | Build faster websites. 9 |

10 |

11 | Pull content from anywhere and serve it fast with Astro's next-gen island 12 | architecture. 13 |

14 |
15 | Get Started 16 |
17 |
18 | -------------------------------------------------------------------------------- /src/components/footer.astro: -------------------------------------------------------------------------------- 1 |
2 |

3 | Copyright © {new Date().getFullYear()} Astroship. All rights reserved. 4 |

5 | 10 |

11 | Made by 16 | Web3Templates 17 | 18 |

19 |
20 | -------------------------------------------------------------------------------- /src/components/logos.astro: -------------------------------------------------------------------------------- 1 | --- 2 | // @ts-ignore 3 | import { Icon } from "astro-icon/components"; 4 | --- 5 | 6 |
7 |

Works with your technologies

8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | -------------------------------------------------------------------------------- /src/components/ui/icons/tick.astro: -------------------------------------------------------------------------------- 1 | --- 2 | const { class: className } = Astro.props; 3 | --- 4 | 5 | 16 | 17 | -------------------------------------------------------------------------------- /src/styles/global.css: -------------------------------------------------------------------------------- 1 | @import 'tailwindcss'; 2 | 3 | @plugin '@tailwindcss/typography'; 4 | 5 | @theme { 6 | --font-sans: 7 | Bricolage Grotesque Variable, Inter Variable, Inter, ui-sans-serif, 8 | system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 9 | 'Segoe UI Symbol', 'Noto Color Emoji'; 10 | } 11 | 12 | /* 13 | The default border color has changed to `currentColor` in Tailwind CSS v4, 14 | so we've added these compatibility styles to make sure everything still 15 | looks the same as it did with Tailwind CSS v3. 16 | 17 | If we ever want to remove these styles, we need to add an explicit border 18 | color utility to any element that depends on these defaults. 19 | */ 20 | @layer base { 21 | *, 22 | ::after, 23 | ::before, 24 | ::backdrop, 25 | ::file-selector-button { 26 | border-color: var(--color-gray-200, currentColor); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "astroship", 3 | "type": "module", 4 | "version": "3.0.0", 5 | "private": true, 6 | "scripts": { 7 | "dev": "astro dev", 8 | "start": "astro dev", 9 | "build": "astro build", 10 | "preview": "astro preview", 11 | "astro": "astro" 12 | }, 13 | "dependencies": { 14 | "@astrojs/mdx": "^4.2.0", 15 | "@astrojs/sitemap": "^3.2.1", 16 | "@fontsource-variable/bricolage-grotesque": "^5.2.5", 17 | "@fontsource-variable/inter": "^5.2.5", 18 | "@iconify-json/bx": "^1.2.2", 19 | "@iconify-json/simple-icons": "^1.2.28", 20 | "@iconify-json/uil": "^1.2.3", 21 | "@tailwindcss/typography": "^0.5.16", 22 | "@tailwindcss/vite": "^4.0.14", 23 | "astro": "^5.5.2", 24 | "astro-icon": "^1.1.5", 25 | "astro-navbar": "^2.3.9", 26 | "astro-seo": "^0.8.4", 27 | "sharp": "^0.33.5", 28 | "tailwindcss": "^4.0.14" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/ui/button.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | size?: "md" | "lg"; 4 | block?: boolean; 5 | style?: "outline" | "primary" | "inverted"; 6 | class?: string; 7 | [x: string]: any; 8 | } 9 | 10 | const { 11 | size = "md", 12 | style = "primary", 13 | block, 14 | class: className, 15 | ...rest 16 | } = Astro.props; 17 | 18 | const sizes = { 19 | md: "px-5 py-2.5", 20 | lg: "px-6 py-3", 21 | }; 22 | 23 | const styles = { 24 | outline: "border-2 border-black hover:bg-black text-black hover:text-white", 25 | primary: 26 | "bg-black text-white hover:bg-slate-900 border-2 border-transparent", 27 | }; 28 | --- 29 | 30 | 41 | -------------------------------------------------------------------------------- /src/components/ui/link.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | href: string; 4 | size?: "md" | "lg"; 5 | block?: boolean; 6 | style?: "outline" | "primary" | "inverted" | "muted"; 7 | class?: string; 8 | [x: string]: any; 9 | } 10 | 11 | const { 12 | href, 13 | block, 14 | size = "lg", 15 | style = "primary", 16 | class: className, 17 | ...rest 18 | } = Astro.props; 19 | 20 | const sizes = { 21 | lg: "px-5 py-2.5", 22 | md: "px-4 py-2", 23 | }; 24 | 25 | const styles = { 26 | outline: "bg-white border-2 border-black hover:bg-gray-100 text-black ", 27 | primary: "bg-black text-white hover:bg-gray-800 border-2 border-transparent", 28 | inverted: "bg-white text-black border-2 border-transparent", 29 | muted: "bg-gray-100 hover:bg-gray-200 border-2 border-transparent", 30 | }; 31 | --- 32 | 33 | 44 | 45 | -------------------------------------------------------------------------------- /src/content/config.ts: -------------------------------------------------------------------------------- 1 | // 1. Import utilities from `astro:content` 2 | import { z, defineCollection } from 'astro:content'; 3 | 4 | // 2. Define your collection(s) 5 | const blogCollection = defineCollection({ 6 | schema: z.object({ 7 | draft: z.boolean(), 8 | title: z.string(), 9 | snippet: z.string(), 10 | image: z.object({ 11 | src: z.string(), 12 | alt: z.string(), 13 | }), 14 | publishDate: z.string().transform(str => new Date(str)), 15 | author: z.string().default('Astroship'), 16 | category: z.string(), 17 | tags: z.array(z.string()), 18 | }), 19 | }); 20 | 21 | const teamCollection = defineCollection({ 22 | schema: z.object({ 23 | draft: z.boolean(), 24 | name: z.string(), 25 | title: z.string(), 26 | avatar: z.object({ 27 | src: z.string(), 28 | alt: z.string(), 29 | }), 30 | publishDate: z.string().transform(str => new Date(str)), 31 | }), 32 | }); 33 | 34 | // 3. Export a single `collections` object to register your collection(s) 35 | // This key should match your collection directory name in "src/content" 36 | export const collections = { 37 | 'blog': blogCollection, 38 | 'team': teamCollection, 39 | }; -------------------------------------------------------------------------------- /src/components/pricing.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Tick } from "@/components/ui/icons"; 3 | import Link from "@/components/ui/link.astro"; 4 | 5 | const { plan } = Astro.props; 6 | --- 7 | 8 |
9 |
11 |
12 |

{plan.name}

14 | { 15 | plan.price && typeof plan.price === "object" 16 | ? plan.price.monthly 17 | : plan.price 18 | } 19 |

20 | 27 |
    28 | { 29 | plan.features.map((item) => ( 30 |
  • 31 | 32 | {item} 33 |
  • 34 | )) 35 | } 36 |
37 | 41 | {plan.button.text || "Get Started"} 42 | 43 |
44 |
45 |
46 | -------------------------------------------------------------------------------- /src/components/navbar/dropdown.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Dropdown as DropdownContainer, DropdownItems } from "astro-navbar"; 3 | const { title, lastItem, children } = Astro.props; 4 | --- 5 | 6 |
  • 7 | 8 | 24 | 25 |
    32 |
    34 | { 35 | children.map((item) => ( 36 | 39 | {item.title} 40 | 41 | )) 42 | } 43 |
    44 |
    45 |
    46 |
    47 |
  • 48 | -------------------------------------------------------------------------------- /src/layouts/BlogLayout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Container from "@/components/container.astro"; 3 | import { getFormattedDate } from "@/utils/all"; 4 | import Layout from "./Layout.astro"; 5 | 6 | const { frontmatter } = Astro.props; 7 | --- 8 | 9 | 10 | 11 |
    12 | 13 | {frontmatter.category} 14 | 15 |

    17 | {frontmatter.title} 18 |

    19 |
    20 | 21 | {frontmatter.author} 22 | 23 | 24 | 27 | 28 |
    29 | { 30 | frontmatter.tags.map((tag) => ( 31 | #{tag} 32 | )) 33 | } 34 |
    35 |
    36 |
    37 | 38 |
    39 | 40 |
    41 |
    42 | ← Back to Blog 47 |
    48 |
    49 |
    50 | -------------------------------------------------------------------------------- /src/pages/contact.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Contactform from "@/components/contactform.astro"; 3 | import Container from "@/components/container.astro"; 4 | import Sectionhead from "@/components/sectionhead.astro"; 5 | import Layout from "@/layouts/Layout.astro"; 6 | import { Icon } from "astro-icon/components"; 7 | --- 8 | 9 | 10 | 11 | 12 | Contact 13 | We are a here to help. 14 | 15 | 16 |
    17 |
    18 |

    Contact Astroship

    19 |

    20 | Have something to say? We are here to help. Fill up the form or send 21 | email or call phone. 22 |

    23 |
    24 |
    25 | 26 | 1734 Sanfransico, CA 93063 27 |
    33 | +1 (987) 4587 899 36 |
    37 |
    38 |
    39 |
    40 | 41 |
    42 |
    43 |
    44 |
    45 | -------------------------------------------------------------------------------- /src/components/hero.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { Picture } from "astro:assets"; 3 | import heroImage from "@/assets/hero.png"; 4 | import Link from "@/components/ui/link.astro"; 5 | import { Icon } from "astro-icon/components"; 6 | --- 7 | 8 |
    10 | 20 |
    21 |

    23 | Marketing website done with Astro 24 |

    25 |

    26 | Astroship is a starter template for startups, marketing websites & landing 27 | pages. Built with Astro.build and TailwindCSS. You can quickly create 28 | any website with this starter. 29 |

    30 |
    31 | 37 | 38 | 39 | Download for Free 40 | 41 | 48 | 49 | GitHub Repo 50 | 51 |
    52 |
    53 |
    54 | -------------------------------------------------------------------------------- /src/pages/pricing.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Layout from "@/layouts/Layout.astro"; 3 | import Container from "@/components/container.astro"; 4 | import Sectionhead from "@/components/sectionhead.astro"; 5 | import PricingCard from "@/components/pricing.astro"; 6 | 7 | const pricing = [ 8 | { 9 | name: "Personal", 10 | price: "Free", 11 | popular: false, 12 | features: [ 13 | "Lifetime free", 14 | "Up to 3 users", 15 | "Unlimited Pages", 16 | "Astro Sub domain", 17 | "Basic Integrations", 18 | "Community Support", 19 | ], 20 | button: { 21 | text: "Get Started", 22 | link: "/", 23 | }, 24 | }, 25 | { 26 | name: "Startup", 27 | price: { 28 | monthly: "$19", 29 | annual: "$16", 30 | discount: "10%", 31 | original: "$24", 32 | }, 33 | popular: true, 34 | features: [ 35 | "All Free Features", 36 | "Up to 20 users", 37 | "20 Custom domains", 38 | "Unlimited Collaborators", 39 | "Advanced Integrations", 40 | "Priority Support", 41 | ], 42 | button: { 43 | text: "Get Started", 44 | link: "#", 45 | }, 46 | }, 47 | { 48 | name: "Enterprise", 49 | price: "Custom", 50 | popular: false, 51 | features: [ 52 | "All Pro Features", 53 | "Unlimited Custom domains", 54 | "99.99% Uptime SLA", 55 | "SAML & SSO Integration", 56 | "Dedicated Account Manager", 57 | "24/7 Phone Support", 58 | ], 59 | button: { 60 | text: "Contact us", 61 | link: "/contact", 62 | }, 63 | }, 64 | ]; 65 | --- 66 | 67 | 68 | 69 | 70 | Pricing 71 | 72 | Simple & Predictable pricing. No Surprises. 73 | 74 | 75 | 76 |
    78 | {pricing.map((item) => )} 79 |
    80 |
    81 |
    82 | -------------------------------------------------------------------------------- /src/layouts/Layout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { SEO } from "astro-seo"; 3 | import Footer from "@/components/footer.astro"; 4 | import Navbar from "@/components/navbar/navbar.astro"; 5 | import "@fontsource-variable/inter/index.css"; 6 | import "@fontsource-variable/bricolage-grotesque"; 7 | import "../styles/global.css"; 8 | 9 | export interface Props { 10 | title: string; 11 | } 12 | 13 | const canonicalURL = new URL(Astro.url.pathname, Astro.site).toString(); 14 | 15 | const resolvedImageWithDomain = new URL( 16 | "/opengraph.jpg", 17 | Astro.site 18 | ).toString(); 19 | 20 | const { title } = Astro.props; 21 | 22 | const makeTitle = title 23 | ? title + " | " + "Astroship" 24 | : "Astroship - Starter Template for Astro with Tailwind CSS"; 25 | --- 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 57 | 58 | 59 | 60 | 61 |