Thomas G. Lopes commited on
Commit
fbef5e8
·
unverified ·
1 Parent(s): 1778c9e

convert actions to attachments (#84)

Browse files
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.2.6",
49
  "prettier-plugin-tailwindcss": "^0.6.11",
50
  "runed": "^0.25.0",
51
  "shiki": "^3.4.0",
52
- "svelte": "^5.28.2",
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.3.1",
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.3.1
16
- version: 3.3.1([email protected]([email protected]))(svelte@5.28.2)
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/[email protected](@sveltejs/[email protected](svelte@5.28.2)([email protected](@types/[email protected])([email protected])))(svelte@5.28.2)([email protected](@types/[email protected])([email protected])))
60
  '@sveltejs/adapter-node':
61
  specifier: ^5.2.0
62
- version: 5.2.12(@sveltejs/[email protected](@sveltejs/[email protected](svelte@5.28.2)([email protected](@types/[email protected])([email protected])))(svelte@5.28.2)([email protected](@types/[email protected])([email protected])))
63
  '@sveltejs/kit':
64
  specifier: ^2.5.27
65
- version: 2.18.0(@sveltejs/[email protected](svelte@5.28.2)([email protected](@types/[email protected])([email protected])))(svelte@5.28.2)([email protected](@types/[email protected])([email protected]))
66
  '@sveltejs/vite-plugin-svelte':
67
  specifier: ^4.0.0
68
- version: 4.0.4(svelte@5.28.2)([email protected](@types/[email protected])([email protected]))
69
  '@tailwindcss/container-queries':
70
  specifier: ^0.1.1
71
  version: 0.1.1([email protected])
@@ -101,7 +101,7 @@ importers:
101
  version: 2.4.2
102
  melt:
103
  specifier: ^0.30.1
104
- version: 0.30.1(@floating-ui/[email protected])(svelte@5.28.2)
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.2.6
116
- version: 3.3.3([email protected])(svelte@5.28.2)
117
  prettier-plugin-tailwindcss:
118
  specifier: ^0.6.11
119
- version: 0.6.11(prettier-plugin-svelte@3.3.3([email protected])(svelte@5.28.2))([email protected])
120
  runed:
121
  specifier: ^0.25.0
122
- version: 0.25.0(svelte@5.28.2)
123
  shiki:
124
  specifier: ^3.4.0
125
  version: 3.4.0
126
  svelte:
127
- specifier: ^5.28.2
128
- version: 5.28.2
129
  svelte-check:
130
  specifier: ^4.0.0
131
- version: 4.1.5([email protected])(svelte@5.28.2)([email protected])
132
  tailwind-merge:
133
  specifier: ^3.0.2
134
  version: 3.0.2
@@ -149,7 +149,7 @@ importers:
149
150
  unplugin-icons:
151
  specifier: ^22.1.0
152
- version: 22.1.0(svelte@5.28.2)
153
  vite:
154
  specifier: ^5.4.4
155
  version: 5.4.14(@types/[email protected])([email protected])
@@ -1410,12 +1410,6 @@ packages:
1410
  resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1411
  engines: {node: '>=10'}
1412
 
1413
1414
- resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==}
1415
- engines: {node: '>=12'}
1416
- peerDependencies:
1417
- eslint: '>=6.0.0'
1418
-
1419
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.3.1:
1440
- resolution: {integrity: sha512-5p3JGBMautDKtQdNmHkp33akcssAqZObV955UREa8v1thDDRG6sCj8gQMztQRRDFJiGsBdWgLWEB5HrdKg5B2w==}
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.35.0:
1802
- resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==}
1803
 
1804
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.3.3:
2180
- resolution: {integrity: sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==}
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.1.0:
2431
- resolution: {integrity: sha512-JP0v/wzDXWxza6c8K9ZjKKHYfgt0KidlbWx1e9n9UV4q+o28GTkk71fR0IDZDmLUDYs3vSq0+Tm9fofDqzGe1w==}
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.28.2:
2440
- resolution: {integrity: sha512-FbWBxgWOpQfhKvoGJv/TFwzqb4EhJbwCD17dB0tEpQiw1XyUEKZJtgm4nA4xq3LLsMo7hu5UY/BOFmroAxKTMg==}
2441
  engines: {node: '>=18'}
