├── .npmrc ├── .vscode ├── settings.json └── extensions.json ├── src ├── routes │ ├── (app) │ │ ├── dashboard │ │ │ └── +page.svelte │ │ └── profile │ │ │ └── +page.svelte │ ├── (pages) │ │ ├── +layout.svelte │ │ ├── +page.server.js │ │ ├── +page.svelte │ │ ├── contact │ │ │ ├── +page.server.js │ │ │ └── +page.svelte │ │ ├── about │ │ │ └── +page.svelte │ │ └── services │ │ │ └── +page.svelte │ ├── robots.txt │ │ └── +server.js │ ├── login │ │ ├── +page.svelte │ │ └── +page.server.js │ ├── blog │ │ ├── [id] │ │ │ ├── +page.js │ │ │ └── +page.svelte │ │ ├── +page.js │ │ └── +page.svelte │ ├── sitemap.xml │ │ └── +server.js │ ├── website │ │ └── +server.js │ ├── +layout.svelte │ └── api │ │ └── posts.json │ │ └── +server.js ├── app.d.ts ├── app.html ├── lib │ ├── Footer.svelte │ ├── icons │ │ ├── moon.svelte │ │ └── sun.svelte │ ├── Button.svelte │ ├── Seo.svelte │ ├── Contact.svelte │ ├── Hero.svelte │ ├── What.svelte │ └── Navbar.svelte └── hooks.server.js ├── static ├── favicon.png ├── company-logo.png └── style.css ├── .gitignore ├── svelte.config.js ├── vite.config.js ├── jsconfig.json ├── package.json └── README.md /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "window.zoomLevel": 4 3 | } -------------------------------------------------------------------------------- /src/routes/(app)/dashboard/+page.svelte: -------------------------------------------------------------------------------- 1 |
2 |

Dashboard

3 |
4 | -------------------------------------------------------------------------------- /src/routes/(app)/profile/+page.svelte: -------------------------------------------------------------------------------- 1 |
2 |

Profile

3 |
4 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sharu725/sveltekit-walkthrough-website/HEAD/static/favicon.png -------------------------------------------------------------------------------- /static/company-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sharu725/sveltekit-walkthrough-website/HEAD/static/company-logo.png -------------------------------------------------------------------------------- /src/routes/(pages)/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/routes/robots.txt/+server.js: -------------------------------------------------------------------------------- 1 | export const GET = async () => { 2 | const text = "hello"; 3 | 4 | return new Response(String(text)); 5 | }; 6 | -------------------------------------------------------------------------------- /src/routes/login/+page.svelte: -------------------------------------------------------------------------------- 1 |
2 |

Login

