chore: Rewrite svelte example (#170)

* new svelte example

* ignore all target dirs

* move example a folder up

* remove old svelte example

* fix path error due to project relocation

Co-authored-by: FabianLars <fabianlars@fabianlars.de>
This commit is contained in:
Vilian Gerdzhikov
2022-11-16 15:21:02 +02:00
committed by GitHub
parent deefe16866
commit 3128e46281
90 changed files with 840 additions and 1266 deletions

2
.gitignore vendored
View File

@@ -7,7 +7,7 @@ debug.log
package-lock.json
yarn.lock
/target
target
Cargo.lock
node_modules/

View File

@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Tauri-Sql Plugin Todo Example</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View File

@@ -0,0 +1,28 @@
{
"name": "svelte-ts",
"private": true,
"version": "1.2.0",
"type": "module",
"scripts": {
"tauri":"tauri",
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.json"
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^1.1.0",
"@tauri-apps/api": "^1.2.0",
"@tauri-apps/cli": "^1.2.0",
"@tsconfig/svelte": "^3.0.0",
"svelte": "^3.52.0",
"svelte-check": "^2.9.2",
"svelte-preprocess": "^4.10.7",
"tslib": "^2.4.0",
"typescript": "^4.6.4",
"vite": "^3.2.3"
},
"dependencies": {
"tauri-plugin-sql-api": "../.."
}
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,29 @@
[package]
name = "app"
version = "0.1.0"
description = "A Tauri App"
authors = ["you"]
license = ""
repository = ""
default-run = "app"
edition = "2021"
rust-version = "1.59"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies]
tauri-build = { version = "1.2.0", features = [] }
[dependencies]
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
tauri = { version = "1.2.0", features = ["api-all"] }
tauri-plugin-sql = { path = "../../..", features = ["sqlite"] }
[features]
# by default Tauri runs in production mode
# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL
default = [ "custom-protocol" ]
# this feature is used for production builds where `devPath` points to the filesystem
# DO NOT remove this
custom-protocol = [ "tauri/custom-protocol" ]

View File

@@ -0,0 +1,3 @@
fn main() {
tauri_build::build()
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,13 @@
#![cfg_attr(
all(not(debug_assertions), target_os = "windows"),
windows_subsystem = "windows"
)]
use tauri_plugin_sql::{Migration, MigrationKind, TauriSql};
fn main() {
tauri::Builder::default()
.plugin(TauriSql::default())
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

View File

@@ -1,23 +1,27 @@
{
"package": {
"productName": "todos-app",
"version": "0.1.0"
},
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"build": {
"distDir": "../build",
"devPath": "http://localhost:5173",
"beforeDevCommand": "yarn dev",
"beforeBuildCommand": "yarn build"
"beforeBuildCommand": "npm run build",
"beforeDevCommand": "npm run dev",
"devPath": "http://localhost:1420",
"distDir": "../dist"
},
"package": {
"productName": "svelte-todo",
"version": "0.0.1"
},
"tauri": {
"systemTray": {
"iconPath": "icons/icon.png",
"iconAsTemplate": true
"allowlist": {
"all": true
},
"bundle": {
"active": true,
"targets": "all",
"identifier": "com.parker-codes.todos-app",
"category": "DeveloperTool",
"copyright": "",
"deb": {
"depends": []
},
"externalBin": [],
"icon": [
"icons/32x32.png",
"icons/128x128.png",
@@ -25,45 +29,38 @@
"icons/icon.icns",
"icons/icon.ico"
],
"resources": [],
"externalBin": [],
"copyright": "",
"category": "Productivity",
"shortDescription": "Handy TODOs app!",
"identifier": "com.tauri.example",
"longDescription": "",
"deb": {
"depends": []
},
"macOS": {
"frameworks": [],
"minimumSystemVersion": "",
"entitlements": null,
"exceptionDomain": "",
"signingIdentity": null,
"entitlements": null
"frameworks": [],
"providerShortName": null,
"signingIdentity": null
},
"resources": [],
"shortDescription": "",
"targets": "all",
"windows": {
"certificateThumbprint": null,
"digestAlgorithm": "sha256",
"timestampUrl": ""
}
},
"security": {
"csp": null
},
"updater": {
"active": false
},
"allowlist": {
"all": true
},
"windows": [
{
"title": "TODOs",
"width": 800,
"fullscreen": false,
"height": 600,
"resizable": true,
"fullscreen": false
"title": "Svelte-Todo Example",
"width": 800
}
],
"security": {
"csp": "default-src blob: data: filesystem: ws: http: https: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'"
}
]
}
}

View File

@@ -0,0 +1,36 @@
<script>
import TodoDisplay from './lib/components/todo/display/TodoDisplay.svelte';
import TodoCreator from './lib/components/todo/create/TodoCreator.svelte';
</script>
<main>
<div class="container">
<TodoCreator />
<TodoDisplay />
</div>
</main>
<style>
:global(:root) {
--primary: #c6d7dd;
--secondary: #c0c0c2;
--bg-100: rgb(94, 94, 94);
--bg-200: #424242;
--bg-300: #252525;
--bg-400: #202020;
}
main {
min-height: 100vh;
min-width: 100vw;
background-color: var(--bg-300);
}
.container {
max-width: 600px;
margin: auto;
padding: 1rem 0;
display: flex;
flex-direction: column;
gap: 1rem;
}
</style>

View File

@@ -0,0 +1,354 @@
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="26.6" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 308"><path fill="#FF3E00" d="M239.682 40.707C211.113-.182 154.69-12.301 113.895 13.69L42.247 59.356a82.198 82.198 0 0 0-37.135 55.056a86.566 86.566 0 0 0 8.536 55.576a82.425 82.425 0 0 0-12.296 30.719a87.596 87.596 0 0 0 14.964 66.244c28.574 40.893 84.997 53.007 125.787 27.016l71.648-45.664a82.182 82.182 0 0 0 37.135-55.057a86.601 86.601 0 0 0-8.53-55.577a82.409 82.409 0 0 0 12.29-30.718a87.573 87.573 0 0 0-14.963-66.244"></path><path fill="#FFF" d="M106.889 270.841c-23.102 6.007-47.497-3.036-61.103-22.648a52.685 52.685 0 0 1-9.003-39.85a49.978 49.978 0 0 1 1.713-6.693l1.35-4.115l3.671 2.697a92.447 92.447 0 0 0 28.036 14.007l2.663.808l-.245 2.659a16.067 16.067 0 0 0 2.89 10.656a17.143 17.143 0 0 0 18.397 6.828a15.786 15.786 0 0 0 4.403-1.935l71.67-45.672a14.922 14.922 0 0 0 6.734-9.977a15.923 15.923 0 0 0-2.713-12.011a17.156 17.156 0 0 0-18.404-6.832a15.78 15.78 0 0 0-4.396 1.933l-27.35 17.434a52.298 52.298 0 0 1-14.553 6.391c-23.101 6.007-47.497-3.036-61.101-22.649a52.681 52.681 0 0 1-9.004-39.849a49.428 49.428 0 0 1 22.34-33.114l71.664-45.677a52.218 52.218 0 0 1 14.563-6.398c23.101-6.007 47.497 3.036 61.101 22.648a52.685 52.685 0 0 1 9.004 39.85a50.559 50.559 0 0 1-1.713 6.692l-1.35 4.116l-3.67-2.693a92.373 92.373 0 0 0-28.037-14.013l-2.664-.809l.246-2.658a16.099 16.099 0 0 0-2.89-10.656a17.143 17.143 0 0 0-18.398-6.828a15.786 15.786 0 0 0-4.402 1.935l-71.67 45.674a14.898 14.898 0 0 0-6.73 9.975a15.9 15.9 0 0 0 2.709 12.012a17.156 17.156 0 0 0 18.404 6.832a15.841 15.841 0 0 0 4.402-1.935l27.345-17.427a52.147 52.147 0 0 1 14.552-6.397c23.101-6.006 47.497 3.037 61.102 22.65a52.681 52.681 0 0 1 9.003 39.848a49.453 49.453 0 0 1-22.34 33.12l-71.664 45.673a52.218 52.218 0 0 1-14.563 6.398"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"
><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path
d="M200 344V280H136C122.7 280 112 269.3 112 256C112 242.7 122.7 232 136 232H200V168C200 154.7 210.7 144 224 144C237.3 144 248 154.7 248 168V232H312C325.3 232 336 242.7 336 256C336 269.3 325.3 280 312 280H248V344C248 357.3 237.3 368 224 368C210.7 368 200 357.3 200 344zM0 96C0 60.65 28.65 32 64 32H384C419.3 32 448 60.65 448 96V416C448 451.3 419.3 480 384 480H64C28.65 480 0 451.3 0 416V96zM48 96V416C48 424.8 55.16 432 64 432H384C392.8 432 400 424.8 400 416V96C400 87.16 392.8 80 384 80H64C55.16 80 48 87.16 48 96z"
/></svg
>
<style>
svg {
height: 100%;
width: 100%;
}
</style>

After

Width:  |  Height:  |  Size: 836 B

View File

@@ -0,0 +1,59 @@
<script>
import { todoStore } from '../../../stores/todoStore';
import AddIcon from './AddIcon.svelte';
let todoTitle = '';
const createNewTask = () => {
if (!todoTitle) return;
todoStore.create(todoTitle);
todoTitle = '';
};
</script>
<form on:submit|preventDefault={createNewTask}>
<input bind:value={todoTitle} type="text" placeholder="Create new todo" />
<button class:valid={todoTitle} type="submit">
<AddIcon />
</button>
</form>
<style>
form {
display: flex;
background-color: var(--bg-200);
justify-content: space-between;
padding: 0.75rem 1rem;
border-radius: 0.5rem;
font-size: x-large;
}
form > * {
background-color: transparent;
outline: none;
border: none;
}
* {
font-size: inherit;
}
button {
height: auto;
display: flex;
height: 2.25rem;
width: 2.25rem;
cursor: pointer;
fill: var(--bg-400);
}
button.valid {
fill: var(--primary);
}
input {
flex: 1;
padding-left: 0.25rem;
color: var(--primary);
}
input::placeholder {
color: var(--bg-400);
}
</style>

View File

@@ -0,0 +1,30 @@
<script lang="ts">
import { todoStore } from '../../../stores/todoStore';
</script>
{#if $todoStore.length > 0}
<table>
<slot />
</table>
{:else}
<div>
<span> No todos found in the database </span>
<br />
<br />
<span> Try creating some todos in the above field </span>
</div>
{/if}
<style>
div,
table {
text-align: center;
color: var(--primary);
border-spacing: 0;
}
span {
font-size: large;
font-weight: bold;
color: var(--text);
}
</style>

View File

@@ -0,0 +1,84 @@
<script lang="ts">
import { todoStore } from '../../../stores/todoStore';
</script>
<tbody>
{#each $todoStore as { completed, id, title } (id)}
<tr>
<td>{id}</td>
<td>{title}</td>
<td>
<!-- IMPORTANTR -->
<!-- Ordering of the directives (bind & on:change) matters! -->
<input
bind:checked={completed}
on:change={() => {
todoStore.update({
completed,
id,
title,
});
}}
type="checkbox"
/>
</td>
<td>
<button
on:click={() => {
todoStore.remove(id);
}}
type="checkbox">Delete</button
>
</td>
</tr>
{/each}
</tbody>
<style>
button {
padding: 0.3rem 0.4rem;
background-color: var(--bg-midtone);
color: var(--text);
cursor: pointer;
border: none;
border-radius: 0.35rem;
transition: background-color 0.1s ease-in;
}
button:hover {
background-color: var(--text-highlited);
color: var(--bg-light);
}
input {
cursor: pointer;
transform: scale(2);
}
td:nth-child(3) {
width: 1px;
}
tbody:before {
content: '';
display: block;
height: 0.5rem;
}
tr:first-child > td:last-child {
border-radius: 0 1rem 0 0;
}
tr:first-child > td:first-child {
border-radius: 1rem 0 0 0;
}
tr:last-child > td:last-child {
border-radius: 0 0 1rem;
}
tr:last-child > td:first-child {
border-radius: 0 0 0 1rem;
}
tr:nth-child(even) {
background-color: var(--bg-200);
}
tr:nth-child(odd) {
background-color: var(--bg-100);
}
</style>

View File

@@ -0,0 +1,12 @@
<script lang="ts">
let tableHeaders = ['ID', 'Title', 'Completed', 'Action'];
</script>
<!-- Table head -->
<thead>
<tr>
{#each tableHeaders as header}
<th>{header}</th>
{/each}
</tr>
</thead>

View File

@@ -0,0 +1,10 @@
<script lang="ts">
import Table from './Table.svelte';
import TableBody from './TableBody.svelte';
import TableHeaders from './TableHeaders.svelte';
</script>
<Table>
<TableHeaders />
<TableBody />
</Table>

View File

@@ -0,0 +1,49 @@
import { writable } from "svelte/store";
import Database, { type QueryResult } from 'tauri-plugin-sql-api';
export type Todo = {
title: string;
id: number;
completed: boolean;
}
const createTodoStore = async () => {
const { subscribe, set, update} = writable<Todo[]>([]);
// New database connection
let db = await Database.load('sqlite:db.sqlite')
// Migrations
await db.execute("CREATE TABLE IF NOT EXISTS todo (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, title VARCHAR(200) NOT NULL, completed BOOLEAN DEFAULT FALSE);");
const fetchAll = async () => {
const allTodos = await db.select('SELECT * FROM todo') as Todo[]
set(allTodos)
}
await fetchAll()
return {
subscribe,
set,
create: async (title: string): Promise<QueryResult> => {
const result = await db.execute('INSERT INTO todo (title) VALUES ($1)', [title]);
await fetchAll()
return result
},
update:async (todo:Todo):Promise<QueryResult> => {
const result = await db.execute('UPDATE todo SET title = $1, completed = $2 WHERE id = $3', [todo.title, todo.completed, todo.id]);
await fetchAll()
return result
},
remove:async (id:number):Promise<QueryResult> => {
const result = await db.execute('DELETE FROM todo WHERE id = $1', [id]);
await fetchAll()
return result
}
}
}
export const todoStore = await createTodoStore()

View File

@@ -0,0 +1,8 @@
import './app.css'
import App from './App.svelte'
const app = new App({
target: document.getElementById('app')
})
export default app

2
examples/svelte-ts/src/vite-env.d.ts vendored Normal file
View File

@@ -0,0 +1,2 @@
/// <reference types="svelte" />
/// <reference types="vite/client" />

View File

@@ -0,0 +1,7 @@
import sveltePreprocess from 'svelte-preprocess'
export default {
// Consult https://github.com/sveltejs/svelte-preprocess
// for more information about preprocessors
preprocess: sveltePreprocess()
}

View File

@@ -0,0 +1,21 @@
{
"extends": "@tsconfig/svelte/tsconfig.json",
"compilerOptions": {
"strict": true,
"target": "ESNext",
"useDefineForClassFields": true,
"module": "ESNext",
"resolveJsonModule": true,
/**
* Typecheck JS in `.svelte` and `.js` files by default.
* Disable checkJs if you'd like to use dynamic types in JS.
* Note that setting allowJs false does not prevent the use
* of JS in `.svelte` files.
*/
"allowJs": true,
"checkJs": true,
"isolatedModules": true
},
"include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
"references": [{ "path": "./tsconfig.node.json" }]
}

View File

@@ -0,0 +1,8 @@
{
"compilerOptions": {
"composite": true,
"module": "ESNext",
"moduleResolution": "Node"
},
"include": ["vite.config.ts"]
}

View File

@@ -0,0 +1,27 @@
import { defineConfig } from 'vite'
import { svelte } from '@sveltejs/vite-plugin-svelte'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [svelte()],
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
// prevent vite from obscuring rust errors
clearScreen: false,
// tauri expects a fixed port, fail if that port is not available
server: {
port: 1420,
strictPort: true,
},
// to make use of `TAURI_DEBUG` and other env variables
// https://tauri.studio/v1/api/config#buildconfig.beforedevcommand
envPrefix: ["VITE_", "TAURI_"],
build: {
// Tauri supports es2021
target: ["es2021", "chrome100", "safari13"],
// don't minify for debug builds
minify: !process.env.TAURI_DEBUG ? "esbuild" : false,
// produce sourcemaps for debug builds
sourcemap: !!process.env.TAURI_DEBUG,
},
})

View File

@@ -1,20 +0,0 @@
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'],
plugins: ['svelte3', '@typescript-eslint'],
ignorePatterns: ['*.cjs'],
overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }],
settings: {
'svelte3/typescript': () => require('typescript')
},
parserOptions: {
sourceType: 'module',
ecmaVersion: 2019
},
env: {
browser: true,
es2017: true,
node: true
}
};

