Przeglądaj źródła

feat: sidebar ui update

Timothy J. Baek 1 rok temu
rodzic
commit
71def5c4cb

+ 233 - 32
package-lock.json

@@ -1,15 +1,16 @@
 {
 {
 	"name": "open-webui",
 	"name": "open-webui",
-	"version": "0.1.106",
+	"version": "0.1.112",
 	"lockfileVersion": 2,
 	"lockfileVersion": 2,
 	"requires": true,
 	"requires": true,
 	"packages": {
 	"packages": {
 		"": {
 		"": {
 			"name": "open-webui",
 			"name": "open-webui",
-			"version": "0.1.106",
+			"version": "0.1.112",
 			"dependencies": {
 			"dependencies": {
 				"@sveltejs/adapter-node": "^1.3.1",
 				"@sveltejs/adapter-node": "^1.3.1",
 				"async": "^3.2.5",
 				"async": "^3.2.5",
+				"bits-ui": "^0.19.7",
 				"dayjs": "^1.11.10",
 				"dayjs": "^1.11.10",
 				"file-saver": "^2.0.5",
 				"file-saver": "^2.0.5",
 				"highlight.js": "^11.9.0",
 				"highlight.js": "^11.9.0",
@@ -150,13 +151,35 @@
 			}
 			}
 		},
 		},
 		"node_modules/@fastify/busboy": {
 		"node_modules/@fastify/busboy": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz",
-			"integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==",
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
+			"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
 			"engines": {
 			"engines": {
 				"node": ">=14"
 				"node": ">=14"
 			}
 			}
 		},
 		},
+		"node_modules/@floating-ui/core": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz",
+			"integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
+			"dependencies": {
+				"@floating-ui/utils": "^0.2.1"
+			}
+		},
+		"node_modules/@floating-ui/dom": {
+			"version": "1.6.3",
+			"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz",
+			"integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==",
+			"dependencies": {
+				"@floating-ui/core": "^1.0.0",
+				"@floating-ui/utils": "^0.2.0"
+			}
+		},
+		"node_modules/@floating-ui/utils": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
+			"integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
+		},
 		"node_modules/@humanwhocodes/config-array": {
 		"node_modules/@humanwhocodes/config-array": {
 			"version": "0.11.13",
 			"version": "0.11.13",
 			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
 			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
@@ -190,6 +213,14 @@
 			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
 			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
 			"dev": true
 			"dev": true
 		},
 		},
+		"node_modules/@internationalized/date": {
+			"version": "3.5.2",
+			"resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz",
+			"integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==",
+			"dependencies": {
+				"@swc/helpers": "^0.5.0"
+			}
+		},
 		"node_modules/@jridgewell/gen-mapping": {
 		"node_modules/@jridgewell/gen-mapping": {
 			"version": "0.3.3",
 			"version": "0.3.3",
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
@@ -233,6 +264,39 @@
 				"@jridgewell/sourcemap-codec": "^1.4.14"
 				"@jridgewell/sourcemap-codec": "^1.4.14"
 			}
 			}
 		},
 		},