2442
 
2443
@@ -3335,22 +3329,22 @@ snapshots:
3335
  dependencies:
3336
  acorn: 8.14.0
3337
 
3338
3339
  dependencies:
3340
- '@sveltejs/kit': 2.18.0(@sveltejs/[email protected](svelte@5.28.2)([email protected](@types/[email protected])([email protected])))(svelte@5.28.2)([email protected](@types/[email protected])([email protected]))
3341
  import-meta-resolve: 4.1.0
3342
 
3343
3344
  dependencies:
3345
  '@rollup/plugin-commonjs': 28.0.2([email protected])
3346
  '@rollup/plugin-json': 6.1.0([email protected])
3347
  '@rollup/plugin-node-resolve': 16.0.0([email protected])
3348
- '@sveltejs/kit': 2.18.0(@sveltejs/[email protected](svelte@5.28.2)([email protected](@types/[email protected])([email protected])))(svelte@5.28.2)([email protected](@types/[email protected])([email protected]))
3349
  rollup: 4.34.9
3350
 
3351
3352
  dependencies:
3353
- '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.28.2)([email protected](@types/[email protected])([email protected]))
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.28.2
3366
  vite: 5.4.14(@types/[email protected])([email protected])
3367
 
3368
3369
  dependencies:
3370
- '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.28.2)([email protected](@types/[email protected])([email protected]))
3371
  debug: 4.4.0
3372
- svelte: 5.28.2
3373
  vite: 5.4.14(@types/[email protected])([email protected])
3374
  transitivePeerDependencies:
3375
  - supports-color
3376
 
3377
3378
  dependencies:
3379
- '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/[email protected](svelte@5.28.2)([email protected](@types/[email protected])([email protected])))(svelte@5.28.2)([email protected](@types/[email protected])([email protected]))
3380
  debug: 4.4.0
3381
  deepmerge: 4.3.1
3382
  kleur: 4.1.5
3383
  magic-string: 0.30.17
3384
- svelte: 5.28.2
3385
  vite: 5.4.14(@types/[email protected])([email protected])
3386
3387
  transitivePeerDependencies:
@@ -3852,11 +3846,6 @@ snapshots:
3852
 
3853
3854
 
3855
3856
- dependencies:
3857
- eslint: 9.22.0([email protected])
3858
- semver: 7.7.1
3859
-
3860
3861
  dependencies:
3862
  eslint: 9.22.0([email protected])
@@ -3870,21 +3859,20 @@ snapshots:
3870
  optionalDependencies:
3871
  eslint-config-prettier: 10.1.1([email protected]([email protected]))
3872
 
3873
- eslint-plugin-svelte@3.3.1([email protected]([email protected]))(svelte@5.28.2):
3874
  dependencies:
3875
  '@eslint-community/eslint-utils': 4.4.1([email protected]([email protected]))
3876
  '@jridgewell/sourcemap-codec': 1.5.0
3877
  eslint: 9.22.0([email protected])
3878
- eslint-compat-utils: 0.6.4([email protected]([email protected]))
3879
  esutils: 2.0.3
3880
- known-css-properties: 0.35.0
3881
  postcss: 8.5.3
3882
  postcss-load-config: 3.1.4([email protected])
3883
  postcss-safe-parser: 7.0.1([email protected])
3884
  semver: 7.7.1
3885
- svelte-eslint-parser: 1.1.0(svelte@5.28.2)
3886
  optionalDependencies:
3887
- svelte: 5.28.2
3888
  transitivePeerDependencies:
3889
  - ts-node
3890
 
@@ -4258,7 +4246,7 @@ snapshots:
4258
 
4259
4260
 
4261
- known-css-properties@0.35.0: {}
4262
 
4263
4264
 
@@ -4359,14 +4347,14 @@ snapshots:
4359
  unist-util-visit: 5.0.0
4360
  vfile: 6.0.3
4361
 