View File

@@ -1,5 +0,0 @@
.DS_Store
node_modules
/.svelte-kit
/package
/build

View File

@@ -1 +0,0 @@
engine-strict=true

View File

@@ -1,4 +0,0 @@
.svelte-kit/**
static/**
build/**
node_modules/**

View File

@@ -1,6 +0,0 @@
{
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"tabWidth": 2
}

View File

@@ -1,38 +0,0 @@
# create-svelte
Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte);
## Creating a project
If you're seeing this, you've probably already done this step. Congrats!
```bash
# create a new project in the current directory
npm init svelte@next
# create a new project in my-app
npm init svelte@next my-app
```
> Note: the `@next` is temporary
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```bash
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
Before creating a production version of your app, install an [adapter](https://kit.svelte.dev/docs#adapters) for your target environment. Then:
```bash
npm run build
```
> You can preview the built app with `npm run preview`, regardless of whether you installed an adapter. This should _not_ be used to serve your app in production.

View File

@@ -1,46 +0,0 @@
{
"name": "todos-app",
"version": "1.1.0",
"scripts": {
"dev": "concurrently \"yarn dev:only\" \"yarn tailwind:watch\"",
"build": "yarn tailwind:build && yarn build:only",
"dev:only": "vite dev",
"build:only": "vite build",
"tailwind:watch": "cross-env TAILWIND_MODE=watch cross-env NODE_ENV=development postcss src/styles/tailwind.css -o src/styles/tailwind-output.css -w",
"tailwind:build": "cross-env TAILWIND_MODE=build cross-env NODE_ENV=production postcss src/styles/tailwind.css -o src/styles/tailwind-output.css",
"preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-check --tsconfig ./tsconfig.json --watch",
"lint": "prettier --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .",
"format": "prettier --write --plugin-search-dir=. .",
"tauri": "tauri"
},
"devDependencies": {
"@sveltejs/adapter-static": "^1.0.0-next.41",
"@sveltejs/kit": "^1.0.0-next.468",
"@tauri-apps/cli": "^1.0.5",
"@typescript-eslint/eslint-plugin": "^5.36.1",
"@typescript-eslint/parser": "^5.36.1",
"autoprefixer": "^10.4.8",
"concurrently": "^7.3.0",
"cross-env": "^7.0.3",
"eslint": "^8.23.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-svelte3": "^4.0.0",
"postcss": "^8.4.16",
"postcss-cli": "^10.0.0",
"prettier": "^2.7.1",
"prettier-plugin-svelte": "^2.7.0",
"svelte": "^3.50.0",
"svelte-check": "^2.9.0",
"svelte-preprocess": "^4.10.7",
"tailwindcss": "^3.1.8",
"tslib": "^2.4.0",
"typescript": "^4.8.2",
"vite": "^3.1.0-0"
},
"type": "module",
"dependencies": {
"tauri-plugin-sql-api": "../.."
}
}

View File

@@ -1,6 +0,0 @@
module.exports = {
plugins: {
autoprefixer: {},
tailwindcss: {}
}
};

View File

@@ -1,5 +0,0 @@
# Generated by Cargo
# will have compiled files and executables
/target/
WixTools
test.db*

View File

@@ -1,23 +0,0 @@
[package]
name = "todos-app"
version = "1.2.0"
description = "Handy TODOs app!"
authors = ["Parker McMullin <parker.mcmullin01@gmail.com>"]
license = ""
repository = ""
default-run = "todos-app"
edition = "2021"
[build-dependencies]
tauri-build = { version = "1.2.0", features = [] }
[dependencies]
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
tauri = { version = "1.2", features = ["api-all", "system-tray"] }
tauri-plugin-sql = { path = "../../..", features = ["sqlite"] }
[features]
default = ["custom-protocol"]
custom-protocol = ["tauri/custom-protocol"]

View File

@@ -1,4 +0,0 @@
fn main() {
println!("cargo:rustc-env=MACOSX_DEPLOYMENT_TARGET=10.13");
tauri_build::build()
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

View File

@@ -1,5 +0,0 @@
CREATE TABLE todos (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
title VARCHAR(200) NOT NULL,
completed BOOLEAN DEFAULT FALSE
);

View File

@@ -1,14 +0,0 @@
max_width = 100
hard_tabs = false
tab_spaces = 2
newline_style = "Auto"
use_small_heuristics = "Default"
reorder_imports = true
reorder_modules = true
remove_nested_parens = true
edition = "2018"
merge_derives = true
use_try_shorthand = false
use_field_init_shorthand = false
force_explicit_abi = true
imports_granularity = "Crate"

View File

@@ -1,67 +0,0 @@
#![cfg_attr(
all(not(debug_assertions), target_os = "windows"),
windows_subsystem = "windows"
)]
use tauri::{
CustomMenuItem, Manager, Menu, MenuItem, Submenu, SystemTray, SystemTrayEvent, SystemTrayMenu,
SystemTrayMenuItem,
};
use tauri_plugin_sql::{Migration, MigrationKind, TauriSql};
fn main() {
let quit = CustomMenuItem::new("quit".to_string(), "Quit");
let hide = CustomMenuItem::new("hide".to_string(), "Hide");
let show = CustomMenuItem::new("show".to_string(), "Show");
let tray_menu = SystemTrayMenu::new()
.add_item(show)
.add_item(hide)
.add_native_item(SystemTrayMenuItem::Separator)
.add_item(quit);
let tray = SystemTray::new().with_menu(tray_menu);
let submenu = Submenu::new(
"File",
Menu::new()
.add_native_item(MenuItem::Hide)
.add_native_item(MenuItem::Quit),
);
let menu = Menu::new().add_submenu(submenu);
#[cfg(not(target_os = "macos"))]
let builder = tauri::Builder::default();
#[cfg(target_os = "macos")]
let builder = tauri::Builder::default().menu(menu);
builder
.system_tray(tray)
.on_system_tray_event(|app, event| match event {
SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {
"show" => {
let window = app.get_window("main").unwrap();
window.show().unwrap();
window.set_focus().unwrap();
}
"hide" => {
let window = app.get_window("main").unwrap();
window.hide().unwrap();
}
"quit" => {
app.exit(0);
}
_ => {}
},
_ => {}
})
.plugin(TauriSql::default().add_migrations(
"sqlite:test.db",
vec![Migration {
version: 1,
description: "create todo",
sql: include_str!("../migrations/1.sql"),
kind: MigrationKind::Up,
}],
))
.run(tauri::generate_context!())
.expect("error while running tauri application");
}

View File

@@ -1,12 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body>
<div id="svelte">%sveltekit.body%</div>
</body>
</html>

View File

@@ -1,10 +0,0 @@
<script lang="ts">
import { fade } from 'svelte/transition';
export let total: number;
export let remaining: number;
</script>
{#if total > 0}
<div transition:fade class="text-center text-sm text-gray-700 mt-3"><span class="font-bold">{remaining}</span> <span>remaining out of</span> <span class="font-bold">{total}</span></div>
{/if}

View File

@@ -1,47 +0,0 @@
<script lang="ts">
import { createEventDispatcher } from 'svelte';
import { slide } from 'svelte/transition';
import type { Todo } from '../models/Todo';
import CheckboxIcon from './icons/CheckboxIcon.svelte';
import TrashIcon from './icons/TrashIcon.svelte';
export let items: Todo[];
const dispatch = createEventDispatcher();
</script>
<div class="m-4 text-gray-900">
{#each items as todo (todo.id)}
<div
transition:slide
class="mb-2 w-full flex justify-between {todo.completed ? 'line-through text-gray-700' : ''}"
>
<div class="flex items-center justify-start flex-shrink-0 mr-2">
<button
on:click={() => dispatch('toggleComplete', { id: todo.id })}
tabindex="0"
aria-label="toggle task completion"
aria-checked={todo.completed ? 'true' : 'false'}
class="w-5 h-5 border-0 rounded-full {todo.completed
? 'text-green-700 bg-green-400 hover:bg-green-200'
: 'hover:text-green-700'}"
>
<CheckboxIcon />
</button>
</div>
<div class="flex-auto">{todo.title}</div>
<div class="flex items-center justify-start flex-shrink-0 ml-2">
<button
on:click={() => dispatch('remove', { id: todo.id })}
class="w-5 h-5 border-0"
tabindex="0"
>
<TrashIcon class="hover:text-red-500" />
</button>
</div>
</div>
{/each}
</div>

View File

@@ -1,43 +0,0 @@
<script lang="ts">
import { createEventDispatcher } from 'svelte';
import PlusIcon from './icons/PlusIcon.svelte';
const dispatch = createEventDispatcher();
let inputRef;
let newTitle: string = '';
function submit(event) {
if (event.key !== undefined && event.key !== 'Enter') return;
if (!newTitle.trim()) return;
dispatch('add', { title: newTitle.trim() });
newTitle = '';
setFocus();
}
function setFocus() {
if (inputRef) inputRef.focus();
}
</script>
<div class="flex items-center justify-between px-3 py-2 m-4 text-gray-800 bg-white rounded shadow">
<input
bind:this={inputRef}
bind:value={newTitle}
on:keydown={submit}
id="new-item-input"
aria-label="new task"
class="flex-auto mr-2 border-0"
/>
<button
on:click={submit}
aria-label="create new task"
class="w-5 h-5 border-0 rounded-full hover:bg-gray-400"
tabindex="0"
>
<PlusIcon />
</button>
</div>

View File

@@ -1,6 +0,0 @@
<svg class="w-full h-full fill-current stroke-current {$$props.class}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" stroke-width="4">
<g transform="translate(.5 .5)" fill="none" stroke-linecap="square" stroke-miterlimit="10">
<path data-color="color-2" d="M18 34l8 8 20-20" />
<circle cx="32" cy="32" r="29" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 345 B

View File

@@ -1,6 +0,0 @@
<svg class="w-full h-full fill-current stroke-current {$$props.class}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" stroke-width="4">
<g transform="translate(.5 .5)" fill="none" stroke-linecap="square" stroke-miterlimit="10">
<path data-color="color-2" d="M32 18v28M46 32H18" />
<circle cx="32" cy="32" r="29" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 347 B

View File

@@ -1,7 +0,0 @@
<svg class="w-full h-full fill-current stroke-current {$$props.class}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" stroke-width="4">
<g fill="none" stroke-linecap="square" stroke-miterlimit="10">
<path data-color="color-2" d="M22.5 13.5v-7a3 3 0 013-3h14a3 3 0 013 3v7M60.5 13.5h-56" />
<path d="M53.5 19.5l-2.668 37.356a5 5 0 01-4.988 4.644H19.156a5 5 0
01-4.988-4.644L11.5 19.5" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 425 B

View File

@@ -1 +0,0 @@
/// <reference types="@sveltejs/kit" />

View File

@@ -1,13 +0,0 @@
export interface Todo {
id: number;
title: string;
completed: boolean;
}
export interface NewTodo {
title: string;
}
export interface ExistingTodo {
id: number;
}

View File

@@ -1,4 +0,0 @@
import '../styles/tailwind-output.css';
export const ssr = false;
export const prerender = true;

View File

@@ -1,20 +0,0 @@
<script lang="ts">
import { onMount } from 'svelte';
import { todos, incompleteCount, init, add, remove, toggleComplete } from '../stores/todos';
import List from '../components/List.svelte';
import NewItem from '../components/NewItem.svelte';
import DisplayCounts from '../components/DisplayCounts.svelte';
onMount(init);
</script>
<div class="flex justify-center h-screen pt-12 bg-gray-100">
<div class="w-full max-w-lg mx-4">
<List items={$todos} on:toggleComplete={toggleComplete} on:remove={remove} />
<NewItem on:add={add} />
<DisplayCounts total={$todos.length} remaining={$incompleteCount} />
</div>
</div>

View File

@@ -1,38 +0,0 @@
import Database from 'tauri-plugin-sql-api';
import type { Todo } from '../models/Todo';
let db = null
const load = Database.load('sqlite:test.db').then(instance => {
db = instance
return db
})
async function all(): Promise<Todo[]> {
await load
return await db.select('SELECT * FROM todos')
}
async function create(title: string): Promise<Todo> {
const { lastInsertId: id } = await db.execute('INSERT INTO todos (title) VALUES ($1)', [title]);
return {
id,
title,
completed: false,
};
}
async function update(todo: Todo): Promise<Todo> {
await db.execute('UPDATE todos SET title = $1, completed = $2 WHERE id = $3', [todo.title, todo.completed, todo.id]);
return todo;
}
async function remove(id: number): Promise<boolean> {
return await db.execute('DELETE FROM todos WHERE id = $1', [id]);
}
export default {
all,
create,
update,
remove
};

View File

@@ -1,43 +0,0 @@
import { writable, derived } from 'svelte/store';
import Storage from '../services/Storage';
import type { Todo, NewTodo, ExistingTodo } from '../models/Todo';
export const todos = writable([]);
export async function init(): Promise<void> {
const $todos: Todo[] = await Storage.all();
todos.set($todos);
}
export async function add({ detail }: CustomEvent<NewTodo>): Promise<void> {
const newTodo: Todo = await Storage.create(detail.title);
todos.update(($todos) => {
return [...$todos, newTodo];
});
}
export async function toggleComplete({ detail }: CustomEvent<ExistingTodo>): Promise<void> {
todos.update(($todos) => {
const todo: Todo | undefined = $todos.find((todo) => todo.id === detail.id);
if (!todo) return;
todo.completed = !todo.completed;
Storage.update(todo);
return $todos;
});
}
export async function remove({ detail }: CustomEvent<ExistingTodo>): Promise<void> {
todos.update(($todos) => {
const index = $todos.findIndex((todo) => todo.id === detail.id);
$todos.splice(index, 1);
Storage.remove(detail.id);
return $todos;
});
}
export const incompleteCount = derived(
todos,
($todos) => $todos.filter((todo) => !todo.completed).length
);

View File

@@ -1,660 +0,0 @@
/*
! tailwindcss v3.1.8 | MIT License | https://tailwindcss.com
*//*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/
*,
::before,
::after {
box-sizing: border-box; /* 1 */
border-width: 0; /* 2 */
border-style: solid; /* 2 */
border-color: #e5e7eb; /* 2 */
}
::before,
::after {
--tw-content: '';
}
/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
*/
html {
line-height: 1.5; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
-moz-tab-size: 4; /* 3 */
-o-tab-size: 4;
tab-size: 4; /* 3 */
font-family: Inter var, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */
}
/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/
body {
margin: 0; /* 1 */
line-height: inherit; /* 2 */
}
/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/
hr {
height: 0; /* 1 */
color: inherit; /* 2 */
border-top-width: 1px; /* 3 */
}
/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
/*
Remove the default font size and weight for headings.
*/
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
/*
Reset links to optimize for opt-in styling instead of opt-out.
*/
a {
color: inherit;
text-decoration: inherit;
}
/*
Add the correct font weight in Edge and Safari.
*/
b,
strong {
font-weight: bolder;
}
/*
1. Use the user's configured `mono` font family by default.
2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp,
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */
font-size: 1em; /* 2 */
}
/*
Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/
table {
text-indent: 0; /* 1 */
border-color: inherit; /* 2 */
border-collapse: collapse; /* 3 */
}
/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
font-weight: inherit; /* 1 */
line-height: inherit; /* 1 */
color: inherit; /* 1 */
margin: 0; /* 2 */
padding: 0; /* 3 */
}
/*
Remove the inheritance of text transform in Edge and Firefox.
*/
button,
select {
text-transform: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button styles.
*/
button,
[type='button'],
[type='reset'],
[type='submit'] {
-webkit-appearance: button; /* 1 */
background-color: transparent; /* 2 */
background-image: none; /* 2 */
}
/*
Use the modern Firefox focus style for all focusable elements.
*/
:-moz-focusring {
outline: auto;
}
/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/
:-moz-ui-invalid {
box-shadow: none;
}
/*
Add the correct vertical alignment in Chrome and Firefox.
*/
progress {
vertical-align: baseline;
}
/*
Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/
[type='search'] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/*
Remove the inner padding in Chrome and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/*
Add the correct display in Chrome and Safari.
*/
summary {
display: list-item;
}
/*
Removes the default spacing and border for appropriate elements.
*/
blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
margin: 0;
}
fieldset {
margin: 0;
padding: 0;
}
legend {
padding: 0;
}
ol,
ul,
menu {
list-style: none;
margin: 0;
padding: 0;
}
/*
Prevent resizing textareas horizontally by default.
*/
textarea {
resize: vertical;
}
/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/
input::-moz-placeholder, textarea::-moz-placeholder {
opacity: 1; /* 1 */
color: #9ca3af; /* 2 */
}
input::placeholder,
textarea::placeholder {
opacity: 1; /* 1 */
color: #9ca3af; /* 2 */
}
/*
Set the default cursor for buttons.
*/
button,
[role="button"] {
cursor: pointer;
}
/*
Make sure disabled buttons don't get the pointer cursor.
*/
:disabled {
cursor: default;
}
/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
This can trigger a poorly considered lint error in some tools but is included by design.
*/
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block; /* 1 */
vertical-align: middle; /* 2 */
}
/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/
img,
video {
max-width: 100%;
height: auto;
}
*, ::before, ::after {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
}
::-webkit-backdrop {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
}
::backdrop {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
}
.m-4 {
margin: 1rem;
}
.mx-4 {
margin-left: 1rem;
margin-right: 1rem;
}
.mt-3 {
margin-top: 0.75rem;
}
.mb-2 {
margin-bottom: 0.5rem;
}
.mr-2 {
margin-right: 0.5rem;
}
.ml-2 {
margin-left: 0.5rem;
}
.flex {
display: flex;
}
.h-5 {
height: 1.25rem;
}
.h-screen {
height: 100vh;
}
.h-full {
height: 100%;
}
.w-full {
width: 100%;
}
.w-5 {
width: 1.25rem;
}
.max-w-lg {
max-width: 32rem;
}
.flex-auto {
flex: 1 1 auto;
}
.flex-shrink-0 {
flex-shrink: 0;
}
.transform {
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.items-center {
align-items: center;
}
.justify-start {
justify-content: flex-start;
}
.justify-center {
justify-content: center;
}
.justify-between {
justify-content: space-between;
}
.rounded-full {
border-radius: 9999px;
}
.rounded {
border-radius: 0.25rem;
}
.border-0 {
border-width: 0px;
}
.bg-green-400 {
--tw-bg-opacity: 1;
background-color: rgb(74 222 128 / var(--tw-bg-opacity));
}
.bg-white {
--tw-bg-opacity: 1;
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
.bg-gray-100 {
--tw-bg-opacity: 1;
background-color: rgb(243 244 246 / var(--tw-bg-opacity));
}
.fill-current {
fill: currentColor;
}
.stroke-current {
stroke: currentColor;
}
.px-3 {
padding-left: 0.75rem;
padding-right: 0.75rem;
}
.py-2 {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
.pt-12 {
padding-top: 3rem;
}
.text-center {
text-align: center;
}
.text-sm {
font-size: 0.875rem;
line-height: 1.25rem;
}
.font-bold {
font-weight: 700;
}
.text-gray-700 {
--tw-text-opacity: 1;
color: rgb(55 65 81 / var(--tw-text-opacity));
}
.text-gray-900 {
--tw-text-opacity: 1;
color: rgb(17 24 39 / var(--tw-text-opacity));
}
.text-green-700 {
--tw-text-opacity: 1;
color: rgb(21 128 61 / var(--tw-text-opacity));
}
.text-gray-800 {
--tw-text-opacity: 1;
color: rgb(31 41 55 / var(--tw-text-opacity));
}
.line-through {
-webkit-text-decoration-line: line-through;
text-decoration-line: line-through;
}
.shadow {
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.hover\:bg-green-200:hover {
--tw-bg-opacity: 1;
background-color: rgb(187 247 208 / var(--tw-bg-opacity));
}
.hover\:bg-gray-400:hover {
--tw-bg-opacity: 1;
background-color: rgb(156 163 175 / var(--tw-bg-opacity));
}
.hover\:text-green-700:hover {
--tw-text-opacity: 1;
color: rgb(21 128 61 / var(--tw-text-opacity));
}
.hover\:text-red-500:hover {
--tw-text-opacity: 1;
color: rgb(239 68 68 / var(--tw-text-opacity));
}

View File

@@ -1,3 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,15 +0,0 @@
import preprocess from 'svelte-preprocess';
import staticAdapter from '@sveltejs/adapter-static';
/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://github.com/sveltejs/svelte-preprocess
// for more information about preprocessors
preprocess: preprocess(),
kit: {
adapter: staticAdapter()
}
};
export default config;

View File

@@ -1,13 +0,0 @@
const defaultTheme = require('tailwindcss/defaultTheme');
module.exports = {
mode: 'jit',
content: ['./src/**/*.html', './src/**/*.svelte'],
theme: {
extend: {
fontFamily: {
sans: ['Inter var', ...defaultTheme.fontFamily.sans]
}
}
}
};

View File

@@ -1,32 +0,0 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"moduleResolution": "node",
"module": "es2020",
"lib": ["es2020"],
"target": "es2019",
/**
svelte-preprocess cannot figure out whether you have a value or a type, so tell TypeScript
to enforce using \`import type\` instead of \`import\` for Types.
*/
"importsNotUsedAsValues": "error",
"isolatedModules": true,
"resolveJsonModule": true,
/**
To have warnings/errors of the Svelte compiler at the correct position,
enable source maps by default.
*/
"sourceMap": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"baseUrl": ".",
"allowJs": true,
"checkJs": true,
"paths": {
"$lib":["src/lib"],
"$lib/*": ["src/lib/*"]
}
},
"include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.ts", "src/**/*.svelte"]
}

View File

@@ -1,13 +0,0 @@
import { sveltekit } from '@sveltejs/kit/vite';
/** @type {import('vite').UserConfig} */
const config = {
plugins: [sveltekit()],
build: {
rollupOptions: {
external: ['@tauri-apps/api/tauri']
}
}
};
export default config;