+		"node_modules/@melt-ui/svelte": {
+			"version": "0.76.0",
+			"resolved": "https://registry.npmjs.org/@melt-ui/svelte/-/svelte-0.76.0.tgz",
+			"integrity": "sha512-X1ktxKujjLjOBt8LBvfckHGDMrkHWceRt1jdsUTf0EH76ikNPP1ofSoiV0IhlduDoCBV+2YchJ8kXCDfDXfC9Q==",
+			"dependencies": {
+				"@floating-ui/core": "^1.3.1",
+				"@floating-ui/dom": "^1.4.5",
+				"@internationalized/date": "^3.5.0",
+				"dequal": "^2.0.3",
+				"focus-trap": "^7.5.2",
+				"nanoid": "^5.0.4"
+			},
+			"peerDependencies": {
+				"svelte": ">=3 <5"
+			}
+		},
+		"node_modules/@melt-ui/svelte/node_modules/nanoid": {
+			"version": "5.0.6",
+			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.6.tgz",
+			"integrity": "sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
+				}
+			],
+			"bin": {
+				"nanoid": "bin/nanoid.js"
+			},
+			"engines": {
+				"node": "^18 || >=20"
+			}
+		},
 		"node_modules/@nodelib/fs.scandir": {
 		"node_modules/@nodelib/fs.scandir": {
 			"version": "2.1.5",
 			"version": "2.1.5",
 			"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
 			"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -472,9 +536,9 @@
 			}
 			}
 		},
 		},
 		"node_modules/@sveltejs/kit": {
 		"node_modules/@sveltejs/kit": {
-			"version": "1.30.3",
-			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.30.3.tgz",
-			"integrity": "sha512-0DzVXfU4h+tChFvoc8C61IqErCyskD4ydSIDjpKS2lYlEzIYrtYrY7juSqACFxqcvZAnOEXvSY+zZ8br0+ZMMg==",
+			"version": "1.30.4",
+			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.30.4.tgz",
+			"integrity": "sha512-JSQIQT6XvdchCRQEm7BABxPC56WP5RYVONAi+09S8tmzeP43fBsRlr95bFmsTQM2RHBldfgQk+jgdnsKI75daA==",
 			"hasInstallScript": true,
 			"hasInstallScript": true,
 			"dependencies": {
 			"dependencies": {
 				"@sveltejs/vite-plugin-svelte": "^2.5.0",
 				"@sveltejs/vite-plugin-svelte": "^2.5.0",
@@ -489,7 +553,7 @@
 				"set-cookie-parser": "^2.6.0",
 				"set-cookie-parser": "^2.6.0",
 				"sirv": "^2.0.2",
 				"sirv": "^2.0.2",
 				"tiny-glob": "^0.2.9",
 				"tiny-glob": "^0.2.9",
-				"undici": "~5.26.2"
+				"undici": "^5.28.3"
 			},
 			},
 			"bin": {
 			"bin": {
 				"svelte-kit": "svelte-kit.js"
 				"svelte-kit": "svelte-kit.js"
@@ -539,6 +603,14 @@
 				"vite": "^4.0.0"
 				"vite": "^4.0.0"
 			}
 			}
 		},
 		},
+		"node_modules/@swc/helpers": {
+			"version": "0.5.6",
+			"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz",
+			"integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==",
+			"dependencies": {
+				"tslib": "^2.4.0"
+			}
+		},
 		"node_modules/@tailwindcss/typography": {
 		"node_modules/@tailwindcss/typography": {
 			"version": "0.5.10",
 			"version": "0.5.10",
 			"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
 			"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
@@ -1001,6 +1073,36 @@
 				"node": ">=8"
 				"node": ">=8"
 			}
 			}
 		},
 		},
+		"node_modules/bits-ui": {
+			"version": "0.19.7",
+			"resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-0.19.7.tgz",
+			"integrity": "sha512-GHUpKvN7QyazhnZNkUy0lxg6W1M6KJHWSZ4a/UGCjPE6nQgk6vKbGysY67PkDtQMknZTZAzVoMj1Eic4IKeCRQ==",
+			"dependencies": {
+				"@internationalized/date": "^3.5.1",
+				"@melt-ui/svelte": "0.76.0",
+				"nanoid": "^5.0.5"
+			},
+			"peerDependencies": {
+				"svelte": "^4.0.0"
+			}
+		},
+		"node_modules/bits-ui/node_modules/nanoid": {
+			"version": "5.0.6",
+			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.6.tgz",
+			"integrity": "sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==",
+			"funding": [
+				{
+					"type": "github",
+					"url": "https://github.com/sponsors/ai"
+				}
+			],
+			"bin": {
+				"nanoid": "bin/nanoid.js"
+			},
+			"engines": {
+				"node": "^18 || >=20"
+			}
+		},
 		"node_modules/brace-expansion": {
 		"node_modules/brace-expansion": {
 			"version": "1.1.11",
 			"version": "1.1.11",
 			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1753,6 +1855,14 @@
 			"integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
 			"integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
 			"dev": true
 			"dev": true
 		},
 		},
+		"node_modules/focus-trap": {
+			"version": "7.5.4",
+			"resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz",
+			"integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==",
+			"dependencies": {
+				"tabbable": "^6.2.0"
+			}
+		},
 		"node_modules/fraction.js": {
 		"node_modules/fraction.js": {
 			"version": "4.3.6",
 			"version": "4.3.6",
 			"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
 			"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
@@ -3304,6 +3414,11 @@
 				"svelte": ">=3 <5"
 				"svelte": ">=3 <5"
 			}
 			}
 		},
 		},
