Spaces:
				
			
			
	
			
			
					
		Running
		
			on 
			
			CPU Upgrade
	
	
	
			
			
	
	
	
	
		
		
					
		Running
		
			on 
			
			CPU Upgrade
	
		Thomas G. Lopes
		
	commited on
		
		
					convert actions to attachments (#84)
Browse files- package.json +3 -3
- pnpm-lock.yaml +61 -73
- src/lib/actions/autofocus.ts +0 -14
- src/lib/actions/click-outside.ts +0 -55
- src/lib/attachments/autofocus.ts +12 -0
- src/lib/attachments/click-outside.ts +48 -0
- src/lib/{actions → attachments}/observe.svelte.ts +45 -49
- src/lib/components/dialog.svelte +5 -2
- src/lib/components/inference-playground/checkpoints-menu.svelte +2 -2
- src/lib/components/inference-playground/custom-model-config.svelte +4 -4
- src/lib/components/inference-playground/hf-token-modal.svelte +4 -4
- src/lib/components/inference-playground/img-preview.svelte +2 -2
- src/lib/components/inference-playground/message.svelte +2 -4
- src/lib/components/inference-playground/model-selector-modal.svelte +2 -2
- src/lib/components/inference-playground/playground.svelte +8 -4
- src/lib/components/inference-playground/project-select.svelte +2 -2
- src/lib/components/local-toasts.svelte +5 -6
- src/lib/components/prompts.svelte +4 -4
- src/lib/components/quota-modal.svelte +2 -2
- src/lib/components/share-modal.svelte +2 -2
    	
        package.json
    CHANGED
    
    | @@ -45,11 +45,11 @@ | |
| 45 | 
             
            		"openai": "^4.90.0",
         | 
| 46 | 
             
            		"postcss": "^8.4.38",
         | 
| 47 | 
             
            		"prettier": "^3.1.1",
         | 
| 48 | 
            -
            		"prettier-plugin-svelte": "^3. | 
| 49 | 
             
            		"prettier-plugin-tailwindcss": "^0.6.11",
         | 
| 50 | 
             
            		"runed": "^0.25.0",
         | 
| 51 | 
             
            		"shiki": "^3.4.0",
         | 
| 52 | 
            -
            		"svelte": "^5. | 
| 53 | 
             
            		"svelte-check": "^4.0.0",
         | 
| 54 | 
             
            		"tailwind-merge": "^3.0.2",
         | 
| 55 | 
             
            		"tailwindcss": "^4.0.9",
         | 
| @@ -63,7 +63,7 @@ | |
| 63 | 
             
            	"type": "module",
         | 
| 64 | 
             
            	"dependencies": {
         | 
| 65 | 
             
            		"dequal": "^2.0.3",
         | 
| 66 | 
            -
            		"eslint-plugin-svelte": "^3. | 
| 67 | 
             
            		"remult": "^3.0.2",
         | 
| 68 | 
             
            		"typia": "^8.0.0"
         | 
| 69 | 
             
            	}
         | 
|  | |
| 45 | 
             
            		"openai": "^4.90.0",
         | 
| 46 | 
             
            		"postcss": "^8.4.38",
         | 
| 47 | 
             
            		"prettier": "^3.1.1",
         | 
| 48 | 
            +
            		"prettier-plugin-svelte": "^3.4.0",
         | 
| 49 | 
             
            		"prettier-plugin-tailwindcss": "^0.6.11",
         | 
| 50 | 
             
            		"runed": "^0.25.0",
         | 
| 51 | 
             
            		"shiki": "^3.4.0",
         | 
| 52 | 
            +
            		"svelte": "^5.30.1",
         | 
| 53 | 
             
            		"svelte-check": "^4.0.0",
         | 
| 54 | 
             
            		"tailwind-merge": "^3.0.2",
         | 
| 55 | 
             
            		"tailwindcss": "^4.0.9",
         | 
|  | |
| 63 | 
             
            	"type": "module",
         | 
| 64 | 
             
            	"dependencies": {
         | 
| 65 | 
             
            		"dequal": "^2.0.3",
         | 
| 66 | 
            +
            		"eslint-plugin-svelte": "^3.6.0",
         | 
| 67 | 
             
            		"remult": "^3.0.2",
         | 
| 68 | 
             
            		"typia": "^8.0.0"
         | 
| 69 | 
             
            	}
         | 
    	
        pnpm-lock.yaml
    CHANGED
    
    | @@ -12,8 +12,8 @@ importers: | |
| 12 | 
             
                    specifier: ^2.0.3
         | 
| 13 | 
             
                    version: 2.0.3
         | 
| 14 | 
             
                  eslint-plugin-svelte:
         | 
| 15 | 
            -
                    specifier: ^3. | 
| 16 | 
            -
                    version: 3. | 
| 17 | 
             
                  remult:
         | 
| 18 | 
             
                    specifier: ^3.0.2
         | 
| 19 | 
             
                    version: 3.0.2
         | 
| @@ -56,16 +56,16 @@ importers: | |
| 56 | 
             
                    version: 3.0.0
         | 
| 57 | 
             
                  '@sveltejs/adapter-auto':
         | 
| 58 | 
             
                    specifier: ^3.2.2
         | 
| 59 | 
            -
                    version: 3.3.1(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 60 | 
             
                  '@sveltejs/adapter-node':
         | 
| 61 | 
             
                    specifier: ^5.2.0
         | 
| 62 | 
            -
                    version: 5.2.12(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 63 | 
             
                  '@sveltejs/kit':
         | 
| 64 | 
             
                    specifier: ^2.5.27
         | 
| 65 | 
            -
                    version: 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 66 | 
             
                  '@sveltejs/vite-plugin-svelte':
         | 
| 67 | 
             
                    specifier: ^4.0.0
         | 
| 68 | 
            -
                    version: 4.0.4(svelte@5. | 
| 69 | 
             
                  '@tailwindcss/container-queries':
         | 
| 70 | 
             
                    specifier: ^0.1.1
         | 
| 71 | 
             
                    version: 0.1.1(tailwindcss@4.0.9)
         | 
| @@ -101,7 +101,7 @@ importers: | |
| 101 | 
             
                    version: 2.4.2
         | 
| 102 | 
             
                  melt:
         | 
| 103 | 
             
                    specifier: ^0.30.1
         | 
| 104 | 
            -
                    version: 0.30.1(@floating-ui/dom@1.6.13)(svelte@5. | 
| 105 | 
             
                  openai:
         | 
| 106 | 
             
                    specifier: ^4.90.0
         | 
| 107 | 
             
                    version: 4.90.0
         | 
| @@ -112,23 +112,23 @@ importers: | |
| 112 | 
             
                    specifier: ^3.1.1
         | 
| 113 | 
             
                    version: 3.5.3
         | 
| 114 | 
             
                  prettier-plugin-svelte:
         | 
| 115 | 
            -
                    specifier: ^3. | 
| 116 | 
            -
                    version: 3. | 
| 117 | 
             
                  prettier-plugin-tailwindcss:
         | 
| 118 | 
             
                    specifier: ^0.6.11
         | 
| 119 | 
            -
                    version: 0.6.11(prettier-plugin-svelte@3. | 
| 120 | 
             
                  runed:
         | 
| 121 | 
             
                    specifier: ^0.25.0
         | 
| 122 | 
            -
                    version: 0.25.0(svelte@5. | 
| 123 | 
             
                  shiki:
         | 
| 124 | 
             
                    specifier: ^3.4.0
         | 
| 125 | 
             
                    version: 3.4.0
         | 
| 126 | 
             
                  svelte:
         | 
| 127 | 
            -
                    specifier: ^5. | 
| 128 | 
            -
                    version: 5. | 
| 129 | 
             
                  svelte-check:
         | 
| 130 | 
             
                    specifier: ^4.0.0
         | 
| 131 | 
            -
                    version: 4.1.5(picomatch@4.0.2)(svelte@5. | 
| 132 | 
             
                  tailwind-merge:
         | 
| 133 | 
             
                    specifier: ^3.0.2
         | 
| 134 | 
             
                    version: 3.0.2
         | 
| @@ -149,7 +149,7 @@ importers: | |
| 149 | 
             
                    version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
         | 
| 150 | 
             
                  unplugin-icons:
         | 
| 151 | 
             
                    specifier: ^22.1.0
         | 
| 152 | 
            -
                    version: 22.1.0(svelte@5. | 
| 153 | 
             
                  vite:
         | 
| 154 | 
             
                    specifier: ^5.4.4
         | 
| 155 | 
             
                    version: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
         | 
| @@ -1410,12 +1410,6 @@ packages: | |
| 1410 | 
             
                resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
         | 
| 1411 | 
             
                engines: {node: '>=10'}
         | 
| 1412 |  | 
| 1413 | 
            -
              eslint-compat-utils@0.6.4:
         | 
| 1414 | 
            -
                resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==}
         | 
| 1415 | 
            -
                engines: {node: '>=12'}
         | 
| 1416 | 
            -
                peerDependencies:
         | 
| 1417 | 
            -
                  eslint: '>=6.0.0'
         | 
| 1418 | 
            -
             | 
| 1419 | 
             
              eslint-config-prettier@10.1.1:
         | 
| 1420 | 
             
                resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
         | 
| 1421 | 
             
                hasBin: true
         | 
| @@ -1436,8 +1430,8 @@ packages: | |
| 1436 | 
             
                  eslint-config-prettier:
         | 
| 1437 | 
             
                    optional: true
         | 
| 1438 |  | 
| 1439 | 
            -
              eslint-plugin-svelte@3. | 
| 1440 | 
            -
                resolution: {integrity: sha512- | 
| 1441 | 
             
                engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
         | 
| 1442 | 
             
                peerDependencies:
         | 
| 1443 | 
             
                  eslint: ^8.57.1 || ^9.0.0
         | 
| @@ -1798,8 +1792,8 @@ packages: | |
| 1798 | 
             
                resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
         | 
| 1799 | 
             
                engines: {node: '>=6'}
         | 
| 1800 |  | 
| 1801 | 
            -
              known-css-properties@0. | 
| 1802 | 
            -
                resolution: {integrity: sha512- | 
| 1803 |  | 
| 1804 | 
             
              kolorist@1.8.0:
         | 
| 1805 | 
             
                resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
         | 
| @@ -2176,8 +2170,8 @@ packages: | |
| 2176 | 
             
                resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
         | 
| 2177 | 
             
                engines: {node: '>=6.0.0'}
         | 
| 2178 |  | 
| 2179 | 
            -
              prettier-plugin-svelte@3. | 
| 2180 | 
            -
                resolution: {integrity: sha512- | 
| 2181 | 
             
                peerDependencies:
         | 
| 2182 | 
             
                  prettier: ^3.0.0
         | 
| 2183 | 
             
                  svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
         | 
| @@ -2427,8 +2421,8 @@ packages: | |
| 2427 | 
             
                  svelte: ^4.0.0 || ^5.0.0-next.0
         | 
| 2428 | 
             
                  typescript: '>=5.0.0'
         | 
| 2429 |  | 
| 2430 | 
            -
              svelte-eslint-parser@1. | 
| 2431 | 
            -
                resolution: {integrity: sha512- | 
| 2432 | 
             
                engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
         | 
| 2433 | 
             
                peerDependencies:
         | 
| 2434 | 
             
                  svelte: ^3.37.0 || ^4.0.0 || ^5.0.0
         | 
| @@ -2436,8 +2430,8 @@ packages: | |
| 2436 | 
             
                  svelte:
         | 
| 2437 | 
             
                    optional: true
         | 
| 2438 |  | 
| 2439 | 
            -
              svelte@5. | 
| 2440 | 
            -
                resolution: {integrity: sha512- | 
| 2441 | 
             
                engines: {node: '>=18'}
         | 
| 2442 |  | 
| 2443 | 
             
              synckit@0.9.2:
         | 
| @@ -3335,22 +3329,22 @@ snapshots: | |
| 3335 | 
             
                dependencies:
         | 
| 3336 | 
             
                  acorn: 8.14.0
         | 
| 3337 |  | 
| 3338 | 
            -
              '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 3339 | 
             
                dependencies:
         | 
| 3340 | 
            -
                  '@sveltejs/kit': 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 3341 | 
             
                  import-meta-resolve: 4.1.0
         | 
| 3342 |  | 
| 3343 | 
            -
              '@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 3344 | 
             
                dependencies:
         | 
| 3345 | 
             
                  '@rollup/plugin-commonjs': 28.0.2(rollup@4.34.9)
         | 
| 3346 | 
             
                  '@rollup/plugin-json': 6.1.0(rollup@4.34.9)
         | 
| 3347 | 
             
                  '@rollup/plugin-node-resolve': 16.0.0(rollup@4.34.9)
         | 
| 3348 | 
            -
                  '@sveltejs/kit': 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 3349 | 
             
                  rollup: 4.34.9
         | 
| 3350 |  | 
| 3351 | 
            -
              '@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 3352 | 
             
                dependencies:
         | 
| 3353 | 
            -
                  '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5. | 
| 3354 | 
             
                  '@types/cookie': 0.6.0
         | 
| 3355 | 
             
                  cookie: 0.6.0
         | 
| 3356 | 
             
                  devalue: 5.1.1
         | 
| @@ -3362,26 +3356,26 @@ snapshots: | |
| 3362 | 
             
                  sade: 1.8.1
         | 
| 3363 | 
             
                  set-cookie-parser: 2.7.1
         | 
| 3364 | 
             
                  sirv: 3.0.1
         | 
| 3365 | 
            -
                  svelte: 5. | 
| 3366 | 
             
                  vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
         | 
| 3367 |  | 
| 3368 | 
            -
              '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 3369 | 
             
                dependencies:
         | 
| 3370 | 
            -
                  '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5. | 
| 3371 | 
             
                  debug: 4.4.0
         | 
| 3372 | 
            -
                  svelte: 5. | 
| 3373 | 
             
                  vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
         | 
| 3374 | 
             
                transitivePeerDependencies:
         | 
| 3375 | 
             
                  - supports-color
         | 
| 3376 |  | 
| 3377 | 
            -
              '@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 3378 | 
             
                dependencies:
         | 
| 3379 | 
            -
                  '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5. | 
| 3380 | 
             
                  debug: 4.4.0
         | 
| 3381 | 
             
                  deepmerge: 4.3.1
         | 
| 3382 | 
             
                  kleur: 4.1.5
         | 
| 3383 | 
             
                  magic-string: 0.30.17
         | 
| 3384 | 
            -
                  svelte: 5. | 
| 3385 | 
             
                  vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
         | 
| 3386 | 
             
                  vitefu: 1.0.6(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 3387 | 
             
                transitivePeerDependencies:
         | 
| @@ -3852,11 +3846,6 @@ snapshots: | |
| 3852 |  | 
| 3853 | 
             
              escape-string-regexp@4.0.0: {}
         | 
| 3854 |  | 
| 3855 | 
            -
              eslint-compat-utils@0.6.4(eslint@9.22.0(jiti@2.4.2)):
         | 
| 3856 | 
            -
                dependencies:
         | 
| 3857 | 
            -
                  eslint: 9.22.0(jiti@2.4.2)
         | 
| 3858 | 
            -
                  semver: 7.7.1
         | 
| 3859 | 
            -
             | 
| 3860 | 
             
              eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)):
         | 
| 3861 | 
             
                dependencies:
         | 
| 3862 | 
             
                  eslint: 9.22.0(jiti@2.4.2)
         | 
| @@ -3870,21 +3859,20 @@ snapshots: | |
| 3870 | 
             
                optionalDependencies:
         | 
| 3871 | 
             
                  eslint-config-prettier: 10.1.1(eslint@9.22.0(jiti@2.4.2))
         | 
| 3872 |  | 
| 3873 | 
            -
              eslint-plugin-svelte@3. | 
| 3874 | 
             
                dependencies:
         | 
| 3875 | 
             
                  '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2))
         | 
| 3876 | 
             
                  '@jridgewell/sourcemap-codec': 1.5.0
         | 
| 3877 | 
             
                  eslint: 9.22.0(jiti@2.4.2)
         | 
| 3878 | 
            -
                  eslint-compat-utils: 0.6.4(eslint@9.22.0(jiti@2.4.2))
         | 
| 3879 | 
             
                  esutils: 2.0.3
         | 
| 3880 | 
            -
                  known-css-properties: 0. | 
| 3881 | 
             
                  postcss: 8.5.3
         | 
| 3882 | 
             
                  postcss-load-config: 3.1.4(postcss@8.5.3)
         | 
| 3883 | 
             
                  postcss-safe-parser: 7.0.1(postcss@8.5.3)
         | 
| 3884 | 
             
                  semver: 7.7.1
         | 
| 3885 | 
            -
                  svelte-eslint-parser: 1. | 
| 3886 | 
             
                optionalDependencies:
         | 
| 3887 | 
            -
                  svelte: 5. | 
| 3888 | 
             
                transitivePeerDependencies:
         | 
| 3889 | 
             
                  - ts-node
         | 
| 3890 |  | 
| @@ -4258,7 +4246,7 @@ snapshots: | |
| 4258 |  | 
| 4259 | 
             
              kleur@4.1.5: {}
         | 
| 4260 |  | 
| 4261 | 
            -
              known-css-properties@0. | 
| 4262 |  | 
| 4263 | 
             
              kolorist@1.8.0: {}
         | 
| 4264 |  | 
| @@ -4359,14 +4347,14 @@ snapshots: | |
| 4359 | 
             
                  unist-util-visit: 5.0.0
         | 
| 4360 | 
             
                  vfile: 6.0.3
         | 
| 4361 |  | 
| 4362 | 
            -
              melt@0.30.1(@floating-ui/dom@1.6.13)(svelte@5. | 
| 4363 | 
             
                dependencies:
         | 
| 4364 | 
             
                  '@floating-ui/dom': 1.6.13
         | 
| 4365 | 
             
                  dequal: 2.0.3
         | 
| 4366 | 
             
                  jest-axe: 9.0.0
         | 
| 4367 | 
             
                  nanoid: 5.1.5
         | 
| 4368 | 
            -
                  runed: 0.23.4(svelte@5. | 
| 4369 | 
            -
                  svelte: 5. | 
| 4370 |  | 
| 4371 | 
             
              merge2@1.4.1: {}
         | 
| 4372 |  | 
| @@ -4602,16 +4590,16 @@ snapshots: | |
| 4602 | 
             
                dependencies:
         | 
| 4603 | 
             
                  fast-diff: 1.3.0
         | 
| 4604 |  | 
| 4605 | 
            -
              prettier-plugin-svelte@3. | 
| 4606 | 
             
                dependencies:
         | 
| 4607 | 
             
                  prettier: 3.5.3
         | 
| 4608 | 
            -
                  svelte: 5. | 
| 4609 |  | 
| 4610 | 
            -
              prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3. | 
| 4611 | 
             
                dependencies:
         | 
| 4612 | 
             
                  prettier: 3.5.3
         | 
| 4613 | 
             
                optionalDependencies:
         | 
| 4614 | 
            -
                  prettier-plugin-svelte: 3. | 
| 4615 |  | 
| 4616 | 
             
              prettier@3.5.3: {}
         | 
| 4617 |  | 
| @@ -4728,15 +4716,15 @@ snapshots: | |
| 4728 | 
             
                dependencies:
         | 
| 4729 | 
             
                  queue-microtask: 1.2.3
         | 
| 4730 |  | 
| 4731 | 
            -
              runed@0.23.4(svelte@5. | 
| 4732 | 
             
                dependencies:
         | 
| 4733 | 
             
                  esm-env: 1.2.2
         | 
| 4734 | 
            -
                  svelte: 5. | 
| 4735 |  | 
| 4736 | 
            -
              runed@0.25.0(svelte@5. | 
| 4737 | 
             
                dependencies:
         | 
| 4738 | 
             
                  esm-env: 1.2.2
         | 
| 4739 | 
            -
                  svelte: 5. | 
| 4740 |  | 
| 4741 | 
             
              rxjs@7.8.2:
         | 
| 4742 | 
             
                dependencies:
         | 
| @@ -4840,19 +4828,19 @@ snapshots: | |
| 4840 |  | 
| 4841 | 
             
              supports-preserve-symlinks-flag@1.0.0: {}
         | 
| 4842 |  | 
| 4843 | 
            -
              svelte-check@4.1.5(picomatch@4.0.2)(svelte@5. | 
| 4844 | 
             
                dependencies:
         | 
| 4845 | 
             
                  '@jridgewell/trace-mapping': 0.3.25
         | 
| 4846 | 
             
                  chokidar: 4.0.3
         | 
| 4847 | 
             
                  fdir: 6.4.3(picomatch@4.0.2)
         | 
| 4848 | 
             
                  picocolors: 1.1.1
         | 
| 4849 | 
             
                  sade: 1.8.1
         | 
| 4850 | 
            -
                  svelte: 5. | 
| 4851 | 
             
                  typescript: 5.8.2
         | 
| 4852 | 
             
                transitivePeerDependencies:
         | 
| 4853 | 
             
                  - picomatch
         | 
| 4854 |  | 
| 4855 | 
            -
              svelte-eslint-parser@1. | 
| 4856 | 
             
                dependencies:
         | 
| 4857 | 
             
                  eslint-scope: 8.3.0
         | 
| 4858 | 
             
                  eslint-visitor-keys: 4.2.0
         | 
| @@ -4861,9 +4849,9 @@ snapshots: | |
| 4861 | 
             
                  postcss-scss: 4.0.9(postcss@8.5.3)
         | 
| 4862 | 
             
                  postcss-selector-parser: 7.1.0
         | 
| 4863 | 
             
                optionalDependencies:
         | 
| 4864 | 
            -
                  svelte: 5. | 
| 4865 |  | 
| 4866 | 
            -
              svelte@5. | 
| 4867 | 
             
                dependencies:
         | 
| 4868 | 
             
                  '@ampproject/remapping': 2.3.0
         | 
| 4869 | 
             
                  '@jridgewell/sourcemap-codec': 1.5.0
         | 
| @@ -5004,7 +4992,7 @@ snapshots: | |
| 5004 | 
             
                  unist-util-is: 6.0.0
         | 
| 5005 | 
             
                  unist-util-visit-parents: 6.0.1
         | 
| 5006 |  | 
| 5007 | 
            -
              unplugin-icons@22.1.0(svelte@5. | 
| 5008 | 
             
                dependencies:
         | 
| 5009 | 
             
                  '@antfu/install-pkg': 1.0.0
         | 
| 5010 | 
             
                  '@iconify/utils': 2.3.0
         | 
| @@ -5012,7 +5000,7 @@ snapshots: | |
| 5012 | 
             
                  local-pkg: 1.1.1
         | 
| 5013 | 
             
                  unplugin: 2.2.0
         | 
| 5014 | 
             
                optionalDependencies:
         | 
| 5015 | 
            -
                  svelte: 5. | 
| 5016 | 
             
                transitivePeerDependencies:
         | 
| 5017 | 
             
                  - supports-color
         | 
| 5018 |  | 
|  | |
| 12 | 
             
                    specifier: ^2.0.3
         | 
| 13 | 
             
                    version: 2.0.3
         | 
| 14 | 
             
                  eslint-plugin-svelte:
         | 
| 15 | 
            +
                    specifier: ^3.6.0
         | 
| 16 | 
            +
                    version: 3.6.0(eslint@9.22.0(jiti@2.4.2))(svelte@5.30.1)
         | 
| 17 | 
             
                  remult:
         | 
| 18 | 
             
                    specifier: ^3.0.2
         | 
| 19 | 
             
                    version: 3.0.2
         | 
|  | |
| 56 | 
             
                    version: 3.0.0
         | 
| 57 | 
             
                  '@sveltejs/adapter-auto':
         | 
| 58 | 
             
                    specifier: ^3.2.2
         | 
| 59 | 
            +
                    version: 3.3.1(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))
         | 
| 60 | 
             
                  '@sveltejs/adapter-node':
         | 
| 61 | 
             
                    specifier: ^5.2.0
         | 
| 62 | 
            +
                    version: 5.2.12(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))
         | 
| 63 | 
             
                  '@sveltejs/kit':
         | 
| 64 | 
             
                    specifier: ^2.5.27
         | 
| 65 | 
            +
                    version: 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 66 | 
             
                  '@sveltejs/vite-plugin-svelte':
         | 
| 67 | 
             
                    specifier: ^4.0.0
         | 
| 68 | 
            +
                    version: 4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 69 | 
             
                  '@tailwindcss/container-queries':
         | 
| 70 | 
             
                    specifier: ^0.1.1
         | 
| 71 | 
             
                    version: 0.1.1(tailwindcss@4.0.9)
         | 
|  | |
| 101 | 
             
                    version: 2.4.2
         | 
| 102 | 
             
                  melt:
         | 
| 103 | 
             
                    specifier: ^0.30.1
         | 
| 104 | 
            +
                    version: 0.30.1(@floating-ui/dom@1.6.13)(svelte@5.30.1)
         | 
| 105 | 
             
                  openai:
         | 
| 106 | 
             
                    specifier: ^4.90.0
         | 
| 107 | 
             
                    version: 4.90.0
         | 
|  | |
| 112 | 
             
                    specifier: ^3.1.1
         | 
| 113 | 
             
                    version: 3.5.3
         | 
| 114 | 
             
                  prettier-plugin-svelte:
         | 
| 115 | 
            +
                    specifier: ^3.4.0
         | 
| 116 | 
            +
                    version: 3.4.0(prettier@3.5.3)(svelte@5.30.1)
         | 
| 117 | 
             
                  prettier-plugin-tailwindcss:
         | 
| 118 | 
             
                    specifier: ^0.6.11
         | 
| 119 | 
            +
                    version: 0.6.11(prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.30.1))(prettier@3.5.3)
         | 
| 120 | 
             
                  runed:
         | 
| 121 | 
             
                    specifier: ^0.25.0
         | 
| 122 | 
            +
                    version: 0.25.0(svelte@5.30.1)
         | 
| 123 | 
             
                  shiki:
         | 
| 124 | 
             
                    specifier: ^3.4.0
         | 
| 125 | 
             
                    version: 3.4.0
         | 
| 126 | 
             
                  svelte:
         | 
| 127 | 
            +
                    specifier: ^5.30.1
         | 
| 128 | 
            +
                    version: 5.30.1
         | 
| 129 | 
             
                  svelte-check:
         | 
| 130 | 
             
                    specifier: ^4.0.0
         | 
| 131 | 
            +
                    version: 4.1.5(picomatch@4.0.2)(svelte@5.30.1)(typescript@5.8.2)
         | 
| 132 | 
             
                  tailwind-merge:
         | 
| 133 | 
             
                    specifier: ^3.0.2
         | 
| 134 | 
             
                    version: 3.0.2
         | 
|  | |
| 149 | 
             
                    version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
         | 
| 150 | 
             
                  unplugin-icons:
         | 
| 151 | 
             
                    specifier: ^22.1.0
         | 
| 152 | 
            +
                    version: 22.1.0(svelte@5.30.1)
         | 
| 153 | 
             
                  vite:
         | 
| 154 | 
             
                    specifier: ^5.4.4
         | 
| 155 | 
             
                    version: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
         | 
|  | |
| 1410 | 
             
                resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
         | 
| 1411 | 
             
                engines: {node: '>=10'}
         | 
| 1412 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 1413 | 
             
              eslint-config-prettier@10.1.1:
         | 
| 1414 | 
             
                resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
         | 
| 1415 | 
             
                hasBin: true
         | 
|  | |
| 1430 | 
             
                  eslint-config-prettier:
         | 
| 1431 | 
             
                    optional: true
         | 
| 1432 |  | 
| 1433 | 
            +
              eslint-plugin-svelte@3.6.0:
         | 
| 1434 | 
            +
                resolution: {integrity: sha512-IIf6Cj6yQuCwL7Qd8bX13BZspz+DQsOkClozMF9EkW20FSxI75Ndd5ZzbviCn32DdXRo9FUWXn+YMIL46qPOOg==}
         | 
| 1435 | 
             
                engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
         | 
| 1436 | 
             
                peerDependencies:
         | 
| 1437 | 
             
                  eslint: ^8.57.1 || ^9.0.0
         | 
|  | |
| 1792 | 
             
                resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
         | 
| 1793 | 
             
                engines: {node: '>=6'}
         | 
| 1794 |  | 
| 1795 | 
            +
              known-css-properties@0.36.0:
         | 
| 1796 | 
            +
                resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==}
         | 
| 1797 |  | 
| 1798 | 
             
              kolorist@1.8.0:
         | 
| 1799 | 
             
                resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
         | 
|  | |
| 2170 | 
             
                resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
         | 
| 2171 | 
             
                engines: {node: '>=6.0.0'}
         | 
| 2172 |  | 
| 2173 | 
            +
              prettier-plugin-svelte@3.4.0:
         | 
| 2174 | 
            +
                resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==}
         | 
| 2175 | 
             
                peerDependencies:
         | 
| 2176 | 
             
                  prettier: ^3.0.0
         | 
| 2177 | 
             
                  svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
         | 
|  | |
| 2421 | 
             
                  svelte: ^4.0.0 || ^5.0.0-next.0
         | 
| 2422 | 
             
                  typescript: '>=5.0.0'
         | 
| 2423 |  | 
| 2424 | 
            +
              svelte-eslint-parser@1.2.0:
         | 
| 2425 | 
            +
                resolution: {integrity: sha512-mbPtajIeuiyU80BEyGvwAktBeTX7KCr5/0l+uRGLq1dafwRNrjfM5kHGJScEBlPG3ipu6dJqfW/k0/fujvIEVw==}
         | 
| 2426 | 
             
                engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
         | 
| 2427 | 
             
                peerDependencies:
         | 
| 2428 | 
             
                  svelte: ^3.37.0 || ^4.0.0 || ^5.0.0
         | 
|  | |
| 2430 | 
             
                  svelte:
         | 
| 2431 | 
             
                    optional: true
         | 
| 2432 |  | 
| 2433 | 
            +
              svelte@5.30.1:
         | 
| 2434 | 
            +
                resolution: {integrity: sha512-QIYtKnJGkubWXtNkrUBKVCvyo9gjcccdbnvXfwsGNhvbeNNdQjRDTa/BiQcJ2kWXbXPQbWKyT7CUu53KIj1rfw==}
         | 
| 2435 | 
             
                engines: {node: '>=18'}
         | 
| 2436 |  | 
| 2437 | 
             
              synckit@0.9.2:
         | 
|  | |
| 3329 | 
             
                dependencies:
         | 
| 3330 | 
             
                  acorn: 8.14.0
         | 
| 3331 |  | 
| 3332 | 
            +
              '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))':
         | 
| 3333 | 
             
                dependencies:
         | 
| 3334 | 
            +
                  '@sveltejs/kit': 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 3335 | 
             
                  import-meta-resolve: 4.1.0
         | 
| 3336 |  | 
| 3337 | 
            +
              '@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))':
         | 
| 3338 | 
             
                dependencies:
         | 
| 3339 | 
             
                  '@rollup/plugin-commonjs': 28.0.2(rollup@4.34.9)
         | 
| 3340 | 
             
                  '@rollup/plugin-json': 6.1.0(rollup@4.34.9)
         | 
| 3341 | 
             
                  '@rollup/plugin-node-resolve': 16.0.0(rollup@4.34.9)
         | 
| 3342 | 
            +
                  '@sveltejs/kit': 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 3343 | 
             
                  rollup: 4.34.9
         | 
| 3344 |  | 
| 3345 | 
            +
              '@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))':
         | 
| 3346 | 
             
                dependencies:
         | 
| 3347 | 
            +
                  '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 3348 | 
             
                  '@types/cookie': 0.6.0
         | 
| 3349 | 
             
                  cookie: 0.6.0
         | 
| 3350 | 
             
                  devalue: 5.1.1
         | 
|  | |
| 3356 | 
             
                  sade: 1.8.1
         | 
| 3357 | 
             
                  set-cookie-parser: 2.7.1
         | 
| 3358 | 
             
                  sirv: 3.0.1
         | 
| 3359 | 
            +
                  svelte: 5.30.1
         | 
| 3360 | 
             
                  vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
         | 
| 3361 |  | 
| 3362 | 
            +
              '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))':
         | 
| 3363 | 
             
                dependencies:
         | 
| 3364 | 
            +
                  '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 3365 | 
             
                  debug: 4.4.0
         | 
| 3366 | 
            +
                  svelte: 5.30.1
         | 
| 3367 | 
             
                  vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
         | 
| 3368 | 
             
                transitivePeerDependencies:
         | 
| 3369 | 
             
                  - supports-color
         | 
| 3370 |  | 
| 3371 | 
            +
              '@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))':
         | 
| 3372 | 
             
                dependencies:
         | 
| 3373 | 
            +
                  '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)))(svelte@5.30.1)(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 3374 | 
             
                  debug: 4.4.0
         | 
| 3375 | 
             
                  deepmerge: 4.3.1
         | 
| 3376 | 
             
                  kleur: 4.1.5
         | 
| 3377 | 
             
                  magic-string: 0.30.17
         | 
| 3378 | 
            +
                  svelte: 5.30.1
         | 
| 3379 | 
             
                  vite: 5.4.14(@types/node@22.14.1)(lightningcss@1.29.1)
         | 
| 3380 | 
             
                  vitefu: 1.0.6(vite@5.4.14(@types/node@22.14.1)(lightningcss@1.29.1))
         | 
| 3381 | 
             
                transitivePeerDependencies:
         | 
|  | |
| 3846 |  | 
| 3847 | 
             
              escape-string-regexp@4.0.0: {}
         | 
| 3848 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 3849 | 
             
              eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)):
         | 
| 3850 | 
             
                dependencies:
         | 
| 3851 | 
             
                  eslint: 9.22.0(jiti@2.4.2)
         | 
|  | |
| 3859 | 
             
                optionalDependencies:
         | 
| 3860 | 
             
                  eslint-config-prettier: 10.1.1(eslint@9.22.0(jiti@2.4.2))
         | 
| 3861 |  | 
| 3862 | 
            +
              eslint-plugin-svelte@3.6.0(eslint@9.22.0(jiti@2.4.2))(svelte@5.30.1):
         | 
| 3863 | 
             
                dependencies:
         | 
| 3864 | 
             
                  '@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2))
         | 
| 3865 | 
             
                  '@jridgewell/sourcemap-codec': 1.5.0
         | 
| 3866 | 
             
                  eslint: 9.22.0(jiti@2.4.2)
         | 
|  | |
| 3867 | 
             
                  esutils: 2.0.3
         | 
| 3868 | 
            +
                  known-css-properties: 0.36.0
         | 
| 3869 | 
             
                  postcss: 8.5.3
         | 
| 3870 | 
             
                  postcss-load-config: 3.1.4(postcss@8.5.3)
         | 
| 3871 | 
             
                  postcss-safe-parser: 7.0.1(postcss@8.5.3)
         | 
| 3872 | 
             
                  semver: 7.7.1
         | 
| 3873 | 
            +
                  svelte-eslint-parser: 1.2.0(svelte@5.30.1)
         | 
| 3874 | 
             
                optionalDependencies:
         | 
| 3875 | 
            +
                  svelte: 5.30.1
         | 
| 3876 | 
             
                transitivePeerDependencies:
         | 
| 3877 | 
             
                  - ts-node
         | 
| 3878 |  | 
|  | |
| 4246 |  | 
| 4247 | 
             
              kleur@4.1.5: {}
         | 
| 4248 |  | 
| 4249 | 
            +
              known-css-properties@0.36.0: {}
         | 
| 4250 |  | 
| 4251 | 
             
              kolorist@1.8.0: {}
         | 
| 4252 |  | 
|  | |
| 4347 | 
             
                  unist-util-visit: 5.0.0
         | 
| 4348 | 
             
                  vfile: 6.0.3
         | 
| 4349 |  | 
| 4350 | 
            +
              melt@0.30.1(@floating-ui/dom@1.6.13)(svelte@5.30.1):
         | 
| 4351 | 
             
                dependencies:
         | 
| 4352 | 
             
                  '@floating-ui/dom': 1.6.13
         | 
| 4353 | 
             
                  dequal: 2.0.3
         | 
| 4354 | 
             
                  jest-axe: 9.0.0
         | 
| 4355 | 
             
                  nanoid: 5.1.5
         | 
| 4356 | 
            +
                  runed: 0.23.4(svelte@5.30.1)
         | 
| 4357 | 
            +
                  svelte: 5.30.1
         | 
| 4358 |  | 
| 4359 | 
             
              merge2@1.4.1: {}
         | 
| 4360 |  | 
|  | |
| 4590 | 
             
                dependencies:
         | 
| 4591 | 
             
                  fast-diff: 1.3.0
         | 
| 4592 |  | 
| 4593 | 
            +
              prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.30.1):
         | 
| 4594 | 
             
                dependencies:
         | 
| 4595 | 
             
                  prettier: 3.5.3
         | 
| 4596 | 
            +
                  svelte: 5.30.1
         | 
| 4597 |  | 
| 4598 | 
            +
              prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.30.1))(prettier@3.5.3):
         | 
| 4599 | 
             
                dependencies:
         | 
| 4600 | 
             
                  prettier: 3.5.3
         | 
| 4601 | 
             
                optionalDependencies:
         | 
| 4602 | 
            +
                  prettier-plugin-svelte: 3.4.0(prettier@3.5.3)(svelte@5.30.1)
         | 
| 4603 |  | 
| 4604 | 
             
              prettier@3.5.3: {}
         | 
| 4605 |  | 
|  | |
| 4716 | 
             
                dependencies:
         | 
| 4717 | 
             
                  queue-microtask: 1.2.3
         | 
| 4718 |  | 
| 4719 | 
            +
              runed@0.23.4(svelte@5.30.1):
         | 
| 4720 | 
             
                dependencies:
         | 
| 4721 | 
             
                  esm-env: 1.2.2
         | 
| 4722 | 
            +
                  svelte: 5.30.1
         | 
| 4723 |  | 
| 4724 | 
            +
              runed@0.25.0(svelte@5.30.1):
         | 
| 4725 | 
             
                dependencies:
         | 
| 4726 | 
             
                  esm-env: 1.2.2
         | 
| 4727 | 
            +
                  svelte: 5.30.1
         | 
| 4728 |  | 
| 4729 | 
             
              rxjs@7.8.2:
         | 
| 4730 | 
             
                dependencies:
         | 
|  | |
| 4828 |  | 
| 4829 | 
             
              supports-preserve-symlinks-flag@1.0.0: {}
         | 
| 4830 |  | 
| 4831 | 
            +
              svelte-check@4.1.5(picomatch@4.0.2)(svelte@5.30.1)(typescript@5.8.2):
         | 
| 4832 | 
             
                dependencies:
         | 
| 4833 | 
             
                  '@jridgewell/trace-mapping': 0.3.25
         | 
| 4834 | 
             
                  chokidar: 4.0.3
         | 
| 4835 | 
             
                  fdir: 6.4.3(picomatch@4.0.2)
         | 
| 4836 | 
             
                  picocolors: 1.1.1
         | 
| 4837 | 
             
                  sade: 1.8.1
         | 
| 4838 | 
            +
                  svelte: 5.30.1
         | 
| 4839 | 
             
                  typescript: 5.8.2
         | 
| 4840 | 
             
                transitivePeerDependencies:
         | 
| 4841 | 
             
                  - picomatch
         | 
| 4842 |  | 
| 4843 | 
            +
              svelte-eslint-parser@1.2.0(svelte@5.30.1):
         | 
| 4844 | 
             
                dependencies:
         | 
| 4845 | 
             
                  eslint-scope: 8.3.0
         | 
| 4846 | 
             
                  eslint-visitor-keys: 4.2.0
         | 
|  | |
| 4849 | 
             
                  postcss-scss: 4.0.9(postcss@8.5.3)
         | 
| 4850 | 
             
                  postcss-selector-parser: 7.1.0
         | 
| 4851 | 
             
                optionalDependencies:
         | 
| 4852 | 
            +
                  svelte: 5.30.1
         | 
| 4853 |  | 
| 4854 | 
            +
              svelte@5.30.1:
         | 
| 4855 | 
             
                dependencies:
         | 
| 4856 | 
             
                  '@ampproject/remapping': 2.3.0
         | 
| 4857 | 
             
                  '@jridgewell/sourcemap-codec': 1.5.0
         | 
|  | |
| 4992 | 
             
                  unist-util-is: 6.0.0
         | 
| 4993 | 
             
                  unist-util-visit-parents: 6.0.1
         | 
| 4994 |  | 
| 4995 | 
            +
              unplugin-icons@22.1.0(svelte@5.30.1):
         | 
| 4996 | 
             
                dependencies:
         | 
| 4997 | 
             
                  '@antfu/install-pkg': 1.0.0
         | 
| 4998 | 
             
                  '@iconify/utils': 2.3.0
         | 
|  | |
| 5000 | 
             
                  local-pkg: 1.1.1
         | 
| 5001 | 
             
                  unplugin: 2.2.0
         | 
| 5002 | 
             
                optionalDependencies:
         | 
| 5003 | 
            +
                  svelte: 5.30.1
         | 
| 5004 | 
             
                transitivePeerDependencies:
         | 
| 5005 | 
             
                  - supports-color
         | 
| 5006 |  | 
    	
        src/lib/actions/autofocus.ts
    DELETED
    
    | @@ -1,14 +0,0 @@ | |
| 1 | 
            -
            import { tick } from "svelte";
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            export function autofocus(node: HTMLElement, enabled = true) {
         | 
| 4 | 
            -
            	function update(enabled = true) {
         | 
| 5 | 
            -
            		if (enabled) {
         | 
| 6 | 
            -
            			tick().then(() => {
         | 
| 7 | 
            -
            				node.focus();
         | 
| 8 | 
            -
            			});
         | 
| 9 | 
            -
            		}
         | 
| 10 | 
            -
            	}
         | 
| 11 | 
            -
            	update(enabled);
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            	return { update };
         | 
| 14 | 
            -
            }
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
    	
        src/lib/actions/click-outside.ts
    DELETED
    
    | @@ -1,55 +0,0 @@ | |
| 1 | 
            -
            import type { Action } from "svelte/action";
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            export const clickOutside: Action<HTMLElement, () => void> = (node, callback) => {
         | 
| 4 | 
            -
            	let _callback = callback;
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            	function update(newCallback: () => void) {
         | 
| 7 | 
            -
            		_callback = newCallback;
         | 
| 8 | 
            -
            	}
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            	function handleClick(event: MouseEvent) {
         | 
| 11 | 
            -
            		if (window.getSelection()?.toString()) {
         | 
| 12 | 
            -
            			// Don't close if text is selected
         | 
| 13 | 
            -
            			return;
         | 
| 14 | 
            -
            		}
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            		// For dialog elements, check if click was on the backdrop
         | 
| 17 | 
            -
            		if (node instanceof HTMLDialogElement) {
         | 
| 18 | 
            -
            			const rect = node.getBoundingClientRect();
         | 
| 19 | 
            -
            			const isInDialog =
         | 
| 20 | 
            -
            				event.clientX >= rect.left &&
         | 
| 21 | 
            -
            				event.clientX <= rect.right &&
         | 
| 22 | 
            -
            				event.clientY >= rect.top &&
         | 
| 23 | 
            -
            				event.clientY <= rect.bottom;
         | 
| 24 | 
            -
             | 
| 25 | 
            -
            			if (!isInDialog) {
         | 
| 26 | 
            -
            				_callback();
         | 
| 27 | 
            -
            				return;
         | 
| 28 | 
            -
            			}
         | 
| 29 | 
            -
            		}
         | 
| 30 | 
            -
             | 
| 31 | 
            -
            		// For non-dialog elements, use the standard contains check
         | 
| 32 | 
            -
            		if (!node.contains(event.target as Node) && !event.defaultPrevented) {
         | 
| 33 | 
            -
            			_callback();
         | 
| 34 | 
            -
            		}
         | 
| 35 | 
            -
            	}
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            	// For dialogs, listen on the element itself
         | 
| 38 | 
            -
            	if (node instanceof HTMLDialogElement) {
         | 
| 39 | 
            -
            		node.addEventListener("click", handleClick);
         | 
| 40 | 
            -
            	} else {
         | 
| 41 | 
            -
            		// For other elements, listen on the document
         | 
| 42 | 
            -
            		document.addEventListener("click", handleClick, true);
         | 
| 43 | 
            -
            	}
         | 
| 44 | 
            -
             | 
| 45 | 
            -
            	return {
         | 
| 46 | 
            -
            		update,
         | 
| 47 | 
            -
            		destroy() {
         | 
| 48 | 
            -
            			if (node instanceof HTMLDialogElement) {
         | 
| 49 | 
            -
            				node.removeEventListener("click", handleClick);
         | 
| 50 | 
            -
            			} else {
         | 
| 51 | 
            -
            				document.removeEventListener("click", handleClick, true);
         | 
| 52 | 
            -
            			}
         | 
| 53 | 
            -
            		},
         | 
| 54 | 
            -
            	};
         | 
| 55 | 
            -
            };
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
    	
        src/lib/attachments/autofocus.ts
    ADDED
    
    | @@ -0,0 +1,12 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import { tick } from "svelte";
         | 
| 2 | 
            +
            import type { Attachment } from "svelte/attachments";
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            export function autofocus(enabled = true): Attachment<HTMLElement> {
         | 
| 5 | 
            +
            	return node => {
         | 
| 6 | 
            +
            		if (!enabled) return;
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            		tick().then(() => {
         | 
| 9 | 
            +
            			node.focus();
         | 
| 10 | 
            +
            		});
         | 
| 11 | 
            +
            	};
         | 
| 12 | 
            +
            }
         | 
    	
        src/lib/attachments/click-outside.ts
    ADDED
    
    | @@ -0,0 +1,48 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import type { Attachment } from "svelte/attachments";
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            export function clickOutside(callback: () => void): Attachment {
         | 
| 4 | 
            +
            	return node => {
         | 
| 5 | 
            +
            		function handleClick(event: MouseEvent) {
         | 
| 6 | 
            +
            			if (window.getSelection()?.toString()) {
         | 
| 7 | 
            +
            				// Don't close if text is selected
         | 
| 8 | 
            +
            				return;
         | 
| 9 | 
            +
            			}
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            			// For dialog elements, check if click was on the backdrop
         | 
| 12 | 
            +
            			if (node instanceof HTMLDialogElement) {
         | 
| 13 | 
            +
            				const rect = node.getBoundingClientRect();
         | 
| 14 | 
            +
            				const isInDialog =
         | 
| 15 | 
            +
            					event.clientX >= rect.left &&
         | 
| 16 | 
            +
            					event.clientX <= rect.right &&
         | 
| 17 | 
            +
            					event.clientY >= rect.top &&
         | 
| 18 | 
            +
            					event.clientY <= rect.bottom;
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            				if (!isInDialog) {
         | 
| 21 | 
            +
            					callback();
         | 
| 22 | 
            +
            					return;
         | 
| 23 | 
            +
            				}
         | 
| 24 | 
            +
            			}
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            			// For non-dialog elements, use the standard contains check
         | 
| 27 | 
            +
            			if (!node.contains(event.target as Node) && !event.defaultPrevented) {
         | 
| 28 | 
            +
            				callback();
         | 
| 29 | 
            +
            			}
         | 
| 30 | 
            +
            		}
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            		// For dialogs, listen on the element itself
         | 
| 33 | 
            +
            		if (node instanceof HTMLDialogElement) {
         | 
| 34 | 
            +
            			node.addEventListener("click", handleClick);
         | 
| 35 | 
            +
            		} else {
         | 
| 36 | 
            +
            			// For other elements, listen on the document
         | 
| 37 | 
            +
            			document.addEventListener("click", handleClick, true);
         | 
| 38 | 
            +
            		}
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            		return () => {
         | 
| 41 | 
            +
            			if (node instanceof HTMLDialogElement) {
         | 
| 42 | 
            +
            				node.removeEventListener("click", handleClick);
         | 
| 43 | 
            +
            			} else {
         | 
| 44 | 
            +
            				document.removeEventListener("click", handleClick, true);
         | 
| 45 | 
            +
            			}
         | 
| 46 | 
            +
            		};
         | 
| 47 | 
            +
            	};
         | 
| 48 | 
            +
            }
         | 
    	
        src/lib/{actions → attachments}/observe.svelte.ts
    RENAMED
    
    | @@ -1,4 +1,5 @@ | |
| 1 | 
            -
            import  | 
|  | |
| 2 |  | 
| 3 | 
             
            export enum ObservedElements {
         | 
| 4 | 
             
            	BottomActions = "bottom-actions",
         | 
| @@ -55,6 +56,7 @@ export const observed: Record<ObservedElements, ObservedData> = $state( | |
| 55 |  | 
| 56 | 
             
            type ObserveArgs = {
         | 
| 57 | 
             
            	name: ObservedElements;
         | 
|  | |
| 58 | 
             
            };
         | 
| 59 |  | 
| 60 | 
             
            function getOffsetPosition(el: HTMLElement) {
         | 
| @@ -72,42 +74,42 @@ function getOffsetPosition(el: HTMLElement) { | |
| 72 | 
             
            	return { top, left, width, height, right: left + width, bottom: top + height };
         | 
| 73 | 
             
            }
         | 
| 74 |  | 
| 75 | 
            -
            export  | 
| 76 | 
            -
            	 | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
            			 | 
| 100 | 
            -
            		} | 
| 101 | 
            -
            	}
         | 
| 102 |  | 
| 103 | 
            -
             | 
| 104 | 
            -
             | 
| 105 | 
            -
            			resizeObserver.disconnect();
         | 
| 106 | 
             
            		}
         | 
| 107 |  | 
| 108 | 
            -
            		 | 
|  | |
| 109 | 
             
            			setVars(args.name);
         | 
| 110 | 
             
            		});
         | 
|  | |
| 111 | 
             
            		resizeObserver.observe(node);
         | 
| 112 |  | 
| 113 | 
             
            		// Listen for scroll and resize events
         | 
| @@ -115,22 +117,16 @@ export const observe: Action<HTMLElement, ObserveArgs> = (node, args) => { | |
| 115 | 
             
            		window.addEventListener("resize", onWindowChange, true);
         | 
| 116 |  | 
| 117 | 
             
            		setVars(args.name); // Initial set after observing
         | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
            	update(args); // Initial setup
         | 
| 125 | 
            -
             | 
| 126 | 
            -
            	function destroy() {
         | 
| 127 | 
            -
            		resizeObserver.disconnect();
         | 
| 128 | 
            -
            		window.removeEventListener("scroll", onWindowChange, true);
         | 
| 129 | 
            -
            		window.removeEventListener("resize", onWindowChange, true);
         | 
| 130 | 
            -
            	}
         | 
| 131 |  | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
|  | |
|  | |
| 135 | 
             
            	};
         | 
| 136 | 
            -
            } | 
|  | |
| 1 | 
            +
            import { AnimationFrames } from "runed";
         | 
| 2 | 
            +
            import type { Attachment } from "svelte/attachments";
         | 
| 3 |  | 
| 4 | 
             
            export enum ObservedElements {
         | 
| 5 | 
             
            	BottomActions = "bottom-actions",
         | 
|  | |
| 56 |  | 
| 57 | 
             
            type ObserveArgs = {
         | 
| 58 | 
             
            	name: ObservedElements;
         | 
| 59 | 
            +
            	useRaf?: boolean;
         | 
| 60 | 
             
            };
         | 
| 61 |  | 
| 62 | 
             
            function getOffsetPosition(el: HTMLElement) {
         | 
|  | |
| 74 | 
             
            	return { top, left, width, height, right: left + width, bottom: top + height };
         | 
| 75 | 
             
            }
         | 
| 76 |  | 
| 77 | 
            +
            export function observe(args: ObserveArgs): Attachment<HTMLElement> {
         | 
| 78 | 
            +
            	return node => {
         | 
| 79 | 
            +
            		function setVars(name: ObservedElements) {
         | 
| 80 | 
            +
            			// 1. Standard rect (includes transforms)
         | 
| 81 | 
            +
            			const rect = node.getBoundingClientRect();
         | 
| 82 | 
            +
            			document.documentElement.style.setProperty(`--${name}-width`, `${rect.width}px`);
         | 
| 83 | 
            +
            			document.documentElement.style.setProperty(`--${name}-height`, `${rect.height}px`);
         | 
| 84 | 
            +
            			document.documentElement.style.setProperty(`--${name}-top`, `${rect.top}px`);
         | 
| 85 | 
            +
            			document.documentElement.style.setProperty(`--${name}-left`, `${rect.left}px`);
         | 
| 86 | 
            +
            			document.documentElement.style.setProperty(`--${name}-right`, `${rect.right}px`);
         | 
| 87 | 
            +
            			document.documentElement.style.setProperty(`--${name}-bottom`, `${rect.bottom}px`);
         | 
| 88 | 
            +
             | 
| 89 | 
            +
            			// 2. Offset position (ignores transforms)
         | 
| 90 | 
            +
            			const offset = getOffsetPosition(node);
         | 
| 91 | 
            +
            			document.documentElement.style.setProperty(`--${name}-width-offset`, `${offset.width}px`);
         | 
| 92 | 
            +
            			document.documentElement.style.setProperty(`--${name}-height-offset`, `${offset.height}px`);
         | 
| 93 | 
            +
            			document.documentElement.style.setProperty(`--${name}-top-offset`, `${offset.top}px`);
         | 
| 94 | 
            +
            			document.documentElement.style.setProperty(`--${name}-left-offset`, `${offset.left}px`);
         | 
| 95 | 
            +
            			document.documentElement.style.setProperty(`--${name}-right-offset`, `${offset.right}px`);
         | 
| 96 | 
            +
            			document.documentElement.style.setProperty(`--${name}-bottom-offset`, `${offset.bottom}px`);
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            			observed[name] = {
         | 
| 99 | 
            +
            				rect,
         | 
| 100 | 
            +
            				offset,
         | 
| 101 | 
            +
            			};
         | 
| 102 | 
            +
            		}
         | 
|  | |
| 103 |  | 
| 104 | 
            +
            		function onWindowChange() {
         | 
| 105 | 
            +
            			setVars(args.name);
         | 
|  | |
| 106 | 
             
            		}
         | 
| 107 |  | 
| 108 | 
            +
            		/** Initialize */
         | 
| 109 | 
            +
            		const resizeObserver = new ResizeObserver(() => {
         | 
| 110 | 
             
            			setVars(args.name);
         | 
| 111 | 
             
            		});
         | 
| 112 | 
            +
             | 
| 113 | 
             
            		resizeObserver.observe(node);
         | 
| 114 |  | 
| 115 | 
             
            		// Listen for scroll and resize events
         | 
|  | |
| 117 | 
             
            		window.addEventListener("resize", onWindowChange, true);
         | 
| 118 |  | 
| 119 | 
             
            		setVars(args.name); // Initial set after observing
         | 
| 120 | 
            +
            		if (args.useRaf) {
         | 
| 121 | 
            +
            			new AnimationFrames(() => {
         | 
| 122 | 
            +
            				setVars(args.name);
         | 
| 123 | 
            +
            			});
         | 
| 124 | 
            +
            		}
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 125 |  | 
| 126 | 
            +
            		return function destroy() {
         | 
| 127 | 
            +
            			resizeObserver.disconnect();
         | 
| 128 | 
            +
            			window.removeEventListener("scroll", onWindowChange, true);
         | 
| 129 | 
            +
            			window.removeEventListener("resize", onWindowChange, true);
         | 
| 130 | 
            +
            		};
         | 
| 131 | 
             
            	};
         | 
| 132 | 
            +
            }
         | 
    	
        src/lib/components/dialog.svelte
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            -
            	import { clickOutside } from "$lib/ | 
| 3 | 
             
            	import type { Snippet } from "svelte";
         | 
| 4 | 
             
            	import type { EventHandler } from "svelte/elements";
         | 
| 5 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| @@ -29,7 +29,10 @@ | |
| 29 | 
             
            <dialog bind:this={dialog} onclose={onClose}>
         | 
| 30 | 
             
            	{#if open}
         | 
| 31 | 
             
            		<form class="fixed inset-0 z-50 flex items-center justify-center overflow-hidden bg-black/85" onsubmit={onSubmit}>
         | 
| 32 | 
            -
            			<div | 
|  | |
|  | |
|  | |
| 33 | 
             
            				<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
         | 
| 34 | 
             
            					{#if typeof title === "string"}
         | 
| 35 | 
             
            						<h3 class="flex items-center gap-2.5 text-lg font-semibold text-gray-900 dark:text-white">
         | 
|  | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            +
            	import { clickOutside } from "$lib/attachments/click-outside.js";
         | 
| 3 | 
             
            	import type { Snippet } from "svelte";
         | 
| 4 | 
             
            	import type { EventHandler } from "svelte/elements";
         | 
| 5 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
|  | |
| 29 | 
             
            <dialog bind:this={dialog} onclose={onClose}>
         | 
| 30 | 
             
            	{#if open}
         | 
| 31 | 
             
            		<form class="fixed inset-0 z-50 flex items-center justify-center overflow-hidden bg-black/85" onsubmit={onSubmit}>
         | 
| 32 | 
            +
            			<div
         | 
| 33 | 
            +
            				class="relative w-xl rounded-xl bg-white shadow-sm dark:bg-gray-900"
         | 
| 34 | 
            +
            				{@attach clickOutside(() => onClose?.())}
         | 
| 35 | 
            +
            			>
         | 
| 36 | 
             
            				<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
         | 
| 37 | 
             
            					{#if typeof title === "string"}
         | 
| 38 | 
             
            						<h3 class="flex items-center gap-2.5 text-lg font-semibold text-gray-900 dark:text-white">
         | 
    	
        src/lib/components/inference-playground/checkpoints-menu.svelte
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            -
            	import { clickOutside } from "$lib/ | 
| 3 | 
             
            	import { checkpoints } from "$lib/state/checkpoints.svelte";
         | 
| 4 | 
             
            	import { projects } from "$lib/state/projects.svelte";
         | 
| 5 | 
             
            	import { iterate } from "$lib/utils/array.js";
         | 
| @@ -37,7 +37,7 @@ | |
| 37 | 
             
            <dialog
         | 
| 38 | 
             
            	bind:this={dialog}
         | 
| 39 | 
             
            	class="mb-2 !overflow-visible rounded-xl border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800"
         | 
| 40 | 
            -
            	 | 
| 41 | 
             
            	{...popover.content}
         | 
| 42 | 
             
            >
         | 
| 43 | 
             
            	<div
         | 
|  | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            +
            	import { clickOutside } from "$lib/attachments/click-outside.js";
         | 
| 3 | 
             
            	import { checkpoints } from "$lib/state/checkpoints.svelte";
         | 
| 4 | 
             
            	import { projects } from "$lib/state/projects.svelte";
         | 
| 5 | 
             
            	import { iterate } from "$lib/utils/array.js";
         | 
|  | |
| 37 | 
             
            <dialog
         | 
| 38 | 
             
            	bind:this={dialog}
         | 
| 39 | 
             
            	class="mb-2 !overflow-visible rounded-xl border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800"
         | 
| 40 | 
            +
            	{@attach clickOutside(() => (popover.open = false))}
         | 
| 41 | 
             
            	{...popover.content}
         | 
| 42 | 
             
            >
         | 
| 43 | 
             
            	<div
         | 
    	
        src/lib/components/inference-playground/custom-model-config.svelte
    CHANGED
    
    | @@ -20,8 +20,8 @@ | |
| 20 | 
             
            </script>
         | 
| 21 |  | 
| 22 | 
             
            <script lang="ts">
         | 
| 23 | 
            -
            	import { autofocus } from "$lib/ | 
| 24 | 
            -
            	import { clickOutside } from "$lib/ | 
| 25 | 
             
            	import { models } from "$lib/state/models.svelte";
         | 
| 26 | 
             
            	import { PipelineTag, pipelineTagLabel, type Conversation, type CustomModel } from "$lib/types.js";
         | 
| 27 | 
             
            	import { createFieldValidation } from "$lib/utils/form.svelte.js";
         | 
| @@ -140,7 +140,7 @@ | |
| 140 | 
             
            			<!-- Content -->
         | 
| 141 | 
             
            			<form
         | 
| 142 | 
             
            				class="relative w-xl rounded-xl bg-white shadow-sm dark:bg-gray-900"
         | 
| 143 | 
            -
            				 | 
| 144 | 
             
            				transition:scale={{ start: 0.975, duration: 250 }}
         | 
| 145 | 
             
            				{onsubmit}
         | 
| 146 | 
             
            			>
         | 
| @@ -166,12 +166,12 @@ | |
| 166 | 
             
            							Model ID <span class="text-red-800 dark:text-red-300">*</span>
         | 
| 167 | 
             
            						</p>
         | 
| 168 | 
             
            						<input
         | 
| 169 | 
            -
            							use:autofocus
         | 
| 170 | 
             
            							bind:value={model.id}
         | 
| 171 | 
             
            							required
         | 
| 172 | 
             
            							placeholder="e.g. mistralai/mistral-large-2407"
         | 
| 173 | 
             
            							type="text"
         | 
| 174 | 
             
            							class="input block w-full"
         | 
|  | |
| 175 | 
             
            						/>
         | 
| 176 | 
             
            					</label>
         | 
| 177 | 
             
            					<label class="flex flex-col gap-2">
         | 
|  | |
| 20 | 
             
            </script>
         | 
| 21 |  | 
| 22 | 
             
            <script lang="ts">
         | 
| 23 | 
            +
            	import { autofocus } from "$lib/attachments/autofocus.js";
         | 
| 24 | 
            +
            	import { clickOutside } from "$lib/attachments/click-outside.js";
         | 
| 25 | 
             
            	import { models } from "$lib/state/models.svelte";
         | 
| 26 | 
             
            	import { PipelineTag, pipelineTagLabel, type Conversation, type CustomModel } from "$lib/types.js";
         | 
| 27 | 
             
            	import { createFieldValidation } from "$lib/utils/form.svelte.js";
         | 
|  | |
| 140 | 
             
            			<!-- Content -->
         | 
| 141 | 
             
            			<form
         | 
| 142 | 
             
            				class="relative w-xl rounded-xl bg-white shadow-sm dark:bg-gray-900"
         | 
| 143 | 
            +
            				{@attach clickOutside(() => close())}
         | 
| 144 | 
             
            				transition:scale={{ start: 0.975, duration: 250 }}
         | 
| 145 | 
             
            				{onsubmit}
         | 
| 146 | 
             
            			>
         | 
|  | |
| 166 | 
             
            							Model ID <span class="text-red-800 dark:text-red-300">*</span>
         | 
| 167 | 
             
            						</p>
         | 
| 168 | 
             
            						<input
         | 
|  | |
| 169 | 
             
            							bind:value={model.id}
         | 
| 170 | 
             
            							required
         | 
| 171 | 
             
            							placeholder="e.g. mistralai/mistral-large-2407"
         | 
| 172 | 
             
            							type="text"
         | 
| 173 | 
             
            							class="input block w-full"
         | 
| 174 | 
            +
            							{@attach autofocus()}
         | 
| 175 | 
             
            						/>
         | 
| 176 | 
             
            					</label>
         | 
| 177 | 
             
            					<label class="flex flex-col gap-2">
         | 
    	
        src/lib/components/inference-playground/hf-token-modal.svelte
    CHANGED
    
    | @@ -2,11 +2,11 @@ | |
| 2 | 
             
            	import { createBubbler, preventDefault } from "svelte/legacy";
         | 
| 3 |  | 
| 4 | 
             
            	const bubble = createBubbler();
         | 
| 5 | 
            -
            	import { clickOutside } from "$lib/ | 
| 6 | 
             
            	import { createEventDispatcher, onDestroy, onMount } from "svelte";
         | 
| 7 |  | 
| 8 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| 9 | 
            -
            	import { autofocus } from "$lib/ | 
| 10 |  | 
| 11 | 
             
            	interface Props {
         | 
| 12 | 
             
            		storeLocallyHfToken?: boolean;
         | 
| @@ -51,7 +51,7 @@ | |
| 51 | 
             
            		class="relative max-h-full w-full max-w-xl p-4 outline-hidden"
         | 
| 52 | 
             
            		bind:this={modalEl}
         | 
| 53 | 
             
            		onkeydown={handleKeydown}
         | 
| 54 | 
            -
            		 | 
| 55 | 
             
            	>
         | 
| 56 | 
             
            		<form onsubmit={preventDefault(bubble("submit"))} class="relative rounded-lg bg-white shadow-sm dark:bg-gray-900">
         | 
| 57 | 
             
            			<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
         | 
| @@ -85,13 +85,13 @@ | |
| 85 | 
             
            						Hugging Face Token
         | 
| 86 | 
             
            					</label>
         | 
| 87 | 
             
            					<input
         | 
| 88 | 
            -
            						use:autofocus
         | 
| 89 | 
             
            						required
         | 
| 90 | 
             
            						placeholder="Enter HF Token"
         | 
| 91 | 
             
            						type="text"
         | 
| 92 | 
             
            						id="hf-token"
         | 
| 93 | 
             
            						name="hf-token"
         | 
| 94 | 
             
            						class="block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500"
         | 
|  | |
| 95 | 
             
            					/>
         | 
| 96 | 
             
            				</div>
         | 
| 97 | 
             
            				<label class="mt-4 flex items-center gap-x-1.5 text-gray-900 dark:text-gray-200">
         | 
|  | |
| 2 | 
             
            	import { createBubbler, preventDefault } from "svelte/legacy";
         | 
| 3 |  | 
| 4 | 
             
            	const bubble = createBubbler();
         | 
| 5 | 
            +
            	import { clickOutside } from "$lib/attachments/click-outside.js";
         | 
| 6 | 
             
            	import { createEventDispatcher, onDestroy, onMount } from "svelte";
         | 
| 7 |  | 
| 8 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| 9 | 
            +
            	import { autofocus } from "$lib/attachments/autofocus.js";
         | 
| 10 |  | 
| 11 | 
             
            	interface Props {
         | 
| 12 | 
             
            		storeLocallyHfToken?: boolean;
         | 
|  | |
| 51 | 
             
            		class="relative max-h-full w-full max-w-xl p-4 outline-hidden"
         | 
| 52 | 
             
            		bind:this={modalEl}
         | 
| 53 | 
             
            		onkeydown={handleKeydown}
         | 
| 54 | 
            +
            		{@attach clickOutside(() => dispatch("close"))}
         | 
| 55 | 
             
            	>
         | 
| 56 | 
             
            		<form onsubmit={preventDefault(bubble("submit"))} class="relative rounded-lg bg-white shadow-sm dark:bg-gray-900">
         | 
| 57 | 
             
            			<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
         | 
|  | |
| 85 | 
             
            						Hugging Face Token
         | 
| 86 | 
             
            					</label>
         | 
| 87 | 
             
            					<input
         | 
|  | |
| 88 | 
             
            						required
         | 
| 89 | 
             
            						placeholder="Enter HF Token"
         | 
| 90 | 
             
            						type="text"
         | 
| 91 | 
             
            						id="hf-token"
         | 
| 92 | 
             
            						name="hf-token"
         | 
| 93 | 
             
            						class="block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500"
         | 
| 94 | 
            +
            						{@attach autofocus()}
         | 
| 95 | 
             
            					/>
         | 
| 96 | 
             
            				</div>
         | 
| 97 | 
             
            				<label class="mt-4 flex items-center gap-x-1.5 text-gray-900 dark:text-gray-200">
         | 
    	
        src/lib/components/inference-playground/img-preview.svelte
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            -
            	import { clickOutside } from "$lib/ | 
| 3 | 
             
            	import { fade, scale } from "svelte/transition";
         | 
| 4 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| 5 |  | 
| @@ -39,7 +39,7 @@ | |
| 39 | 
             
            				class="max-h-[calc(100vh-120px)] max-w-[calc(100vw-120px)] object-contain"
         | 
| 40 | 
             
            				src={img}
         | 
| 41 | 
             
            				alt=""
         | 
| 42 | 
            -
            				 | 
| 43 | 
             
            				transition:scale={{ start: 0.975, duration: 250 }}
         | 
| 44 | 
             
            			/>
         | 
| 45 |  | 
|  | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            +
            	import { clickOutside } from "$lib/attachments/click-outside.js";
         | 
| 3 | 
             
            	import { fade, scale } from "svelte/transition";
         | 
| 4 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| 5 |  | 
|  | |
| 39 | 
             
            				class="max-h-[calc(100vh-120px)] max-w-[calc(100vw-120px)] object-contain"
         | 
| 40 | 
             
            				src={img}
         | 
| 41 | 
             
            				alt=""
         | 
| 42 | 
            +
            				{@attach clickOutside(() => (img = undefined))}
         | 
| 43 | 
             
            				transition:scale={{ start: 0.975, duration: 250 }}
         | 
| 44 | 
             
            			/>
         | 
| 45 |  | 
    	
        src/lib/components/inference-playground/message.svelte
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            -
            	import { autofocus as autofocusAction } from "$lib/ | 
| 3 | 
             
            	import Tooltip from "$lib/components/tooltip.svelte";
         | 
| 4 | 
             
            	import { TextareaAutosize } from "$lib/spells/textarea-autosize.svelte.js";
         | 
| 5 | 
             
            	import { type ConversationClass } from "$lib/state/conversations.svelte.js";
         | 
| @@ -51,7 +51,6 @@ | |
| 51 | 
             
            			}
         | 
| 52 |  | 
| 53 | 
             
            			fileQueue.add(async () => {
         | 
| 54 | 
            -
            				console.log("queue item start");
         | 
| 55 | 
             
            				const key = await images.upload(file);
         | 
| 56 |  | 
| 57 | 
             
            				const prev = message.images ?? [];
         | 
| @@ -59,7 +58,6 @@ | |
| 59 | 
             
            				// We're dealing with files ourselves, so we don't want fileUpload to have any internal state,
         | 
| 60 | 
             
            				// to avoid conflicts
         | 
| 61 | 
             
            				if (fileQueue.queue.length <= 1) fileUpload.clear();
         | 
| 62 | 
            -
            				console.log("queue item end");
         | 
| 63 | 
             
            			});
         | 
| 64 | 
             
            		},
         | 
| 65 | 
             
            		disabled: () => !canUploadImgs,
         | 
| @@ -102,7 +100,6 @@ | |
| 102 | 
             
            		<div class="flex w-full gap-4">
         | 
| 103 | 
             
            			<textarea
         | 
| 104 | 
             
            				bind:this={element}
         | 
| 105 | 
            -
            				use:autofocusAction={autofocus}
         | 
| 106 | 
             
            				value={message?.content}
         | 
| 107 | 
             
            				onchange={e => {
         | 
| 108 | 
             
            					const el = e.target as HTMLTextAreaElement;
         | 
| @@ -114,6 +111,7 @@ | |
| 114 | 
             
            				class="grow resize-none overflow-hidden rounded-lg bg-transparent px-2 py-2.5 ring-gray-100 outline-none group-hover/message:ring-3 hover:bg-white focus:bg-white focus:ring-3 @2xl:px-3 dark:ring-gray-600 dark:hover:bg-gray-900 dark:focus:bg-gray-900"
         | 
| 115 | 
             
            				rows="1"
         | 
| 116 | 
             
            				data-message
         | 
|  | |
| 117 | 
             
            			></textarea>
         | 
| 118 |  | 
| 119 | 
             
            			<!-- Sticky wrapper for action buttons -->
         | 
|  | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            +
            	import { autofocus as autofocusAction } from "$lib/attachments/autofocus.js";
         | 
| 3 | 
             
            	import Tooltip from "$lib/components/tooltip.svelte";
         | 
| 4 | 
             
            	import { TextareaAutosize } from "$lib/spells/textarea-autosize.svelte.js";
         | 
| 5 | 
             
            	import { type ConversationClass } from "$lib/state/conversations.svelte.js";
         | 
|  | |
| 51 | 
             
            			}
         | 
| 52 |  | 
| 53 | 
             
            			fileQueue.add(async () => {
         | 
|  | |
| 54 | 
             
            				const key = await images.upload(file);
         | 
| 55 |  | 
| 56 | 
             
            				const prev = message.images ?? [];
         | 
|  | |
| 58 | 
             
            				// We're dealing with files ourselves, so we don't want fileUpload to have any internal state,
         | 
| 59 | 
             
            				// to avoid conflicts
         | 
| 60 | 
             
            				if (fileQueue.queue.length <= 1) fileUpload.clear();
         | 
|  | |
| 61 | 
             
            			});
         | 
| 62 | 
             
            		},
         | 
| 63 | 
             
            		disabled: () => !canUploadImgs,
         | 
|  | |
| 100 | 
             
            		<div class="flex w-full gap-4">
         | 
| 101 | 
             
            			<textarea
         | 
| 102 | 
             
            				bind:this={element}
         | 
|  | |
| 103 | 
             
            				value={message?.content}
         | 
| 104 | 
             
            				onchange={e => {
         | 
| 105 | 
             
            					const el = e.target as HTMLTextAreaElement;
         | 
|  | |
| 111 | 
             
            				class="grow resize-none overflow-hidden rounded-lg bg-transparent px-2 py-2.5 ring-gray-100 outline-none group-hover/message:ring-3 hover:bg-white focus:bg-white focus:ring-3 @2xl:px-3 dark:ring-gray-600 dark:hover:bg-gray-900 dark:focus:bg-gray-900"
         | 
| 112 | 
             
            				rows="1"
         | 
| 113 | 
             
            				data-message
         | 
| 114 | 
            +
            				{@attach autofocusAction(autofocus)}
         | 
| 115 | 
             
            			></textarea>
         | 
| 116 |  | 
| 117 | 
             
            			<!-- Sticky wrapper for action buttons -->
         | 
    	
        src/lib/components/inference-playground/model-selector-modal.svelte
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            -
            	import { autofocus } from "$lib/ | 
| 3 | 
             
            	import type { ConversationClass } from "$lib/state/conversations.svelte";
         | 
| 4 | 
             
            	import { models } from "$lib/state/models.svelte.js";
         | 
| 5 | 
             
            	import type { CustomModel, Model } from "$lib/types.js";
         | 
| @@ -81,10 +81,10 @@ | |
| 81 | 
             
            			</div>
         | 
| 82 | 
             
            			<input
         | 
| 83 | 
             
            				{...combobox.input}
         | 
| 84 | 
            -
            				use:autofocus
         | 
| 85 | 
             
            				class="flex h-10 w-full rounded-md bg-transparent py-3 text-sm placeholder-gray-400 outline-hidden"
         | 
| 86 | 
             
            				placeholder="Search models ..."
         | 
| 87 | 
             
            				bind:value={query}
         | 
|  | |
| 88 | 
             
            			/>
         | 
| 89 | 
             
            		</div>
         | 
| 90 | 
             
            		<div
         | 
|  | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            +
            	import { autofocus } from "$lib/attachments/autofocus.js";
         | 
| 3 | 
             
            	import type { ConversationClass } from "$lib/state/conversations.svelte";
         | 
| 4 | 
             
            	import { models } from "$lib/state/models.svelte.js";
         | 
| 5 | 
             
            	import type { CustomModel, Model } from "$lib/types.js";
         | 
|  | |
| 81 | 
             
            			</div>
         | 
| 82 | 
             
            			<input
         | 
| 83 | 
             
            				{...combobox.input}
         | 
|  | |
| 84 | 
             
            				class="flex h-10 w-full rounded-md bg-transparent py-3 text-sm placeholder-gray-400 outline-hidden"
         | 
| 85 | 
             
            				placeholder="Search models ..."
         | 
| 86 | 
             
            				bind:value={query}
         | 
| 87 | 
            +
            				{@attach autofocus()}
         | 
| 88 | 
             
            			/>
         | 
| 89 | 
             
            		</div>
         | 
| 90 | 
             
            		<div
         | 
    	
        src/lib/components/inference-playground/playground.svelte
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            -
            	import { observe, observed, ObservedElements } from "$lib/ | 
| 3 | 
             
            	import { token } from "$lib/state/token.svelte.js";
         | 
| 4 | 
             
            	import { cmdOrCtrl, optOrAlt } from "$lib/utils/platform.js";
         | 
| 5 | 
             
            	import { Popover } from "melt/components";
         | 
| @@ -170,9 +170,13 @@ | |
| 170 | 
             
            					{@const tceRight = observed["token-count-end"].offset.right}
         | 
| 171 | 
             
            					<span
         | 
| 172 | 
             
            						style:translate={isLast ? (baLeft - 12 < tceRight ? baLeft - tceRight - 12 + "px" : "") : undefined}
         | 
| 173 | 
            -
            						 | 
| 174 | 
            -
             | 
|  | |
|  | |
| 175 | 
             
            					>
         | 
|  | |
|  | |
| 176 | 
             
            				{/each}
         | 
| 177 | 
             
            			</div>
         | 
| 178 | 
             
            			<div class="flex flex-1 justify-end gap-x-2">
         | 
| @@ -180,7 +184,7 @@ | |
| 180 | 
             
            					type="button"
         | 
| 181 | 
             
            					onclick={() => (viewCode = !viewCode)}
         | 
| 182 | 
             
            					class="btn"
         | 
| 183 | 
            -
            					 | 
| 184 | 
             
            				>
         | 
| 185 | 
             
            					<IconCode />
         | 
| 186 | 
             
            					{!viewCode ? "View Code" : "Hide Code"}
         | 
|  | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            +
            	import { observe, observed, ObservedElements } from "$lib/attachments/observe.svelte.js";
         | 
| 3 | 
             
            	import { token } from "$lib/state/token.svelte.js";
         | 
| 4 | 
             
            	import { cmdOrCtrl, optOrAlt } from "$lib/utils/platform.js";
         | 
| 5 | 
             
            	import { Popover } from "melt/components";
         | 
|  | |
| 170 | 
             
            					{@const tceRight = observed["token-count-end"].offset.right}
         | 
| 171 | 
             
            					<span
         | 
| 172 | 
             
            						style:translate={isLast ? (baLeft - 12 < tceRight ? baLeft - tceRight - 12 + "px" : "") : undefined}
         | 
| 173 | 
            +
            						{@attach observe({
         | 
| 174 | 
            +
            							name: isLast ? ObservedElements.TokenCountEnd : ObservedElements.TokenCountStart,
         | 
| 175 | 
            +
            							useRaf: true,
         | 
| 176 | 
            +
            						})}
         | 
| 177 | 
             
            					>
         | 
| 178 | 
            +
            						{tokens} tokens · Latency {latency}ms
         | 
| 179 | 
            +
            					</span>
         | 
| 180 | 
             
            				{/each}
         | 
| 181 | 
             
            			</div>
         | 
| 182 | 
             
            			<div class="flex flex-1 justify-end gap-x-2">
         | 
|  | |
| 184 | 
             
            					type="button"
         | 
| 185 | 
             
            					onclick={() => (viewCode = !viewCode)}
         | 
| 186 | 
             
            					class="btn"
         | 
| 187 | 
            +
            					{@attach observe({ name: ObservedElements.BottomActions, useRaf: true })}
         | 
| 188 | 
             
            				>
         | 
| 189 | 
             
            					<IconCode />
         | 
| 190 | 
             
            					{!viewCode ? "View Code" : "Hide Code"}
         | 
    	
        src/lib/components/inference-playground/project-select.svelte
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            -
            	import { autofocus } from "$lib/ | 
| 3 | 
             
            	import { checkpoints } from "$lib/state/checkpoints.svelte";
         | 
| 4 | 
             
            	import { cn } from "$lib/utils/cn.js";
         | 
| 5 | 
             
            	import { Select } from "melt/builders";
         | 
| @@ -156,9 +156,9 @@ | |
| 156 | 
             
            		<input
         | 
| 157 | 
             
            			bind:value={sdState.name}
         | 
| 158 | 
             
            			placeholder={projectPlaceholder}
         | 
| 159 | 
            -
            			use:autofocus
         | 
| 160 | 
             
            			type="text"
         | 
| 161 | 
             
            			class="block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400"
         | 
|  | |
| 162 | 
             
            		/>
         | 
| 163 | 
             
            	</label>
         | 
| 164 | 
             
            	<label class="mt-4 flex gap-2 font-medium text-gray-900 dark:text-white">
         | 
|  | |
| 1 | 
             
            <script lang="ts">
         | 
| 2 | 
            +
            	import { autofocus } from "$lib/attachments/autofocus.js";
         | 
| 3 | 
             
            	import { checkpoints } from "$lib/state/checkpoints.svelte";
         | 
| 4 | 
             
            	import { cn } from "$lib/utils/cn.js";
         | 
| 5 | 
             
            	import { Select } from "melt/builders";
         | 
|  | |
| 156 | 
             
            		<input
         | 
| 157 | 
             
            			bind:value={sdState.name}
         | 
| 158 | 
             
            			placeholder={projectPlaceholder}
         | 
|  | |
| 159 | 
             
            			type="text"
         | 
| 160 | 
             
            			class="block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400"
         | 
| 161 | 
            +
            			{@attach autofocus()}
         | 
| 162 | 
             
            		/>
         | 
| 163 | 
             
            	</label>
         | 
| 164 | 
             
            	<label class="mt-4 flex gap-2 font-medium text-gray-900 dark:text-white">
         | 
    	
        src/lib/components/local-toasts.svelte
    CHANGED
    
    | @@ -2,6 +2,7 @@ | |
| 2 | 
             
            	import { autoUpdate, computePosition } from "@floating-ui/dom";
         | 
| 3 | 
             
            	import { Toaster } from "melt/builders";
         | 
| 4 | 
             
            	import { type Snippet } from "svelte";
         | 
|  | |
| 5 | 
             
            	import { fly } from "svelte/transition";
         | 
| 6 |  | 
| 7 | 
             
            	interface Props {
         | 
| @@ -29,7 +30,7 @@ | |
| 29 |  | 
| 30 | 
             
            	export const addToast = toaster.addToast;
         | 
| 31 |  | 
| 32 | 
            -
            	 | 
| 33 | 
             
            		const triggerEl = document.querySelector(`[data-local-toast-trigger=${id}]`);
         | 
| 34 | 
             
            		if (!triggerEl) return;
         | 
| 35 |  | 
| @@ -44,10 +45,8 @@ | |
| 44 | 
             
            				});
         | 
| 45 | 
             
            			});
         | 
| 46 |  | 
| 47 | 
            -
            		return  | 
| 48 | 
            -
             | 
| 49 | 
            -
            		};
         | 
| 50 | 
            -
            	}
         | 
| 51 |  | 
| 52 | 
             
            	const classMap: Record<ToastData["variant"], string> = {
         | 
| 53 | 
             
            		info: "border border-blue-400 bg-gradient-to-b from-blue-500 to-blue-600",
         | 
| @@ -65,7 +64,7 @@ | |
| 65 | 
             
            		class={[!toastSnippet && `${classMap[toast.data.variant]} rounded-full px-2 py-1 text-xs`]}
         | 
| 66 | 
             
            		in:fly={{ y: 10 }}
         | 
| 67 | 
             
            		out:fly={{ y: -4 }}
         | 
| 68 | 
            -
            		 | 
| 69 | 
             
            	>
         | 
| 70 | 
             
            		{#if toastSnippet}
         | 
| 71 | 
             
            			{@render toastSnippet({ toast, float })}
         | 
|  | |
| 2 | 
             
            	import { autoUpdate, computePosition } from "@floating-ui/dom";
         | 
| 3 | 
             
            	import { Toaster } from "melt/builders";
         | 
| 4 | 
             
            	import { type Snippet } from "svelte";
         | 
| 5 | 
            +
            	import { type Attachment } from "svelte/attachments";
         | 
| 6 | 
             
            	import { fly } from "svelte/transition";
         | 
| 7 |  | 
| 8 | 
             
            	interface Props {
         | 
|  | |
| 30 |  | 
| 31 | 
             
            	export const addToast = toaster.addToast;
         | 
| 32 |  | 
| 33 | 
            +
            	const float: Attachment<HTMLElement> = function (node) {
         | 
| 34 | 
             
            		const triggerEl = document.querySelector(`[data-local-toast-trigger=${id}]`);
         | 
| 35 | 
             
            		if (!triggerEl) return;
         | 
| 36 |  | 
|  | |
| 45 | 
             
            				});
         | 
| 46 | 
             
            			});
         | 
| 47 |  | 
| 48 | 
            +
            		return autoUpdate(triggerEl, node, compute);
         | 
| 49 | 
            +
            	};
         | 
|  | |
|  | |
| 50 |  | 
| 51 | 
             
            	const classMap: Record<ToastData["variant"], string> = {
         | 
| 52 | 
             
            		info: "border border-blue-400 bg-gradient-to-b from-blue-500 to-blue-600",
         | 
|  | |
| 64 | 
             
            		class={[!toastSnippet && `${classMap[toast.data.variant]} rounded-full px-2 py-1 text-xs`]}
         | 
| 65 | 
             
            		in:fly={{ y: 10 }}
         | 
| 66 | 
             
            		out:fly={{ y: -4 }}
         | 
| 67 | 
            +
            		{@attach float}
         | 
| 68 | 
             
            	>
         | 
| 69 | 
             
            		{#if toastSnippet}
         | 
| 70 | 
             
            			{@render toastSnippet({ toast, float })}
         | 
    	
        src/lib/components/prompts.svelte
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 | 
             
            <script lang="ts" module>
         | 
| 2 | 
            -
            	import { autofocus } from "$lib/ | 
| 3 | 
            -
            	import { clickOutside } from "$lib/ | 
| 4 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| 5 |  | 
| 6 | 
             
            	type Prompt = {
         | 
| @@ -49,7 +49,7 @@ | |
| 49 | 
             
            			<form
         | 
| 50 | 
             
            				onsubmit={onSubmit}
         | 
| 51 | 
             
            				class="relative w-xl rounded-lg bg-white shadow-sm dark:bg-gray-900"
         | 
| 52 | 
            -
            				 | 
| 53 | 
             
            			>
         | 
| 54 | 
             
            				<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
         | 
| 55 | 
             
            					<h3 class="flex items-center gap-2.5 text-lg font-semibold text-gray-900 dark:text-white">
         | 
| @@ -73,9 +73,9 @@ | |
| 73 | 
             
            							bind:value={current.value}
         | 
| 74 | 
             
            							placeholder={current.placeholder}
         | 
| 75 | 
             
            							required
         | 
| 76 | 
            -
            							use:autofocus
         | 
| 77 | 
             
            							type="text"
         | 
| 78 | 
             
            							class="block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500"
         | 
|  | |
| 79 | 
             
            						/>
         | 
| 80 | 
             
            					</label>
         | 
| 81 | 
             
            				</div>
         | 
|  | |
| 1 | 
             
            <script lang="ts" module>
         | 
| 2 | 
            +
            	import { autofocus } from "$lib/attachments/autofocus.js";
         | 
| 3 | 
            +
            	import { clickOutside } from "$lib/attachments/click-outside.js";
         | 
| 4 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| 5 |  | 
| 6 | 
             
            	type Prompt = {
         | 
|  | |
| 49 | 
             
            			<form
         | 
| 50 | 
             
            				onsubmit={onSubmit}
         | 
| 51 | 
             
            				class="relative w-xl rounded-lg bg-white shadow-sm dark:bg-gray-900"
         | 
| 52 | 
            +
            				{@attach clickOutside(resolvePrompt)}
         | 
| 53 | 
             
            			>
         | 
| 54 | 
             
            				<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
         | 
| 55 | 
             
            					<h3 class="flex items-center gap-2.5 text-lg font-semibold text-gray-900 dark:text-white">
         | 
|  | |
| 73 | 
             
            							bind:value={current.value}
         | 
| 74 | 
             
            							placeholder={current.placeholder}
         | 
| 75 | 
             
            							required
         | 
|  | |
| 76 | 
             
            							type="text"
         | 
| 77 | 
             
            							class="block w-full rounded-lg border border-gray-300 bg-gray-50 p-2.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 dark:text-white dark:placeholder-gray-400 dark:focus:border-blue-500 dark:focus:ring-blue-500"
         | 
| 78 | 
            +
            							{@attach autofocus()}
         | 
| 79 | 
             
            						/>
         | 
| 80 | 
             
            					</label>
         | 
| 81 | 
             
            				</div>
         | 
    	
        src/lib/components/quota-modal.svelte
    CHANGED
    
    | @@ -7,7 +7,7 @@ | |
| 7 | 
             
            </script>
         | 
| 8 |  | 
| 9 | 
             
            <script lang="ts">
         | 
| 10 | 
            -
            	import { clickOutside } from "$lib/ | 
| 11 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| 12 | 
             
            	import IconCheck from "~icons/carbon/checkmark";
         | 
| 13 | 
             
            	import IconExternal from "~icons/carbon/arrow-up-right";
         | 
| @@ -41,7 +41,7 @@ | |
| 41 | 
             
            			<!-- Content -->
         | 
| 42 | 
             
            			<div
         | 
| 43 | 
             
            				class="relative w-lg rounded-xl bg-white shadow-sm dark:bg-gray-900"
         | 
| 44 | 
            -
            				 | 
| 45 | 
             
            				transition:scale={{ start: 0.975, duration: 250 }}
         | 
| 46 | 
             
            			>
         | 
| 47 | 
             
            				<h2 class="mt-8 text-center text-2xl font-semibold text-balance sm:text-3xl dark:text-white">
         | 
|  | |
| 7 | 
             
            </script>
         | 
| 8 |  | 
| 9 | 
             
            <script lang="ts">
         | 
| 10 | 
            +
            	import { clickOutside } from "$lib/attachments/click-outside.js";
         | 
| 11 | 
             
            	import IconCross from "~icons/carbon/close";
         | 
| 12 | 
             
            	import IconCheck from "~icons/carbon/checkmark";
         | 
| 13 | 
             
            	import IconExternal from "~icons/carbon/arrow-up-right";
         | 
|  | |
| 41 | 
             
            			<!-- Content -->
         | 
| 42 | 
             
            			<div
         | 
| 43 | 
             
            				class="relative w-lg rounded-xl bg-white shadow-sm dark:bg-gray-900"
         | 
| 44 | 
            +
            				{@attach clickOutside(() => (open = false))}
         | 
| 45 | 
             
            				transition:scale={{ start: 0.975, duration: 250 }}
         | 
| 46 | 
             
            			>
         | 
| 47 | 
             
            				<h2 class="mt-8 text-center text-2xl font-semibold text-balance sm:text-3xl dark:text-white">
         | 
    	
        src/lib/components/share-modal.svelte
    CHANGED
    
    | @@ -11,7 +11,7 @@ | |
| 11 | 
             
            </script>
         | 
| 12 |  | 
| 13 | 
             
            <script lang="ts">
         | 
| 14 | 
            -
            	import { clickOutside } from "$lib/ | 
| 15 | 
             
            	import { ProjectEntity, projects, type ProjectEntityMembers } from "$lib/state/projects.svelte";
         | 
| 16 | 
             
            	import { copyToClipboard } from "$lib/utils/copy.js";
         | 
| 17 | 
             
            	import { decodeString, encodeObject } from "$lib/utils/encode.js";
         | 
| @@ -87,7 +87,7 @@ | |
| 87 | 
             
            			<!-- Content -->
         | 
| 88 | 
             
            			<div
         | 
| 89 | 
             
            				class="relative w-xl max-w-[calc(100dvw-2rem)] rounded-xl bg-white shadow-sm dark:bg-gray-900"
         | 
| 90 | 
            -
            				 | 
| 91 | 
             
            				transition:scale={{ start: 0.975, duration: 250 }}
         | 
| 92 | 
             
            			>
         | 
| 93 | 
             
            				<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
         | 
|  | |
| 11 | 
             
            </script>
         | 
| 12 |  | 
| 13 | 
             
            <script lang="ts">
         | 
| 14 | 
            +
            	import { clickOutside } from "$lib/attachments/click-outside.js";
         | 
| 15 | 
             
            	import { ProjectEntity, projects, type ProjectEntityMembers } from "$lib/state/projects.svelte";
         | 
| 16 | 
             
            	import { copyToClipboard } from "$lib/utils/copy.js";
         | 
| 17 | 
             
            	import { decodeString, encodeObject } from "$lib/utils/encode.js";
         | 
|  | |
| 87 | 
             
            			<!-- Content -->
         | 
| 88 | 
             
            			<div
         | 
| 89 | 
             
            				class="relative w-xl max-w-[calc(100dvw-2rem)] rounded-xl bg-white shadow-sm dark:bg-gray-900"
         | 
| 90 | 
            +
            				{@attach clickOutside(() => close())}
         | 
| 91 | 
             
            				transition:scale={{ start: 0.975, duration: 250 }}
         | 
| 92 | 
             
            			>
         | 
| 93 | 
             
            				<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
         | 
