├── .env.example ├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .npmrc ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── README.md ├── guides └── laravel-sanctum.md ├── package-lock.json ├── package.json ├── playwright.config.ts ├── postcss.config.cjs ├── run ├── src ├── app.css ├── app.d.ts ├── app.html ├── hooks │ ├── laravel-sanctum-fake-logged-in.ts │ ├── laravel-sanctum-fake-logged-out.ts │ ├── laravel-sanctum.ts │ └── sveltekit-default.ts ├── lib │ ├── Counter.svelte │ ├── components │ │ ├── Accordion.svelte │ │ ├── AccordionItem.svelte │ │ ├── Alert.svelte │ │ ├── Badge.svelte │ │ ├── Breadcrumb.svelte │ │ ├── ButtonGroup.svelte │ │ ├── Buttons.svelte │ │ ├── Card.svelte │ │ ├── Carousel.svelte │ │ ├── CloseButton.svelte │ │ ├── Code.svelte │ │ ├── Collapse.svelte │ │ ├── Docs │ │ │ ├── DocAccordion.svelte │ │ │ ├── DocAlert.svelte │ │ │ └── DocBadge.svelte │ │ ├── Dropdowns.svelte │ │ ├── ListGroup.svelte │ │ ├── Modal.svelte │ │ ├── NavsAndTabs.svelte │ │ ├── Pagination.svelte │ │ ├── Popovers.svelte │ │ ├── Spinners.svelte │ │ ├── Toasts.svelte │ │ └── Tooltips.svelte │ ├── form.ts │ ├── header │ │ ├── Header.svelte │ │ └── svelte-logo.svg │ ├── images │ │ ├── github.svg │ │ ├── svelte-logo.svg │ │ ├── svelte-welcome.png │ │ └── svelte-welcome.webp │ ├── ioevents │ │ ├── click.ts │ │ └── keydown.ts │ ├── tailwind.css │ ├── templates │ │ ├── Admin │ │ │ ├── API │ │ │ │ └── form.ts │ │ │ ├── Config │ │ │ │ └── charts.ts │ │ │ ├── Header.svelte │ │ │ ├── Images │ │ │ │ ├── create-account-office-dark.jpeg │ │ │ │ ├── create-account-office.jpeg │ │ │ │ ├── dashboard.png │ │ │ │ ├── forgot-password-office-dark.jpeg │ │ │ │ ├── forgot-password-office.jpeg │ │ │ │ ├── github.svg │ │ │ │ ├── login-office-dark.jpeg │ │ │ │ ├── login-office.jpeg │ │ │ │ └── twitter.svg │ │ │ ├── SideBar.svelte │ │ │ └── ToggleTheme.svelte │ │ └── Blog │ │ │ ├── Config │ │ │ ├── links.json │ │ │ └── particle.json │ │ │ ├── Header.svelte │ │ │ ├── Images │ │ │ ├── company1.png │ │ │ ├── company2.svg │ │ │ ├── company3.png │ │ │ └── company4.jpeg │ │ │ ├── Particles │ │ │ ├── Particles.svelte │ │ │ ├── global.d.ts │ │ │ ├── index.d.ts │ │ │ └── index.ts │ │ │ └── SideBar.svelte │ └── translator.ts ├── routes │ ├── admin │ │ ├── (authenticated) │ │ │ ├── +layout.svelte │ │ │ ├── +page.svelte │ │ │ ├── buttons │ │ │ │ └── +page.svelte │ │ │ ├── cards │ │ │ │ └── +page.svelte │ │ │ ├── charts │ │ │ │ └── +page.svelte │ │ │ ├── components │ │ │ │ └── +page.svelte │ │ │ ├── forms │ │ │ │ └── +page.svelte │ │ │ ├── modals │ │ │ │ └── +page.svelte │ │ │ └── tables │ │ │ │ └── +page.svelte │ │ ├── (guest) │ │ │ ├── +layout.svelte │ │ │ ├── auth │ │ │ │ ├── login │ │ │ │ │ ├── +page.server.ts │ │ │ │ │ └── +page.svelte │ │ │ │ └── logout │ │ │ │ │ └── +page.server.ts │ │ │ ├── forgot-password │ │ │ │ └── +page.svelte │ │ │ └── register │ │ │ │ └── +page.svelte │ │ ├── +error.svelte │ │ ├── +layout.server.ts │ │ └── html_head.svelte │ ├── api.ts │ ├── blog │ │ ├── +layout.svelte │ │ ├── +page.svelte │ │ └── resume │ │ │ └── +page.svelte │ └── demo │ │ ├── +layout.svelte │ │ ├── +page.svelte │ │ ├── +page.ts │ │ ├── Counter.svelte │ │ ├── Header.svelte │ │ ├── about │ │ ├── +page.svelte │ │ └── +page.ts │ │ ├── styles.css │ │ └── sverdle │ │ ├── +page.server.ts │ │ ├── +page.svelte │ │ ├── game.test.ts │ │ ├── game.ts │ │ ├── how-to-play │ │ ├── +page.svelte │ │ └── +page.ts │ │ ├── reduced-motion.ts │ │ └── words.server.ts ├── service-worker.ts └── stores │ └── menus.ts ├── start ├── route.js ├── tailwind │ ├── admin.cjs │ ├── daisy-ui.cjs │ └── index.cjs └── vite │ ├── default.vite.config.js │ └── index.js ├── static ├── favicon.png ├── icons │ ├── icon-128x128.png │ ├── icon-144x144.png │ ├── icon-152x152.png │ ├── icon-192x192.png │ ├── icon-384x384.png │ ├── icon-48x48.png │ ├── icon-512x512.png │ ├── icon-72x72.png │ └── icon-96x96.png ├── manifest.json ├── robots.txt ├── svelte-welcome.png └── svelte-welcome.webp ├── svelte.config.js ├── tailwind.config.cjs ├── tests └── demo.ts ├── tsconfig.json └── vite.config.js /.env.example: -------------------------------------------------------------------------------- 1 | VITE_APP_NAME="Project Name" 2 | VITE_BASE_API="http://api.local" 3 | VITE_SESSION_NAME="laravel_session" 4 | 5 | # url path 6 | VITE_LOGIN_PATH="/auth/login" 7 | VITE_LOGOUT_PATH="/auth/logout" 8 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript'), 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020, 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true, 19 | }, 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .DS_Store 3 | node_modules 4 | /build 5 | /.svelte-kit 6 | /package 7 | .env 8 | .env.* 9 | !.env.example 10 | .vercel 11 | .output 12 | /functions 13 | /.vercel_build_output 14 | /.idea 15 | /vite.config.js.timestamp* 16 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v16.14.2 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "pluginSearchDirs": ["."], 7 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }], 8 | "semi": false 9 | } 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SvelteKit Projects 2 | 3 | - [./run and src/route.js](#run-and-srcroutejs) 4 | - [Playwright Test Cases](#playwright-test-cases) 5 | - [Demo](#demo) 6 | - [Framework Specific Guidelines](#framework-specific-guidelines) 7 | - [Disclaimer](#disclaimer) 8 | 9 | The copy of this branch should have at least the `v1.15.10` of `@sveltejs/kit` 10 | 11 | ## ./run and src/route.js 12 | 13 | Dynamic way of serving the `./src/routes/admin`, we've added a condition inside our `start/route.js` to pre-determine the folder we want. 14 | 15 | ```bash 16 | # this demonstrates a fake logged in 17 | $> ./run admin dev 18 | $> ./run admin-in dev 19 | 20 | # this demonstrates a fake logged out 21 | $> ./run admin-out dev 22 | 23 | # this connects to your laravel sanctum 24 | $> ./run admin-laravel-sanctum dev 25 | ``` 26 | 27 | The above command is similar to what it looks like below 28 | 29 | ```bash 30 | $> ROUTE_FOLDER=admin npm run dev 31 | ``` 32 | 33 | We've stored more route projects, such as the original `demo` of sveltekit and my own resumé `blog` 34 | 35 | ```bash 36 | # this demonstrates my bio and resumé 37 | $> ./run blog dev 38 | 39 | # this demonstrates the original sveltekit counter + todo 40 | $> ./run demo dev 41 | ``` 42 | 43 | ## Playwright Test Cases 44 | 45 | When writing a test cases, rule of thumb is to name your tests with/by specific words, such as **"demo:"** 46 | 47 | ```js 48 | // tests/demo.js 49 | test('demo: about page has expected h1', async ({ page }) => { 50 | // ... 51 | }); 52 | ``` 53 | 54 | Then you can run specific folders by executing it this way 55 | 56 | ```bash 57 | ./run demo test -- -g "demo:" 58 | ``` 59 | 60 | ## Demo 61 | 62 | - [Admin logged-in](https://sveltekit-windmill-admin.vercel.app/) 63 | - [Admin logged-out](https://sveltekit-windmill-admin-out.vercel.app/) 64 | - [Bio / Resumé](https://daison.vercel.app/) 65 | 66 | ## Framework Specific Guidelines 67 | 68 | - [Setup Laravel Sanctum](/guides/laravel-sanctum.md) 69 | - ***You have backend framework? Add your sveltekit guidelines here!*** 70 | 71 | ## Disclaimer 72 | 73 | - (Admin UI) Most of the design was based originally from [Estevan Maito's](https://github.com/estevanmaito/windmill-dashboard) 74 | 75 | ## Project Sponsors 76 | 77 | - https://formatterjson.com/ 78 | - https://jsonlinter.com/ 79 | -------------------------------------------------------------------------------- /guides/laravel-sanctum.md: -------------------------------------------------------------------------------- 1 | # SvelteKit + Laravel Sanctum Setup 2 | 3 | Install sanctum under your laravel 4 | 5 | ```bash 6 | laravel/ :~$ composer require laravel/sanctum 7 | ``` 8 | 9 | Add a new route group under your `app/Http/Kernel.php` 10 | 11 | ```php 12 | 'api' => [ 13 | \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 14 | 'throttle:api', 15 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 16 | ], 17 | ``` 18 | 19 | Under `routes/api.php` 20 | 21 | ```php 22 | Route::middleware('auth:sanctum')->group(['middleware' => 'auth:sanctum'], function () { 23 | Route::post('/login', function (Request $request) { 24 | $credentials = $request->validate([ 25 | 'email' => ['required', 'email'], 26 | 'password' => ['required'], 27 | ]); 28 | 29 | return response()->json(['authenticated' => Auth::attempt($credentials)]); 30 | }); 31 | 32 | Route::get('/logged-in', function (Request $request) { 33 | return response()->json([ 34 | 'user' => $request->user()->only('id', 'email', 'first_name', 'last_name', 'image'), 35 | ]); 36 | }); 37 | 38 | Route::match(['get', 'post'], '/logout', function (Request $request) { 39 | \Illuminate\Support\Facades\Auth::logout(); 40 | return response()->json(['authenticated' => false]); 41 | }); 42 | }); 43 | ``` 44 | 45 | The above code, we serve 3 routes, that is `/login`, `/logged-in` and `/logout` 46 | 47 | ## SvelteKit Starter Configuration 48 | 49 | Update the `hooks` inside **svelte.config.js** 50 | 51 | ```diff 52 | - hooks: `src/hooks/laravel-sanctum-fake-logged-in.ts`, 53 | + hooks: `src/hooks/laravel-sanctum.ts`, 54 | ``` 55 | 56 | Copy `.env.example` and make it `.env` 57 | 58 | ```bash 59 | sveltekit-starter/ :~$ cp .env.example .env 60 | ``` 61 | 62 | Then update the `VITE_BASE_API` based on your laravel url. 63 | 64 | ### How the hooks work? 65 | 66 | To explain about `laravel-sanctum.js` file 67 | 68 | - it will check if there are `locals.user` loaded, or else it fetches to your laravel endpoint `/logged-in` and passing the **user** object inside **locals.user** 69 | - then, if `laravel_session` does not exists, it will fetch `/sanctum/csrf-cookie` and sets the cookie 70 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-starter", 3 | "version": "0.0.1", 4 | "scripts": { 5 | "dev": "vite dev", 6 | "build": "vite build", 7 | "preview": "vite preview", 8 | "test": "playwright test", 9 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 10 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 11 | "test:unit": "vitest", 12 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 13 | "format": "prettier --plugin-search-dir . --write ." 14 | }, 15 | "devDependencies": { 16 | "@fontsource/fira-mono": "^4.5.10", 17 | "@neoconfetti/svelte": "^1.0.0", 18 | "@playwright/test": "^1.28.1", 19 | "@sveltejs/adapter-auto": "^2.0.0", 20 | "@sveltejs/kit": "^1.5.0", 21 | "@types/cookie": "^0.5.1", 22 | "@typescript-eslint/eslint-plugin": "^5.45.0", 23 | "@typescript-eslint/parser": "^5.45.0", 24 | "eslint": "^8.28.0", 25 | "eslint-config-prettier": "^8.5.0", 26 | "eslint-plugin-svelte": "^2.26.0", 27 | "prettier": "^2.8.0", 28 | "prettier-plugin-svelte": "^2.8.1", 29 | "svelte": "^3.54.0", 30 | "svelte-check": "^3.0.1", 31 | "tslib": "^2.4.1", 32 | "typescript": "^5.0.0", 33 | "vite": "^4.3.0", 34 | "vitest": "^0.25.3", 35 | "@sveltejs/adapter-vercel": "^1.0.0-next.62", 36 | "autoprefixer": "^10.2.5", 37 | "postcss": "^8.2.15", 38 | "svelte-bootstrap-icons": "^1.8.0", 39 | "tailwindcss": "^3.1.8", 40 | "tsparticles": "^2.2.4", 41 | "@esbuild-plugins/node-globals-polyfill": "^0.1.1", 42 | "@esbuild-plugins/node-modules-polyfill": "^0.1.4", 43 | "@lukeed/uuid": "^2.0.0", 44 | "@tailwindcss/typography": "^0.5.7", 45 | "browserify-zlib": "^0.2.0", 46 | "buffer": "^6.0.3", 47 | "cookie": "^0.4.1", 48 | "daisyui": "^2.27.0", 49 | "events": "^3.3.0", 50 | "leaflet": "^1.9.2", 51 | "process": "^0.11.10", 52 | "stream": "^0.0.2", 53 | "stream-browserify": "^3.0.0", 54 | "svelte-chartjs": "^1.0.1", 55 | "svelte-particles": "^2.2.4", 56 | "util": "^0.12.4" 57 | }, 58 | "type": "module" 59 | } 60 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import type { PlaywrightTestConfig } from '@playwright/test'; 2 | 3 | const config: PlaywrightTestConfig = { 4 | webServer: { 5 | command: 'npm run build && npm run preview', 6 | port: 4173 7 | }, 8 | testDir: 'tests', 9 | testMatch: /(.+\.)?(test|spec)\.[jt]s/ 10 | }; 11 | 12 | export default config; 13 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [require('tailwindcss'), require('autoprefixer')] 3 | } 4 | -------------------------------------------------------------------------------- /run: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # How to? 3 | # ./run {route-folder} {packages.scripts} 4 | # 5 | # As an example below: 6 | # ./run demo dev 7 | # ./run admin dev 8 | # ./run admin-in dev 9 | # ./run admin-out dev 10 | # ./run blog dev 11 | # ./run landing dev 12 | # 13 | # Others such as: 14 | # ./run admin build 15 | # ./run admin package 16 | ROUTE_FOLDER=$1 $(which npm) run $2 ${@:3} 17 | -------------------------------------------------------------------------------- /src/app.css: -------------------------------------------------------------------------------- 1 | @import '@fontsource/fira-mono'; 2 | 3 | :root { 4 | font-family: Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, 5 | Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 6 | --font-mono: 'Fira Mono', monospace; 7 | --pure-white: #ffffff; 8 | --primary-color: #b9c6d2; 9 | --secondary-color: #d0dde9; 10 | --tertiary-color: #edf0f8; 11 | --accent-color: #ff3e00; 12 | --heading-color: rgba(0, 0, 0, 0.7); 13 | --text-color: #444444; 14 | --background-without-opacity: rgba(255, 255, 255, 0.7); 15 | --column-width: 42rem; 16 | --column-margin-top: 4rem; 17 | } 18 | 19 | body { 20 | min-height: 100vh; 21 | margin: 0; 22 | background-color: var(--primary-color); 23 | background: linear-gradient( 24 | 180deg, 25 | var(--primary-color) 0%, 26 | var(--secondary-color) 10.45%, 27 | var(--tertiary-color) 41.35% 28 | ); 29 | } 30 | 31 | body::before { 32 | content: ''; 33 | width: 80vw; 34 | height: 100vh; 35 | position: absolute; 36 | top: 0; 37 | left: 10vw; 38 | z-index: -1; 39 | background: radial-gradient( 40 | 50% 50% at 50% 50%, 41 | var(--pure-white) 0%, 42 | rgba(255, 255, 255, 0) 100% 43 | ); 44 | opacity: 0.05; 45 | } 46 | 47 | #svelte { 48 | min-height: 100vh; 49 | display: flex; 50 | flex-direction: column; 51 | } 52 | 53 | h1, 54 | h2, 55 | p { 56 | font-weight: 400; 57 | color: var(--heading-color); 58 | } 59 | 60 | p { 61 | line-height: 1.5; 62 | } 63 | 64 | a { 65 | color: var(--accent-color); 66 | text-decoration: none; 67 | } 68 | 69 | a:hover { 70 | text-decoration: underline; 71 | } 72 | 73 | h1 { 74 | font-size: 2rem; 75 | text-align: center; 76 | } 77 | 78 | h2 { 79 | font-size: 1rem; 80 | } 81 | 82 | pre { 83 | font-size: 16px; 84 | font-family: var(--font-mono); 85 | background-color: rgba(255, 255, 255, 0.45); 86 | border-radius: 3px; 87 | box-shadow: 2px 2px 6px rgb(255 255 255 / 25%); 88 | padding: 0.5em; 89 | overflow-x: auto; 90 | color: var(--text-color); 91 | } 92 | 93 | input, 94 | button { 95 | font-size: inherit; 96 | font-family: inherit; 97 | } 98 | 99 | button:focus:not(:focus-visible) { 100 | outline: none; 101 | } 102 | 103 | @media (min-width: 720px) { 104 | h1 { 105 | font-size: 2.4rem; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs#typescript 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | 7 | interface Locals { 8 | // sveltekit default 9 | userid: string; 10 | 11 | // laravel sanctum 12 | user: any; 13 | session: string; 14 | } 15 | 16 | interface Session { 17 | // laravel sanctum 18 | user: any; 19 | } 20 | 21 | // interface PageData {} 22 | // interface Platform {} 23 | } 24 | } 25 | 26 | export { }; 27 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
9 | {#if language}
10 | // {language}
11 | {:else}
12 |
13 | {/if}
14 |
15 | {#if data.length}
16 | {#each data as datum, i}
17 | {datum}
18 |
19 | {#if data.length !== i + 1}
20 |
21 | {/if}
22 | {/each}
23 | {:else}
24 |
25 | {/if}
26 |
27 |
--------------------------------------------------------------------------------
/src/lib/components/Collapse.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/Collapse.svelte
--------------------------------------------------------------------------------
/src/lib/components/Docs/DocAccordion.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 | Accordion
8 | 19 | Esse labore dolore reprehenderit est laboris labore. Deserunt pariatur nisi enim nulla elit 20 | minim laborum sunt sunt labore duis sit. Dolore incididunt minim eu est dolor velit 21 | adipisicing deserunt labore. Culpa aute nostrud magna aliqua exercitation reprehenderit sunt 22 | sit. 23 |
24 | strong 25 | italic 26 |
32 | {"import Accordion from '$lib/components/Accordion.svelte'"}
33 | {"import AccordionItem from '$lib/components/AccordionItem.svelte'"}
34 | {'// can be (primary, secondary, success, danger, warning, info, light, dark)'}
35 | {"let type = 'danger'"}
36 |
37 | {''}
38 | {'Text or HTML element here.. '}
39 | {'Text or HTML element here..'}
41 | {''}
42 |
43 |
--------------------------------------------------------------------------------
/src/lib/components/Docs/DocAlert.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 | Alerts
7 |
18 | {"import Alert from '$lib/components/Alert.svelte'"}
19 | {' '}
20 | {'A simple primary alert '}
21 |
22 |
--------------------------------------------------------------------------------
/src/lib/components/Docs/DocBadge.svelte:
--------------------------------------------------------------------------------
1 |
5 |
6 | Badges
7 |
8 |
22 | {"import Badge from '$lib/components/Badge.svelte'"}
23 | {' '}
24 | {' '}
25 | {' '}
26 | {' '}
27 | {' '}
28 | {' '}
29 | {' '}
30 | {' '}
31 | {'Hello World! '}
32 |
33 |
--------------------------------------------------------------------------------
/src/lib/components/Dropdowns.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/Dropdowns.svelte
--------------------------------------------------------------------------------
/src/lib/components/ListGroup.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/ListGroup.svelte
--------------------------------------------------------------------------------
/src/lib/components/Modal.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/Modal.svelte
--------------------------------------------------------------------------------
/src/lib/components/NavsAndTabs.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/NavsAndTabs.svelte
--------------------------------------------------------------------------------
/src/lib/components/Pagination.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/Pagination.svelte
--------------------------------------------------------------------------------
/src/lib/components/Popovers.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/Popovers.svelte
--------------------------------------------------------------------------------
/src/lib/components/Spinners.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/Spinners.svelte
--------------------------------------------------------------------------------
/src/lib/components/Toasts.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/Toasts.svelte
--------------------------------------------------------------------------------
/src/lib/components/Tooltips.svelte:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/daison12006013/sveltekit-starter/e761b9f3946352b1624f5200b4c0461a5b633ac1/src/lib/components/Tooltips.svelte
--------------------------------------------------------------------------------
/src/lib/form.ts:
--------------------------------------------------------------------------------
1 | import { invalidateAll } from '$app/navigation';
2 |
3 | // this action (https://svelte.dev/tutorial/actions) allows us to
4 | // progressively enhance a