+		"node_modules/tabbable": {
+			"version": "6.2.0",
+			"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+			"integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
+		},
 		"node_modules/tailwindcss": {
 		"node_modules/tailwindcss": {
 			"version": "3.3.3",
 			"version": "3.3.3",
 			"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
 			"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
@@ -3464,8 +3579,7 @@
 		"node_modules/tslib": {
 		"node_modules/tslib": {
 			"version": "2.6.2",
 			"version": "2.6.2",
 			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
 			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
-			"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
-			"dev": true
+			"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
 		},
 		},
 		"node_modules/type-check": {
 		"node_modules/type-check": {
 			"version": "0.4.0",
 			"version": "0.4.0",
@@ -3505,9 +3619,9 @@
 			}
 			}
 		},
 		},
 		"node_modules/undici": {
 		"node_modules/undici": {
-			"version": "5.26.4",
-			"resolved": "https://registry.npmjs.org/undici/-/undici-5.26.4.tgz",
-			"integrity": "sha512-OG+QOf0fTLtazL9P9X7yqWxQ+Z0395Wk6DSkyTxtaq3wQEjIroVe7Y4asCX/vcCxYpNGMnwz8F0qbRYUoaQVMw==",
+			"version": "5.28.3",
+			"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz",
+			"integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==",
 			"dependencies": {
 			"dependencies": {
 				"@fastify/busboy": "^2.0.0"
 				"@fastify/busboy": "^2.0.0"
 			},
 			},
@@ -3573,9 +3687,9 @@
 			}
 			}
 		},
 		},
 		"node_modules/vite": {
 		"node_modules/vite": {
-			"version": "4.5.1",
-			"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz",
-			"integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==",
+			"version": "4.5.2",
+			"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
+			"integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
 			"dependencies": {
 			"dependencies": {
 				"esbuild": "^0.18.10",
 				"esbuild": "^0.18.10",
 				"postcss": "^8.4.27",
 				"postcss": "^8.4.27",
@@ -3754,9 +3868,31 @@
 			"dev": true
 			"dev": true
 		},
 		},
 		"@fastify/busboy": {
 		"@fastify/busboy": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz",
-			"integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ=="
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
+			"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="
+		},
+		"@floating-ui/core": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz",
+			"integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
+			"requires": {
+				"@floating-ui/utils": "^0.2.1"
+			}
+		},
+		"@floating-ui/dom": {
+			"version": "1.6.3",
+			"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz",
+			"integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==",
+			"requires": {
+				"@floating-ui/core": "^1.0.0",
+				"@floating-ui/utils": "^0.2.0"
+			}
+		},
+		"@floating-ui/utils": {
+			"version": "0.2.1",
+			"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
+			"integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
 		},
 		},
 		"@humanwhocodes/config-array": {
 		"@humanwhocodes/config-array": {
 			"version": "0.11.13",
 			"version": "0.11.13",
@@ -3781,6 +3917,14 @@
 			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
 			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
 			"dev": true
 			"dev": true
 		},
 		},
+		"@internationalized/date": {
+			"version": "3.5.2",
+			"resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz",
+			"integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==",
+			"requires": {
+				"@swc/helpers": "^0.5.0"
+			}
+		},
 		"@jridgewell/gen-mapping": {
 		"@jridgewell/gen-mapping": {
 			"version": "0.3.3",
 			"version": "0.3.3",
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
@@ -3815,6 +3959,26 @@
 				"@jridgewell/sourcemap-codec": "^1.4.14"
 				"@jridgewell/sourcemap-codec": "^1.4.14"
 			}
 			}
 		},
 		},
