9 Commits

Author SHA1 Message Date
f9e581fcc2 refactor: skeleton to bits ui components
todo: restyle navbar layout
2025-09-25 22:26:11 +01:00
21cb4f5cfb refactor: page routing
feat: base order and product view pages

feat: base auth state
2025-09-25 22:16:33 +01:00
5152852db5 refactor: navbar display
todo: lucide-svelete to react-icons/svelte-icons-pack
2025-09-10 17:10:14 +01:00
befca6144b feat (web): light/dark logo assets
fix: light/dark mode toggling

todo: implement a light theme
2025-08-19 15:07:04 +01:00
6d82886270 feat: logo assets for stocklet 2025-08-10 10:57:08 +01:00
53ea5021d7 feat: openapi-fetch typing
feat: base page layout for implementation

todo: fix light/dark mode toggling
2025-08-10 10:50:52 +01:00
ce03e2f681 feat: skeleton ui and theming 2025-08-09 21:29:27 +01:00
828332a786 feat: base frontend deployment 2025-08-07 21:38:45 +01:00
859e075407 feat: base frontend
feat: base openapi v2 to openapi v3 generation
2025-08-07 16:23:22 +01:00
60 changed files with 9570 additions and 9 deletions

6
.gitignore vendored
View File

@@ -1,3 +1,4 @@
# Go
*.exe
*.exe~
*.dll
@@ -6,4 +7,7 @@
*.test
*.out
go.work
*.env
*.env
# Misc
node_modules

View File

@@ -1,13 +1,38 @@
install-tools:
go install github.com/bufbuild/buf/cmd/buf@v1.27.2
go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@v4.17.0
#
# Dev Tools
#
generate-protobufs:
.PHONY: install-tools
install-tools:
go install github.com/bufbuild/buf/cmd/buf@v1.27.2 && \
go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@v4.17.0 && \
npm install
#
# Code Gen
#
.PHONY: gen-protobufs
gen-protobufs:
buf generate
format:
buf format -w
.PHONY: gen-openapi
gen-openapi: gen-protobufs
npx openapi-generator-cli generate -g openapi-yaml -i schema/openapi/services.swagger.yaml -o schema/openapi -p outputFile=openapi.yaml
#
# Linting / Formatting
#
.PHONY: format-go
format-go:
buf format -w && \
gofmt -w -s .
#
# Deployment
#
.PHONY: deploy-docker
deploy-docker:
docker compose -f deploy/docker/compose.yaml -f deploy/docker/compose.override.yaml up --build

View File

