diff --git a/frontend/package.json b/frontend/package.json
index 5fe0ff5..8e6a8f4 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,6 +30,7 @@
"@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",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index ecb9990..f3a1370 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
@@ -390,6 +396,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 +429,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 +449,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 +982,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 +1236,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 +1580,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'}
@@ -2059,6 +2090,16 @@ packages:
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ 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 +2150,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 +2178,19 @@ packages:
svelte:
optional: true
+ svelte-toolbelt@0.10.5:
+ resolution: {integrity: sha512-8e+eWTgxw1aiLxhDE8Rb1X6AoLitqpJz+WhAul2W7W58C8KoLoJQf1TgQdFPBiCPJ0Jg5y0Zi1uyua9em4VS0w==}
+ engines: {node: '>=18', pnpm: '>=8.7.0'}
+ peerDependencies:
+ svelte: ^5.30.2
+
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 +2617,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 +2643,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 +2665,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 +3284,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 +3555,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 +3932,8 @@ snapshots:
imurmurhash@0.1.4: {}
+ inline-style-parser@0.2.4: {}
+
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
@@ -4233,6 +4318,16 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
+ 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 +4373,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 +4406,13 @@ snapshots:
optionalDependencies:
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@5.36.13:
dependencies:
'@ampproject/remapping': 2.3.0
@@ -4324,6 +4430,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/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..840b2f6
--- /dev/null
+++ b/frontend/src/lib/common/framework/components/ui/dialog/dialog-close.svelte
@@ -0,0 +1,7 @@
+
+
+
Gallery is currently unavailable.
+