diff --git a/frontend/package.json b/frontend/package.json
index 5fe0ff5..acf56c4 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -20,7 +20,8 @@
"@eslint/compat": "^1.2.5",
"@eslint/js": "^9.18.0",
"@fortawesome/fontawesome-free": "^7.0.0",
- "@lucide/svelte": "^0.545.0",
+ "@internationalized/date": "^3.10.0",
+ "@lucide/svelte": "^0.544.0",
"@sveltejs/adapter-auto": "^6.0.0",
"@sveltejs/adapter-node": "^5.2.13",
"@sveltejs/kit": "^2.22.0",
@@ -29,18 +30,21 @@
"@tailwindcss/vite": "^4.0.0",
"@types/markdown-it": "^14.1.2",
"@types/sanitize-html": "^2.16.0",
+ "bits-ui": "^2.11.5",
"clsx": "^2.1.1",
"eslint": "^9.18.0",
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-svelte": "^3.0.0",
"globals": "^16.0.0",
"markdown-it": "^14.1.0",
+ "mode-watcher": "^1.1.0",
"prettier": "^3.4.2",
"prettier-plugin-svelte": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.11",
"sanitize-html": "^2.17.0",
"svelte": "^5.0.0",
"svelte-check": "^4.0.0",
+ "svelte-sonner": "^1.0.5",
"tailwind-merge": "^3.3.1",
"tailwind-variants": "^3.1.1",
"tailwindcss": "^4.0.0",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index ecb9990..98050c9 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -21,9 +21,12 @@ importers:
'@fortawesome/fontawesome-free':
specifier: ^7.0.0
version: 7.0.0
+ '@internationalized/date':
+ specifier: ^3.10.0
+ version: 3.10.0
'@lucide/svelte':
- specifier: ^0.545.0
- version: 0.545.0(svelte@5.36.13)
+ specifier: ^0.544.0
+ version: 0.544.0(svelte@5.36.13)
'@sveltejs/adapter-auto':
specifier: ^6.0.0
version: 6.0.1(@sveltejs/kit@2.25.1(@sveltejs/vite-plugin-svelte@6.1.0(svelte@5.36.13)(vite@7.0.5(@types/node@24.2.0)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.36.13)(vite@7.0.5(@types/node@24.2.0)(jiti@2.4.2)(lightningcss@1.30.1)))
@@ -48,6 +51,9 @@ importers:
'@types/sanitize-html':
specifier: ^2.16.0
version: 2.16.0
+ bits-ui:
+ specifier: ^2.11.5
+ version: 2.11.5(@internationalized/date@3.10.0)(svelte@5.36.13)
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -66,6 +72,9 @@ importers:
markdown-it:
specifier: ^14.1.0
version: 14.1.0
+ mode-watcher:
+ specifier: ^1.1.0
+ version: 1.1.0(svelte@5.36.13)
prettier:
specifier: ^3.4.2
version: 3.6.2
@@ -84,6 +93,9 @@ importers:
svelte-check:
specifier: ^4.0.0
version: 4.3.0(picomatch@4.0.3)(svelte@5.36.13)(typescript@5.8.3)
+ svelte-sonner:
+ specifier: ^1.0.5
+ version: 1.0.5(svelte@5.36.13)
tailwind-merge:
specifier: ^3.3.1
version: 3.3.1
@@ -390,6 +402,15 @@ packages:
resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@floating-ui/core@1.7.3':
+ resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
+
+ '@floating-ui/dom@1.7.4':
+ resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
+
+ '@floating-ui/utils@0.2.10':
+ resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+
'@fortawesome/fontawesome-free@7.0.0':
resolution: {integrity: sha512-X48nISrSOa89zu2VMljC4XaRf8NmgTwQBVHfS2Nu5G00ZwM31oOVrAtGxZF3b6wDYf9lJsf/Eq4cCSFKIkOWPQ==}
engines: {node: '>=6'}
@@ -414,6 +435,9 @@ packages:
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
+ '@internationalized/date@3.10.0':
+ resolution: {integrity: sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==}
+
'@isaacs/fs-minipass@4.0.1':
resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
engines: {node: '>=18.0.0'}
@@ -431,8 +455,8 @@ packages:
'@jridgewell/trace-mapping@0.3.29':
resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==}
- '@lucide/svelte@0.545.0':
- resolution: {integrity: sha512-RlAtWefx9MdpXaOMbx3Qv3/NqpeZKOIPxN2D0RBN2+op0opKly8VgYEEWZTT6Ow/zf7UwyTg6/0ExJlsVLK+8g==}
+ '@lucide/svelte@0.544.0':
+ resolution: {integrity: sha512-9f9O6uxng2pLB01sxNySHduJN3HTl5p0HDu4H26VR51vhZfiMzyOMe9Mhof3XAk4l813eTtl+/DYRvGyoRR+yw==}
peerDependencies:
svelte: ^5
@@ -964,6 +988,9 @@ packages:
svelte: ^5.0.0
vite: ^6.3.0 || ^7.0.0
+ '@swc/helpers@0.5.17':
+ resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
+
'@tailwindcss/node@4.1.11':
resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==}
@@ -1215,6 +1242,13 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
+ bits-ui@2.11.5:
+ resolution: {integrity: sha512-d7b6HrrCUeK261c777agFz0G5lx13RMA0DT022e4SRuIjI3bZ8ci53YxIZ2/jpXTmeAeqeShyC+Mgibh9OeW9A==}
+ engines: {node: '>=20'}
+ peerDependencies:
+ '@internationalized/date': ^3.8.1
+ svelte: ^5.33.0
+
brace-expansion@1.1.12:
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
@@ -1552,6 +1586,9 @@ packages:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
+ inline-style-parser@0.2.4:
+ resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+
is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
@@ -1782,6 +1819,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ mode-watcher@1.1.0:
+ resolution: {integrity: sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==}
+ peerDependencies:
+ svelte: ^5.27.0
+
module-details-from-path@1.0.4:
resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==}
@@ -2059,6 +2101,31 @@ packages:
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ runed@0.23.4:
+ resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==}
+ peerDependencies:
+ svelte: ^5.7.0
+
+ runed@0.25.0:
+ resolution: {integrity: sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg==}
+ peerDependencies:
+ svelte: ^5.7.0
+
+ runed@0.28.0:
+ resolution: {integrity: sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ==}
+ peerDependencies:
+ svelte: ^5.7.0
+
+ runed@0.29.2:
+ resolution: {integrity: sha512-0cq6cA6sYGZwl/FvVqjx9YN+1xEBu9sDDyuWdDW1yWX7JF2wmvmVKfH+hVCZs+csW+P3ARH92MjI3H9QTagOQA==}
+ peerDependencies:
+ svelte: ^5.7.0
+
+ runed@0.31.1:
+ resolution: {integrity: sha512-v3czcTnO+EJjiPvD4dwIqfTdHLZ8oH0zJheKqAHh9QMViY7Qb29UlAMRpX7ZtHh7AFqV60KmfxaJ9QMy+L1igQ==}
+ peerDependencies:
+ svelte: ^5.7.0
+
sade@1.8.1:
resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
engines: {node: '>=6'}
@@ -2109,6 +2176,9 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ style-to-object@1.0.11:
+ resolution: {integrity: sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -2134,10 +2204,30 @@ packages:
svelte:
optional: true
+ svelte-sonner@1.0.5:
+ resolution: {integrity: sha512-9dpGPFqKb/QWudYqGnEz93vuY+NgCEvyNvxoCLMVGw6sDN/3oVeKV1xiEirW2E1N3vJEyj5imSBNOGltQHA7mg==}
+ peerDependencies:
+ svelte: ^5.0.0
+
+ svelte-toolbelt@0.10.5:
+ resolution: {integrity: sha512-8e+eWTgxw1aiLxhDE8Rb1X6AoLitqpJz+WhAul2W7W58C8KoLoJQf1TgQdFPBiCPJ0Jg5y0Zi1uyua9em4VS0w==}
+ engines: {node: '>=18', pnpm: '>=8.7.0'}
+ peerDependencies:
+ svelte: ^5.30.2
+
+ svelte-toolbelt@0.7.1:
+ resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==}
+ engines: {node: '>=18', pnpm: '>=8.7.0'}
+ peerDependencies:
+ svelte: ^5.0.0
+
svelte@5.36.13:
resolution: {integrity: sha512-LnSywHHQM/nJekC65d84T1Yo85IeCYN4AryWYPhTokSvcEAFdYFCfbMhX1mc0zHizT736QQj0nalUk+SXaWrEQ==}
engines: {node: '>=18'}
+ tabbable@6.2.0:
+ resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+
tailwind-merge@3.3.1:
resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==}
@@ -2564,6 +2654,17 @@ snapshots:
'@eslint/core': 0.15.1
levn: 0.4.1
+ '@floating-ui/core@1.7.3':
+ dependencies:
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/dom@1.7.4':
+ dependencies:
+ '@floating-ui/core': 1.7.3
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/utils@0.2.10': {}
+
'@fortawesome/fontawesome-free@7.0.0': {}
'@humanfs/core@0.19.1': {}
@@ -2579,6 +2680,10 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
+ '@internationalized/date@3.10.0':
+ dependencies:
+ '@swc/helpers': 0.5.17
+
'@isaacs/fs-minipass@4.0.1':
dependencies:
minipass: 7.1.2
@@ -2597,7 +2702,7 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.4
- '@lucide/svelte@0.545.0(svelte@5.36.13)':
+ '@lucide/svelte@0.544.0(svelte@5.36.13)':
dependencies:
svelte: 5.36.13
@@ -3216,6 +3321,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@swc/helpers@0.5.17':
+ dependencies:
+ tslib: 2.8.1
+
'@tailwindcss/node@4.1.11':
dependencies:
'@ampproject/remapping': 2.3.0
@@ -3483,6 +3592,17 @@ snapshots:
binary-extensions@2.3.0: {}
+ bits-ui@2.11.5(@internationalized/date@3.10.0)(svelte@5.36.13):
+ dependencies:
+ '@floating-ui/core': 1.7.3
+ '@floating-ui/dom': 1.7.4
+ '@internationalized/date': 3.10.0
+ esm-env: 1.2.2
+ runed: 0.31.1(svelte@5.36.13)
+ svelte: 5.36.13
+ svelte-toolbelt: 0.10.5(svelte@5.36.13)
+ tabbable: 6.2.0
+
brace-expansion@1.1.12:
dependencies:
balanced-match: 1.0.2
@@ -3849,6 +3969,8 @@ snapshots:
imurmurhash@0.1.4: {}
+ inline-style-parser@0.2.4: {}
+
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
@@ -4033,6 +4155,12 @@ snapshots:
mkdirp@3.0.1: {}
+ mode-watcher@1.1.0(svelte@5.36.13):
+ dependencies:
+ runed: 0.25.0(svelte@5.36.13)
+ svelte: 5.36.13
+ svelte-toolbelt: 0.7.1(svelte@5.36.13)
+
module-details-from-path@1.0.4: {}
mri@1.2.0: {}
@@ -4233,6 +4361,31 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
+ runed@0.23.4(svelte@5.36.13):
+ dependencies:
+ esm-env: 1.2.2
+ svelte: 5.36.13
+
+ runed@0.25.0(svelte@5.36.13):
+ dependencies:
+ esm-env: 1.2.2
+ svelte: 5.36.13
+
+ runed@0.28.0(svelte@5.36.13):
+ dependencies:
+ esm-env: 1.2.2
+ svelte: 5.36.13
+
+ runed@0.29.2(svelte@5.36.13):
+ dependencies:
+ esm-env: 1.2.2
+ svelte: 5.36.13
+
+ runed@0.31.1(svelte@5.36.13):
+ dependencies:
+ esm-env: 1.2.2
+ svelte: 5.36.13
+
sade@1.8.1:
dependencies:
mri: 1.2.0
@@ -4278,6 +4431,10 @@ snapshots:
strip-json-comments@3.1.1: {}
+ style-to-object@1.0.11:
+ dependencies:
+ inline-style-parser: 0.2.4
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -4307,6 +4464,25 @@ snapshots:
optionalDependencies:
svelte: 5.36.13
+ svelte-sonner@1.0.5(svelte@5.36.13):
+ dependencies:
+ runed: 0.28.0(svelte@5.36.13)
+ svelte: 5.36.13
+
+ svelte-toolbelt@0.10.5(svelte@5.36.13):
+ dependencies:
+ clsx: 2.1.1
+ runed: 0.29.2(svelte@5.36.13)
+ style-to-object: 1.0.11
+ svelte: 5.36.13
+
+ svelte-toolbelt@0.7.1(svelte@5.36.13):
+ dependencies:
+ clsx: 2.1.1
+ runed: 0.23.4(svelte@5.36.13)
+ style-to-object: 1.0.11
+ svelte: 5.36.13
+
svelte@5.36.13:
dependencies:
'@ampproject/remapping': 2.3.0
@@ -4324,6 +4500,8 @@ snapshots:
magic-string: 0.30.17
zimmerframe: 1.1.2
+ tabbable@6.2.0: {}
+
tailwind-merge@3.3.1: {}
tailwind-variants@3.1.1(tailwind-merge@3.3.1)(tailwindcss@4.1.11):
diff --git a/frontend/src/app.css b/frontend/src/app.css
index de683ad..1572abe 100644
--- a/frontend/src/app.css
+++ b/frontend/src/app.css
@@ -153,6 +153,10 @@ button {
@apply cursor-pointer;
}
-.container {
+.content-container {
@apply mx-auto max-w-screen-xl px-4 md:px-6;
}
+
+.dashboard-container {
+ @apply mx-auto w-full max-w-screen-lg px-7;
+}
diff --git a/frontend/src/lib/auth/domain/entity/user.ts b/frontend/src/lib/auth/domain/entity/user.ts
index 43a2157..42d728c 100644
--- a/frontend/src/lib/auth/domain/entity/user.ts
+++ b/frontend/src/lib/auth/domain/entity/user.ts
@@ -1,7 +1,7 @@
export class User {
- id: number;
- name: string;
- email: string;
+ readonly id: number;
+ readonly name: string;
+ readonly email: string;
constructor(props: { id: number; name: string; email: string }) {
this.id = props.id;
diff --git a/frontend/src/lib/common/framework/components/ui/dialog/dialog-close.svelte b/frontend/src/lib/common/framework/components/ui/dialog/dialog-close.svelte
new file mode 100644
index 0000000..e8a96a7
--- /dev/null
+++ b/frontend/src/lib/common/framework/components/ui/dialog/dialog-close.svelte
@@ -0,0 +1,7 @@
+
+
+
Gallery is currently unavailable.
+