@@ -55,10 +55,15 @@ In the nature of open-source software, please consider contributing and giving b
* [google.golang.org/protobuf](https://pkg.go.dev/google.golang.org/protobuf)
* [github.com/bufbuild/protovalidate-go](https://pkg.go.dev/github.com/bufbuild/protovalidate-go)
* Frontend
* [github.com/sveltejs/kit](https://github.com/sveltejs/kit)
* [github.com/tailwindlabs/tailwindcss](https://github.com/tailwindlabs/tailwindcss)
* Tools
* [plantuml.com](https://plantuml.com/)
* [github.com/bufbuild/buf/cmd/buf](https://buf.build/docs/installation)
* [github.com/golang-migrate/migrate/v4](https://pkg.go.dev/github.com/golang-migrate/migrate/v4#section-readme)
* [github.com/openapitools/openapi-generator](https://github.com/openapitools/openapi-generator)
* Miscellaneous
* [golang.org/x/crypto/bcrypt](https://pkg.go.dev/golang.org/x/crypto/bcrypt)

16
build/frontend/Dockerfile Normal file
View File

@@ -0,0 +1,16 @@
FROM node:24-slim AS base
WORKDIR /app
# Install pnpm
RUN npm install -g pnpm
# Install dependencies
COPY package.json ./
COPY pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
# Prepare application
COPY . ./
RUN pnpm build
CMD ["pnpm", "preview", "--host", "'0.0.0.0'", "--port", "5173"]

5
go.mod
View File

@@ -1,7 +1,8 @@
module github.com/hexolan/stocklet
go 1.21.1
toolchain go1.24.1
go 1.23.0
toolchain go1.24.3
require (
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20231106192134-1baebb0a1518.2

7
openapitools.json Normal file
View File

@@ -0,0 +1,7 @@
{
"$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json",
"spaces": 2,
"generator-cli": {
"version": "7.14.0"
}
}

2352
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

5
package.json Normal file
View File

@@ -0,0 +1,5 @@
{
"devDependencies": {
"@openapitools/openapi-generator-cli": "^2.21.4"
}
}

3
schema/openapi/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.openapi-generator
.openapi-generator-ignore
README.md

1107
schema/openapi/openapi.yaml Normal file

File diff suppressed because it is too large Load Diff

1
web/.env.example Normal file
View File

@@ -0,0 +1 @@
PUBLIC_API_URL=http://localhost:80/

23
web/.gitignore vendored Normal file
View File

@@ -0,0 +1,23 @@
node_modules
# Output
.output
.vercel
.netlify
.wrangler
/.svelte-kit
/build
# OS
.DS_Store
Thumbs.db
# Env
.env
.env.*
!.env.example
!.env.test
# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

1
web/.npmrc Normal file
View File

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

9
web/.prettierignore Normal file
View File

@@ -0,0 +1,9 @@
# Package Managers
package-lock.json
pnpm-lock.yaml
yarn.lock
bun.lock
bun.lockb
# Miscellaneous
/static/

16
web/.prettierrc Normal file
View File

@@ -0,0 +1,16 @@
{
"useTabs": true,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 100,
"plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
"overrides": [
{
"files": "*.svelte",
"options": {
"parser": "svelte"
}
}
],
"tailwindStylesheet": "./src/app.css"
}

40
web/eslint.config.js Normal file
View File

@@ -0,0 +1,40 @@
import prettier from 'eslint-config-prettier';
import { includeIgnoreFile } from '@eslint/compat';
import js from '@eslint/js';
import svelte from 'eslint-plugin-svelte';
import globals from 'globals';
import { fileURLToPath } from 'node:url';
import ts from 'typescript-eslint';
import svelteConfig from './svelte.config.js';
const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url));
export default ts.config(
includeIgnoreFile(gitignorePath),
js.configs.recommended,
...ts.configs.recommended,
...svelte.configs.recommended,
prettier,
...svelte.configs.prettier,
{
languageOptions: {
globals: { ...globals.browser, ...globals.node }
},
rules: {
// typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects.
// see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors
'no-undef': 'off'
}
},
{
files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
languageOptions: {
parserOptions: {
projectService: true,
extraFileExtensions: ['.svelte'],
parser: ts.parser,
svelteConfig
}
}
}
);

53
web/package.json Normal file
View File

@@ -0,0 +1,53 @@
{
"name": "web",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite dev",
"build": "vite build",
"preview": "vite preview",
"prepare": "svelte-kit sync || echo ''",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"format": "prettier --write .",
"lint": "prettier --check . && eslint .",
"gen-openapi": "openapi-typescript ../schema/openapi/openapi.yaml -o ./src/lib/api/schema.d.ts"
},
"devDependencies": {
"@eslint/compat": "^1.2.5",
"@eslint/js": "^9.18.0",
"@sveltejs/adapter-auto": "^6.0.0",
"@sveltejs/adapter-node": "^5.2.14",
"@sveltejs/adapter-static": "^3.0.9",
"@sveltejs/kit": "^2.22.0",
"@sveltejs/vite-plugin-svelte": "^6.0.0",
"@tailwindcss/typography": "^0.5.15",
"@tailwindcss/vite": "^4.0.0",
"eslint": "^9.18.0",
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-svelte": "^3.0.0",
"globals": "^16.0.0",
"openapi-typescript": "^7.8.0",
"prettier": "^3.4.2",
"prettier-plugin-svelte": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.11",
"svelte": "^5.0.0",
"svelte-check": "^4.0.0",
"tailwindcss": "^4.0.0",
"typescript": "^5.0.0",
"typescript-eslint": "^8.20.0",
"vite": "^7.0.4"
},
"pnpm": {
"onlyBuiltDependencies": [
"esbuild"
]
},
"dependencies": {
"@lucide/svelte": "^0.540.0",
"bits-ui": "^2.11.4",
"next-translate": "^2.6.2",
"openapi-fetch": "^0.14.0"
}
}

3570
web/pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

209
web/src/app.css Normal file
View File

@@ -0,0 +1,209 @@
@import 'tailwindcss';
@plugin '@tailwindcss/typography';
[data-theme='catppuccin'] {
--text-scaling: 1.067;
--base-font-color: var(--color-surface-700);
--base-font-color-dark: var(--color-surface-50);
--base-font-family: system-ui;
--base-font-size: inherit;
--base-line-height: inherit;
--base-font-weight: normal;
--base-font-style: normal;
--base-letter-spacing: 0em;
--heading-font-color: var(--color-tertiary-500);
--heading-font-color-dark: var(--color-secondary-200);
--heading-font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif;
--heading-font-weight: bolder;
--heading-font-style: normal;
--heading-letter-spacing: inherit;
--anchor-font-color: var(--color-secondary-600);
--anchor-font-color-dark: var(--color-tertiary-400);
--anchor-font-family: inherit;
--anchor-font-size: inherit;
--anchor-line-height: inherit;
--anchor-font-weight: normal;
--anchor-font-style: normal;
--anchor-letter-spacing: inherit;
--anchor-text-decoration: none;
--anchor-text-decoration-hover: underline;
--anchor-text-decoration-active: none;
--anchor-text-decoration-focus: none;
--spacing: 0.25rem;
--radius-base: 0.75rem;
--radius-container: 0.75rem;
--default-border-width: 2px;
--default-divide-width: 1px;
--default-ring-width: 1px;
--body-background-color: oklch(1 0 0 / 1);
--body-background-color-dark: var(--color-surface-950);
--color-primary-50: oklch(97.6% 0.02 212.47deg);
--color-primary-100: oklch(91.32% 0.04 257.13deg);
--color-primary-200: oklch(84.83% 0.07 268.85deg);
--color-primary-300: oklch(78.59% 0.11 272.12deg);
--color-primary-400: oklch(72.23% 0.14 273.55deg);
--color-primary-500: oklch(66.25% 0.18 273.14deg);
--color-primary-600: oklch(63.84% 0.17 273.48deg);
--color-primary-700: oklch(61.62% 0.15 273.47deg);
--color-primary-800: oklch(59.25% 0.14 273.88deg);
--color-primary-900: oklch(57.01% 0.12 273.81deg);
--color-primary-950: oklch(54.55% 0.11 274.23deg);
--color-primary-contrast-dark: var(--color-primary-950);
--color-primary-contrast-light: var(--color-primary-50);
--color-primary-contrast-50: var(--color-primary-contrast-dark);
--color-primary-contrast-100: var(--color-primary-contrast-dark);
--color-primary-contrast-200: var(--color-primary-contrast-dark);
--color-primary-contrast-300: var(--color-primary-contrast-dark);
--color-primary-contrast-400: var(--color-primary-contrast-light);
--color-primary-contrast-500: var(--color-primary-contrast-light);
--color-primary-contrast-600: var(--color-primary-contrast-light);
--color-primary-contrast-700: var(--color-primary-contrast-light);
--color-primary-contrast-800: var(--color-primary-contrast-light);
--color-primary-contrast-900: var(--color-primary-contrast-light);
--color-primary-contrast-950: var(--color-primary-contrast-light);
--color-secondary-50: oklch(87.05% 0.08 336.55deg);
--color-secondary-100: oklch(83.93% 0.1 336.74deg);
--color-secondary-200: oklch(80.87% 0.12 337.02deg);
--color-secondary-300: oklch(78.17% 0.13 337.85deg);
--color-secondary-400: oklch(75.29% 0.15 338.19deg);
--color-secondary-500: oklch(72.53% 0.17 338.6deg);
--color-secondary-600: oklch(66.07% 0.16 338.29deg);
--color-secondary-700: oklch(59.56% 0.14 338.49deg);
--color-secondary-800: oklch(52.62% 0.12 337.58deg);
--color-secondary-900: oklch(45.7% 0.11 337.72deg);
--color-secondary-950: oklch(38.38% 0.09 336.89deg);
--color-secondary-contrast-dark: var(--color-secondary-950);
--color-secondary-contrast-light: var(--color-secondary-50);
--color-secondary-contrast-50: var(--color-secondary-contrast-dark);
--color-secondary-contrast-100: var(--color-secondary-contrast-dark);
--color-secondary-contrast-200: var(--color-secondary-contrast-dark);
--color-secondary-contrast-300: var(--color-secondary-contrast-dark);
--color-secondary-contrast-400: var(--color-secondary-contrast-dark);
--color-secondary-contrast-500: var(--color-secondary-contrast-dark);
--color-secondary-contrast-600: var(--color-secondary-contrast-dark);
--color-secondary-contrast-700: var(--color-secondary-contrast-light);
--color-secondary-contrast-800: var(--color-secondary-contrast-light);
--color-secondary-contrast-900: var(--color-secondary-contrast-light);
--color-secondary-contrast-950: var(--color-secondary-contrast-light);
--color-tertiary-50: oklch(85.8% 0.08 182.85deg);
--color-tertiary-100: oklch(80.55% 0.09 187.22deg);
--color-tertiary-200: oklch(75.29% 0.09 190.97deg);
--color-tertiary-300: oklch(70.14% 0.1 194.28deg);
--color-tertiary-400: oklch(65.06% 0.1 197.47deg);
--color-tertiary-500: oklch(60.13% 0.1 200.95deg);
--color-tertiary-600: oklch(55.26% 0.09 199.74deg);
--color-tertiary-700: oklch(50.32% 0.08 199.32deg);
--color-tertiary-800: oklch(45.24% 0.07 197.5deg);
--color-tertiary-900: oklch(40.06% 0.06 196.51deg);
--color-tertiary-950: oklch(34.72% 0.05 193.09deg);
--color-tertiary-contrast-dark: var(--color-tertiary-950);
--color-tertiary-contrast-light: var(--color-tertiary-50);
--color-tertiary-contrast-50: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-100: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-200: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-300: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-400: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-500: var(--color-tertiary-contrast-dark);
--color-tertiary-contrast-600: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-700: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-800: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-900: var(--color-tertiary-contrast-light);
--color-tertiary-contrast-950: var(--color-tertiary-contrast-light);
--color-success-50: oklch(85.77% 0.11 142.7deg);
--color-success-100: oklch(81.11% 0.13 141.89deg);
--color-success-200: oklch(76.23% 0.14 141.28deg);
--color-success-300: oklch(71.66% 0.16 140.48deg);
--color-success-400: oklch(66.87% 0.17 140.33deg);
--color-success-500: oklch(62.41% 0.18 140.43deg);
--color-success-600: oklch(57.85% 0.16 140.84deg);
--color-success-700: oklch(52.9% 0.14 141.79deg);
--color-success-800: oklch(48.16% 0.12 142.88deg);
--color-success-900: oklch(43% 0.1 145.42deg);
--color-success-950: oklch(38.04% 0.08 149.33deg);
--color-success-contrast-dark: var(--color-success-950);
--color-success-contrast-light: var(--color-success-50);
--color-success-contrast-50: var(--color-success-contrast-dark);
--color-success-contrast-100: var(--color-success-contrast-dark);
--color-success-contrast-200: var(--color-success-contrast-dark);
--color-success-contrast-300: var(--color-success-contrast-dark);
--color-success-contrast-400: var(--color-success-contrast-dark);
--color-success-contrast-500: var(--color-success-contrast-dark);
--color-success-contrast-600: var(--color-success-contrast-light);
--color-success-contrast-700: var(--color-success-contrast-light);
--color-success-contrast-800: var(--color-success-contrast-light);
--color-success-contrast-900: var(--color-success-contrast-light);
--color-success-contrast-950: var(--color-success-contrast-light);
--color-warning-50: oklch(91.93% 0.07 86.52deg);
--color-warning-100: oklch(87.62% 0.09 81.75deg);
--color-warning-200: oklch(83.36% 0.11 78.43deg);
--color-warning-300: oklch(79.3% 0.12 76.32deg);
--color-warning-400: oklch(75.26% 0.14 72.68deg);
--color-warning-500: oklch(71.4% 0.15 67.88deg);
--color-warning-600: oklch(65.78% 0.14 69.03deg);
--color-warning-700: oklch(60.37% 0.12 70.57deg);
--color-warning-800: oklch(54.52% 0.1 72.35deg);
--color-warning-900: oklch(48.88% 0.09 74.8deg);
--color-warning-950: oklch(42.76% 0.07 78.06deg);
--color-warning-contrast-dark: var(--color-warning-950);
--color-warning-contrast-light: var(--color-warning-50);
--color-warning-contrast-50: var(--color-warning-contrast-dark);
--color-warning-contrast-100: var(--color-warning-contrast-dark);
--color-warning-contrast-200: var(--color-warning-contrast-dark);
--color-warning-contrast-300: var(--color-warning-contrast-dark);
--color-warning-contrast-400: var(--color-warning-contrast-dark);
--color-warning-contrast-500: var(--color-warning-contrast-dark);
--color-warning-contrast-600: var(--color-warning-contrast-dark);
--color-warning-contrast-700: var(--color-warning-contrast-light);
--color-warning-contrast-800: var(--color-warning-contrast-light);
--color-warning-contrast-900: var(--color-warning-contrast-light);
--color-warning-contrast-950: var(--color-warning-contrast-light);
--color-error-50: oklch(75.56% 0.13 2.78deg);
--color-error-100: oklch(70.18% 0.16 4.89deg);
--color-error-200: oklch(65.27% 0.18 7.81deg);
--color-error-300: oklch(60.81% 0.2 10.57deg);
--color-error-400: oklch(57.47% 0.22 14.92deg);
--color-error-500: oklch(55.13% 0.22 19.72deg);
--color-error-600: oklch(50.99% 0.2 18.37deg);
--color-error-700: oklch(46.81% 0.18 16.65deg);
--color-error-800: oklch(42.42% 0.16 14.8deg);
--color-error-900: oklch(38.31% 0.14 12.11deg);
--color-error-950: oklch(34.35% 0.11 8.63deg);
--color-error-contrast-dark: var(--color-error-950);
--color-error-contrast-light: var(--color-error-50);
--color-error-contrast-50: var(--color-error-contrast-dark);
--color-error-contrast-100: var(--color-error-contrast-dark);
--color-error-contrast-200: var(--color-error-contrast-dark);
--color-error-contrast-300: var(--color-error-contrast-dark);
--color-error-contrast-400: var(--color-error-contrast-dark);
--color-error-contrast-500: var(--color-error-contrast-light);
--color-error-contrast-600: var(--color-error-contrast-light);
--color-error-contrast-700: var(--color-error-contrast-light);
--color-error-contrast-800: var(--color-error-contrast-light);
--color-error-contrast-900: var(--color-error-contrast-light);
--color-error-contrast-950: var(--color-error-contrast-light);
--color-surface-50: oklch(90.64% 0.01 267.4deg);
--color-surface-100: oklch(85.79% 0.01 271.31deg);
--color-surface-200: oklch(80.91% 0.02 274.81deg);
--color-surface-300: oklch(75.63% 0.02 276.88deg);
--color-surface-400: oklch(70.59% 0.03 278.21deg);
--color-surface-500: oklch(65.43% 0.03 278.8deg);
--color-surface-600: oklch(57.8% 0.03 280.9deg);
--color-surface-700: oklch(50.1% 0.03 280.32deg);
--color-surface-800: oklch(41.9% 0.03 282.54deg);
--color-surface-900: oklch(33.48% 0.03 281.97deg);
--color-surface-950: oklch(24.29% 0.03 283.92deg);
--color-surface-contrast-dark: var(--color-surface-950);
--color-surface-contrast-light: var(--color-surface-50);
--color-surface-contrast-50: var(--color-surface-contrast-dark);
--color-surface-contrast-100: var(--color-surface-contrast-dark);
--color-surface-contrast-200: var(--color-surface-contrast-dark);
--color-surface-contrast-300: var(--color-surface-contrast-dark);
--color-surface-contrast-400: var(--color-surface-contrast-dark);
--color-surface-contrast-500: var(--color-surface-contrast-dark);
--color-surface-contrast-600: var(--color-surface-contrast-dark);
--color-surface-contrast-700: var(--color-surface-contrast-light);
--color-surface-contrast-800: var(--color-surface-contrast-light);
--color-surface-contrast-900: var(--color-surface-contrast-light);
--color-surface-contrast-950: var(--color-surface-contrast-light);
}

13
web/src/app.d.ts vendored Normal file
View File

@@ -0,0 +1,13 @@
// See https://svelte.dev/docs/kit/types#app.d.ts
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface PageState {}
// interface Platform {}
}
}
export {};

11
web/src/app.html Normal file
View File

@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>

View File

@@ -0,0 +1,10 @@
<script lang="ts">
import LightDarkMode from './LightDarkMode.svelte';
</script>
<footer class="border-t border-surface-200-800 bg-surface-100-900 fixed bottom-0 w-full z-10">
<div class="mx-auto flex w-full max-w-7xl items-center justify-between px-4 py-6 text-sm text-surface-700-300">
<span>Stocklet</span>
<LightDarkMode />
</div>
</footer>

View File

@@ -0,0 +1,39 @@
<script lang="ts">
import { Label, Switch } from "bits-ui";
let checked = $state(false);
$effect(() => {
const mode = localStorage.getItem('mode') || 'light';
checked = mode === 'dark';
document.documentElement.setAttribute('data-mode', mode);
});
const onCheckedChange = (event: { checked: boolean }) => {
const mode = event.checked ? 'dark' : 'light';
document.documentElement.setAttribute('data-mode', mode);
localStorage.setItem('mode', mode);
checked = event.checked;
};
</script>
<svelte:head>
<script>
const mode = localStorage.getItem('mode') || 'light';
document.documentElement.setAttribute('data-mode', mode);
</script>
</svelte:head>
<div class="flex items-center space-x-3">
<Switch.Root
id="light-dark"
checked={checked}
onCheckedChange={(change) => { onCheckedChange({ checked: change }) }}
class="focus-visible:ring-foreground focus-visible:ring-offset-background data-[state=checked]:bg-foreground data-[state=unchecked]:bg-dark-10 data-[state=unchecked]:shadow-mini-inset dark:data-[state=checked]:bg-foreground focus-visible:outline-hidden peer inline-flex h-[36px] min-h-[36px] w-[60px] shrink-0 cursor-pointer items-center rounded-full px-[3px] transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
>
<Switch.Thumb
class="bg-background data-[state=unchecked]:shadow-mini dark:border-background/30 dark:bg-foreground dark:shadow-popover pointer-events-none block size-[30px] shrink-0 rounded-full transition-transform data-[state=checked]:translate-x-6 data-[state=unchecked]:translate-x-0 dark:border dark:data-[state=unchecked]:border"
/>
</Switch.Root>
<Label.Root for="light-dark" class="text-sm font-medium">Light / Dark</Label.Root>
</div>

View File

@@ -0,0 +1,35 @@
<script lang="ts">
import "../app.css";
import { ShoppingCart, User } from '@lucide/svelte';
</script>
<header class="border-b border-surface-200-800 bg-surface-100-900">
<div class="mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8">
<div class="flex h-16 items-center justify-between">
<div class="mx-12">
<a href="/" class="flex items-center gap-2 font-semibold">
<img src="/assets/logo.svg" alt="Stocklet" class="h-8 w-auto dark:hidden" />
<img src="/assets/logo-light.svg" alt="Stocklet" class="h-8 w-auto hidden dark:block" />
</a>
</div>
<div class="bg-transparent w-auto p-0 mx-12">
<a href="/">Home</a>
<a href="/about">About</a>
<div class="flex flex-row gap-4">
<a href="/" title="Cart">
<p>Cart</p>
<ShoppingCart class="h-6 w-6" />
</a>
<a href="/" title="User">
<p>User</p>
<User class="h-6 w-6" />
</a>
</div>
</div>
</div>
</div>
</header>

View File

@@ -0,0 +1,8 @@
import createClient from "openapi-fetch";
import type { paths } from "./schema.d";
import { API_URL } from "../config";
const client = createClient<paths>({ baseUrl: API_URL });
export default client;

1614
web/src/lib/api/schema.d.ts vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="107" height="128" viewBox="0 0 107 128"><title>svelte-logo</title><path d="M94.157 22.819c-10.4-14.885-30.94-19.297-45.792-9.835L22.282 29.608A29.92 29.92 0 0 0 8.764 49.65a31.5 31.5 0 0 0 3.108 20.231 30 30 0 0 0-4.477 11.183 31.9 31.9 0 0 0 5.448 24.116c10.402 14.887 30.942 19.297 45.791 9.835l26.083-16.624A29.92 29.92 0 0 0 98.235 78.35a31.53 31.53 0 0 0-3.105-20.232 30 30 0 0 0 4.474-11.182 31.88 31.88 0 0 0-5.447-24.116" style="fill:#ff3e00"/><path d="M45.817 106.582a20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.503 18 18 0 0 1 .624-2.435l.49-1.498 1.337.981a33.6 33.6 0 0 0 10.203 5.098l.97.294-.09.968a5.85 5.85 0 0 0 1.052 3.878 6.24 6.24 0 0 0 6.695 2.485 5.8 5.8 0 0 0 1.603-.704L69.27 76.28a5.43 5.43 0 0 0 2.45-3.631 5.8 5.8 0 0 0-.987-4.371 6.24 6.24 0 0 0-6.698-2.487 5.7 5.7 0 0 0-1.6.704l-9.953 6.345a19 19 0 0 1-5.296 2.326 20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.502 17.99 17.99 0 0 1 8.13-12.052l26.081-16.623a19 19 0 0 1 5.3-2.329 20.72 20.72 0 0 1 22.237 8.243 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-.624 2.435l-.49 1.498-1.337-.98a33.6 33.6 0 0 0-10.203-5.1l-.97-.294.09-.968a5.86 5.86 0 0 0-1.052-3.878 6.24 6.24 0 0 0-6.696-2.485 5.8 5.8 0 0 0-1.602.704L37.73 51.72a5.42 5.42 0 0 0-2.449 3.63 5.79 5.79 0 0 0 .986 4.372 6.24 6.24 0 0 0 6.698 2.486 5.8 5.8 0 0 0 1.602-.704l9.952-6.342a19 19 0 0 1 5.295-2.328 20.72 20.72 0 0 1 22.237 8.242 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-8.13 12.053l-26.081 16.622a19 19 0 0 1-5.3 2.328" style="fill:#fff"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

3
web/src/lib/config.ts Normal file
View File

@@ -0,0 +1,3 @@
import { PUBLIC_API_URL } from "$env/static/public";
export const API_URL = PUBLIC_API_URL || "http://localhost:80/v1/";

1
web/src/lib/index.ts Normal file
View File

@@ -0,0 +1 @@
// place files you want to import through the `$lib` alias in this folder.

View File

View File

@@ -0,0 +1,25 @@
<script lang="ts">
import Navbar from '../components/Navbar.svelte';
import Footer from '../components/Footer.svelte';
import '../app.css';
import favicon from '$lib/assets/favicon.svg';
let { children } = $props();
</script>
<svelte:head>
<title>Stocklet</title>
<link rel="icon" href={favicon} />
</svelte:head>
<main data-theme="catppuccin" class="min-h-screen h-full">
<div>
<Navbar />
{@render children?.()}
<Footer />
</div>
</main>

View File

@@ -0,0 +1,7 @@
<script lang="ts">
</script>
<div>
<h5 class="text-xl">Homepage</h5>
</div>

View File

View File

View File

@@ -0,0 +1,18 @@
<script lang="ts">
import type { components } from '$lib/api/schema';
const orders: components['schemas']['v1Order'][] = [
{
id: '1',
status: 'ORDER_STATUS_PENDING',
items: {
'1': 1,
'2': 2,
},
customerId: '1',
transactionId: '1',
createdAt: Date.now().toString(),
updatedAt: Date.now().toString(),
},
];
</script>

View File

@@ -0,0 +1,7 @@
<script lang="ts">
import type { PageProps } from './$types';
let { data }: PageProps = $props();
</script>
<h1>Order ID: {data.id}</h1>

View File

@@ -0,0 +1,7 @@
import type { PageLoad } from './$types';
export const load: PageLoad = ({ params }) => {
return {
id: params.id
};
};

View File

View File

@@ -0,0 +1,7 @@
<script lang="ts">
import type { PageProps } from './$types';
let { data }: PageProps = $props();
</script>
<h1>Product ID: {data.id}</h1>

View File

@@ -0,0 +1,10 @@
// import { error } from '@sveltejs/kit';
import type { PageLoad } from './$types';
export const load: PageLoad = ({ params }) => {
return {
id: params.id
};
// error(404, 'Product not found');
};

28
web/src/stores/auth.ts Normal file
View File

@@ -0,0 +1,28 @@
import { writable } from 'svelte/store';
import type { components } from "$lib/api/schema";
type AuthStore = {
profile: components["schemas"]["v1User"] | null;
tokens: components["schemas"]["v1AuthToken"] | null;
isLoading: boolean;
};
const INITIAL_AUTH_STATE: AuthStore = {
profile: null,
tokens: null,
isLoading: false
};
export const authState = writable<AuthStore>(INITIAL_AUTH_STATE);
export function setTokens(value: components["schemas"]["v1AuthToken"]): void {
authState.update((currentState) => {
return { ...currentState, tokens: value }
});
}
export function setProfile(value: components["schemas"]["v1User"]): void {
authState.update((currentState) => {
return { ...currentState, profile: value }
});
}

0
web/src/stores/cart.ts Normal file
View File

35
web/src/stores/theme.ts Normal file
View File

@@ -0,0 +1,35 @@
import { writable } from 'svelte/store';
function getInitialDark(): boolean {
if (typeof window === 'undefined') return false;
try {
const saved = localStorage.getItem('color-scheme');
if (saved === 'dark') return true;
if (saved === 'light') return false;
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
} catch {
return false;
}
}
export const darkMode = writable<boolean>(getInitialDark());
export function setDarkMode(value: boolean): void {
darkMode.set(value);
}
export function toggleDarkMode(): void {
darkMode.update((v) => !v);
}
if (typeof window !== 'undefined') {
darkMode.subscribe((isDark) => {
const root = document.documentElement;
root.classList.toggle('dark', isDark);
try {
localStorage.setItem('color-scheme', isDark ? 'dark' : 'light');
} catch {
// ignore storage write errors
}
});
}

BIN
web/static/assets/cover.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -0,0 +1,9 @@
font name: sofiapro-light
font link: https://www.fontspring.com/fonts/mostardesign/sofia-pro/sofia-pro-light
font author: Mostardesign
font author site: http://www.motyfo.com/
icon designer: N.K.Narasimhan
icon designer link: /creator/animnarsi@yahoo.com/
{"bg":"#F1E2EC","icon-gradient-0":"#8C48D2","icon-gradient-1":"#CF705A","font":"#331B2B","slogan":"#472f3f"}

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
data-v-423bf9ae=""
viewBox="0 0 434 90"
class="iconLeft"
version="1.1"
id="svg4"
sodipodi:docname="logo-light.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="2.8018433"
inkscape:cx="217"
inkscape:cy="44.970395"
inkscape:window-width="1920"
inkscape:window-height="1011"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<g
data-v-423bf9ae=""
id="7ccbf1f1-d01a-42aa-9755-e9ae79724b7b"
fill="#331B2B"
transform="matrix(5.7915059834320255,0,0,5.7915059834320255,152.75612078133662,14.999999523162842)"
style="fill:#ffffff;fill-opacity:1">
<path
d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"
id="path1"
style="fill:#ffffff;fill-opacity:1" />
</g>
<defs
data-v-423bf9ae=""
id="defs2">
<linearGradient
data-v-423bf9ae=""
gradientTransform="rotate(25)"
id="e8769ea9-6fdc-46c7-87bb-cf92f23a859c"
x1="0%"
y1="0%"
x2="100%"
y2="0%">
<stop
data-v-423bf9ae=""
offset="0%"
style="stop-color: rgb(140, 72, 210); stop-opacity: 1;"
id="stop1" />
<stop
data-v-423bf9ae=""
offset="100%"
style="stop-color: rgb(207, 112, 90); stop-opacity: 1;"
id="stop2" />
</linearGradient>
</defs>
<g
data-v-423bf9ae=""
id="7665600e-8875-4e76-bddc-4f57bcba1929"
transform="matrix(3.635041968759201,0,0,3.635041968759201,0.39221588485064274,-0.0000019073486328125)"
stroke="none"
fill="url(#e8769ea9-6fdc-46c7-87bb-cf92f23a859c)">
<path
d="M30.231 8.097h-5.692v7.71h5.692v-7.71zM37.748 8.097h-6.023v7.71h6.023v-7.71z"
id="path2" />
<path
d="M35.647 22.106c0 .249-.026.47-.055.663h2.155v-5.471H13.569a.75.75 0 01-.36-.084.651.651 0 01-.276-.275L3.207 0H0l12.768 22.77h2.266c-.028-.138-.028-.276-.028-.414 0-1.022.359-1.907 1.105-2.625.718-.719 1.575-1.078 2.598-1.078.995 0 1.852.359 2.57 1.078.746.718 1.105 1.603 1.105 2.625 0 .138 0 .276-.028.414h6.024a2.385 2.385 0 01-.083-.663c0-1.021.359-1.906 1.078-2.625.718-.718 1.574-1.078 2.569-1.078 1.023 0 1.907.36 2.626 1.078.719.718 1.077 1.603 1.077 2.624z"
id="path3" />
<path
d="M34.404 22.079a2.37 2.37 0 00-.719-1.74 2.373 2.373 0 00-1.741-.719c-.663 0-1.243.248-1.713.719a2.372 2.372 0 00-.719 1.74c0 .249.028.497.111.69.11.387.304.719.607 1.023.47.47 1.05.719 1.713.719.691 0 1.271-.249 1.741-.719.304-.305.498-.637.635-1.023.058-.193.085-.441.085-.69zM23.047 15.807v-7.71h-5.859v7.71h5.859zM15.696 8.097H9.589l4.422 7.71h1.685v-7.71zM16.221 22.328c0 .139.028.304.056.441.082.471.303.912.663 1.271.497.471 1.077.719 1.74.719.664 0 1.244-.248 1.742-.719.359-.359.58-.801.69-1.271.027-.138.027-.303.027-.441 0-.691-.248-1.271-.718-1.741-.498-.47-1.078-.719-1.742-.719-.663 0-1.243.249-1.74.719a2.384 2.384 0 00-.718 1.741z"
id="path4" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
data-v-423bf9ae=""
viewBox="0 0 434 90"
class="iconLeft"
version="1.1"
id="svg4"
sodipodi:docname="logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="4.0852535"
inkscape:cx="149.56232"
inkscape:cy="45.040045"
inkscape:window-width="1920"
inkscape:window-height="1011"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<g
data-v-423bf9ae=""
id="7ccbf1f1-d01a-42aa-9755-e9ae79724b7b"
fill="#331B2B"
transform="matrix(5.7915059834320255,0,0,5.7915059834320255,152.75612078133662,14.999999523162842)"
style="fill:#000000;fill-opacity:1">
<path
d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"
id="path1"
style="fill:#000000;fill-opacity:1" />
</g>
<defs
data-v-423bf9ae=""
id="defs2">
<linearGradient
data-v-423bf9ae=""
gradientTransform="rotate(25)"
id="e8769ea9-6fdc-46c7-87bb-cf92f23a859c"
x1="0%"
y1="0%"
x2="100%"
y2="0%">
<stop
data-v-423bf9ae=""
offset="0%"
style="stop-color: rgb(140, 72, 210); stop-opacity: 1;"
id="stop1" />
<stop
data-v-423bf9ae=""
offset="100%"
style="stop-color: rgb(207, 112, 90); stop-opacity: 1;"
id="stop2" />
</linearGradient>
</defs>
<g
data-v-423bf9ae=""
id="7665600e-8875-4e76-bddc-4f57bcba1929"
transform="matrix(3.635041968759201,0,0,3.635041968759201,0.39221588485064274,-0.0000019073486328125)"
stroke="none"
fill="url(#e8769ea9-6fdc-46c7-87bb-cf92f23a859c)">
<path
d="M30.231 8.097h-5.692v7.71h5.692v-7.71zM37.748 8.097h-6.023v7.71h6.023v-7.71z"
id="path2" />
<path
d="M35.647 22.106c0 .249-.026.47-.055.663h2.155v-5.471H13.569a.75.75 0 01-.36-.084.651.651 0 01-.276-.275L3.207 0H0l12.768 22.77h2.266c-.028-.138-.028-.276-.028-.414 0-1.022.359-1.907 1.105-2.625.718-.719 1.575-1.078 2.598-1.078.995 0 1.852.359 2.57 1.078.746.718 1.105 1.603 1.105 2.625 0 .138 0 .276-.028.414h6.024a2.385 2.385 0 01-.083-.663c0-1.021.359-1.906 1.078-2.625.718-.718 1.574-1.078 2.569-1.078 1.023 0 1.907.36 2.626 1.078.719.718 1.077 1.603 1.077 2.624z"
id="path3" />
<path
d="M34.404 22.079a2.37 2.37 0 00-.719-1.74 2.373 2.373 0 00-1.741-.719c-.663 0-1.243.248-1.713.719a2.372 2.372 0 00-.719 1.74c0 .249.028.497.111.69.11.387.304.719.607 1.023.47.47 1.05.719 1.713.719.691 0 1.271-.249 1.741-.719.304-.305.498-.637.635-1.023.058-.193.085-.441.085-.69zM23.047 15.807v-7.71h-5.859v7.71h5.859zM15.696 8.097H9.589l4.422 7.71h1.685v-7.71zM16.221 22.328c0 .139.028.304.056.441.082.471.303.912.663 1.271.497.471 1.077.719 1.74.719.664 0 1.244-.248 1.742-.719.359-.359.58-.801.69-1.271.027-.138.027-.303.027-.441 0-.691-.248-1.271-.718-1.741-.498-.47-1.078-.719-1.742-.719-.663 0-1.243.249-1.74.719a2.384 2.384 0 00-.718 1.741z"
id="path4" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -0,0 +1 @@
<svg data-v-423bf9ae="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 434 90" class="iconLeft"><!----><!----><!----><g data-v-423bf9ae="" id="dd29e1ea-8536-46b0-b33c-374cd452669b" fill="black" transform="matrix(5.7915059834320255,0,0,5.7915059834320255,152.75612078133662,14.999999523162842)"><path d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"></path></g><!----><g data-v-423bf9ae="" id="1f868b94-934e-425c-b97d-c594a0825f88" transform="matrix(3.635041968759201,0,0,3.635041968759201,0.39221588485064274,-0.0000019073486328125)" stroke="none" fill="black"><path d="M30.231 8.097h-5.692v7.71h5.692v-7.71zM37.748 8.097h-6.023v7.71h6.023v-7.71z"></path><path d="M35.647 22.106c0 .249-.026.47-.055.663h2.155v-5.471H13.569a.75.75 0 01-.36-.084.651.651 0 01-.276-.275L3.207 0H0l12.768 22.77h2.266c-.028-.138-.028-.276-.028-.414 0-1.022.359-1.907 1.105-2.625.718-.719 1.575-1.078 2.598-1.078.995 0 1.852.359 2.57 1.078.746.718 1.105 1.603 1.105 2.625 0 .138 0 .276-.028.414h6.024a2.385 2.385 0 01-.083-.663c0-1.021.359-1.906 1.078-2.625.718-.718 1.574-1.078 2.569-1.078 1.023 0 1.907.36 2.626 1.078.719.718 1.077 1.603 1.077 2.624z"></path><path d="M34.404 22.079a2.37 2.37 0 00-.719-1.74 2.373 2.373 0 00-1.741-.719c-.663 0-1.243.248-1.713.719a2.372 2.372 0 00-.719 1.74c0 .249.028.497.111.69.11.387.304.719.607 1.023.47.47 1.05.719 1.713.719.691 0 1.271-.249 1.741-.719.304-.305.498-.637.635-1.023.058-.193.085-.441.085-.69zM23.047 15.807v-7.71h-5.859v7.71h5.859zM15.696 8.097H9.589l4.422 7.71h1.685v-7.71zM16.221 22.328c0 .139.028.304.056.441.082.471.303.912.663 1.271.497.471 1.077.719 1.74.719.664 0 1.244-.248 1.742-.719.359-.359.58-.801.69-1.271.027-.138.027-.303.027-.441 0-.691-.248-1.271-.718-1.741-.498-.47-1.078-.719-1.742-.719-.663 0-1.243.249-1.74.719a2.384 2.384 0 00-.718 1.741z"></path></g><!----></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1 @@
<svg data-v-423bf9ae="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 434 90" class="iconLeft"><!----><!----><!----><g data-v-423bf9ae="" id="1257107e-f0fa-4ca8-afb9-859f8a88e819" fill="white" transform="matrix(5.7915059834320255,0,0,5.7915059834320255,152.75612078133662,14.999999523162842)"><path d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"></path></g><!----><g data-v-423bf9ae="" id="edef95aa-1b99-42ce-a29c-747b164bbefc" transform="matrix(3.635041968759201,0,0,3.635041968759201,0.39221588485064274,-0.0000019073486328125)" stroke="none" fill="white"><path d="M30.231 8.097h-5.692v7.71h5.692v-7.71zM37.748 8.097h-6.023v7.71h6.023v-7.71z"></path><path d="M35.647 22.106c0 .249-.026.47-.055.663h2.155v-5.471H13.569a.75.75 0 01-.36-.084.651.651 0 01-.276-.275L3.207 0H0l12.768 22.77h2.266c-.028-.138-.028-.276-.028-.414 0-1.022.359-1.907 1.105-2.625.718-.719 1.575-1.078 2.598-1.078.995 0 1.852.359 2.57 1.078.746.718 1.105 1.603 1.105 2.625 0 .138 0 .276-.028.414h6.024a2.385 2.385 0 01-.083-.663c0-1.021.359-1.906 1.078-2.625.718-.718 1.574-1.078 2.569-1.078 1.023 0 1.907.36 2.626 1.078.719.718 1.077 1.603 1.077 2.624z"></path><path d="M34.404 22.079a2.37 2.37 0 00-.719-1.74 2.373 2.373 0 00-1.741-.719c-.663 0-1.243.248-1.713.719a2.372 2.372 0 00-.719 1.74c0 .249.028.497.111.69.11.387.304.719.607 1.023.47.47 1.05.719 1.713.719.691 0 1.271-.249 1.741-.719.304-.305.498-.637.635-1.023.058-.193.085-.441.085-.69zM23.047 15.807v-7.71h-5.859v7.71h5.859zM15.696 8.097H9.589l4.422 7.71h1.685v-7.71zM16.221 22.328c0 .139.028.304.056.441.082.471.303.912.663 1.271.497.471 1.077.719 1.74.719.664 0 1.244-.248 1.742-.719.359-.359.58-.801.69-1.271.027-.138.027-.303.027-.441 0-.691-.248-1.271-.718-1.741-.498-.47-1.078-.719-1.742-.719-.663 0-1.243.249-1.74.719a2.384 2.384 0 00-.718 1.741z"></path></g><!----></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1 @@
<svg data-v-423bf9ae="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 434 90" class="iconLeft"><!----><!----><!----><g data-v-423bf9ae="" id="7ccbf1f1-d01a-42aa-9755-e9ae79724b7b" fill="#331B2B" transform="matrix(5.7915059834320255,0,0,5.7915059834320255,152.75612078133662,14.999999523162842)"><path d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"></path></g><defs data-v-423bf9ae=""><linearGradient data-v-423bf9ae="" gradientTransform="rotate(25)" id="e8769ea9-6fdc-46c7-87bb-cf92f23a859c" x1="0%" y1="0%" x2="100%" y2="0%"><stop data-v-423bf9ae="" offset="0%" style="stop-color: rgb(140, 72, 210); stop-opacity: 1;"></stop><stop data-v-423bf9ae="" offset="100%" style="stop-color: rgb(207, 112, 90); stop-opacity: 1;"></stop></linearGradient></defs><g data-v-423bf9ae="" id="7665600e-8875-4e76-bddc-4f57bcba1929" transform="matrix(3.635041968759201,0,0,3.635041968759201,0.39221588485064274,-0.0000019073486328125)" stroke="none" fill="url(#e8769ea9-6fdc-46c7-87bb-cf92f23a859c)"><path d="M30.231 8.097h-5.692v7.71h5.692v-7.71zM37.748 8.097h-6.023v7.71h6.023v-7.71z"></path><path d="M35.647 22.106c0 .249-.026.47-.055.663h2.155v-5.471H13.569a.75.75 0 01-.36-.084.651.651 0 01-.276-.275L3.207 0H0l12.768 22.77h2.266c-.028-.138-.028-.276-.028-.414 0-1.022.359-1.907 1.105-2.625.718-.719 1.575-1.078 2.598-1.078.995 0 1.852.359 2.57 1.078.746.718 1.105 1.603 1.105 2.625 0 .138 0 .276-.028.414h6.024a2.385 2.385 0 01-.083-.663c0-1.021.359-1.906 1.078-2.625.718-.718 1.574-1.078 2.569-1.078 1.023 0 1.907.36 2.626 1.078.719.718 1.077 1.603 1.077 2.624z"></path><path d="M34.404 22.079a2.37 2.37 0 00-.719-1.74 2.373 2.373 0 00-1.741-.719c-.663 0-1.243.248-1.713.719a2.372 2.372 0 00-.719 1.74c0 .249.028.497.111.69.11.387.304.719.607 1.023.47.47 1.05.719 1.713.719.691 0 1.271-.249 1.741-.719.304-.305.498-.637.635-1.023.058-.193.085-.441.085-.69zM23.047 15.807v-7.71h-5.859v7.71h5.859zM15.696 8.097H9.589l4.422 7.71h1.685v-7.71zM16.221 22.328c0 .139.028.304.056.441.082.471.303.912.663 1.271.497.471 1.077.719 1.74.719.664 0 1.244-.248 1.742-.719.359-.359.58-.801.69-1.271.027-.138.027-.303.027-.441 0-.691-.248-1.271-.718-1.741-.498-.47-1.078-.719-1.742-.719-.663 0-1.243.249-1.74.719a2.384 2.384 0 00-.718 1.741z"></path></g><!----></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1 @@
<svg data-v-fde0c5aa="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300" class="iconLeft"><!----><defs data-v-fde0c5aa=""><!----></defs><rect data-v-fde0c5aa="" fill="#F1E2EC" x="0" y="0" width="300px" height="300px" class="logo-background-square"></rect><defs data-v-fde0c5aa=""><!----></defs><g data-v-fde0c5aa="" id="d7c30393-961b-4b3a-9f0c-019d46f9408e" fill="#331B2B" transform="matrix(2.902307689539151,0,0,2.902307689539151,119.52830478166314,134.96604666640133)"><path d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"></path></g><defs data-v-fde0c5aa=""><linearGradient data-v-fde0c5aa="" gradientTransform="rotate(25)" id="e769396b-e7dc-4463-997c-19b23a564bda" x1="0%" y1="0%" x2="100%" y2="0%"><stop data-v-fde0c5aa="" offset="0%" stop-color="#8C48D2" stop-opacity="1"></stop><stop data-v-fde0c5aa="" offset="100%" stop-color="#CF705A" stop-opacity="1"></stop></linearGradient></defs><g data-v-fde0c5aa="" id="278c653e-b7e8-4473-949a-a2d1c8506d27" stroke="none" fill="url(#e769396b-e7dc-4463-997c-19b23a564bda)" transform="matrix(1.821635044133282,0,0,1.821635044133282,40,127.449069999602)"><path d="M30.231 8.097h-5.692v7.71h5.692v-7.71zM37.748 8.097h-6.023v7.71h6.023v-7.71z"></path><path d="M35.647 22.106c0 .249-.026.47-.055.663h2.155v-5.471H13.569a.75.75 0 01-.36-.084.651.651 0 01-.276-.275L3.207 0H0l12.768 22.77h2.266c-.028-.138-.028-.276-.028-.414 0-1.022.359-1.907 1.105-2.625.718-.719 1.575-1.078 2.598-1.078.995 0 1.852.359 2.57 1.078.746.718 1.105 1.603 1.105 2.625 0 .138 0 .276-.028.414h6.024a2.385 2.385 0 01-.083-.663c0-1.021.359-1.906 1.078-2.625.718-.718 1.574-1.078 2.569-1.078 1.023 0 1.907.36 2.626 1.078.719.718 1.077 1.603 1.077 2.624z"></path><path d="M34.404 22.079a2.37 2.37 0 00-.719-1.74 2.373 2.373 0 00-1.741-.719c-.663 0-1.243.248-1.713.719a2.372 2.372 0 00-.719 1.74c0 .249.028.497.111.69.11.387.304.719.607 1.023.47.47 1.05.719 1.713.719.691 0 1.271-.249 1.741-.719.304-.305.498-.637.635-1.023.058-.193.085-.441.085-.69zM23.047 15.807v-7.71h-5.859v7.71h5.859zM15.696 8.097H9.589l4.422 7.71h1.685v-7.71zM16.221 22.328c0 .139.028.304.056.441.082.471.303.912.663 1.271.497.471 1.077.719 1.74.719.664 0 1.244-.248 1.742-.719.359-.359.58-.801.69-1.271.027-.138.027-.303.027-.441 0-.691-.248-1.271-.718-1.741-.498-.47-1.078-.719-1.742-.719-.663 0-1.243.249-1.74.719a2.384 2.384 0 00-.718 1.741z"></path></g><!----></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1 @@
<svg data-v-fde0c5aa="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300" class="font"><!----><defs data-v-fde0c5aa=""><!----></defs><rect data-v-fde0c5aa="" fill="#F1E2EC" x="0" y="0" width="300px" height="300px" class="logo-background-square"></rect><defs data-v-fde0c5aa=""><linearGradient data-v-fde0c5aa="" gradientTransform="rotate(25)" id="55d34800-f110-4512-9699-1f5d7d1d4408" x1="0%" y1="0%" x2="100%" y2="0%"><stop data-v-fde0c5aa="" offset="0%" stop-color="#8C48D2" stop-opacity="1"></stop><stop data-v-fde0c5aa="" offset="100%" stop-color="#CF705A" stop-opacity="1"></stop></linearGradient></defs><g data-v-fde0c5aa="" id="c8ec85ad-7159-4a52-a513-df3587f56c8b" fill="url(#55d34800-f110-4512-9699-1f5d7d1d4408)" transform="matrix(4.618937540760917,0,0,4.618937540760917,36.44341818171332,126.07390433175163)"><path d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"></path></g><!----><!----></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1 @@
<svg data-v-423bf9ae="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 275.84943617686315 60" class="font"><!----><!----><!----><g data-v-423bf9ae="" id="9e49fb69-d1b0-46ae-beda-1ae5f9d0dd96" fill="black" transform="matrix(5.7915059834320255,0,0,5.7915059834320255,-4.459463019932912,-4.76837158203125e-7)"><path d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"></path></g><!----><!----></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1 @@
<svg data-v-423bf9ae="" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 275.84943617686315 60" class="font"><!----><!----><!----><g data-v-423bf9ae="" id="a893fd5a-3adf-4cc3-81b4-6b589464f3c0" fill="white" transform="matrix(5.7915059834320255,0,0,5.7915059834320255,-4.459463019932912,-4.76837158203125e-7)"><path d="M4.00 10.36C6.12 10.36 7.24 8.92 7.24 7.56C7.24 6.16 6.17 5.33 4.65 4.96L3.35 4.65C1.90 4.31 1.76 3.54 1.76 3.09C1.76 2.02 2.79 1.33 3.88 1.33C5.04 1.33 5.92 2.02 5.98 3.08L6.90 3.08C6.85 1.47 5.54 0.46 3.91 0.46C2.31 0.46 0.84 1.50 0.84 3.09C0.84 3.86 1.13 5.03 3.12 5.50L4.42 5.81C5.38 6.05 6.31 6.55 6.31 7.60C6.31 8.51 5.54 9.49 4.00 9.49C2.65 9.49 1.78 8.58 1.68 7.63L0.77 7.63C0.84 9.03 2.11 10.36 4.00 10.36ZM11.82 3.68L10.32 3.68L10.32 1.08L9.44 1.08L9.44 3.68L8.25 3.68L8.25 4.45L9.44 4.45L9.44 10.22L10.32 10.22L10.32 4.45L11.82 4.45ZM16.02 10.36C17.88 10.36 19.45 9.00 19.45 6.93C19.45 4.86 17.88 3.54 16.02 3.54C14.15 3.54 12.60 4.86 12.60 6.93C12.60 9.00 14.15 10.36 16.02 10.36ZM16.02 9.51C14.63 9.51 13.50 8.48 13.50 6.93C13.50 5.39 14.63 4.40 16.02 4.40C17.39 4.40 18.55 5.39 18.55 6.93C18.55 8.48 17.39 9.51 16.02 9.51ZM24.23 10.35C25.17 10.35 26.00 10.01 26.59 9.45L26.03 8.85C25.58 9.25 24.96 9.49 24.26 9.49C22.83 9.49 21.67 8.47 21.67 6.94C21.67 5.40 22.83 4.40 24.26 4.40C24.96 4.40 25.58 4.65 26.03 5.05L26.59 4.44C26.00 3.89 25.17 3.54 24.23 3.54C22.37 3.54 20.78 4.87 20.78 6.94C20.78 9.02 22.37 10.35 24.23 10.35ZM33.66 10.22L30.03 6.52L32.83 3.68L31.58 3.68L29.13 6.19L29.13 0L28.24 0L28.24 10.22L29.13 10.22L29.13 6.86L32.44 10.22ZM34.68 10.22L35.57 10.22L35.57 0L34.68 0ZM43.92 6.93C43.92 4.86 42.56 3.54 40.70 3.54C38.85 3.54 37.37 4.86 37.37 6.93C37.37 9.00 38.85 10.36 40.70 10.36C41.93 10.36 43.05 9.77 43.62 8.72L42.85 8.39C42.42 9.10 41.62 9.51 40.73 9.51C39.41 9.51 38.43 8.72 38.28 7.32L43.90 7.32C43.92 7.20 43.92 7.06 43.92 6.93ZM38.29 6.55C38.46 5.15 39.41 4.40 40.70 4.40C41.97 4.40 42.91 5.19 43.04 6.55ZM48.40 3.68L46.90 3.68L46.90 1.08L46.02 1.08L46.02 3.68L44.83 3.68L44.83 4.45L46.02 4.45L46.02 10.22L46.90 10.22L46.90 4.45L48.40 4.45Z"></path></g><!----><!----></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

3
web/static/robots.txt Normal file
View File

@@ -0,0 +1,3 @@
# allow crawling everything by default
User-agent: *
Disallow:

28
web/svelte.config.js Normal file
View File

@@ -0,0 +1,28 @@
import adapter from '@sveltejs/adapter-node';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://svelte.dev/docs/kit/integrations
// for more information about preprocessors
preprocess: vitePreprocess(),
kit: {
// Use static adapter for Docker deployment
// adapter: adapter({
// pages: 'build',
// assets: 'build',
// fallback: 'index.html',
// precompress: false,
// strict: false
// })
adapter: adapter({
out: 'build',
precompress: false,
envPrefix: ''
})
}
};
export default config;

19
web/tsconfig.json Normal file
View File

@@ -0,0 +1,19 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"moduleResolution": "bundler"
}
// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
//
// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
// from the referenced tsconfig.json - TypeScript does not merge them in
}

7
web/vite.config.ts Normal file
View File

@@ -0,0 +1,7 @@
import tailwindcss from '@tailwindcss/vite';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [tailwindcss(), sveltekit()]
});