4362
- [email protected](@floating-ui/[email protected])(svelte@5.28.2):
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.28.2)
4369
- svelte: 5.28.2
4370
 
4371
4372
 
@@ -4602,16 +4590,16 @@ snapshots:
4602
  dependencies:
4603
  fast-diff: 1.3.0
4604
 
4605
- prettier-plugin-svelte@3.3.3([email protected])(svelte@5.28.2):
4606
  dependencies:
4607
  prettier: 3.5.3
4608
- svelte: 5.28.2
4609
 
4610
- [email protected](prettier-plugin-svelte@3.3.3([email protected])(svelte@5.28.2))([email protected]):
4611
  dependencies:
4612
  prettier: 3.5.3
4613
  optionalDependencies:
4614
- prettier-plugin-svelte: 3.3.3([email protected])(svelte@5.28.2)
4615
 
4616
4617
 
@@ -4728,15 +4716,15 @@ snapshots:
4728
  dependencies:
4729
  queue-microtask: 1.2.3
4730
 
4731
- [email protected](svelte@5.28.2):
4732
  dependencies:
4733
  esm-env: 1.2.2
4734
- svelte: 5.28.2
4735
 
4736
- [email protected](svelte@5.28.2):
4737
  dependencies:
4738
  esm-env: 1.2.2
4739
- svelte: 5.28.2
4740
 
4741
4742
  dependencies:
@@ -4840,19 +4828,19 @@ snapshots:
4840
 
4841
4842
 
4843
4844
  dependencies:
4845
  '@jridgewell/trace-mapping': 0.3.25
4846
  chokidar: 4.0.3
4847
  fdir: 6.4.3([email protected])
4848
  picocolors: 1.1.1
4849
  sade: 1.8.1
4850
- svelte: 5.28.2
4851
  typescript: 5.8.2
4852
  transitivePeerDependencies:
4853
  - picomatch
4854
 
4855
- svelte-eslint-parser@1.1.0(svelte@5.28.2):
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([email protected])
4862
  postcss-selector-parser: 7.1.0
4863
  optionalDependencies:
4864
- svelte: 5.28.2
4865
 
4866
- svelte@5.28.2:
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
- [email protected](svelte@5.28.2):
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.28.2
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([email protected]([email protected]))(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/[email protected](@sveltejs/[email protected](svelte@5.30.1)([email protected](@types/[email protected])([email protected])))(svelte@5.30.1)([email protected](@types/[email protected])([email protected])))
60
  '@sveltejs/adapter-node':
61
  specifier: ^5.2.0
62
+ version: 5.2.12(@sveltejs/[email protected](@sveltejs/[email protected](svelte@5.30.1)([email protected](@types/[email protected])([email protected])))(svelte@5.30.1)([email protected](@types/[email protected])([email protected])))
63
  '@sveltejs/kit':
64
  specifier: ^2.5.27
65
+ version: 2.18.0(@sveltejs/[email protected](svelte@5.30.1)([email protected](@types/[email protected])([email protected])))(svelte@5.30.1)([email protected](@types/[email protected])([email protected]))
66
  '@sveltejs/vite-plugin-svelte':
67
  specifier: ^4.0.0
68
+ version: 4.0.4(svelte@5.30.1)([email protected](@types/[email protected])([email protected]))
69
  '@tailwindcss/container-queries':
70
  specifier: ^0.1.1
71
  version: 0.1.1([email protected])
 
101
  version: 2.4.2
102
  melt:
103
  specifier: ^0.30.1
104
+ version: 0.30.1(@floating-ui/[email protected])(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([email protected])(svelte@5.30.1)
117
  prettier-plugin-tailwindcss:
118
  specifier: ^0.6.11
119
+ version: 0.6.11(prettier-plugin-svelte@3.4.0([email protected])(svelte@5.30.1))([email protected])
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([email protected])(svelte@5.30.1)([email protected])
132
  tailwind-merge:
133
  specifier: ^3.0.2
134
  version: 3.0.2
 
149
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/[email protected])([email protected])
 
1410
  resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1411
  engines: {node: '>=10'}
1412
 
 
 
 
 
 
 