3 | 4 |
5 | 6 |
7 |
8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | -------------------------------------------------------------------------------- /src/routes/login/+page.server.js: -------------------------------------------------------------------------------- 1 | /** @type {import('./$types').Actions} */ 2 | export const actions = { 3 | default: async ({ cookies }) => { 4 | cookies.set("access", "true"); 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | 3 | /** @type {import('@sveltejs/kit').Config} */ 4 | const config = { 5 | kit: { 6 | adapter: adapter() 7 | } 8 | }; 9 | 10 | export default config; 11 | -------------------------------------------------------------------------------- /src/routes/blog/[id]/+page.js: -------------------------------------------------------------------------------- 1 | export const load = async ({ fetch, params: { id } }) => { 2 | const res = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`); 3 | const post = await res.json(); 4 | 5 | return { 6 | post, 7 | }; 8 | }; 9 | -------------------------------------------------------------------------------- /src/routes/sitemap.xml/+server.js: -------------------------------------------------------------------------------- 1 | export const GET = async () => { 2 | const markup = "

Webjeda

"; 3 | 4 | return new Response(markup, { 5 | headers: { 6 | "Content-Type": "application/xml", 7 | }, 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /src/routes/website/+server.js: -------------------------------------------------------------------------------- 1 | export const GET = async () => { 2 | const markup = "

Webjeda

"; 3 | 4 | return new Response(markup, { 5 | headers: { 6 | "Content-Type": "text/html", 7 | }, 8 | }); 9 | }; 10 | -------------------------------------------------------------------------------- /src/routes/blog/+page.js: -------------------------------------------------------------------------------- 1 | export const load = async ({ fetch }) => { 2 | const res = await fetch("https://jsonplaceholder.typicode.com/posts"); 3 | const allPosts = await res.json(); 4 | const posts = allPosts.slice(0, 10); 5 | 6 | return { 7 | posts, 8 | }; 9 | }; 10 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | // and what to do when importing types 4 | declare namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface Platform {} 9 | } 10 | -------------------------------------------------------------------------------- /src/routes/(pages)/+page.server.js: -------------------------------------------------------------------------------- 1 | export const load = async ({ fetch }) => { 2 | const getPosts = async () => { 3 | const res = await fetch("/api/posts.json"); 4 | const data = await res.json(); 5 | return data; 6 | }; 7 | 8 | return { 9 | posts: getPosts(), 10 | }; 11 | }; 12 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { sveltekit } from "@sveltejs/kit/vite"; 2 | 3 | /** @type {import('vite').UserConfig} */ 4 | const config = { 5 | plugins: [sveltekit()], 6 | server: { 7 | fs: { 8 | // Allow serving files from one level up to the project root 9 | allow: [".."], 10 | }, 11 | }, 12 | }; 13 | 14 | export default config; 15 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | %sveltekit.head% 9 | 10 | 11 |
12 | %sveltekit.body% 13 |
14 | 15 | -------------------------------------------------------------------------------- /src/routes/blog/[id]/+page.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 |
10 |

{post.title}

11 |

{post.body}

12 |
13 | 14 | 19 | -------------------------------------------------------------------------------- /src/lib/Footer.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 |
Copyright © Your Website {year}
7 |
8 | 9 | 20 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 |
8 | 9 | 10 |
11 |
12 | 13 | 20 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. 3 | // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp 4 | 5 | // List of extensions which should be recommended for users of this workspace. 6 | "recommendations": [ 7 | 8 | ], 9 | // List of extensions recommended by VS Code that should not be recommended for users of this workspace. 10 | "unwantedRecommendations": [ 11 | 12 | ] 13 | } -------------------------------------------------------------------------------- /src/lib/icons/moon.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /src/lib/Button.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 13 | 30 | -------------------------------------------------------------------------------- /src/lib/Seo.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | {title} 13 | 14 | {@html ``} 23 | 24 | -------------------------------------------------------------------------------- /src/hooks.server.js: -------------------------------------------------------------------------------- 1 | import { redirect } from "@sveltejs/kit"; 2 | 3 | /** @type {import('@sveltejs/kit').Handle} */ 4 | export const handle = async ({ event, resolve }) => { 5 | const access = event.cookies.get("access") === "true"; 6 | 7 | if (!access && event.route.id?.startsWith("/(app)")) { 8 | throw redirect(302, "/login"); 9 | } 10 | 11 | const theme = event.cookies.get("siteTheme"); 12 | 13 | const response = await resolve(event, { 14 | transformPageChunk: ({ html }) => 15 | html.replace('data-theme=""', `data-theme="${theme}"`), 16 | }); 17 | return response; 18 | }; 19 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias and https://kit.svelte.dev/docs/configuration#files 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-walkthrough", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", 10 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch" 11 | }, 12 | "devDependencies": { 13 | "@sveltejs/adapter-auto": "^1.0.0", 14 | "@sveltejs/kit": "^1.0.0", 15 | "svelte": "^3.54.0", 16 | "svelte-check": "^2.9.2", 17 | "typescript": "^4.9.3", 18 | "vite": "^4.0.0", 19 | "yup": "^0.32.11" 20 | }, 21 | "type": "module" 22 | } 23 | -------------------------------------------------------------------------------- /src/routes/blog/+page.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 |
10 |

Blog Posts

11 | 12 | {#each posts as post} 13 | 14 |

{post.title}

15 |
16 | {/each} 17 |
18 | 19 | 24 | 25 | 34 | -------------------------------------------------------------------------------- /static/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --primary-color: #6495ed; 3 | --bg-color: white; 4 | --color: #333; 5 | } 6 | 7 | [data-theme="dark"] { 8 | --primary-color: #2b3f63; 9 | --bg-color: #000; 10 | --color: #ddd; 11 | } 12 | 13 | body { 14 | margin: 0; 15 | font-family: -apple-system, BlinkMacSystemFont, segoe ui, Roboto, 16 | helvetica neue, Arial, noto sans, sans-serif, apple color emoji, 17 | segoe ui emoji, segoe ui symbol, noto color emoji; 18 | background-color: var(--bg-color); 19 | color: var(--color); 20 | } 21 | 22 | .container { 23 | max-width: 960px; 24 | margin: 0 auto; 25 | } 26 | 27 | input, textarea { 28 | background-color: transparent; 29 | } 30 | -------------------------------------------------------------------------------- /src/lib/Contact.svelte: -------------------------------------------------------------------------------- 1 |
2 |

Contact Us

3 |

Start Bootstrap

4 |

3481 Melrose Place

5 |

Beverly Hills, CA 90210

6 |

P: (123) 456-7890

7 |

E:name@example.com

8 |
9 | 10 | 29 | -------------------------------------------------------------------------------- /src/lib/Hero.svelte: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Business Name or Tagline

4 |

5 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non possimus ab 6 | labore provident mollitia. Id assumenda voluptate earum corporis facere 7 | quibusdam quisquam iste ipsa cumque unde nisi, totam quas ipsam. 8 |

9 |
10 |
11 | 12 | 29 | -------------------------------------------------------------------------------- /src/routes/(pages)/+page.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 |
13 |
14 | {#each posts as { id, title, image, body }} 15 |
16 |

{title.substring(0, 20)}

17 | {title} 18 |

{body.substring(0, 80)}

19 |
20 | {/each} 21 |
22 |
23 | 24 | 25 | 26 | 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # create-svelte 2 | 3 | Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte). 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npm create svelte@latest 12 | 13 | # create a new project in my-app 14 | npm create svelte@latest my-app 15 | ``` 16 | 17 | ## Developing 18 | 19 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 20 | 21 | ```bash 22 | npm run dev 23 | 24 | # or start the server and open the app in a new browser tab 25 | npm run dev -- --open 26 | ``` 27 | 28 | ## Building 29 | 30 | To create a production version of your app: 31 | 32 | ```bash 33 | npm run build 34 | ``` 35 | 36 | You can preview the production build with `npm run preview`. 37 | 38 | > To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. 39 | -------------------------------------------------------------------------------- /src/routes/api/posts.json/+server.js: -------------------------------------------------------------------------------- 1 | import { json } from "@sveltejs/kit"; 2 | 3 | export const GET = async () => { 4 | const posts = [ 5 | { 6 | id: 1, 7 | title: 8 | "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", 9 | image: "https://picsum.photos/id/10/800/500", 10 | body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto", 11 | }, 12 | { 13 | id: 2, 14 | title: "qui est esse", 15 | image: "https://picsum.photos/id/17/800/500", 16 | body: "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla", 17 | }, 18 | { 19 | id: 3, 20 | title: "ea molestias quasi exercitationem repellat qui ipsa sit aut", 21 | image: "https://picsum.photos/id/49/800/500", 22 | body: "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut", 23 | }, 24 | ]; 25 | 26 | return json(posts) 27 | }; 28 | -------------------------------------------------------------------------------- /src/lib/What.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 |
8 |

What We Do?

9 |

10 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. A deserunt neque 11 | tempore recusandae animi soluta quasi? Asperiores rem dolore eaque vel, 12 | porro, soluta unde debitis aliquam laboriosam. Repellat explicabo, 13 | maiores! 14 |

15 |

16 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis optio 17 | neque consectetur consequatur magni in nisi, natus beatae quidem quam odit 18 | commodi ducimus totam eum, alias, adipisci nesciunt voluptate. Voluptatum. 19 |

20 | 21 | 24 |
25 | 26 |
27 | 28 | 47 | -------------------------------------------------------------------------------- /src/lib/icons/sun.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | -------------------------------------------------------------------------------- /src/routes/(pages)/contact/+page.server.js: -------------------------------------------------------------------------------- 1 | import { fail } from "@sveltejs/kit"; 2 | import { object, string, number, date, InferType } from "yup"; 3 | 4 | export const actions = { 5 | default: async ({ request }) => { 6 | const formData = await request.formData(); 7 | const name = formData.get("name"); 8 | const email = formData.get("email"); 9 | const message = formData.get("message"); 10 | 11 | const contactFormSchema = object({ 12 | name: string().min(2, "too short").required("We only accept named users"), 13 | email: string().required().email(), 14 | message: string().required(), 15 | }); 16 | 17 | try { 18 | const result = await contactFormSchema.validate( 19 | { name, email, message }, 20 | { abortEarly: false } 21 | ); 22 | 23 | const prefilledLink = `https://docs.google.com/forms/d/e/1FAIpQLSeOGNYx08uzHGf3HASA_CDn6z6adFT4_N0w6OvZduCBxMRfEw/formResponse?usp=pp_url&entry.190919771=${name}&entry.543063817=${email}&entry.2120037074=${message}&submit=Submit`; 24 | 25 | const res = await fetch(prefilledLink); 26 | 27 | return { 28 | success: true, 29 | status: "Form is submitted", 30 | }; 31 | } catch (error) { 32 | console.log({ error }); 33 | const errors = error.inner.reduce((acc, err) => { 34 | return { ...acc, [err.path]: err.message }; 35 | }, {}); 36 | 37 | return { 38 | errors, 39 | name, 40 | email, 41 | message, 42 | }; 43 | } 44 | }, 45 | }; 46 | -------------------------------------------------------------------------------- /src/routes/(pages)/about/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 |
8 |

About Us

9 |

10 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. A deserunt neque 11 | tempore recusandae animi soluta quasi? Asperiores rem dolore eaque vel, 12 | porro, soluta unde debitis aliquam laboriosam. Repellat explicabo, 13 | maiores! 14 |

15 | 16 |

17 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis optio 18 | neque consectetur consequatur magni in nisi, natus beatae quidem quam odit 19 | commodi ducimus totam eum, alias, adipisci nesciunt voluptate. Voluptatum. 20 |

21 | 22 |

23 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. A deserunt neque 24 | tempore recusandae animi soluta quasi? Asperiores rem dolore eaque vel, 25 | porro, soluta unde debitis aliquam laboriosam. Repellat explicabo, 26 | maiores! 27 |

28 |

29 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. A deserunt neque 30 | tempore recusandae animi soluta quasi? Asperiores rem dolore eaque vel, 31 | porro, soluta unde debitis aliquam laboriosam. Repellat explicabo, 32 | maiores! 33 |

34 |

35 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. A deserunt neque 36 | tempore recusandae animi soluta quasi? Asperiores rem dolore eaque vel, 37 | porro, soluta unde debitis aliquam laboriosam. Repellat explicabo, 38 | maiores! 39 |

40 |

41 | Lorem ipsum dolor sit amet, consectetur adipisicing elit. A deserunt neque 42 | tempore recusandae animi soluta quasi? Asperiores rem dolore eaque vel, 43 | porro, soluta unde debitis aliquam laboriosam. Repellat explicabo, 44 | maiores! 45 |

46 |
47 | 48 |
49 | 50 | 68 | -------------------------------------------------------------------------------- /src/lib/Navbar.svelte: -------------------------------------------------------------------------------- 1 | 55 | 56 | 85 | 86 | 124 | -------------------------------------------------------------------------------- /src/routes/(pages)/contact/+page.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 |
11 |

Contact us

12 | {#if form?.success} 13 |

{form?.status || ""}

14 | {:else} 15 |
{ 18 | return async ({ result }) => { 19 | await applyAction(result); 20 | }; 21 | }} 22 | > 23 |
24 | 25 |
26 | 35 | {#if form?.errors?.name} 36 |

{form?.errors?.name}

37 | {/if} 38 |
39 |
40 | 41 |
42 | 43 |
44 | 53 | {#if form?.errors?.email} 54 |

{form?.errors?.email}

55 | {/if} 56 |
57 |
58 | 59 |
60 | 61 |
62 |