From 6ddaa69f6921962d68fd335e9732bef6f0abfb52 Mon Sep 17 00:00:00 2001 From: Baobeld Date: Thu, 19 Dec 2024 21:20:21 -0500 Subject: [PATCH] Daisy UI (#14) * add dependency * rename Input to TextInput and use daisy * base styling * storybook setup with tailwind and theme changer * daisy buttons * add flaticons * text input to daisy * Navbar to daisy * login using daisy * autodocs is... auto * refactor Tabs to separate components * move TextInput * move button * move navbar * remove index * move container * move loader * move tabs to navigation * organize storybook hierarchy * use card * remove storybook dark mode * README * ignore db file * ignore db * prisma scripts * format * blyat * fix redirect --- .gitignore | 3 +- .prettierrc | 8 +- .storybook/main.js | 13 +-- .storybook/preview.css | 4 + .storybook/preview.js | 25 ++++-- README.md | 57 ++++++++++--- bun.lockb | Bin 259875 -> 284154 bytes docs/DAISY.md | 3 + eslint.config.js | 12 +-- package.json | 12 ++- playwright.config.ts | 4 +- postcss.config.js | 4 +- prisma/dev.db | Bin 49152 -> 0 bytes .../migration.sql | 24 ------ .../20241220011159_init/migration.sql | 34 ++++++++ prisma/schema.prisma | 34 ++++---- src/app.css | 15 +--- src/app.d.ts | 3 +- src/lib/components/Button.stories.svelte | 30 ------- src/lib/components/Button.svelte | 51 ----------- src/lib/components/Input.stories.svelte | 43 ---------- src/lib/components/Input.svelte | 36 -------- src/lib/components/Navbar.svelte | 31 ------- .../Navbar}/Navbar.stories.svelte | 5 +- .../Navigation/Navbar/Navbar.svelte | 12 +++ src/lib/components/Navigation/Navbar/index.ts | 3 + src/lib/components/Navigation/Tabs/Tab.svelte | 5 ++ .../Navigation/Tabs/Tabs.stories.svelte | 27 ++++++ .../components/Navigation/Tabs/Tabs.svelte | 36 ++++++++ src/lib/components/Navigation/Tabs/index.ts | 4 + src/lib/components/Navigation/index.ts | 4 + .../common/Button/Button.stories.svelte | 44 ++++++++++ .../components/common/Button/Button.svelte | 57 +++++++++++++ src/lib/components/common/Button/index.ts | 3 + .../{ => common/Loader}/Loader.stories.svelte | 5 +- .../{ => common/Loader}/Loader.svelte | 2 +- src/lib/components/common/Loader/index.ts | 3 + .../common/TextInput/TextInput.stories.svelte | 45 ++++++++++ .../common/TextInput/TextInput.svelte | 68 +++++++++++++++ src/lib/components/common/TextInput/index.ts | 3 + src/lib/components/index.ts | 1 - src/lib/index.ts | 2 +- src/lib/server/config/index.ts | 6 +- src/lib/server/logger/index.ts | 4 +- src/lib/server/lucia.ts | 8 +- src/lib/server/pothos/builder.ts | 6 +- src/lib/server/pothos/index.ts | 2 +- src/lib/server/pothos/schema/Scalars/Date.ts | 4 +- src/lib/server/pothos/schema/Scalars/index.ts | 2 +- src/lib/server/pothos/schema/index.ts | 4 +- src/lib/server/pothos/schema/posts.ts | 62 +++++++------- src/lib/server/pothos/schema/users.ts | 48 +++++------ src/lib/server/prisma/index.ts | 2 +- src/lib/server/yoga/context.ts | 4 +- src/lib/server/yoga/index.ts | 2 +- src/lib/server/yoga/server.ts | 4 +- src/lib/types/daisy-colors.ts | 12 +++ src/lib/types/daisy-sizes.ts | 1 + src/lib/types/index.ts | 2 + src/routes/+layout.svelte | 4 +- src/routes/+page.server.ts | 22 ++--- src/routes/+page.svelte | 10 +-- src/routes/api/graphql/+server.ts | 2 +- src/routes/app/+layout.svelte | 4 +- src/routes/login/+page.server.ts | 14 +-- src/routes/login/+page.svelte | 80 ++++++++++-------- svelte.config.js | 4 +- tailwind.config.ts | 20 +++-- vite.config.ts | 4 +- 69 files changed, 663 insertions(+), 449 deletions(-) create mode 100644 .storybook/preview.css create mode 100644 docs/DAISY.md delete mode 100644 prisma/dev.db delete mode 100644 prisma/migrations/20241215222709_removed_issue/migration.sql create mode 100644 prisma/migrations/20241220011159_init/migration.sql delete mode 100644 src/lib/components/Button.stories.svelte delete mode 100644 src/lib/components/Button.svelte delete mode 100644 src/lib/components/Input.stories.svelte delete mode 100644 src/lib/components/Input.svelte delete mode 100644 src/lib/components/Navbar.svelte rename src/lib/components/{ => Navigation/Navbar}/Navbar.stories.svelte (67%) create mode 100644 src/lib/components/Navigation/Navbar/Navbar.svelte create mode 100644 src/lib/components/Navigation/Navbar/index.ts create mode 100644 src/lib/components/Navigation/Tabs/Tab.svelte create mode 100644 src/lib/components/Navigation/Tabs/Tabs.stories.svelte create mode 100644 src/lib/components/Navigation/Tabs/Tabs.svelte create mode 100644 src/lib/components/Navigation/Tabs/index.ts create mode 100644 src/lib/components/Navigation/index.ts create mode 100644 src/lib/components/common/Button/Button.stories.svelte create mode 100644 src/lib/components/common/Button/Button.svelte create mode 100644 src/lib/components/common/Button/index.ts rename src/lib/components/{ => common/Loader}/Loader.stories.svelte (72%) rename src/lib/components/{ => common/Loader}/Loader.svelte (98%) create mode 100644 src/lib/components/common/Loader/index.ts create mode 100644 src/lib/components/common/TextInput/TextInput.stories.svelte create mode 100644 src/lib/components/common/TextInput/TextInput.svelte create mode 100644 src/lib/components/common/TextInput/index.ts delete mode 100644 src/lib/components/index.ts create mode 100644 src/lib/types/daisy-colors.ts create mode 100644 src/lib/types/daisy-sizes.ts create mode 100644 src/lib/types/index.ts diff --git a/.gitignore b/.gitignore index ce55f38..cbf6a49 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ Thumbs.db vite.config.js.timestamp-* vite.config.ts.timestamp-* -*storybook.log \ No newline at end of file +*/dev.db +*/dev.db-journal \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 7ebb855..1b5c8a9 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,8 +1,14 @@ { "useTabs": true, "singleQuote": true, - "trailingComma": "none", + "trailingComma": "es5", "printWidth": 100, + "endOfLine": "lf", + "arrowParens": "always", + "jsxSingleQuote": false, + "semi": true, + "quoteProps": "as-needed", + "tabWidth": 4, "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], "overrides": [ { diff --git a/.storybook/main.js b/.storybook/main.js index f073993..5f0a59a 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -2,15 +2,16 @@ const config = { stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|ts|svelte)'], addons: [ - '@storybook/addon-svelte-csf', - '@storybook/addon-essentials', '@chromatic-com/storybook', + '@storybook/addon-essentials', '@storybook/addon-interactions', - 'storybook-dark-mode' + '@storybook/addon-styling-webpack', + '@storybook/addon-svelte-csf', + '@storybook/addon-themes', ], framework: { name: '@storybook/sveltekit', - options: {} - } + options: {}, + }, }; -export default config; \ No newline at end of file +export default config; diff --git a/.storybook/preview.css b/.storybook/preview.css new file mode 100644 index 0000000..4e7ba75 --- /dev/null +++ b/.storybook/preview.css @@ -0,0 +1,4 @@ +@import 'tailwindcss/base'; +@import 'tailwindcss/components'; +@import 'tailwindcss/utilities'; +@import '@flaticon/flaticon-uicons/css/all/all'; diff --git a/.storybook/preview.js b/.storybook/preview.js index 747af9c..46d380c 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -1,13 +1,28 @@ +import { withThemeByDataAttribute } from '@storybook/addon-themes'; +import './preview.css'; + /** @type { import('@storybook/svelte').Preview } */ const preview = { + tags: ['autodocs'], parameters: { controls: { matchers: { color: /(background|color)$/i, - date: /Date$/i - } - } - } + date: /Date$/i, + }, + }, + }, + decorators: [ + withThemeByDataAttribute({ + themes: { + light: 'light', + dark: 'dark', + night: 'night', + }, + defaultTheme: 'dark', + attributeName: 'data-theme', + }), + ], }; -export default preview; \ No newline at end of file +export default preview; diff --git a/README.md b/README.md index 8aff12f..6211c61 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,69 @@ -# sv +# Hestia -Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). +Hestia is an early stage project -## Creating a project - -If you're seeing this, you've probably already done this step. Congrats! +## Setup ```bash -# create a new project in the current directory -bunx sv create +# install dependencies +bun install -# create a new project in my-app -bunx sv create my-app +# set up local database +bun prisma:dev ``` ## Developing -Once you've created a project and installed dependencies with `bun install`, start a development server: +Once you've created a project and installed dependencies, start a development server: ```bash -bun run dev +bun dev # or start the server and open the app in a new browser tab -bun run dev -- --open +bun dev -- --open + +# to use storybook for components development +bun storybook + +# interact with local database +bun prisma:studio ``` +> You can access the Yoga web-app at `/api/graphql` + ## Building To create a production version of your app: ```bash -bun run build +bun build ``` +## Stack + +- https://svelte.dev/docs/kit/introduction +- https://zod.dev/ +- https://day.js.org/ + +### Frontend + +- https://tailwindcss.com/ +- https://www.flaticon.com/ +- https://daisyui.com/ + +### Backend + +- https://www.prisma.io/ +- https://pothos-graphql.dev/ +- https://the-guild.dev/graphql/yoga-server +- https://github.com/pinojs/pino + +### Tools + +- https://storybook.js.org/ +- https://vite.dev/ +- https://vitest.dev/ + You can preview the production build with `bun run preview`. > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/bun.lockb b/bun.lockb index 49f309742d80ecce4c21491563cd7a138a44e646..3bf4b9d34a273886d901a360d1d08564b1749455 100755 GIT binary patch delta 62046 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 R4DpZ@>Sy(QDjq5KzW|IPPHF%E delta 46949 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 J7~zb~{{S{2V`u;X diff --git a/docs/DAISY.md b/docs/DAISY.md new file mode 100644 index 0000000..1470054 --- /dev/null +++ b/docs/DAISY.md @@ -0,0 +1,3 @@ +# Experienced Issues + +- https://github.com/saadeghi/daisyui/issues/811 diff --git a/eslint.config.js b/eslint.config.js index aa5987f..5c68edc 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -18,17 +18,17 @@ export default ts.config( languageOptions: { globals: { ...globals.browser, - ...globals.node - } - } + ...globals.node, + }, + }, }, { files: ['**/*.svelte'], languageOptions: { parserOptions: { - parser: ts.parser - } - } + parser: ts.parser, + }, + }, } ); diff --git a/package.json b/package.json index 22de0de..a909d73 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,12 @@ "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "test:e2e": "playwright test", - "prisma:generate": "prisma generate" + "prisma:dev": "prisma migrate dev", + "prisma:format": "prisma format", + "prisma:generate": "prisma generate", + "prisma:push": "prisma db push", + "prisma:reset": "prisma migrate reset --force", + "prisma:studio": "prisma studio" }, "devDependencies": { "@chromatic-com/storybook": "^3.2.2", @@ -23,7 +28,9 @@ "@playwright/test": "^1.45.3", "@storybook/addon-essentials": "^8.4.7", "@storybook/addon-interactions": "^8.4.7", + "@storybook/addon-styling-webpack": "^1.0.1", "@storybook/addon-svelte-csf": "^5.0.0-next.13", + "@storybook/addon-themes": "^8.4.7", "@storybook/blocks": "^8.4.7", "@storybook/svelte": "^8.4.7", "@storybook/sveltekit": "^8.4.7", @@ -33,6 +40,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.0", "@types/bun": "^1.1.14", "autoprefixer": "^10.4.20", + "daisyui": "^4.12.22", "eslint": "^9.7.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.36.0", @@ -42,7 +50,6 @@ "prettier-plugin-tailwindcss": "^0.6.5", "prisma": "^6.0.1", "storybook": "^8.4.7", - "storybook-dark-mode": "^4.0.2", "svelte": "^5.0.0", "svelte-check": "^4.0.0", "tailwindcss": "^3.4.9", @@ -52,6 +59,7 @@ "vitest": "^2.0.4" }, "dependencies": { + "@flaticon/flaticon-uicons": "^3.3.1", "@lucia-auth/adapter-prisma": "^4.0.1", "@pothos/core": "^4.3.0", "@pothos/plugin-prisma": "^4.4.0", diff --git a/playwright.config.ts b/playwright.config.ts index d76ea26..07b7bd2 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -3,8 +3,8 @@ import { defineConfig } from '@playwright/test'; export default defineConfig({ webServer: { command: 'npm run build && npm run preview', - port: 4173 + port: 4173, }, - testDir: 'e2e' + testDir: 'e2e', }); diff --git a/postcss.config.js b/postcss.config.js index 0f77216..7b75c83 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ export default { plugins: { tailwindcss: {}, - autoprefixer: {} - } + autoprefixer: {}, + }, }; diff --git a/prisma/dev.db b/prisma/dev.db deleted file mode 100644 index 86ecbef1a1c7a349d239bde8bd6c1be2c0b51769..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49152 zcmeI5U2Ggj9l-B=w$C5&U7O+<8iEenZDS?d?&s{T+K^tHOLA#qC-z+%CyGw9v$J=5 z-?w|`yEB5y4NZ&0163lSKI91@9+BV;#4G9pJXAnc(FfE55)!CV1ybo7GxrhOu}!WZ zph^E@?W}k9zyJBqZ~pVKv)=XUf@X!&saqyAw%-me?)j}OxMOvoK%qsPLw^H8r>*V4}BA!abQt?w460zBBXJ%tZ zCt@tjy7p`=xs*zrO{~P0mQ%5%^o0wtODoBX@s+jM3yHN@Je^ujE-^(H6HBS%-HUEy z9t+PLITC#B(Yu*ns`z!TpYL~Ndt>QK9r>G;J>@5Mo5|JeurZam!i?L)z@ABUw_c>P zu^nQ)Q>0R^(=t=H*U4(bD!P7-G7P7dmoFsZOR>|5Gx79=RLsFepZ0X%Mm<;Yl1yqZ zCB&n+PVG3$<22))N?uHC+1gjPm|j_72s8ZbYASy5QcrcGYX938FD@^wrdHyt0%Nlr zS*CAi#wpPDZ0yYPN+Nl7sZ)_hXZt5-7h)@kGYMwRVq!HmoA#;4SaVlch%NK-Uq~>g zSz%VLBo|XWDSe5TE4CP4U5uYjOf0OY4*=?5O2nVt^5cH?}vIo&wL_AKFM zwo?n-0r+-LbAqPS?bPnm4!2k8|FS6w)1x!-!@+=CwrR_+71@NEx8h3YxZkH|q@JIR zPb~%xElfZ2_~^{yk*$lKV#m);ZyoPc(kYI_;{#94{3}7;6J#VFhhKT@P{+5vHQw

k-E;CNFZFSD+` zvkNz_2E#Lw6ug<~n3Sn{u3y5LlAHB#olP+O-6=ym3Ol=7V26|NiN`&mGpcT%cJzn( zes7AI?# zmTGgos_GC4Aridx%ks|`Wl>foS<+-#)}7Cl0r;Fu`zQ9#A;aAC{_%O71J`Q?I2A?9mCLFVv=I0@*c#V+?)w@ z3_HtxOp`=Sv9K=Kj-v<+k|bc$bOeN`ge+N8Y?Zm2BiW`(3`{7)r^y|k;!Y{6*dfSP z9Yt}Fq+;fs%pWz|(M?sgMANZkLd}k0b6bXqilSz)Z8Hz+uQYW;qMI{ATb7BoAsLQN z1eUkVoJ=8tWw8oXv1F(cC9|sBi!M8aS+8j# z)~Sq5ESgAm5K@ROce0)8StiM%XsSB5Z0p9~=OR}>+?)z_EK@i$Telt4LRdhiiCJZ; zy1<&0F31`qBuYBbSaVcaV?(-(GzXc~VSc4Bz(_%ktXQgUBU7Rl185qSCOI0BEQhk{ zlqqY+#6Y-{?O%G9v9_z|nwVkhEA`Ha_a<1M7LI%ni2f*gJ$f@b8TlZpM&bVd0qW_& zR3HEZfB+Bx0zd!=00AHX1b_e#=n^;@N(Tp701I=$K^CM&x!@oRL?c{qkOiCJPSyh~ zpoF;KAnO@JPleJ0Eidr<|4{VpK=h;N`)mgR2mk>f00e*l5C8%|00;m9AOHk_01$W( z2t-43LFM@@e~aX4QYnS_vAlIW6ba3ZOIyeM@Bi6L|AFYo?C1Rlp@3i`5C8%|00;m9 zAOHk_01yBIKmZ5;0U)rGKx8;HIUG7N*8i+iI24*5;~$m?53^tR=S2AZe<<=;AW9-X zV><{y00;m9AOHk_01yBIKmZ5;0U+@CA+Y&GXe>P!-CQ0SLAvC~re+ATCF$(dc|#Kn z%XS0>=@xr0Uv@-nY#HFC=STAwI9XSXwTN=Mrl<@rCpC4OjKgl-AE{2Fk7Z=`4F` z{r3ELH{N_=sBfo5*moHmNfoe#EkV^KB$%>>1Zo+gq*&~O2kZ^{t%u(7eeAqcHIw#> z=V($-dMW+9d@gk{;Wp>pQrxW6uUyVGS8K;s6Y^?fB~Ja+nt56@<5)bO6_251%S~QA z$L*}#`9?S1d^|XIvdfc{)Ed%Dt(M4w+cbRB%d(G4)WmI1D}w4}EcZ`HrtIw#@$#!`0WipT)2rI(h9as9MflKmYIjGU}E`K;v>Exl=L>wY!smRjpLtL5@7#ieq+;jq2!HY&l}^YTs6xFynLys7n-$7S)+bIZx@T@eDHSm z(06~&9xs3It@pd}zN+ovj_P!)(6aQpQ&;kZid?h3YLyf%uZCr{M03cO3q`NuZDb2f z^})X$WJ+((Pj}-%Zk5+U-2%AHyv408Qrt$(a-p=2oLVklX)8_C(5RCycpBMo+B}!9 zWtje3>-_WiEZ)BWL)`+%*lVlR4Uam_Y`chBk*rrJ6kU>Ar`0lcoV=GU)%^;xv*jww<O(vB;Z&=ntc@=tktt$ls#BiTomZ@u6?#P(UC61b_e#00KY&2mk>f z00e*l5cq5mI3Btl9CQh0j0+FCs1oMFgD#Vda^XQ2K1R6kpi3FUTzJqGi4Yeabd6!? zSm^rrpi2e)@Bgt%AO37qJXiq)fB+Bx0zd!=00AHX1b_e#00KY&2mk>f00e*l5C8%| z00;m9AOHk_01yBIKmZ7QS_1s<|M~y_g8&4801yBIKmZ5;0U!VbfB+Bx0zd!=JiG+{ E3Fgi0K>z>% diff --git a/prisma/migrations/20241215222709_removed_issue/migration.sql b/prisma/migrations/20241215222709_removed_issue/migration.sql deleted file mode 100644 index 1aada7c..0000000 --- a/prisma/migrations/20241215222709_removed_issue/migration.sql +++ /dev/null @@ -1,24 +0,0 @@ -/* - Warnings: - - - The primary key for the `Post` table will be changed. If it partially fails, the table could be left without primary key constraint. - -*/ --- RedefineTables -PRAGMA defer_foreign_keys=ON; -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Post" ( - "id" TEXT NOT NULL PRIMARY KEY, - "title" TEXT NOT NULL, - "content" TEXT NOT NULL, - "published" BOOLEAN DEFAULT false, - "authorId" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Post" ("authorId", "content", "createdAt", "id", "published", "title", "updatedAt") SELECT "authorId", "content", "createdAt", "id", "published", "title", "updatedAt" FROM "Post"; -DROP TABLE "Post"; -ALTER TABLE "new_Post" RENAME TO "Post"; -PRAGMA foreign_keys=ON; -PRAGMA defer_foreign_keys=OFF; diff --git a/prisma/migrations/20241220011159_init/migration.sql b/prisma/migrations/20241220011159_init/migration.sql new file mode 100644 index 0000000..bbed9b9 --- /dev/null +++ b/prisma/migrations/20241220011159_init/migration.sql @@ -0,0 +1,34 @@ +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL PRIMARY KEY, + "email" TEXT, + "name" TEXT NOT NULL, + "password" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +-- CreateTable +CREATE TABLE "Session" ( + "id" TEXT NOT NULL PRIMARY KEY, + "expiresAt" DATETIME NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "userId" TEXT NOT NULL, + CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "Post" ( + "id" TEXT NOT NULL PRIMARY KEY, + "title" TEXT NOT NULL, + "content" TEXT NOT NULL, + "published" BOOLEAN DEFAULT false, + "authorId" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index bdf9ac4..4449dae 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -15,34 +15,38 @@ datasource db { } model User { - id String @id @default(uuid()) - email String? @unique - name String - password String - posts Post[] - sessions Session[] + id String @id @default(uuid()) + + email String? @unique + name String + password String + posts Post[] + sessions Session[] createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt } model Session { - id String @id @default(uuid()) - expiresAt DateTime - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - userId String - user User @relation(references: [id], fields: [userId]) + id String @id @default(uuid()) + + expiresAt DateTime + user User @relation(references: [id], fields: [userId]) + userId String + + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt } - model Post { - id String @id @default(uuid()) + id String @id @default(uuid()) + title String content String published Boolean? @default(false) author User @relation(references: [id], fields: [authorId]) authorId String + createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt -} \ No newline at end of file +} diff --git a/src/app.css b/src/app.css index 414ab1e..6a836a2 100644 --- a/src/app.css +++ b/src/app.css @@ -1,19 +1,8 @@ @import 'tailwindcss/base'; @import 'tailwindcss/components'; @import 'tailwindcss/utilities'; +@import '@flaticon/flaticon-uicons/css/all/all'; :root { - @apply text-slate-800; + @apply text-base-content; } - -h1 { - @apply font-display text-4xl; -} - -h2 { - @apply font-display text-3xl; -} - -h3 { - @apply font-display text-2xl; -} \ No newline at end of file diff --git a/src/app.d.ts b/src/app.d.ts index bb055d9..7cce717 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -2,10 +2,9 @@ // for information about these interfaces declare global { namespace App { - // interface Error {} interface Locals { - user: import("lucia").User | null; + user: import('lucia').User | null; session: import('lucia').Session | null; } // interface PageData {} diff --git a/src/lib/components/Button.stories.svelte b/src/lib/components/Button.stories.svelte deleted file mode 100644 index 9403409..0000000 --- a/src/lib/components/Button.stories.svelte +++ /dev/null @@ -1,30 +0,0 @@ - - - \ No newline at end of file diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte deleted file mode 100644 index 2c8737a..0000000 --- a/src/lib/components/Button.svelte +++ /dev/null @@ -1,51 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/lib/components/Input.stories.svelte b/src/lib/components/Input.stories.svelte deleted file mode 100644 index f3810b9..0000000 --- a/src/lib/components/Input.stories.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/lib/components/Input.svelte b/src/lib/components/Input.svelte deleted file mode 100644 index 4b58ee1..0000000 --- a/src/lib/components/Input.svelte +++ /dev/null @@ -1,36 +0,0 @@ - - -

- {#if label} - -
- {/if} - -
- - \ No newline at end of file diff --git a/src/lib/components/Navbar.svelte b/src/lib/components/Navbar.svelte deleted file mode 100644 index bb75025..0000000 --- a/src/lib/components/Navbar.svelte +++ /dev/null @@ -1,31 +0,0 @@ - - -
- -
- - \ No newline at end of file diff --git a/src/lib/components/Navbar.stories.svelte b/src/lib/components/Navigation/Navbar/Navbar.stories.svelte similarity index 67% rename from src/lib/components/Navbar.stories.svelte rename to src/lib/components/Navigation/Navbar/Navbar.stories.svelte index fe5c161..d9fa299 100644 --- a/src/lib/components/Navbar.stories.svelte +++ b/src/lib/components/Navigation/Navbar/Navbar.stories.svelte @@ -3,10 +3,9 @@ import Navbar from './Navbar.svelte'; const { Story } = defineMeta({ - title: 'Navbar', + title: 'Navigation/Navbar', component: Navbar, - tags: ['autodocs'] }); - \ No newline at end of file + diff --git a/src/lib/components/Navigation/Navbar/Navbar.svelte b/src/lib/components/Navigation/Navbar/Navbar.svelte new file mode 100644 index 0000000..c16b463 --- /dev/null +++ b/src/lib/components/Navigation/Navbar/Navbar.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/src/lib/components/Navigation/Navbar/index.ts b/src/lib/components/Navigation/Navbar/index.ts new file mode 100644 index 0000000..29b38de --- /dev/null +++ b/src/lib/components/Navigation/Navbar/index.ts @@ -0,0 +1,3 @@ +import Navbar from './Navbar.svelte'; + +export default Navbar; diff --git a/src/lib/components/Navigation/Tabs/Tab.svelte b/src/lib/components/Navigation/Tabs/Tab.svelte new file mode 100644 index 0000000..a30a6ee --- /dev/null +++ b/src/lib/components/Navigation/Tabs/Tab.svelte @@ -0,0 +1,5 @@ + + + diff --git a/src/lib/components/Navigation/Tabs/Tabs.stories.svelte b/src/lib/components/Navigation/Tabs/Tabs.stories.svelte new file mode 100644 index 0000000..828b063 --- /dev/null +++ b/src/lib/components/Navigation/Tabs/Tabs.stories.svelte @@ -0,0 +1,27 @@ + + +{#snippet template(args: Partial>)} + +{/snippet} + + diff --git a/src/lib/components/Navigation/Tabs/Tabs.svelte b/src/lib/components/Navigation/Tabs/Tabs.svelte new file mode 100644 index 0000000..a0a7e77 --- /dev/null +++ b/src/lib/components/Navigation/Tabs/Tabs.svelte @@ -0,0 +1,36 @@ + + +
+ {#each tabs as tab, index} + {#key [tab, value]} + { + value = index; + }} + /> + {/key} + {/each} +
diff --git a/src/lib/components/Navigation/Tabs/index.ts b/src/lib/components/Navigation/Tabs/index.ts new file mode 100644 index 0000000..d4f7fd8 --- /dev/null +++ b/src/lib/components/Navigation/Tabs/index.ts @@ -0,0 +1,4 @@ +import Tabs from './Tabs.svelte'; + +export default Tabs; +export { default as Tabs } from './Tabs.svelte'; diff --git a/src/lib/components/Navigation/index.ts b/src/lib/components/Navigation/index.ts new file mode 100644 index 0000000..1c2df11 --- /dev/null +++ b/src/lib/components/Navigation/index.ts @@ -0,0 +1,4 @@ +import Navbar from './Navbar'; +import Tabs from './Tabs'; + +export { Navbar, Tabs }; diff --git a/src/lib/components/common/Button/Button.stories.svelte b/src/lib/components/common/Button/Button.stories.svelte new file mode 100644 index 0000000..d182565 --- /dev/null +++ b/src/lib/components/common/Button/Button.stories.svelte @@ -0,0 +1,44 @@ + + + diff --git a/src/lib/components/common/Button/Button.svelte b/src/lib/components/common/Button/Button.svelte new file mode 100644 index 0000000..e7c4391 --- /dev/null +++ b/src/lib/components/common/Button/Button.svelte @@ -0,0 +1,57 @@ + + + + + diff --git a/src/lib/components/common/Button/index.ts b/src/lib/components/common/Button/index.ts new file mode 100644 index 0000000..14aed5d --- /dev/null +++ b/src/lib/components/common/Button/index.ts @@ -0,0 +1,3 @@ +import Button from './Button.svelte'; + +export default Button; diff --git a/src/lib/components/Loader.stories.svelte b/src/lib/components/common/Loader/Loader.stories.svelte similarity index 72% rename from src/lib/components/Loader.stories.svelte rename to src/lib/components/common/Loader/Loader.stories.svelte index 27ef46b..226cba1 100644 --- a/src/lib/components/Loader.stories.svelte +++ b/src/lib/components/common/Loader/Loader.stories.svelte @@ -3,10 +3,9 @@ import Loader from './Loader.svelte'; const { Story } = defineMeta({ - title: 'Loader', + title: 'Feedback/Loader', component: Loader, - tags: ['autodocs'] }); - \ No newline at end of file + diff --git a/src/lib/components/Loader.svelte b/src/lib/components/common/Loader/Loader.svelte similarity index 98% rename from src/lib/components/Loader.svelte rename to src/lib/components/common/Loader/Loader.svelte index b855fec..425d59e 100644 --- a/src/lib/components/Loader.svelte +++ b/src/lib/components/common/Loader/Loader.svelte @@ -48,4 +48,4 @@ transform: rotate(-360deg); } } - \ No newline at end of file + diff --git a/src/lib/components/common/Loader/index.ts b/src/lib/components/common/Loader/index.ts new file mode 100644 index 0000000..9623773 --- /dev/null +++ b/src/lib/components/common/Loader/index.ts @@ -0,0 +1,3 @@ +import Loader from './Loader.svelte'; + +export default Loader; diff --git a/src/lib/components/common/TextInput/TextInput.stories.svelte b/src/lib/components/common/TextInput/TextInput.stories.svelte new file mode 100644 index 0000000..74eb578 --- /dev/null +++ b/src/lib/components/common/TextInput/TextInput.stories.svelte @@ -0,0 +1,45 @@ + + +{#snippet icon()} + +{/snippet} + + + + diff --git a/src/lib/components/common/TextInput/TextInput.svelte b/src/lib/components/common/TextInput/TextInput.svelte new file mode 100644 index 0000000..affbd2c --- /dev/null +++ b/src/lib/components/common/TextInput/TextInput.svelte @@ -0,0 +1,68 @@ + + + + + diff --git a/src/lib/components/common/TextInput/index.ts b/src/lib/components/common/TextInput/index.ts new file mode 100644 index 0000000..89470e9 --- /dev/null +++ b/src/lib/components/common/TextInput/index.ts @@ -0,0 +1,3 @@ +import TextInput from './TextInput.svelte'; + +export default TextInput; diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts deleted file mode 100644 index 1689ba6..0000000 --- a/src/lib/components/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Navbar.svelte'; \ No newline at end of file diff --git a/src/lib/index.ts b/src/lib/index.ts index e5efcb2..aa2aa7e 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1,2 +1,2 @@ // place files you want to import through the `$lib` alias in this folder. -export * from './components'; \ No newline at end of file +export * from './components'; diff --git a/src/lib/server/config/index.ts b/src/lib/server/config/index.ts index b7dcdbe..0239640 100644 --- a/src/lib/server/config/index.ts +++ b/src/lib/server/config/index.ts @@ -8,7 +8,7 @@ export interface Configuration { export const LoadConfig = (): Configuration => { const { success, data, error } = z .object({ - VITE_APP_VERSION: z.string().default('development') + VITE_APP_VERSION: z.string().default('development'), }) .safeParse(import.meta.env); @@ -17,8 +17,8 @@ export const LoadConfig = (): Configuration => { } return { - app_version: data!.VITE_APP_VERSION + app_version: data!.VITE_APP_VERSION, }; }; -export const Config = LoadConfig(); \ No newline at end of file +export const Config = LoadConfig(); diff --git a/src/lib/server/logger/index.ts b/src/lib/server/logger/index.ts index 38ed4aa..7dea51d 100644 --- a/src/lib/server/logger/index.ts +++ b/src/lib/server/logger/index.ts @@ -19,5 +19,5 @@ export const yogaLogger: YogaLogger = { error(...args) { // @ts-expect-error types dont match logger.error(...args); - } -}; \ No newline at end of file + }, +}; diff --git a/src/lib/server/lucia.ts b/src/lib/server/lucia.ts index ac99da9..be9c091 100644 --- a/src/lib/server/lucia.ts +++ b/src/lib/server/lucia.ts @@ -7,14 +7,14 @@ const adapter = new PrismaAdapter(prisma.session, prisma.user); export const auth = new Lucia(adapter, { sessionCookie: { attributes: { - secure: process.env.NODE_ENV === 'production' - } + secure: process.env.NODE_ENV === 'production', + }, }, getUserAttributes: (attributes) => { return { - email: attributes.email + email: attributes.email, }; - } + }, }); declare module 'lucia' { diff --git a/src/lib/server/pothos/builder.ts b/src/lib/server/pothos/builder.ts index 0b7fda4..15de43f 100644 --- a/src/lib/server/pothos/builder.ts +++ b/src/lib/server/pothos/builder.ts @@ -23,6 +23,6 @@ export const builder = new SchemaBuilder({ // use where clause from prismaRelatedConnection for totalCount (defaults to true) filterConnectionTotalCount: true, // warn when not using a query parameter correctly - onUnusedQuery: process.env.NODE_ENV === 'production' ? null : 'warn' - } -}); \ No newline at end of file + onUnusedQuery: process.env.NODE_ENV === 'production' ? null : 'warn', + }, +}); diff --git a/src/lib/server/pothos/index.ts b/src/lib/server/pothos/index.ts index 5d5aa13..e27a6e2 100644 --- a/src/lib/server/pothos/index.ts +++ b/src/lib/server/pothos/index.ts @@ -1 +1 @@ -export * from './schema'; \ No newline at end of file +export * from './schema'; diff --git a/src/lib/server/pothos/schema/Scalars/Date.ts b/src/lib/server/pothos/schema/Scalars/Date.ts index 6573f0a..7fe4322 100644 --- a/src/lib/server/pothos/schema/Scalars/Date.ts +++ b/src/lib/server/pothos/schema/Scalars/Date.ts @@ -10,5 +10,5 @@ export const DateScalar = builder.scalarType('Date', { throw new Error('Cyka blyat'); } return new Date(date); - } -}); \ No newline at end of file + }, +}); diff --git a/src/lib/server/pothos/schema/Scalars/index.ts b/src/lib/server/pothos/schema/Scalars/index.ts index 0751f41..337b487 100644 --- a/src/lib/server/pothos/schema/Scalars/index.ts +++ b/src/lib/server/pothos/schema/Scalars/index.ts @@ -5,4 +5,4 @@ export type Scalars = { Input: Date; Output: Date; }; -}; \ No newline at end of file +}; diff --git a/src/lib/server/pothos/schema/index.ts b/src/lib/server/pothos/schema/index.ts index acdab44..84e199f 100644 --- a/src/lib/server/pothos/schema/index.ts +++ b/src/lib/server/pothos/schema/index.ts @@ -5,7 +5,7 @@ builder.queryType({}); builder.queryField('version', (t) => t.string({ description: 'Application version', - resolve: (parent, args, context) => context.config.app_version + resolve: (parent, args, context) => context.config.app_version, }) ); @@ -15,4 +15,4 @@ import './Scalars'; import './posts'; import './users'; -export const Schema = builder.toSchema(); \ No newline at end of file +export const Schema = builder.toSchema(); diff --git a/src/lib/server/pothos/schema/posts.ts b/src/lib/server/pothos/schema/posts.ts index f616871..1885f06 100644 --- a/src/lib/server/pothos/schema/posts.ts +++ b/src/lib/server/pothos/schema/posts.ts @@ -9,39 +9,39 @@ export const Post = builder.prismaObject('Post', { published: t.exposeBoolean('published'), author: t.relation('author'), createdAt: t.expose('createdAt', { - type: 'Date' + type: 'Date', }), updatedAt: t.expose('updatedAt', { - type: 'Date' - }) - }) + type: 'Date', + }), + }), }); const CreatePost = builder.inputType('CreatePost', { fields: (t) => ({ title: t.string({ - required: true + required: true, }), content: t.string({ - required: true + required: true, }), published: t.boolean(), authorId: t.id({ - required: true - }) - }) + required: true, + }), + }), }); const UpdatePost = builder.inputType('UpdatePost', { fields: (t) => ({ id: t.id({ - required: true + required: true, }), title: t.string(), content: t.string(), published: t.boolean(), - authorId: t.id() - }) + authorId: t.id(), + }), }); builder.queryFields((t) => ({ @@ -49,19 +49,19 @@ builder.queryFields((t) => ({ type: [Post], resolve: async () => { return await prisma.post.findMany(); - } - }) + }, + }), })); builder.mutationFields((t) => ({ createPost: t.field({ type: Post, args: { - input: t.arg({ required: true, type: CreatePost }) + input: t.arg({ required: true, type: CreatePost }), }, resolve: async (parent, args) => { const author = await prisma.user.findUnique({ - where: { id: Number(args.input.authorId) } + where: { id: Number(args.input.authorId) }, }); if (!author) { throw new Error('Author does not exist!'); @@ -73,23 +73,23 @@ builder.mutationFields((t) => ({ published: args.input.published, author: { connect: { - id: author.id - } - } - } + id: author.id, + }, + }, + }, }); return post; - } + }, }), updatePost: t.field({ type: Post, args: { - input: t.arg({ required: true, type: UpdatePost }) + input: t.arg({ required: true, type: UpdatePost }), }, resolve: async (parent, args) => { const post = await prisma.post.update({ where: { - id: Number(args.input.id) + id: Number(args.input.id), }, data: { title: args.input.title ?? undefined, @@ -98,13 +98,13 @@ builder.mutationFields((t) => ({ ...(args.input.authorId && { author: { connect: { - id: Number(args.input.authorId) - } - } - }) - } + id: Number(args.input.authorId), + }, + }, + }), + }, }); return post; - } - }) -})); \ No newline at end of file + }, + }), +})); diff --git a/src/lib/server/pothos/schema/users.ts b/src/lib/server/pothos/schema/users.ts index c15b8bb..210ad57 100644 --- a/src/lib/server/pothos/schema/users.ts +++ b/src/lib/server/pothos/schema/users.ts @@ -8,33 +8,33 @@ export const User = builder.prismaObject('User', { name: t.exposeString('name'), posts: t.relation('posts'), createdAt: t.expose('createdAt', { - type: 'Date' + type: 'Date', }), updatedAt: t.expose('updatedAt', { - type: 'Date' - }) - }) + type: 'Date', + }), + }), }); const CreateUser = builder.inputType('CreateUser', { fields: (t) => ({ email: t.string({ - required: true + required: true, }), name: t.string({ - required: true - }) - }) + required: true, + }), + }), }); const UpdateUser = builder.inputType('UpdateUser', { fields: (t) => ({ id: t.id({ - required: true + required: true, }), email: t.string(), - name: t.string() - }) + name: t.string(), + }), }); builder.queryFields((t) => ({ @@ -42,42 +42,42 @@ builder.queryFields((t) => ({ type: [User], resolve: async () => { return await prisma.user.findMany(); - } - }) + }, + }), })); builder.mutationFields((t) => ({ createUser: t.field({ type: User, args: { - input: t.arg({ required: true, type: CreateUser }) + input: t.arg({ required: true, type: CreateUser }), }, resolve: async (parent, args) => { const post = await prisma.user.create({ data: { email: args.input.email, - name: args.input.name - } + name: args.input.name, + }, }); return post; - } + }, }), updateUser: t.field({ type: User, args: { - input: t.arg({ required: true, type: UpdateUser }) + input: t.arg({ required: true, type: UpdateUser }), }, resolve: async (parent, args) => { const post = await prisma.user.update({ where: { - id: Number(args.input.id) + id: Number(args.input.id), }, data: { email: args.input.email, - name: args.input.name ?? undefined - } + name: args.input.name ?? undefined, + }, }); return post; - } - }) -})); \ No newline at end of file + }, + }), +})); diff --git a/src/lib/server/prisma/index.ts b/src/lib/server/prisma/index.ts index fbb7b51..9b6c4ce 100644 --- a/src/lib/server/prisma/index.ts +++ b/src/lib/server/prisma/index.ts @@ -1,3 +1,3 @@ import { PrismaClient } from '@prisma/client'; -export const prisma = new PrismaClient(); \ No newline at end of file +export const prisma = new PrismaClient(); diff --git a/src/lib/server/yoga/context.ts b/src/lib/server/yoga/context.ts index 8a3ab51..e7eff70 100644 --- a/src/lib/server/yoga/context.ts +++ b/src/lib/server/yoga/context.ts @@ -3,5 +3,5 @@ import type { YogaInitialContext } from 'graphql-yoga'; export const Context = (initialContext: YogaInitialContext) => ({ ...initialContext, - config: Config -}); \ No newline at end of file + config: Config, +}); diff --git a/src/lib/server/yoga/index.ts b/src/lib/server/yoga/index.ts index b489ffb..8e2b5fb 100644 --- a/src/lib/server/yoga/index.ts +++ b/src/lib/server/yoga/index.ts @@ -1,2 +1,2 @@ export * from './context'; -export * from './server'; \ No newline at end of file +export * from './server'; diff --git a/src/lib/server/yoga/server.ts b/src/lib/server/yoga/server.ts index 4bdfbe6..aa17066 100644 --- a/src/lib/server/yoga/server.ts +++ b/src/lib/server/yoga/server.ts @@ -10,5 +10,5 @@ export const Yoga = createYoga({ graphqlEndpoint: '/api/graphql', // Let Yoga use sveltekit's Response object fetchAPI: { Response }, - logging: yogaLogger -}); \ No newline at end of file + logging: yogaLogger, +}); diff --git a/src/lib/types/daisy-colors.ts b/src/lib/types/daisy-colors.ts new file mode 100644 index 0000000..e8c5062 --- /dev/null +++ b/src/lib/types/daisy-colors.ts @@ -0,0 +1,12 @@ +export type DaisyColor = + | 'default' + | 'neutral' + | 'primary' + | 'secondary' + | 'accent' + | 'ghost' + | 'link' + | 'info' + | 'success' + | 'warning' + | 'error'; diff --git a/src/lib/types/daisy-sizes.ts b/src/lib/types/daisy-sizes.ts new file mode 100644 index 0000000..87421d4 --- /dev/null +++ b/src/lib/types/daisy-sizes.ts @@ -0,0 +1 @@ +export type DaisySize = 'xs' | 'sm' | 'lg'; diff --git a/src/lib/types/index.ts b/src/lib/types/index.ts new file mode 100644 index 0000000..282f9e4 --- /dev/null +++ b/src/lib/types/index.ts @@ -0,0 +1,2 @@ +export * from './daisy-colors'; +export * from './daisy-sizes'; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 1a20558..ae9ad12 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -9,6 +9,6 @@ \ No newline at end of file + diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 3e2a230..89bd867 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,17 +1,17 @@ import { prisma } from '$lib/server/prisma'; +import { redirect } from '@sveltejs/kit'; export async function load(event) { - const userId = event.cookies.get('user'); - if (!userId) { - return { - authenticated: false - }; + const sessionId = event.cookies.get('auth_session'); + if (!sessionId) { + redirect(303, '/login'); } - const user = await prisma.user.findUnique({ + const user = await prisma.session.findUnique({ where: { - id: userId - } + id: sessionId, + }, }); - return { - authenticated: !!user - }; + if (!user) { + redirect(401, '/login'); + } + return {}; } diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 2a4c1a0..378f71c 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,19 +1,17 @@ -
-

Hestia

+
diff --git a/src/routes/api/graphql/+server.ts b/src/routes/api/graphql/+server.ts index c208143..e1eead7 100644 --- a/src/routes/api/graphql/+server.ts +++ b/src/routes/api/graphql/+server.ts @@ -1,3 +1,3 @@ import { Yoga } from '$lib/server/yoga'; -export { Yoga as GET, Yoga as POST }; \ No newline at end of file +export { Yoga as GET, Yoga as POST }; diff --git a/src/routes/app/+layout.svelte b/src/routes/app/+layout.svelte index b0005e0..c14e9a4 100644 --- a/src/routes/app/+layout.svelte +++ b/src/routes/app/+layout.svelte @@ -1,8 +1,8 @@ -{@render children()} \ No newline at end of file +{@render children()} diff --git a/src/routes/login/+page.server.ts b/src/routes/login/+page.server.ts index dc69fae..0fea32f 100644 --- a/src/routes/login/+page.server.ts +++ b/src/routes/login/+page.server.ts @@ -12,8 +12,8 @@ export const actions = { } const user = await prisma.user.findUnique({ where: { - email: form.get('email') as string - } + email: form.get('email') as string, + }, }); if (!user) { logger.error('User not found! ${user}'); @@ -31,7 +31,7 @@ export const actions = { const sessionCookie = auth.createSessionCookie(session.id); event.cookies.set(sessionCookie.name, sessionCookie.value, { path: '/', - maxAge: 120 + maxAge: 120, }); redirect(302, '/'); }, @@ -47,8 +47,8 @@ export const actions = { data: { email: form.get('email') as string, name: form.get('name') as string, - password: hashedPassword - } + password: hashedPassword, + }, }); const session = await auth.createSession(user.id.toString(), {}); const sessionCookie = auth.createSessionCookie(session.id); @@ -57,8 +57,8 @@ export const actions = { } event.cookies.set(sessionCookie.name, sessionCookie.value, { path: '/', - maxAge: 120 + maxAge: 120, }); redirect(302, '/'); - } + }, } satisfies Actions; diff --git a/src/routes/login/+page.svelte b/src/routes/login/+page.svelte index 1eb8b77..f32bb29 100644 --- a/src/routes/login/+page.svelte +++ b/src/routes/login/+page.svelte @@ -1,38 +1,50 @@ -
-

Hestia

-