1413
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
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
 
3329
  dependencies:
3330
  acorn: 8.14.0
3331
 
3332
3333
  dependencies:
3334
+ '@sveltejs/kit': 2.18.0(@sveltejs/[email protected](svelte@5.30.1)([email protected](@types/[email protected])([email protected])))(svelte@5.30.1)([email protected](@types/[email protected])([email protected]))
3335
  import-meta-resolve: 4.1.0
3336
 
3337
3338
  dependencies:
3339
  '@rollup/plugin-commonjs': 28.0.2([email protected])
3340
  '@rollup/plugin-json': 6.1.0([email protected])
3341
  '@rollup/plugin-node-resolve': 16.0.0([email protected])
3342
+ '@sveltejs/kit': 2.18.0(@sveltejs/[email protected](svelte@5.30.1)([email protected](@types/[email protected])([email protected])))(svelte@5.30.1)([email protected](@types/[email protected])([email protected]))
3343
  rollup: 4.34.9
3344
 
3345
3346
  dependencies:
3347
+ '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.30.1)([email protected](@types/[email protected])([email protected]))
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/[email protected])([email protected])
3361
 
3362
3363
  dependencies:
3364
+ '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.30.1)([email protected](@types/[email protected])([email protected]))
3365
  debug: 4.4.0
3366
+ svelte: 5.30.1
3367
  vite: 5.4.14(@types/[email protected])([email protected])
3368
  transitivePeerDependencies:
3369
  - supports-color
3370
 
3371
3372
  dependencies:
3373
+ '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/[email protected](svelte@5.30.1)([email protected](@types/[email protected])([email protected])))(svelte@5.30.1)([email protected](@types/[email protected])([email protected]))
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/[email protected])([email protected])
3380
3381
  transitivePeerDependencies:
 
3846
 
3847
3848
 
 
 
 
 
 
3849
3850
  dependencies:
3851
  eslint: 9.22.0([email protected])
 
3859
  optionalDependencies:
3860
  eslint-config-prettier: 10.1.1([email protected]([email protected]))
3861
 
3862
+ eslint-plugin-svelte@3.6.0([email protected]([email protected]))(svelte@5.30.1):
3863
  dependencies:
3864
  '@eslint-community/eslint-utils': 4.4.1([email protected]([email protected]))
3865
  '@jridgewell/sourcemap-codec': 1.5.0
3866
  eslint: 9.22.0([email protected])
 
3867
  esutils: 2.0.3
3868
+ known-css-properties: 0.36.0
3869
  postcss: 8.5.3
3870
  postcss-load-config: 3.1.4([email protected])
3871
  postcss-safe-parser: 7.0.1([email protected])
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
4248
 
4249
+ known-css-properties@0.36.0: {}
4250
 
4251
4252
 
 
4347
  unist-util-visit: 5.0.0
4348
  vfile: 6.0.3
4349
 