+		"@melt-ui/svelte": {
+			"version": "0.76.0",
+			"resolved": "https://registry.npmjs.org/@melt-ui/svelte/-/svelte-0.76.0.tgz",
+			"integrity": "sha512-X1ktxKujjLjOBt8LBvfckHGDMrkHWceRt1jdsUTf0EH76ikNPP1ofSoiV0IhlduDoCBV+2YchJ8kXCDfDXfC9Q==",
+			"requires": {
+				"@floating-ui/core": "^1.3.1",
+				"@floating-ui/dom": "^1.4.5",
+				"@internationalized/date": "^3.5.0",
+				"dequal": "^2.0.3",
+				"focus-trap": "^7.5.2",
+				"nanoid": "^5.0.4"
+			},
+			"dependencies": {
+				"nanoid": {
+					"version": "5.0.6",
+					"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.6.tgz",
+					"integrity": "sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA=="
+				}
+			}
+		},
 		"@nodelib/fs.scandir": {
 		"@nodelib/fs.scandir": {
 			"version": "2.1.5",
 			"version": "2.1.5",
 			"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
 			"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -3981,9 +4145,9 @@
 			"requires": {}
 			"requires": {}
 		},
 		},
 		"@sveltejs/kit": {
 		"@sveltejs/kit": {
-			"version": "1.30.3",
-			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.30.3.tgz",
-			"integrity": "sha512-0DzVXfU4h+tChFvoc8C61IqErCyskD4ydSIDjpKS2lYlEzIYrtYrY7juSqACFxqcvZAnOEXvSY+zZ8br0+ZMMg==",
+			"version": "1.30.4",
+			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.30.4.tgz",
+			"integrity": "sha512-JSQIQT6XvdchCRQEm7BABxPC56WP5RYVONAi+09S8tmzeP43fBsRlr95bFmsTQM2RHBldfgQk+jgdnsKI75daA==",
 			"requires": {
 			"requires": {
 				"@sveltejs/vite-plugin-svelte": "^2.5.0",
 				"@sveltejs/vite-plugin-svelte": "^2.5.0",
 				"@types/cookie": "^0.5.1",
 				"@types/cookie": "^0.5.1",
@@ -3997,7 +4161,7 @@
 				"set-cookie-parser": "^2.6.0",
 				"set-cookie-parser": "^2.6.0",
 				"sirv": "^2.0.2",
 				"sirv": "^2.0.2",
 				"tiny-glob": "^0.2.9",
 				"tiny-glob": "^0.2.9",
-				"undici": "~5.26.2"
+				"undici": "^5.28.3"
 			}
 			}
 		},
 		},
 		"@sveltejs/vite-plugin-svelte": {
 		"@sveltejs/vite-plugin-svelte": {
@@ -4022,6 +4186,14 @@
 				"debug": "^4.3.4"
 				"debug": "^4.3.4"
 			}
 			}
 		},
 		},
+		"@swc/helpers": {
+			"version": "0.5.6",
+			"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.6.tgz",
+			"integrity": "sha512-aYX01Ke9hunpoCexYAgQucEpARGQ5w/cqHFrIR+e9gdKb1QWTsVJuTJ2ozQzIAxLyRQe/m+2RqzkyOOGiMKRQA==",
+			"requires": {
+				"tslib": "^2.4.0"
+			}
+		},
 		"@tailwindcss/typography": {
 		"@tailwindcss/typography": {
 			"version": "0.5.10",
 			"version": "0.5.10",
 			"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
 			"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz",
@@ -4334,6 +4506,23 @@
 			"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
 			"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
 			"dev": true
 			"dev": true
 		},
 		},
+		"bits-ui": {
+			"version": "0.19.7",
+			"resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-0.19.7.tgz",
+			"integrity": "sha512-GHUpKvN7QyazhnZNkUy0lxg6W1M6KJHWSZ4a/UGCjPE6nQgk6vKbGysY67PkDtQMknZTZAzVoMj1Eic4IKeCRQ==",
+			"requires": {
+				"@internationalized/date": "^3.5.1",
+				"@melt-ui/svelte": "0.76.0",
+				"nanoid": "^5.0.5"
+			},
+			"dependencies": {
+				"nanoid": {
+					"version": "5.0.6",
+					"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.6.tgz",
+					"integrity": "sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA=="
+				}
+			}
+		},
 		"brace-expansion": {
 		"brace-expansion": {
 			"version": "1.1.11",
 			"version": "1.1.11",
 			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 			"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -4878,6 +5067,14 @@
 			"integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
 			"integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
 			"dev": true
 			"dev": true
 		},
 		},
+		"focus-trap": {
+			"version": "7.5.4",
+			"resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz",
+			"integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==",
+			"requires": {
+				"tabbable": "^6.2.0"
+			}
+		},
 		"fraction.js": {
 		"fraction.js": {
 			"version": "4.3.6",
 			"version": "4.3.6",
 			"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
 			"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz",
@@ -5904,6 +6101,11 @@
 			"integrity": "sha512-jpPOgLtHwRaB6Vqo2dUQMv15/yUV/BQWTjKpEqQ11uqRSHKjAYUKZyGrHB2cQsGmyjR0JUzBD58btpgNqINQ/Q==",
 			"integrity": "sha512-jpPOgLtHwRaB6Vqo2dUQMv15/yUV/BQWTjKpEqQ11uqRSHKjAYUKZyGrHB2cQsGmyjR0JUzBD58btpgNqINQ/Q==",
 			"requires": {}
 			"requires": {}
 		},
 		},
