diff --git a/frontend/.env b/frontend/.env
new file mode 100644
index 0000000..9c70025
--- /dev/null
+++ b/frontend/.env
@@ -0,0 +1,3 @@
+PUBLIC_TITLE="Example TODO App"
+PUBLIC_DESCRIPTION="An example TODO app built with sveltekit and fastapi."
+PUBLIC_AUTHOR="John Doe"
diff --git a/frontend/.env.development b/frontend/.env.development
new file mode 100644
index 0000000..1762eb8
--- /dev/null
+++ b/frontend/.env.development
@@ -0,0 +1 @@
+ORIGIN=http://localhost
diff --git a/frontend/.gitignore b/frontend/.gitignore
index 6635cf5..fd2c41d 100644
--- a/frontend/.gitignore
+++ b/frontend/.gitignore
@@ -3,8 +3,8 @@ node_modules
/build
/.svelte-kit
/package
-.env
.env.*
+!.env.development
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 34ba4a9..b10125c 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -7,17 +7,35 @@
"": {
"name": "fastapi-svelte-template",
"version": "0.0.1",
+ "dependencies": {
+ "dotenv": "^16.0.3"
+ },
"devDependencies": {
"@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/adapter-node": "^1.2.4",
"@sveltejs/kit": "^1.5.0",
+ "autoprefixer": "^10.4.14",
+ "postcss": "^8.4.23",
"svelte": "^3.54.0",
"svelte-check": "^3.0.1",
+ "tailwindcss": "^3.3.2",
"tslib": "^2.4.1",
"typescript": "^5.0.0",
"vite": "^4.3.0"
}
},
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@esbuild/android-arm": {
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
@@ -370,6 +388,20 @@
"node": ">=12"
}
},
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
@@ -379,6 +411,15 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
@@ -662,6 +703,12 @@
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
"dev": true
},
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -675,6 +722,45 @@
"node": ">= 8"
}
},
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.14",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
+ "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001464",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -711,6 +797,34 @@
"node": ">=8"
}
},
+ "node_modules/browserslist": {
+ "version": "4.21.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
"node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@@ -753,6 +867,35 @@
"node": ">=6"
}
},
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001488",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz",
+ "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -780,6 +923,15 @@
"fsevents": "~2.3.2"
}
},
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
@@ -801,6 +953,18 @@
"node": ">= 0.6"
}
},
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -842,6 +1006,32 @@
"integrity": "sha512-Kc0TSP9IUU9eg55au5Q3YtqaYI2cgntVpunJV9Exbm9nvlBeTE5p2NqYHfpuXK6+VF2hF5PI+BPFPUti7e2N1g==",
"dev": true
},
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/dotenv": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+ "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.402",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.402.tgz",
+ "integrity": "sha512-gWYvJSkohOiBE6ecVYXkrDgNaUjo47QEKK0kQzmWyhkH+yoYiG44bwuicTGNSIQRG3WDMsWVZJLRnJnLNkbWvA==",
+ "dev": true
+ },
"node_modules/es6-promise": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
@@ -885,6 +1075,15 @@
"@esbuild/win32-x64": "0.17.19"
}
},
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/esm-env": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz",
@@ -934,6 +1133,19 @@
"node": ">=8"
}
},
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -1147,6 +1359,15 @@
"@types/estree": "*"
}
},
+ "node_modules/jiti": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
+ "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
"node_modules/kleur": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
@@ -1156,6 +1377,21 @@
"node": ">=6"
}
},
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
"node_modules/magic-string": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
@@ -1268,6 +1504,17 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
"node_modules/nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -1286,6 +1533,12 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/node-releases": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
+ "dev": true
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -1295,6 +1548,33 @@
"node": ">=0.10.0"
}
},
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1349,6 +1629,24 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/postcss": {
"version": "8.4.23",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz",
@@ -1377,6 +1675,109 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -1397,6 +1798,15 @@
}
]
},
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -1627,6 +2037,70 @@
"node": ">=8"
}
},
+ "node_modules/sucrase": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz",
+ "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -1744,6 +2218,77 @@
}
}
},
+ "node_modules/tailwindcss": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz",
+ "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==",
+ "dev": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/tiny-glob": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
@@ -1775,6 +2320,12 @@
"node": ">=6"
}
},
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
"node_modules/tslib": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz",
@@ -1806,6 +2357,42 @@
"node": ">=14.0"
}
},
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
"node_modules/vite": {
"version": "4.3.8",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.3.8.tgz",
@@ -1873,9 +2460,24 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
+ },
+ "node_modules/yaml": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
+ "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
}
},
"dependencies": {
+ "@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true
+ },
"@esbuild/android-arm": {
"version": "0.17.19",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
@@ -2030,12 +2632,29 @@
"dev": true,
"optional": true
},
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
"@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
"dev": true
},
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true
+ },
"@jridgewell/sourcemap-codec": {
"version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
@@ -2242,6 +2861,12 @@
"integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
"dev": true
},
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true
+ },
"anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -2252,6 +2877,26 @@
"picomatch": "^2.0.4"
}
},
+ "arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "10.4.14",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
+ "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001464",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2282,6 +2927,18 @@
"fill-range": "^7.0.1"
}
},
+ "browserslist": {
+ "version": "4.21.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
+ }
+ },
"buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
@@ -2309,6 +2966,18 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true
},
+ "camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001488",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz",
+ "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==",
+ "dev": true
+ },
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
@@ -2325,6 +2994,12 @@
"readdirp": "~3.6.0"
}
},
+ "commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true
+ },
"commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
@@ -2343,6 +3018,12 @@
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"dev": true
},
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -2370,6 +3051,29 @@
"integrity": "sha512-Kc0TSP9IUU9eg55au5Q3YtqaYI2cgntVpunJV9Exbm9nvlBeTE5p2NqYHfpuXK6+VF2hF5PI+BPFPUti7e2N1g==",
"dev": true
},
+ "didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true
+ },
+ "dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "dotenv": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+ "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
+ },
+ "electron-to-chromium": {
+ "version": "1.4.402",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.402.tgz",
+ "integrity": "sha512-gWYvJSkohOiBE6ecVYXkrDgNaUjo47QEKK0kQzmWyhkH+yoYiG44bwuicTGNSIQRG3WDMsWVZJLRnJnLNkbWvA==",
+ "dev": true
+ },
"es6-promise": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
@@ -2406,6 +3110,12 @@
"@esbuild/win32-x64": "0.17.19"
}
},
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
"esm-env": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz",
@@ -2449,6 +3159,12 @@
"to-regex-range": "^5.0.1"
}
},
+ "fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "dev": true
+ },
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -2612,12 +3328,30 @@
"@types/estree": "*"
}
},
+ "jiti": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
+ "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
+ "dev": true
+ },
"kleur": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
"dev": true
},
+ "lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true
+ },
+ "lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
"magic-string": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
@@ -2697,18 +3431,53 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
"nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
"integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
"dev": true
},
+ "node-releases": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
+ "dev": true
+ },
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true
+ },
+ "object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true
+ },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -2751,6 +3520,18 @@
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true
+ },
+ "pirates": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "dev": true
+ },
"postcss": {
"version": "8.4.23",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz",
@@ -2762,12 +3543,76 @@
"source-map-js": "^1.0.2"
}
},
+ "postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "requires": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ }
+ },
+ "postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "requires": {
+ "camelcase-css": "^2.0.1"
+ }
+ },
+ "postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "requires": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ }
+ },
+ "postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.11"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
"queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true
},
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^2.3.0"
+ }
+ },
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -2933,6 +3778,56 @@
"min-indent": "^1.0.0"
}
},
+ "sucrase": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz",
+ "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -2981,6 +3876,66 @@
"strip-indent": "^3.0.0"
}
},
+ "tailwindcss": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz",
+ "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==",
+ "dev": true,
+ "requires": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ }
+ }
+ },
+ "thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "requires": {
+ "thenify": ">= 3.1.0 < 4"
+ }
+ },
"tiny-glob": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
@@ -3006,6 +3961,12 @@
"integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
"dev": true
},
+ "ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true
+ },
"tslib": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz",
@@ -3027,6 +3988,22 @@
"busboy": "^1.6.0"
}
},
+ "update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
"vite": {
"version": "4.3.8",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.3.8.tgz",
@@ -3051,6 +4028,12 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
+ },
+ "yaml": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
+ "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
+ "dev": true
}
}
}
diff --git a/frontend/package.json b/frontend/package.json
index 52da2b1..f5a4260 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -13,11 +13,17 @@
"@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/adapter-node": "^1.2.4",
"@sveltejs/kit": "^1.5.0",
+ "autoprefixer": "^10.4.14",
+ "postcss": "^8.4.23",
"svelte": "^3.54.0",
"svelte-check": "^3.0.1",
+ "tailwindcss": "^3.3.2",
"tslib": "^2.4.1",
"typescript": "^5.0.0",
"vite": "^4.3.0"
},
- "type": "module"
+ "type": "module",
+ "dependencies": {
+ "dotenv": "^16.0.3"
+ }
}
diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js
new file mode 100644
index 0000000..2e7af2b
--- /dev/null
+++ b/frontend/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/frontend/src/app.css b/frontend/src/app.css
new file mode 100644
index 0000000..b2a041b
--- /dev/null
+++ b/frontend/src/app.css
@@ -0,0 +1,51 @@
+/* This file imports all styles defined in other files. */
+@import "./fonts.css";
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ h1, h2, h3, h4, h5, h6 {
+ @apply font-bold text-primary;
+ }
+
+ h1 {
+ @apply text-5xl;
+ }
+ h2 {
+ @apply text-4xl;
+ }
+ h3 {
+ @apply text-3xl;
+ }
+ h4 {
+ @apply text-2xl;
+ }
+ h5 {
+ @apply text-xl;
+ }
+ h6 {
+ @apply text-lg;
+ }
+}
+
+@layer components {
+ button {
+ @apply p-2;
+ @apply rounded-md;
+ @apply bg-neutral-100;
+ @apply border-2 border-neutral-200;
+ @apply transition-all ease-in-out;
+ }
+ button:hover {
+ @apply bg-neutral-200;
+ @apply border-neutral-300;
+ }
+ button:active {
+ @apply bg-neutral-300;
+ @apply border-neutral-400;
+ }
+ button:focus {
+ @apply ring-1 ring-neutral-400 ring-offset-1;
+ }
+}
diff --git a/frontend/src/fonts.css b/frontend/src/fonts.css
new file mode 100644
index 0000000..21216e0
--- /dev/null
+++ b/frontend/src/fonts.css
@@ -0,0 +1,379 @@
+/* Kanit */
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-thin.ttf') format('truetype');
+ font-weight: 100;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-thin-italic.ttf') format('truetype');
+ font-weight: 100;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-extralight.ttf') format('truetype');
+ font-weight: 200;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-extralight-italic.ttf') format('truetype');
+ font-weight: 200;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-light.ttf') format('truetype');
+ font-weight: 300;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-light-italic.ttf') format('truetype');
+ font-weight: 300;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-regular-italic.ttf') format('truetype');
+ font-weight: 400;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-medium.ttf') format('truetype');
+ font-weight: 500;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-medium-italic.ttf') format('truetype');
+ font-weight: 500;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-semibold.ttf') format('truetype');
+ font-weight: 600;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-semibold-italic.ttf') format('truetype');
+ font-weight: 600;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-bold.ttf') format('truetype');
+ font-weight: 700;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-bold-italic.ttf') format('truetype');
+ font-weight: 700;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-extrabold.ttf') format('truetype');
+ font-weight: 800;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-extrabold-italic.ttf') format('truetype');
+ font-weight: 800;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-black.ttf') format('truetype');
+ font-weight: 900;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Kanit';
+ src: url('/fonts/kanit/kanit-black-italic.ttf') format('truetype');
+ font-weight: 900;
+ font-style: italic;
+}
+
+
+/* Montserrat */
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-thin.ttf') format('truetype');
+ font-weight: 100;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-thin-italic.ttf') format('truetype');
+ font-weight: 100;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-extralight.ttf') format('truetype');
+ font-weight: 200;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-extralight-italic.ttf') format('truetype');
+ font-weight: 200;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-light.ttf') format('truetype');
+ font-weight: 300;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-light-italic.ttf') format('truetype');
+ font-weight: 300;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-regular-italic.ttf') format('truetype');
+ font-weight: 400;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-medium.ttf') format('truetype');
+ font-weight: 500;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-medium-italic.ttf') format('truetype');
+ font-weight: 500;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-semibold.ttf') format('truetype');
+ font-weight: 600;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-semibold-italic.ttf') format('truetype');
+ font-weight: 600;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-bold.ttf') format('truetype');
+ font-weight: 700;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-bold-italic.ttf') format('truetype');
+ font-weight: 700;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-extrabold.ttf') format('truetype');
+ font-weight: 800;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-extrabold-italic.ttf') format('truetype');
+ font-weight: 800;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-black.ttf') format('truetype');
+ font-weight: 900;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Montserrat';
+ src: url('/fonts/montserrat/montserrat-black-italic.ttf') format('truetype');
+ font-weight: 900;
+ font-style: italic;
+}
+
+
+/* SourceCodePro */
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-extralight.ttf') format('truetype');
+ font-weight: 200;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-extralight-italic.ttf') format('truetype');
+ font-weight: 200;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-light.ttf') format('truetype');
+ font-weight: 300;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-light-italic.ttf') format('truetype');
+ font-weight: 300;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-regular-italic.ttf') format('truetype');
+ font-weight: 400;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-medium.ttf') format('truetype');
+ font-weight: 500;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-medium-italic.ttf') format('truetype');
+ font-weight: 500;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-semibold.ttf') format('truetype');
+ font-weight: 600;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-semibold-italic.ttf') format('truetype');
+ font-weight: 600;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-bold.ttf') format('truetype');
+ font-weight: 700;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-bold-italic.ttf') format('truetype');
+ font-weight: 700;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-extrabold.ttf') format('truetype');
+ font-weight: 800;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-extrabold-italic.ttf') format('truetype');
+ font-weight: 800;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-black.ttf') format('truetype');
+ font-weight: 900;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'SourceCodePro';
+ src: url('/fonts/sourcecodepro/sourcecodepro-black-italic.ttf') format('truetype');
+ font-weight: 900;
+ font-style: italic;
+}
+
+
+/* Lora */
+@font-face {
+ font-family: 'Lora';
+ src: url('/fonts/lora/lora-regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Lora';
+ src: url('/fonts/lora/lora-regular-italic.ttf') format('truetype');
+ font-weight: 400;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Lora';
+ src: url('/fonts/lora/lora-medium.ttf') format('truetype');
+ font-weight: 500;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Lora';
+ src: url('/fonts/lora/lora-medium-italic.ttf') format('truetype');
+ font-weight: 500;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Lora';
+ src: url('/fonts/lora/lora-semibold.ttf') format('truetype');
+ font-weight: 600;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Lora';
+ src: url('/fonts/lora/lora-semibold-italic.ttf') format('truetype');
+ font-weight: 600;
+ font-style: italic;
+}
+@font-face {
+ font-family: 'Lora';
+ src: url('/fonts/lora/lora-bold.ttf') format('truetype');
+ font-weight: 700;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'Lora';
+ src: url('/fonts/lora/lora-bold-italic.ttf') format('truetype');
+ font-weight: 700;
+ font-style: italic;
+}
+
+
+/* NotoColorEmoji */
+@font-face {
+ font-family: 'NotoColorEmoji';
+ src: url('/fonts/notocoloremoji/notocoloremoji-regular.ttf') format('truetype');
+ font-weight: 400;
+ font-style: normal;
+}
diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte
new file mode 100644
index 0000000..0fe5e54
--- /dev/null
+++ b/frontend/src/routes/+layout.svelte
@@ -0,0 +1,35 @@
+
+ Example TODO App
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/static/favicon.ico b/frontend/static/favicon.ico
new file mode 120000
index 0000000..b81bb09
--- /dev/null
+++ b/frontend/static/favicon.ico
@@ -0,0 +1 @@
+images/common/favicon/favicon.ico
\ No newline at end of file
diff --git a/frontend/static/favicon.png b/frontend/static/favicon.png
deleted file mode 100644
index 825b9e6..0000000
Binary files a/frontend/static/favicon.png and /dev/null differ
diff --git a/frontend/static/favicon.png b/frontend/static/favicon.png
new file mode 120000
index 0000000..7eda551
--- /dev/null
+++ b/frontend/static/favicon.png
@@ -0,0 +1 @@
+images/common/favicon/favicon-32x32.png
\ No newline at end of file
diff --git a/frontend/static/fonts/kanit/kanit-black-italic.ttf b/frontend/static/fonts/kanit/kanit-black-italic.ttf
new file mode 100644
index 0000000..dc81853
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-black-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-black.ttf b/frontend/static/fonts/kanit/kanit-black.ttf
new file mode 100644
index 0000000..2e37a00
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-black.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-bold-italic.ttf b/frontend/static/fonts/kanit/kanit-bold-italic.ttf
new file mode 100644
index 0000000..17eda2a
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-bold-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-bold.ttf b/frontend/static/fonts/kanit/kanit-bold.ttf
new file mode 100644
index 0000000..4686906
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-bold.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-extrabold-italic.ttf b/frontend/static/fonts/kanit/kanit-extrabold-italic.ttf
new file mode 100644
index 0000000..037187a
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-extrabold-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-extrabold.ttf b/frontend/static/fonts/kanit/kanit-extrabold.ttf
new file mode 100644
index 0000000..5240d38
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-extrabold.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-extralight-italic.ttf b/frontend/static/fonts/kanit/kanit-extralight-italic.ttf
new file mode 100644
index 0000000..5d575cc
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-extralight-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-extralight.ttf b/frontend/static/fonts/kanit/kanit-extralight.ttf
new file mode 100644
index 0000000..404c1e0
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-extralight.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-light-italic.ttf b/frontend/static/fonts/kanit/kanit-light-italic.ttf
new file mode 100644
index 0000000..59a3f2e
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-light-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-light.ttf b/frontend/static/fonts/kanit/kanit-light.ttf
new file mode 100644
index 0000000..3c9d4b5
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-light.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-medium-italic.ttf b/frontend/static/fonts/kanit/kanit-medium-italic.ttf
new file mode 100644
index 0000000..2c6aa14
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-medium-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-medium.ttf b/frontend/static/fonts/kanit/kanit-medium.ttf
new file mode 100644
index 0000000..50413d0
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-medium.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-regular-italic.ttf b/frontend/static/fonts/kanit/kanit-regular-italic.ttf
new file mode 100644
index 0000000..e6d868b
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-regular-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-regular.ttf b/frontend/static/fonts/kanit/kanit-regular.ttf
new file mode 100644
index 0000000..ef204c1
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-regular.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-semibold-italic.ttf b/frontend/static/fonts/kanit/kanit-semibold-italic.ttf
new file mode 100644
index 0000000..21a2f3d
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-semibold-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-semibold.ttf b/frontend/static/fonts/kanit/kanit-semibold.ttf
new file mode 100644
index 0000000..7501a2e
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-semibold.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-thin-italic.ttf b/frontend/static/fonts/kanit/kanit-thin-italic.ttf
new file mode 100644
index 0000000..25fd1f9
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-thin-italic.ttf differ
diff --git a/frontend/static/fonts/kanit/kanit-thin.ttf b/frontend/static/fonts/kanit/kanit-thin.ttf
new file mode 100644
index 0000000..5c835ad
Binary files /dev/null and b/frontend/static/fonts/kanit/kanit-thin.ttf differ
diff --git a/frontend/static/fonts/lora/lora-bold-italic.ttf b/frontend/static/fonts/lora/lora-bold-italic.ttf
new file mode 100644
index 0000000..9d61f1b
Binary files /dev/null and b/frontend/static/fonts/lora/lora-bold-italic.ttf differ
diff --git a/frontend/static/fonts/lora/lora-bold.ttf b/frontend/static/fonts/lora/lora-bold.ttf
new file mode 100644
index 0000000..cd154bf
Binary files /dev/null and b/frontend/static/fonts/lora/lora-bold.ttf differ
diff --git a/frontend/static/fonts/lora/lora-medium-italic.ttf b/frontend/static/fonts/lora/lora-medium-italic.ttf
new file mode 100644
index 0000000..f52f150
Binary files /dev/null and b/frontend/static/fonts/lora/lora-medium-italic.ttf differ
diff --git a/frontend/static/fonts/lora/lora-medium.ttf b/frontend/static/fonts/lora/lora-medium.ttf
new file mode 100644
index 0000000..6d652b5
Binary files /dev/null and b/frontend/static/fonts/lora/lora-medium.ttf differ
diff --git a/frontend/static/fonts/lora/lora-regular-italic.ttf b/frontend/static/fonts/lora/lora-regular-italic.ttf
new file mode 100644
index 0000000..c037576
Binary files /dev/null and b/frontend/static/fonts/lora/lora-regular-italic.ttf differ
diff --git a/frontend/static/fonts/lora/lora-regular.ttf b/frontend/static/fonts/lora/lora-regular.ttf
new file mode 100644
index 0000000..5306a94
Binary files /dev/null and b/frontend/static/fonts/lora/lora-regular.ttf differ
diff --git a/frontend/static/fonts/lora/lora-semibold-italic.ttf b/frontend/static/fonts/lora/lora-semibold-italic.ttf
new file mode 100644
index 0000000..c3d61ee
Binary files /dev/null and b/frontend/static/fonts/lora/lora-semibold-italic.ttf differ
diff --git a/frontend/static/fonts/lora/lora-semibold.ttf b/frontend/static/fonts/lora/lora-semibold.ttf
new file mode 100644
index 0000000..c69d778
Binary files /dev/null and b/frontend/static/fonts/lora/lora-semibold.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-black-italic.ttf b/frontend/static/fonts/montserrat/montserrat-black-italic.ttf
new file mode 100644
index 0000000..172e249
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-black-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-black.ttf b/frontend/static/fonts/montserrat/montserrat-black.ttf
new file mode 100644
index 0000000..7bb6575
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-black.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-bold-italic.ttf b/frontend/static/fonts/montserrat/montserrat-bold-italic.ttf
new file mode 100644
index 0000000..b7d8031
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-bold-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-bold.ttf b/frontend/static/fonts/montserrat/montserrat-bold.ttf
new file mode 100644
index 0000000..efddc83
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-bold.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-extrabold-italic.ttf b/frontend/static/fonts/montserrat/montserrat-extrabold-italic.ttf
new file mode 100644
index 0000000..c21a396
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-extrabold-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-extrabold.ttf b/frontend/static/fonts/montserrat/montserrat-extrabold.ttf
new file mode 100644
index 0000000..3059507
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-extrabold.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-extralight-italic.ttf b/frontend/static/fonts/montserrat/montserrat-extralight-italic.ttf
new file mode 100644
index 0000000..382293d
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-extralight-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-extralight.ttf b/frontend/static/fonts/montserrat/montserrat-extralight.ttf
new file mode 100644
index 0000000..f1b405e
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-extralight.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-light-italic.ttf b/frontend/static/fonts/montserrat/montserrat-light-italic.ttf
new file mode 100644
index 0000000..5bdce7f
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-light-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-light.ttf b/frontend/static/fonts/montserrat/montserrat-light.ttf
new file mode 100644
index 0000000..c5dfdb7
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-light.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-medium-italic.ttf b/frontend/static/fonts/montserrat/montserrat-medium-italic.ttf
new file mode 100644
index 0000000..ce56883
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-medium-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-medium.ttf b/frontend/static/fonts/montserrat/montserrat-medium.ttf
new file mode 100644
index 0000000..dfc7e2f
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-medium.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-regular-italic.ttf b/frontend/static/fonts/montserrat/montserrat-regular-italic.ttf
new file mode 100644
index 0000000..eee45ba
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-regular-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-regular.ttf b/frontend/static/fonts/montserrat/montserrat-regular.ttf
new file mode 100644
index 0000000..aa9033a
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-regular.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-semibold-italic.ttf b/frontend/static/fonts/montserrat/montserrat-semibold-italic.ttf
new file mode 100644
index 0000000..7f9153d
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-semibold-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-semibold.ttf b/frontend/static/fonts/montserrat/montserrat-semibold.ttf
new file mode 100644
index 0000000..cbf44db
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-semibold.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-thin-italic.ttf b/frontend/static/fonts/montserrat/montserrat-thin-italic.ttf
new file mode 100644
index 0000000..94bcf55
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-thin-italic.ttf differ
diff --git a/frontend/static/fonts/montserrat/montserrat-thin.ttf b/frontend/static/fonts/montserrat/montserrat-thin.ttf
new file mode 100644
index 0000000..7c90a54
Binary files /dev/null and b/frontend/static/fonts/montserrat/montserrat-thin.ttf differ
diff --git a/frontend/static/fonts/notocoloremoji/notocoloremoji-regular.ttf b/frontend/static/fonts/notocoloremoji/notocoloremoji-regular.ttf
new file mode 100644
index 0000000..8ebcc8f
Binary files /dev/null and b/frontend/static/fonts/notocoloremoji/notocoloremoji-regular.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-black-italic.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-black-italic.ttf
new file mode 100644
index 0000000..b9e96b2
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-black-italic.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-black.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-black.ttf
new file mode 100644
index 0000000..cfc5f9f
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-black.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-bold-italic.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-bold-italic.ttf
new file mode 100644
index 0000000..7b354cc
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-bold-italic.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-bold.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-bold.ttf
new file mode 100644
index 0000000..e034f70
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-bold.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-extrabold-italic.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-extrabold-italic.ttf
new file mode 100644
index 0000000..5041be4
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-extrabold-italic.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-extrabold.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-extrabold.ttf
new file mode 100644
index 0000000..a66b0f4
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-extrabold.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-extralight-italic.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-extralight-italic.ttf
new file mode 100644
index 0000000..0345c21
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-extralight-italic.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-extralight.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-extralight.ttf
new file mode 100644
index 0000000..2b652af
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-extralight.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-light-italic.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-light-italic.ttf
new file mode 100644
index 0000000..c1f3d4b
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-light-italic.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-light.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-light.ttf
new file mode 100644
index 0000000..aae9d48
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-light.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-medium-italic.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-medium-italic.ttf
new file mode 100644
index 0000000..580c00d
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-medium-italic.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-medium.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-medium.ttf
new file mode 100644
index 0000000..1e42b5e
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-medium.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-regular-italic.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-regular-italic.ttf
new file mode 100644
index 0000000..ffbae58
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-regular-italic.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-regular.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-regular.ttf
new file mode 100644
index 0000000..daad874
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-regular.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-semibold-italic.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-semibold-italic.ttf
new file mode 100644
index 0000000..37595b0
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-semibold-italic.ttf differ
diff --git a/frontend/static/fonts/sourcecodepro/sourcecodepro-semibold.ttf b/frontend/static/fonts/sourcecodepro/sourcecodepro-semibold.ttf
new file mode 100644
index 0000000..7dc26d9
Binary files /dev/null and b/frontend/static/fonts/sourcecodepro/sourcecodepro-semibold.ttf differ
diff --git a/frontend/static/images/common/favicon/android-chrome-192x192.png b/frontend/static/images/common/favicon/android-chrome-192x192.png
new file mode 100644
index 0000000..6b40da6
Binary files /dev/null and b/frontend/static/images/common/favicon/android-chrome-192x192.png differ
diff --git a/frontend/static/images/common/favicon/android-chrome-512x512.png b/frontend/static/images/common/favicon/android-chrome-512x512.png
new file mode 100644
index 0000000..6a8698f
Binary files /dev/null and b/frontend/static/images/common/favicon/android-chrome-512x512.png differ
diff --git a/frontend/static/images/common/favicon/apple-touch-icon.png b/frontend/static/images/common/favicon/apple-touch-icon.png
new file mode 100644
index 0000000..8396146
Binary files /dev/null and b/frontend/static/images/common/favicon/apple-touch-icon.png differ
diff --git a/frontend/static/images/common/favicon/browserconfig.xml b/frontend/static/images/common/favicon/browserconfig.xml
new file mode 100644
index 0000000..b3930d0
--- /dev/null
+++ b/frontend/static/images/common/favicon/browserconfig.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+ #da532c
+
+
+
diff --git a/frontend/static/images/common/favicon/favicon-16x16.png b/frontend/static/images/common/favicon/favicon-16x16.png
new file mode 100644
index 0000000..3534b08
Binary files /dev/null and b/frontend/static/images/common/favicon/favicon-16x16.png differ
diff --git a/frontend/static/images/common/favicon/favicon-32x32.png b/frontend/static/images/common/favicon/favicon-32x32.png
new file mode 100644
index 0000000..ded72b6
Binary files /dev/null and b/frontend/static/images/common/favicon/favicon-32x32.png differ
diff --git a/frontend/static/images/common/favicon/favicon.ico b/frontend/static/images/common/favicon/favicon.ico
new file mode 100644
index 0000000..6400300
Binary files /dev/null and b/frontend/static/images/common/favicon/favicon.ico differ
diff --git a/frontend/static/images/common/favicon/favicon.svg b/frontend/static/images/common/favicon/favicon.svg
new file mode 100644
index 0000000..913aafd
--- /dev/null
+++ b/frontend/static/images/common/favicon/favicon.svg
@@ -0,0 +1,4 @@
+
diff --git a/frontend/static/images/common/favicon/mstile-144x144.png b/frontend/static/images/common/favicon/mstile-144x144.png
new file mode 100644
index 0000000..b56cc9f
Binary files /dev/null and b/frontend/static/images/common/favicon/mstile-144x144.png differ
diff --git a/frontend/static/images/common/favicon/mstile-150x150.png b/frontend/static/images/common/favicon/mstile-150x150.png
new file mode 100644
index 0000000..179fb13
Binary files /dev/null and b/frontend/static/images/common/favicon/mstile-150x150.png differ
diff --git a/frontend/static/images/common/favicon/mstile-310x150.png b/frontend/static/images/common/favicon/mstile-310x150.png
new file mode 100644
index 0000000..77c5ca9
Binary files /dev/null and b/frontend/static/images/common/favicon/mstile-310x150.png differ
diff --git a/frontend/static/images/common/favicon/mstile-310x310.png b/frontend/static/images/common/favicon/mstile-310x310.png
new file mode 100644
index 0000000..d099842
Binary files /dev/null and b/frontend/static/images/common/favicon/mstile-310x310.png differ
diff --git a/frontend/static/images/common/favicon/mstile-70x70.png b/frontend/static/images/common/favicon/mstile-70x70.png
new file mode 100644
index 0000000..e9710d6
Binary files /dev/null and b/frontend/static/images/common/favicon/mstile-70x70.png differ
diff --git a/frontend/static/images/common/favicon/safari-pinned-tab.svg b/frontend/static/images/common/favicon/safari-pinned-tab.svg
new file mode 100644
index 0000000..62ce369
--- /dev/null
+++ b/frontend/static/images/common/favicon/safari-pinned-tab.svg
@@ -0,0 +1,71 @@
+
+
+
diff --git a/frontend/static/images/common/favicon/site.webmanifest b/frontend/static/images/common/favicon/site.webmanifest
new file mode 100644
index 0000000..a40fa45
--- /dev/null
+++ b/frontend/static/images/common/favicon/site.webmanifest
@@ -0,0 +1,19 @@
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "./android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "./android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff",
+ "display": "standalone"
+}
diff --git a/frontend/static/images/common/og-image.webp b/frontend/static/images/common/og-image.webp
new file mode 100644
index 0000000..55357f4
Binary files /dev/null and b/frontend/static/images/common/og-image.webp differ
diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js
index 032cdfc..e7737a8 100644
--- a/frontend/svelte.config.js
+++ b/frontend/svelte.config.js
@@ -3,8 +3,6 @@ import { vitePreprocess } from '@sveltejs/kit/vite';
/** @type {import('@sveltejs/kit').Config} */
const config = {
- // Consult https://kit.svelte.dev/docs/integrations#preprocessors
- // for more information about preprocessors
preprocess: vitePreprocess(),
kit: {
diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js
new file mode 100644
index 0000000..4d1d8ba
--- /dev/null
+++ b/frontend/tailwind.config.js
@@ -0,0 +1,64 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: ['./src/**/*.{html,js,svelte,ts}'],
+ theme: {
+ extend: {
+ fontFamily: {
+ sans: ["Montserrat", "NotoColorEmoji"],
+ serif: ["Lora", "NotoColorEmoji"],
+ mono: ["SourceCodePro", "NotoColorEmoji"],
+ accent: ["Kanit", "NotoColorEmoji"],
+ emoji: ["NotoColorEmoji"],
+ },
+ colors: {
+ transparent: "transparent",
+ current: "currentColor",
+ primary: {
+ 50: "#D1DAF0",
+ 100: "#859DD6",
+ 200: "#5778C7",
+ 300: "#385AA8",
+ 400: "#29417A",
+ 500: "#1F315C",
+ DEFAULT: "#1F315C",
+ 600: "#14213D",
+ 700: "#0F192E",
+ 800: "#0A111F",
+ 900: "#05080F",
+ },
+ secondary: {
+ 50: "#DBF5FA",
+ 100: "#B7EBF5",
+ 200: "#81DCEE",
+ 300: "#4BCDE7",
+ 400: "#1DB8D7",
+ 500: "#189AB4",
+ DEFAULT: "#189AB4",
+ 600: "#147B90",
+ 700: "#0F5C6C",
+ 800: "#0A3D48",
+ 900: "#051E24",
+ },
+ accent: {
+ 50: "#FED7DE",
+ 100: "#FD9BAD",
+ 200: "#FC738C",
+ 300: "#FB4B6B",
+ 400: "#FB234B",
+ 500: "#DC042C",
+ DEFAULT: "#DC042C",
+ 600: "#9A031E",
+ 700: "#780218",
+ 800: "#500110",
+ 900: "#280008",
+ },
+ },
+ screens: {
+ '3xl': '1920px',
+ '4xl': '3840px',
+ }
+ },
+ },
+ plugins: [],
+}
+
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index bbf8c7d..485bf59 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -2,5 +2,6 @@ import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
- plugins: [sveltekit()]
+ envPrefix: 'PUBLIC_',
+ plugins: [sveltekit()],
});