4350
+ [email protected](@floating-ui/[email protected])(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
4360
 
 
4590
  dependencies:
4591
  fast-diff: 1.3.0
4592
 
4593
+ prettier-plugin-svelte@3.4.0([email protected])(svelte@5.30.1):
4594
  dependencies:
4595
  prettier: 3.5.3
4596
+ svelte: 5.30.1
4597
 
4598
+ [email protected](prettier-plugin-svelte@3.4.0([email protected])(svelte@5.30.1))([email protected]):
4599
  dependencies:
4600
  prettier: 3.5.3
4601
  optionalDependencies:
4602
+ prettier-plugin-svelte: 3.4.0([email protected])(svelte@5.30.1)
4603
 
4604
4605
 
 
4716
  dependencies:
4717
  queue-microtask: 1.2.3
4718
 
4719
+ [email protected](svelte@5.30.1):
4720
  dependencies:
4721
  esm-env: 1.2.2
4722
+ svelte: 5.30.1
4723
 
4724
+ [email protected](svelte@5.30.1):
4725
  dependencies:
4726
  esm-env: 1.2.2
4727
+ svelte: 5.30.1
4728
 
4729
4730
  dependencies:
 
4828
 
4829
4830
 
4831
4832
  dependencies:
4833
  '@jridgewell/trace-mapping': 0.3.25
4834
  chokidar: 4.0.3
4835
  fdir: 6.4.3([email protected])
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([email protected])
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
+ [email protected](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 type { Action } from "svelte/action";
 
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 const observe: Action<HTMLElement, ObserveArgs> = (node, args) => {
76
- let resizeObserver: ResizeObserver;
77
-
78
- function setVars(name: ObservedElements) {
79
- // 1. Standard rect (includes transforms)
80
- const rect = node.getBoundingClientRect();
81
- document.documentElement.style.setProperty(`--${name}-width`, `${rect.width}px`);
82
- document.documentElement.style.setProperty(`--${name}-height`, `${rect.height}px`);
83
- document.documentElement.style.setProperty(`--${name}-top`, `${rect.top}px`);
84
- document.documentElement.style.setProperty(`--${name}-left`, `${rect.left}px`);
85
- document.documentElement.style.setProperty(`--${name}-right`, `${rect.right}px`);
86
- document.documentElement.style.setProperty(`--${name}-bottom`, `${rect.bottom}px`);
87
-
88
- // 2. Offset position (ignores transforms)
89
- const offset = getOffsetPosition(node);
90
- document.documentElement.style.setProperty(`--${name}-width-offset`, `${offset.width}px`);
91
- document.documentElement.style.setProperty(`--${name}-height-offset`, `${offset.height}px`);
92
- document.documentElement.style.setProperty(`--${name}-top-offset`, `${offset.top}px`);
93
- document.documentElement.style.setProperty(`--${name}-left-offset`, `${offset.left}px`);
94
- document.documentElement.style.setProperty(`--${name}-right-offset`, `${offset.right}px`);
95
- document.documentElement.style.setProperty(`--${name}-bottom-offset`, `${offset.bottom}px`);
96
-
97
- observed[name] = {
98
- rect,
99
- offset,
100
- };
101
- }
102
 
103
- function update(args: ObserveArgs) {
104
- if (resizeObserver) {
105
- resizeObserver.disconnect();
106
  }
107
 
108
- resizeObserver = new ResizeObserver(() => {
 
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
- function onWindowChange() {
121
- setVars(args.name);
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
- return {
133
- update,
134
- destroy,
 
 
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/actions/click-outside.js";
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 class="relative w-xl rounded-xl bg-white shadow-sm dark:bg-gray-900" use:clickOutside={() => onClose?.()}>
 
 
 
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/actions/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,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
- use:clickOutside={() => (popover.open = false)}
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/actions/autofocus.js";
24
- import { clickOutside } from "$lib/actions/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,7 +140,7 @@
140
  <!-- Content -->
141
  <form
142
  class="relative w-xl rounded-xl bg-white shadow-sm dark:bg-gray-900"
143
- use:clickOutside={() => close()}
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/actions/click-outside.js";
6
  import { createEventDispatcher, onDestroy, onMount } from "svelte";
7
 
8
  import IconCross from "~icons/carbon/close";
9
- import { autofocus } from "$lib/actions/autofocus.js";
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
- use: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,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/actions/click-outside.js";
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
- use:clickOutside={() => (img = undefined)}
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/actions/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,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/actions/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,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/actions/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,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
- use:observe={{ name: isLast ? ObservedElements.TokenCountEnd : ObservedElements.TokenCountStart }}
174
- >{tokens} tokens · Latency {latency}ms</span
 
 
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
- use:observe={{ name: ObservedElements.BottomActions }}
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/actions/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,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
- function float(node: HTMLElement) {
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
- destroy: autoUpdate(triggerEl, node, compute),
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
- use:float
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/actions/autofocus.js";
3
- import { clickOutside } from "$lib/actions/click-outside.js";
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
- use: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,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/actions/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,7 +41,7 @@
41
  <!-- Content -->
42
  <div
43
  class="relative w-lg rounded-xl bg-white shadow-sm dark:bg-gray-900"
44
- use: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">
 
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/actions/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,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
- use: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">
 
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">