├── src
├── routes
│ ├── about
│ │ └── +page.svelte
│ ├── account
│ │ ├── +page.svelte
│ │ └── +page.ts
│ ├── privacy
│ │ └── +page.svelte
│ ├── terms
│ │ └── +page.svelte
│ ├── checkout
│ │ ├── +page.ts
│ │ ├── success
│ │ │ └── [code]
│ │ │ │ ├── +page.svelte
│ │ │ │ └── +page.ts
│ │ └── +page.svelte
│ ├── auth
│ │ ├── signout
│ │ │ ├── +page.ts
│ │ │ └── +page.svelte
│ │ ├── +page.ts
│ │ ├── verify
│ │ │ ├── +page.ts
│ │ │ └── +page.svelte
│ │ └── +page.svelte
│ ├── +page.svelte
│ ├── braintree
│ │ ├── success
│ │ │ └── [code]
│ │ │ │ ├── +page.svelte
│ │ │ │ └── +page.ts
│ │ ├── +page.ts
│ │ └── +page.svelte
│ ├── +layout.ts
│ ├── carousel
│ │ ├── +page.ts
│ │ └── +page.svelte
│ ├── collection
│ │ └── [slug]
│ │ │ ├── +page.ts
│ │ │ └── +page.svelte
│ ├── product
│ │ └── [slug]
│ │ │ ├── +page.ts
│ │ │ └── +page.svelte
│ ├── test
│ │ ├── +page.ts
│ │ └── +page.svelte
│ ├── search
│ │ └── +page.svelte
│ └── +layout.svelte
├── lib
│ ├── components
│ │ ├── Newsletter.svelte
│ │ ├── Highlights.svelte
│ │ ├── AppleButton.svelte
│ │ ├── SearchHit.svelte
│ │ ├── CheckoutSuccess.svelte
│ │ ├── VendureAsset.svelte
│ │ ├── Rating.svelte
│ │ ├── ThemeSwitcher.svelte
│ │ ├── AuthContainer.svelte
│ │ ├── ShowHideIcon.svelte
│ │ ├── CarouselItem.svelte
│ │ ├── InputCheckbox.svelte
│ │ ├── Footer.svelte
│ │ ├── Gallery.svelte
│ │ ├── MetaTags.svelte
│ │ ├── Star.svelte
│ │ ├── SearchBox.svelte
│ │ ├── Account.svelte
│ │ ├── NavBar.svelte
│ │ ├── ThemeScript.svelte
│ │ ├── InputText.svelte
│ │ ├── FAQ.svelte
│ │ ├── SideBar.svelte
│ │ ├── SocialLinks.svelte
│ │ ├── CheckoutOrderSummary.svelte
│ │ ├── ProductReviews.svelte
│ │ ├── Theme.svelte
│ │ ├── Cart.svelte
│ │ └── GooglePlacesAutocomplete.svelte
│ ├── gql
│ │ ├── index.ts
│ │ └── fragment-masking.ts
│ ├── vendure
│ │ ├── index.ts
│ │ ├── collection.graphql.ts
│ │ ├── product.graphql.ts
│ │ ├── customer.graphql.ts
│ │ └── order.graphql.ts
│ ├── utils.ts
│ ├── stores.ts
│ └── validators.ts
├── index.test.ts
├── app.html
├── app.d.ts
├── environment.d.ts
├── hooks.server.ts
└── app.pcss
├── .npmrc
├── static
├── logo.png
├── favicon.png
├── img
│ ├── noimg.png
│ └── icon-apple.svg
├── robots.txt
├── crossdomain.xml
└── logo.svg
├── .gitignore
├── tests
└── test.ts
├── playwright.config.ts
├── postcss.config.cjs
├── vite.config.ts
├── tsconfig.json
├── codegen.ts
├── tailwind.config.cjs
├── LICENSE
├── svelte.config.js
├── .env.example
├── package.json
└── README.md
/src/routes/about/+page.svelte:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/routes/account/+page.svelte:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/routes/privacy/+page.svelte:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/routes/terms/+page.svelte:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/lib/components/Newsletter.svelte:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
2 | resolution-mode=highest
3 |
--------------------------------------------------------------------------------
/src/routes/account/+page.ts:
--------------------------------------------------------------------------------
1 | export const prerender = false
--------------------------------------------------------------------------------
/src/routes/checkout/+page.ts:
--------------------------------------------------------------------------------
1 | export const prerender = false
--------------------------------------------------------------------------------
/src/routes/auth/signout/+page.ts:
--------------------------------------------------------------------------------
1 | export const prerender = false
--------------------------------------------------------------------------------
/src/lib/gql/index.ts:
--------------------------------------------------------------------------------
1 | export * from "./fragment-masking";
2 | export * from "./gql";
--------------------------------------------------------------------------------
/static/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pevey/sveltekit-vendure-starter/HEAD/static/logo.png
--------------------------------------------------------------------------------
/static/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pevey/sveltekit-vendure-starter/HEAD/static/favicon.png
--------------------------------------------------------------------------------
/static/img/noimg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pevey/sveltekit-vendure-starter/HEAD/static/img/noimg.png
--------------------------------------------------------------------------------
/src/index.test.ts:
--------------------------------------------------------------------------------
1 | import { describe, it, expect } from 'vitest'
2 |
3 | describe('sum test', () => {
4 | it('adds 1 + 2 to equal 3', () => {
5 | expect(1 + 2).toBe(3);
6 | })
7 | })
8 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /build
4 | /.svelte-kit
5 | /.vercel
6 | /package
7 | .env
8 | .env.*
9 | !.env.example
10 | vite.config.js.timestamp-*
11 | vite.config.ts.timestamp-*
12 | yarn-error.log
--------------------------------------------------------------------------------
/static/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow: /account
3 | Disallow: /terms
4 | Disallow: /privacy
5 | Disallow: /auth
6 | Disallow: /api
7 | Disallow: /checkout
8 | Disallow: /search
9 |
10 | User-agent: GPTBot
11 | Disallow: /
--------------------------------------------------------------------------------
/static/crossdomain.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Order not found
10 | {/if} -------------------------------------------------------------------------------- /src/routes/checkout/success/[code]/+page.svelte: -------------------------------------------------------------------------------- 1 | 6 | {#if data.code} 7 |Order not found
10 | {/if} -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | const tailwindcss = require("tailwindcss") 2 | const autoprefixer = require("autoprefixer") 3 | 4 | const config = { 5 | plugins: [ 6 | //Some plugins, like tailwindcss/nesting, need to run before Tailwind, 7 | tailwindcss(), 8 | //But others, like autoprefixer, need to run after, 9 | autoprefixer, 10 | ], 11 | } 12 | 13 | module.exports = config 14 | -------------------------------------------------------------------------------- /src/routes/+layout.ts: -------------------------------------------------------------------------------- 1 | import { createClient, GetTopLevelCollections } from '$lib/vendure' 2 | 3 | const client = createClient() 4 | 5 | export const prerender = true 6 | 7 | export async function load() { 8 | return { 9 | client, 10 | collections: await client.query(GetTopLevelCollections, {}).toPromise().then((result) => result?.data?.collections?.items) 11 | } 12 | } -------------------------------------------------------------------------------- /src/routes/carousel/+page.ts: -------------------------------------------------------------------------------- 1 | import type { PageLoad } from './$types' 2 | import { GetCollection } from '$lib/vendure' 3 | 4 | export const load = (async function ({ parent }) { 5 | const { client } = await parent() 6 | return { 7 | result: await client.query(GetCollection, { slug: "electronics" }).toPromise().then((result: any) => result?.data) 8 | } 9 | }) satisfies PageLoad -------------------------------------------------------------------------------- /src/routes/collection/[slug]/+page.ts: -------------------------------------------------------------------------------- 1 | import type { PageLoad } from './$types' 2 | import { GetCollection } from '$lib/vendure' 3 | 4 | export const load = (async function ({ parent, params }) { 5 | const { client } = await parent() 6 | return { 7 | result: await client.query(GetCollection, { slug: params.slug }).toPromise().then((result: any) => result?.data) 8 | } 9 | }) satisfies PageLoad -------------------------------------------------------------------------------- /src/routes/product/[slug]/+page.ts: -------------------------------------------------------------------------------- 1 | import type { PageLoad } from './$types' 2 | import { GetProduct } from '$lib/vendure' 3 | 4 | export const load = (async function ({ parent, params }) { 5 | const { client } = await parent() 6 | return { 7 | client, 8 | product: await client.query(GetProduct, { slug: params.slug }).toPromise().then((result: any) => result?.data?.product) 9 | } 10 | }) satisfies PageLoad -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |{rating} out of 5 stars
21 |You have been successfully signed out.
31 | 32 |There was an error signing you out. Please try again.
38 |No results found.
29 | {:else} 30 |Enter a search term.
31 | {/if} 32 | {/each} 33 |Your email has been verified.
34 | 35 |There was an error verifying your email. Please try again.
41 | 42 |If you have or are able to purchase a coffee grinder, we recommend purchasing whole bean coffee. 8 | Coffee will lose its freshness much more quickly after it has been ground. 9 | That said, convenience is also an important part of enjoying your favorite brew. For that reason, we offer a variety of ground coffee options. 10 | When selecting ground coffee, keep in mind the way you intend to brew it. These are general rules of thumb:
11 |Coffee is a considered to be a shelf-stable food that is safe to consume for many months after it has been roasted. 22 | That said, just because a food is safe, that does not mean it will have optimal taste. 23 | Coffee reaches optimal flavor about 2-3 days after roasting, and then it begins to lose that flavor at a decreasing rate. 24 | We recommend choosing a size that will last you one month or less if possible. Life is too short to drink stale coffee!
25 |Our coffee is shipped on the same day it is roasted, with the exception of K-Cups, office packs, and our small 2 oz sample packs. 29 | Why? After roasting, coffee releases carbon dioxide, which can cause the coffee to expand and burst the packaging. 30 | Our K-Cups, office packs, and 2 oz sample packs do not have the little valves that are on our 10 oz, 16 oz, and 5 lb packaging that prevent the bags from bursting. 31 | As a result, the coffee has to "rest" for 3 days after roasting before it is safe to package and ship. 32 | This is inherent to the design of K-Cups and is not specific to our processes. 33 | We make runs of K-Cups and office packs about once per week. 34 |
35 |No products found
48 | {/each} 49 |facets
47 |Price: {formatCurrency(line.unitPrice, currency)}
48 |Quantity: {line.quantity}
49 |100 | Total 101 | {formatCurrency(order.totalWithTax, currency)} 102 |
103 | 104 |{new Date(review.created_at).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })}
118 |{review.content}
121 |{@html xss(product.description || '')}
56 | {#if (product.variants?.length && product.variants?.length > 1)} 57 |{formatCurrency(product.variants[product.variants.findIndex(v => v.id === selectedVariantId)].price, PUBLIC_DEFAULT_CURRENCY)}
98 |/ {product.variants[product.variants.findIndex(v => v.id === selectedVariantId)]?.name}
99 |
87 | {/if}
88 | Facet Values will go here
96 | 97 |{formatCurrency(line.linePrice, PUBLIC_DEFAULT_CURRENCY)}
99 |Qty: {line.quantity}
100 |Shipping and taxes will be calculated at checkout.
136 |Your cart is empty.
224 | {:else if !$addressQuery?.fetching} 225 |Your cart is empty.
208 | {:else if !token && PUBLIC_TURNSTILE_SITE_KEY} 209 |