+		"tabbable": {
+			"version": "6.2.0",
+			"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+			"integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
+		},
 		"tailwindcss": {
 		"tailwindcss": {
 			"version": "3.3.3",
 			"version": "3.3.3",
 			"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
 			"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
@@ -6023,8 +6225,7 @@
 		"tslib": {
 		"tslib": {
 			"version": "2.6.2",
 			"version": "2.6.2",
 			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
 			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
-			"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
-			"dev": true
+			"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
 		},
 		},
 		"type-check": {
 		"type-check": {
 			"version": "0.4.0",
 			"version": "0.4.0",
@@ -6048,9 +6249,9 @@
 			"dev": true
 			"dev": true
 		},
 		},
 		"undici": {
 		"undici": {
-			"version": "5.26.4",
-			"resolved": "https://registry.npmjs.org/undici/-/undici-5.26.4.tgz",
-			"integrity": "sha512-OG+QOf0fTLtazL9P9X7yqWxQ+Z0395Wk6DSkyTxtaq3wQEjIroVe7Y4asCX/vcCxYpNGMnwz8F0qbRYUoaQVMw==",
+			"version": "5.28.3",
+			"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz",
+			"integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==",
 			"requires": {
 			"requires": {
 				"@fastify/busboy": "^2.0.0"
 				"@fastify/busboy": "^2.0.0"
 			}
 			}
@@ -6086,9 +6287,9 @@
 			"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
 			"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="
 		},
 		},
 		"vite": {
 		"vite": {
-			"version": "4.5.1",
-			"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz",
-			"integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==",
+			"version": "4.5.2",
+			"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
+			"integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
 			"requires": {
 			"requires": {
 				"esbuild": "^0.18.10",
 				"esbuild": "^0.18.10",
 				"fsevents": "~2.3.2",
 				"fsevents": "~2.3.2",

+ 2 - 1
package.json

@@ -42,6 +42,7 @@
 	"dependencies": {
 	"dependencies": {
 		"@sveltejs/adapter-node": "^1.3.1",
 		"@sveltejs/adapter-node": "^1.3.1",
 		"async": "^3.2.5",
 		"async": "^3.2.5",
+		"bits-ui": "^0.19.7",
 		"dayjs": "^1.11.10",
 		"dayjs": "^1.11.10",
 		"file-saver": "^2.0.5",
 		"file-saver": "^2.0.5",
 		"highlight.js": "^11.9.0",
 		"highlight.js": "^11.9.0",
@@ -53,4 +54,4 @@
 		"tippy.js": "^6.3.7",
 		"tippy.js": "^6.3.7",
 		"uuid": "^9.0.1"
 		"uuid": "^9.0.1"
 	}
 	}
-}
+}

+ 30 - 0
src/lib/components/common/Dropdown.svelte

@@ -0,0 +1,30 @@
+<script lang="ts">
+	import { DropdownMenu } from 'bits-ui';
+</script>
+
+<DropdownMenu.Root>
+	<DropdownMenu.Trigger>
+		<slot />
+	</DropdownMenu.Trigger>
+
+	<slot name="content">
+		<DropdownMenu.Content
+			class="w-full max-w-[130px] rounded-lg px-1 py-1.5 border border-gray-700 z-50 bg-gray-850 text-white"
+			sideOffset={8}
+			side="bottom"
+			align="start"
+		>
+			<DropdownMenu.Item class="flex items-center px-3 py-2 text-sm  font-medium">
+				<div class="flex items-center">Profile</div>
+			</DropdownMenu.Item>
+
+			<DropdownMenu.Item class="flex items-center px-3 py-2 text-sm  font-medium">
+				<div class="flex items-center">Profile</div>
+			</DropdownMenu.Item>
+
+			<DropdownMenu.Item class="flex items-center px-3 py-2 text-sm  font-medium">
+				<div class="flex items-center">Profile</div>
+			</DropdownMenu.Item>
+		</DropdownMenu.Content>
+	</slot>
+</DropdownMenu.Root>

+ 19 - 0
src/lib/components/icons/GarbageBin.svelte

@@ -0,0 +1,19 @@
+<script lang="ts">
+	export let className = 'w-4 h-4';
+	export let strokeWidth = '1.5';
+</script>
+
+<svg
+	xmlns="http://www.w3.org/2000/svg"
+	fill="none"
+	viewBox="0 0 24 24"
+	stroke-width={strokeWidth}
+	stroke="currentColor"
+	class={className}
+>
+	<path
+		stroke-linecap="round"
+		stroke-linejoin="round"
+		d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"
+	/>
+</svg>

+ 19 - 0
src/lib/components/icons/Pencil.svelte

@@ -0,0 +1,19 @@
+<script lang="ts">
+	export let className = 'w-4 h-4';
+	export let strokeWidth = '1.5';
+</script>
+
+<svg
+	xmlns="http://www.w3.org/2000/svg"
+	fill="none"
+	viewBox="0 0 24 24"
+	stroke-width={strokeWidth}
+	stroke="currentColor"
+	class={className}
+>
+	<path
+		stroke-linecap="round"
+		stroke-linejoin="round"
+		d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
+	/>
+</svg>

+ 44 - 50
src/lib/components/layout/Sidebar.svelte

@@ -20,6 +20,8 @@
 	import { slide } from 'svelte/transition';
 	import { slide } from 'svelte/transition';
 	import { WEBUI_BASE_URL } from '$lib/constants';
 	import { WEBUI_BASE_URL } from '$lib/constants';
 	import Tooltip from '../common/Tooltip.svelte';
 	import Tooltip from '../common/Tooltip.svelte';
+	import Dropdown from '../common/Dropdown.svelte';
+	import ChatMenu from './Sidebar/ChatMenu.svelte';
 
 
 	let show = false;
 	let show = false;
 	let navElement;
 	let navElement;
@@ -27,6 +29,8 @@
 	let title: string = 'UI';
 	let title: string = 'UI';
 	let search = '';
 	let search = '';
 
 
+	let selectedChatId = null;
+
 	let chatDeleteId = null;
 	let chatDeleteId = null;
 	let chatTitleEditId = null;
 	let chatTitleEditId = null;
 	let chatTitle = '';
 	let chatTitle = '';
@@ -376,21 +380,24 @@
 					<div class=" w-full pr-2 relative group">
 					<div class=" w-full pr-2 relative group">
 						{#if chatTitleEditId === chat.id}
 						{#if chatTitleEditId === chat.id}
 							<div
 							<div
-								class=" w-full flex justify-between rounded-xl px-3 py-2 group-hover:bg-gray-900 {chat.id ===
-								$chatId
+								class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId
 									? 'bg-gray-900'
 									? 'bg-gray-900'
-									: ''}  whitespace-nowrap text-ellipsis"
+									: chat.id === selectedChatId
+									? 'bg-gray-950'
+									: 'group-hover:bg-gray-950'}  whitespace-nowrap text-ellipsis"
 							>
 							>
 								<input bind:value={chatTitle} class=" bg-transparent w-full outline-none mr-10" />
 								<input bind:value={chatTitle} class=" bg-transparent w-full outline-none mr-10" />
 							</div>
 							</div>
 						{:else}
 						{:else}
 							<a
 							<a
-								class=" w-full flex justify-between rounded-xl px-3 py-2 group-hover:bg-gray-900 {chat.id ===
-								$chatId
+								class=" w-full flex justify-between rounded-xl px-3 py-2 {chat.id === $chatId
 									? 'bg-gray-900'
 									? 'bg-gray-900'
-									: ''}  whitespace-nowrap text-ellipsis"
+									: chat.id === selectedChatId
+									? 'bg-gray-950'
+									: 'group-hover:bg-gray-950'}  whitespace-nowrap text-ellipsis"
 								href="/c/{chat.id}"
 								href="/c/{chat.id}"
 								on:click={() => {
 								on:click={() => {
+									selectedChatId = chat.id;
 									if (window.innerWidth < 1024) {
 									if (window.innerWidth < 1024) {
 										show = false;
 										show = false;
 									}
 									}
@@ -406,7 +413,16 @@
 						{/if}
 						{/if}
 
 
 						<div
 						<div
-							class=" invisible group-hover:visible absolute right-[14px] top-[10px] px-2 bg-gradient-to-l from-80% from-gray-900 to-transparent"
+							class="
+							
+							{chat.id === $chatId
+								? ' from-gray-900'
+								: chat.id === selectedChatId
+								? 'from-gray-950'
+								: 'invisible group-hover:visible from-gray-950'}
+								absolute right-[10px] top-[10px] pr-2 pl-5 bg-gradient-to-l from-80%
+								
+								  to-transparent"
 						>
 						>
 							{#if chatTitleEditId === chat.id}
 							{#if chatTitleEditId === chat.id}
 								<div class="flex self-center space-x-1.5 z-10">
 								<div class="flex self-center space-x-1.5 z-10">
@@ -491,56 +507,34 @@
 								</div>
 								</div>
 							{:else}
 							{:else}
 								<div class="flex self-center space-x-1.5 z-10">
 								<div class="flex self-center space-x-1.5 z-10">
-									<button
-										id="delete-chat-button"
-										class=" hidden"
-										on:click={() => {
-											deleteChat(chat.id);
-										}}
-									/>
-									<button
-										class=" self-center hover:text-white transition"
-										on:click={() => {
+									<ChatMenu
+										renameHandler={() => {
 											chatTitle = chat.title;
 											chatTitle = chat.title;
 											chatTitleEditId = chat.id;
 											chatTitleEditId = chat.id;
 										}}
 										}}
-									>
-										<svg
-											xmlns="http://www.w3.org/2000/svg"
-											fill="none"
-											viewBox="0 0 24 24"
-											stroke-width="1.5"
-											stroke="currentColor"
-											class="w-4 h-4"
-										>
-											<path
-												stroke-linecap="round"
-												stroke-linejoin="round"
-												d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
-											/>
-										</svg>
-									</button>
-									<button
-										class=" self-center hover:text-white transition"
-										on:click={() => {
+										deleteHandler={() => {
 											chatDeleteId = chat.id;
 											chatDeleteId = chat.id;
 										}}
 										}}
 									>
 									>
-										<svg
-											xmlns="http://www.w3.org/2000/svg"
-											fill="none"
-											viewBox="0 0 24 24"
-											stroke-width="1.5"
-											stroke="currentColor"
-											class="w-4 h-4"
+										<button
+											aria-label="Chat Menu"
+											class=" self-center hover:text-white transition"
+											on:click={() => {
+												selectedChatId = chat.id;
+											}}
 										>
 										>
-											<path
-												stroke-linecap="round"
-												stroke-linejoin="round"
-												d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"
-											/>
-										</svg>
-									</button>
+											<svg
+												xmlns="http://www.w3.org/2000/svg"
+												viewBox="0 0 16 16"
+												fill="currentColor"
+												class="w-4 h-4"
+											>
+												<path
+													d="M2 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM6.5 8a1.5 1.5 0 1 1 3 0 1.5 1.5 0 0 1-3 0ZM12.5 6.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z"
+												/>
+											</svg>
+										</button>
+									</ChatMenu>
 								</div>
 								</div>
 							{/if}
 							{/if}
 						</div>
 						</div>

+ 43 - 0
src/lib/components/layout/Sidebar/ChatMenu.svelte

@@ -0,0 +1,43 @@
+<script lang="ts">
+	import { DropdownMenu } from 'bits-ui';
+
+	import Dropdown from '$lib/components/common/Dropdown.svelte';
+	import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
+	import Pencil from '$lib/components/icons/Pencil.svelte';
+
+	export let renameHandler: Function;
+	export let deleteHandler: Function;
+</script>
+
+<Dropdown>
+	<slot />
+
+	<div slot="content">
+		<DropdownMenu.Content
+			class="w-full max-w-[130px] rounded-lg px-1 py-1.5 border border-gray-700 z-50 bg-gray-850 text-white"
+			sideOffset={8}
+			side="bottom"
+			align="start"
+		>
+			<DropdownMenu.Item
+				class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer"
+				on:click={() => {
+					renameHandler();
+				}}
+			>
+				<Pencil strokeWidth="2" />
+				<div class="flex items-center">Rename</div>
+			</DropdownMenu.Item>
+
+			<DropdownMenu.Item
+				class="flex  gap-2  items-center px-3 py-2 text-sm  font-medium cursor-pointer"
+				on:click={() => {
+					deleteHandler();
+				}}
+			>
+				<GarbageBin strokeWidth="2" />
+				<div class="flex items-center">Delete</div>
+			</DropdownMenu.Item>
+		</DropdownMenu.Content>
+	</div>
+</Dropdown>