Error handling (#64)
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .eslintignore +0 -13
- .eslintrc.cjs +0 -41
- eslint-rules/enforce-extensions.js +171 -0
- eslint.config.mts +99 -0
- package.json +25 -18
- pnpm-lock.yaml +569 -718
- src/lib/actions/autofocus.ts +7 -0
- src/lib/components/DebugMenu.svelte +0 -81
- src/lib/components/InferencePlayground/InferencePlaygroundModelSelectorModal.svelte +0 -175
- src/lib/components/{Avatar.svelte β avatar.svelte} +7 -3
- src/lib/components/debug-menu.svelte +123 -0
- src/lib/components/{Icons/IconProvider.svelte β icon-provider.svelte} +8 -5
- src/lib/components/{InferencePlayground/InferencePlaygroundCodeSnippets.svelte β inference-playground/code-snippets.svelte} +57 -55
- src/lib/components/{InferencePlayground/InferencePlaygroundConversationHeader.svelte β inference-playground/conversation-header.svelte} +19 -19
- src/lib/components/{InferencePlayground/InferencePlaygroundConversation.svelte β inference-playground/conversation.svelte} +32 -47
- src/lib/components/{InferencePlayground/generationConfigSettings.ts β inference-playground/generation-config-settings.ts} +0 -0
- src/lib/components/{InferencePlayground/InferencePlaygroundGenerationConfig.svelte β inference-playground/generation-config.svelte} +13 -7
- src/lib/components/{InferencePlayground/InferencePlaygroundHFTokenModal.svelte β inference-playground/hf-token-modal.svelte} +16 -9
- src/lib/components/{InferencePlayground/InferencePlaygroundMessage.svelte β inference-playground/message.svelte} +25 -18
- src/lib/components/inference-playground/model-selector-modal.svelte +165 -0
- src/lib/components/{InferencePlayground/InferencePlaygroundModelSelector.svelte β inference-playground/model-selector.svelte} +18 -18
- src/lib/components/{InferencePlayground/InferencePlayground.svelte β inference-playground/playground.svelte} +134 -137
- src/lib/components/{InferencePlayground/InferencePlaygroundProjectSelect.svelte β inference-playground/project-select.svelte} +28 -27
- src/lib/components/{InferencePlayground/InferencePlaygroundProviderSelect.svelte β inference-playground/provider-select.svelte} +26 -23
- src/lib/components/{InferencePlayground/inferencePlaygroundUtils.ts β inference-playground/utils.ts} +1 -2
- src/lib/components/label-pro.svelte +23 -0
- src/lib/components/{Prompts.svelte β prompts.svelte} +22 -24
- src/lib/components/quota-modal.svelte +106 -0
- src/lib/components/toaster.svelte +171 -0
- src/lib/components/toaster.svelte.ts +39 -0
- src/lib/spells/README.md +3 -0
- src/lib/spells/abort-manager.svelte.ts +34 -0
- src/lib/spells/create-init.svelte.ts +14 -0
- src/lib/spells/extract.svelte.ts +21 -0
- src/lib/spells/textarea-autosize.svelte.ts +67 -0
- src/lib/state/models.svelte.ts +10 -0
- src/lib/{stores/session.ts β state/session.svelte.ts} +66 -99
- src/lib/state/token.svelte.ts +35 -0
- src/lib/stores/models.ts +0 -8
- src/lib/stores/mounted.ts +0 -9
- src/lib/stores/token.ts +0 -31
- src/lib/types.ts +9 -3
- src/lib/utils/compare.ts +3 -0
- src/lib/utils/effect.ts +0 -51
- src/lib/utils/is.ts +37 -0
- src/lib/utils/model.ts +0 -5
- src/lib/utils/object.ts +20 -0
- src/routes/+layout.svelte +10 -3
- src/routes/+page.svelte +2 -2
- src/routes/+page.ts +2 -2
.eslintignore
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
.DS_Store
|
2 |
-
node_modules
|
3 |
-
/build
|
4 |
-
/.svelte-kit
|
5 |
-
/package
|
6 |
-
.env
|
7 |
-
.env.*
|
8 |
-
!.env.example
|
9 |
-
|
10 |
-
# Ignore files for PNPM, NPM and YARN
|
11 |
-
pnpm-lock.yaml
|
12 |
-
package-lock.json
|
13 |
-
yarn.lock
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.eslintrc.cjs
DELETED
@@ -1,41 +0,0 @@
|
|
1 |
-
module.exports = {
|
2 |
-
root: true,
|
3 |
-
parser: "@typescript-eslint/parser",
|
4 |
-
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:svelte/recommended", "prettier"],
|
5 |
-
plugins: ["@typescript-eslint"],
|
6 |
-
ignorePatterns: ["*.cjs"],
|
7 |
-
overrides: [
|
8 |
-
{
|
9 |
-
files: ["*.svelte"],
|
10 |
-
parser: "svelte-eslint-parser",
|
11 |
-
parserOptions: {
|
12 |
-
parser: "@typescript-eslint/parser",
|
13 |
-
},
|
14 |
-
},
|
15 |
-
],
|
16 |
-
parserOptions: {
|
17 |
-
sourceType: "module",
|
18 |
-
ecmaVersion: 2020,
|
19 |
-
extraFileExtensions: [".svelte"],
|
20 |
-
project: "./tsconfig.json",
|
21 |
-
},
|
22 |
-
rules: {
|
23 |
-
"require-yield": "off",
|
24 |
-
"@typescript-eslint/no-explicit-any": "error",
|
25 |
-
"@typescript-eslint/no-non-null-assertion": "error",
|
26 |
-
"@typescript-eslint/no-unused-vars": [
|
27 |
-
// prevent variables with a _ prefix from being marked as unused
|
28 |
-
"error",
|
29 |
-
{
|
30 |
-
argsIgnorePattern: "^_",
|
31 |
-
},
|
32 |
-
],
|
33 |
-
"object-shorthand": ["error", "always"],
|
34 |
-
"svelte/no-at-html-tags": "off",
|
35 |
-
},
|
36 |
-
env: {
|
37 |
-
browser: true,
|
38 |
-
es2017: true,
|
39 |
-
node: true,
|
40 |
-
},
|
41 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
eslint-rules/enforce-extensions.js
ADDED
@@ -0,0 +1,171 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import fs from "fs";
|
2 |
+
import path from "path";
|
3 |
+
|
4 |
+
export default {
|
5 |
+
meta: {
|
6 |
+
type: "suggestion",
|
7 |
+
docs: {
|
8 |
+
description: "Enforce file extensions in import statements",
|
9 |
+
},
|
10 |
+
fixable: "code",
|
11 |
+
schema: [
|
12 |
+
{
|
13 |
+
type: "object",
|
14 |
+
properties: {
|
15 |
+
ignorePaths: {
|
16 |
+
type: "array",
|
17 |
+
items: { type: "string" },
|
18 |
+
},
|
19 |
+
includePaths: {
|
20 |
+
type: "array",
|
21 |
+
items: { type: "string" },
|
22 |
+
description: "Path patterns to include (e.g., '$lib/')",
|
23 |
+
},
|
24 |
+
tsToJs: {
|
25 |
+
type: "boolean",
|
26 |
+
description: "Convert .ts files to .js when importing",
|
27 |
+
},
|
28 |
+
aliases: {
|
29 |
+
type: "object",
|
30 |
+
description: "Map of path aliases to their actual paths (e.g., {'$lib': 'src/lib'})",
|
31 |
+
},
|
32 |
+
},
|
33 |
+
additionalProperties: false,
|
34 |
+
},
|
35 |
+
],
|
36 |
+
messages: {
|
37 |
+
missingExtension: "Import should include a file extension",
|
38 |
+
noFileFound: "Import is missing extension and no matching file was found",
|
39 |
+
},
|
40 |
+
},
|
41 |
+
create(context) {
|
42 |
+
const options = context.options[0] || {};
|
43 |
+
const ignorePaths = options.ignorePaths || [];
|
44 |
+
const includePaths = options.includePaths || [];
|
45 |
+
const tsToJs = options.tsToJs !== undefined ? options.tsToJs : true; // Default to true
|
46 |
+
const aliases = options.aliases || {};
|
47 |
+
|
48 |
+
// Get the project root directory
|
49 |
+
const projectRoot = process.cwd();
|
50 |
+
|
51 |
+
// Utility function to resolve file paths
|
52 |
+
function resolveImportPath(importPath, currentFilePath) {
|
53 |
+
// Handle relative paths
|
54 |
+
if (importPath.startsWith("./") || importPath.startsWith("../")) {
|
55 |
+
return path.resolve(path.dirname(currentFilePath), importPath);
|
56 |
+
}
|
57 |
+
|
58 |
+
// Handle aliased paths
|
59 |
+
for (const [alias, aliasPath] of Object.entries(aliases)) {
|
60 |
+
// Check if the import starts with this alias
|
61 |
+
if (importPath === alias || importPath.startsWith(`${alias}/`)) {
|
62 |
+
// Replace the alias with the actual path
|
63 |
+
const relativePath = importPath === alias ? "" : importPath.slice(alias.length + 1); // +1 for the slash
|
64 |
+
|
65 |
+
// Convert the aliasPath to an absolute path
|
66 |
+
let absoluteAliasPath = aliasPath;
|
67 |
+
if (!path.isAbsolute(absoluteAliasPath)) {
|
68 |
+
absoluteAliasPath = path.resolve(projectRoot, aliasPath);
|
69 |
+
}
|
70 |
+
|
71 |
+
return path.join(absoluteAliasPath, relativePath);
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
return null;
|
76 |
+
}
|
77 |
+
|
78 |
+
// Find the file extension by checking which file exists
|
79 |
+
function findActualFile(basePath) {
|
80 |
+
if (!basePath) return null;
|
81 |
+
|
82 |
+
try {
|
83 |
+
// Get the directory and base name
|
84 |
+
const dir = path.dirname(basePath);
|
85 |
+
const base = path.basename(basePath);
|
86 |
+
|
87 |
+
// If the directory doesn't exist, return early
|
88 |
+
if (!fs.existsSync(dir)) {
|
89 |
+
return null;
|
90 |
+
}
|
91 |
+
|
92 |
+
// Read all files in the directory
|
93 |
+
const files = fs.readdirSync(dir);
|
94 |
+
|
95 |
+
// Look for files that match our base name plus any extension
|
96 |
+
for (const file of files) {
|
97 |
+
const fileParts = path.parse(file);
|
98 |
+
|
99 |
+
// If we find a file that matches our base name
|
100 |
+
if (fileParts.name === base) {
|
101 |
+
// Handle TypeScript to JavaScript conversion
|
102 |
+
if (tsToJs && fileParts.ext === ".ts") {
|
103 |
+
return {
|
104 |
+
actualPath: path.join(dir, file),
|
105 |
+
importExt: ".js", // Import as .js even though it's a .ts file
|
106 |
+
};
|
107 |
+
}
|
108 |
+
|
109 |
+
// Otherwise use the actual extension
|
110 |
+
return {
|
111 |
+
actualPath: path.join(dir, file),
|
112 |
+
importExt: fileParts.ext,
|
113 |
+
};
|
114 |
+
}
|
115 |
+
}
|
116 |
+
} catch (error) {
|
117 |
+
// If there's an error checking file existence, return null
|
118 |
+
console.error("Error checking files:", error);
|
119 |
+
}
|
120 |
+
|
121 |
+
return null;
|
122 |
+
}
|
123 |
+
|
124 |
+
return {
|
125 |
+
ImportDeclaration(node) {
|
126 |
+
const source = node.source.value;
|
127 |
+
|
128 |
+
// Check if it's a relative import or matches a manually specified include path
|
129 |
+
const isRelativeImport = source.startsWith("./") || source.startsWith("../");
|
130 |
+
const isAliasedPath = Object.keys(aliases).some(alias => source === alias || source.startsWith(`${alias}/`));
|
131 |
+
const isIncludedPath = includePaths.some(pattern => source.startsWith(pattern));
|
132 |
+
|
133 |
+
// Skip if it's not a relative import, aliased path, or included path
|
134 |
+
if (!isRelativeImport && !isAliasedPath && !isIncludedPath) {
|
135 |
+
return;
|
136 |
+
}
|
137 |
+
|
138 |
+
// Skip ignored paths
|
139 |
+
if (ignorePaths.some(path => source.includes(path))) {
|
140 |
+
return;
|
141 |
+
}
|
142 |
+
|
143 |
+
// Check if the import already has an extension
|
144 |
+
const hasExtension = path.extname(source) !== "";
|
145 |
+
if (!hasExtension) {
|
146 |
+
// Get current file path to resolve the import
|
147 |
+
const currentFilePath = context.getFilename();
|
148 |
+
|
149 |
+
// Try to determine the correct file by checking what exists
|
150 |
+
const resolvedPath = resolveImportPath(source, currentFilePath);
|
151 |
+
const fileInfo = findActualFile(resolvedPath);
|
152 |
+
|
153 |
+
context.report({
|
154 |
+
node,
|
155 |
+
messageId: fileInfo ? "missingExtension" : "noFileFound",
|
156 |
+
fix(fixer) {
|
157 |
+
// Only provide a fix if we found a file
|
158 |
+
if (fileInfo) {
|
159 |
+
// Replace the string literal with one that includes the extension
|
160 |
+
return fixer.replaceText(node.source, `"${source}${fileInfo.importExt}"`);
|
161 |
+
}
|
162 |
+
|
163 |
+
// Otherwise, don't try to fix
|
164 |
+
return null;
|
165 |
+
},
|
166 |
+
});
|
167 |
+
}
|
168 |
+
},
|
169 |
+
};
|
170 |
+
},
|
171 |
+
};
|
eslint.config.mts
ADDED
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import js from "@eslint/js";
|
2 |
+
import svelte from "eslint-plugin-svelte";
|
3 |
+
import globals from "globals";
|
4 |
+
import ts from "typescript-eslint";
|
5 |
+
import svelteConfig from "./svelte.config.js";
|
6 |
+
import enforceExt from "./eslint-rules/enforce-extensions.js";
|
7 |
+
import prettier from "eslint-plugin-prettier/recommended";
|
8 |
+
|
9 |
+
export default ts.config(
|
10 |
+
js.configs.recommended,
|
11 |
+
ts.configs.recommended,
|
12 |
+
...svelte.configs.recommended,
|
13 |
+
prettier,
|
14 |
+
// Configure svelte
|
15 |
+
{
|
16 |
+
files: ["**/*.svelte", "**/*.svelte.ts", "**/*.svelte.js"],
|
17 |
+
// See more details at: https://typescript-eslint.io/packages/parser/
|
18 |
+
languageOptions: {
|
19 |
+
parserOptions: {
|
20 |
+
projectService: true,
|
21 |
+
extraFileExtensions: [".svelte"], // Add support for additional file extensions, such as .svelte
|
22 |
+
parser: ts.parser,
|
23 |
+
// Specify a parser for each language, if needed:
|
24 |
+
// parser: {
|
25 |
+
// ts: ts.parser,
|
26 |
+
// js: espree, // Use espree for .js files (add: import espree from 'espree')
|
27 |
+
// typescript: ts.parser
|
28 |
+
// },
|
29 |
+
|
30 |
+
// We recommend importing and specifying svelte.config.js.
|
31 |
+
// By doing so, some rules in eslint-plugin-svelte will automatically read the configuration and adjust their behavior accordingly.
|
32 |
+
// While certain Svelte settings may be statically loaded from svelte.config.js even if you donβt specify it,
|
33 |
+
// explicitly specifying it ensures better compatibility and functionality.
|
34 |
+
svelteConfig,
|
35 |
+
},
|
36 |
+
},
|
37 |
+
},
|
38 |
+
{
|
39 |
+
plugins: {
|
40 |
+
local: {
|
41 |
+
rules: {
|
42 |
+
"enforce-ext": enforceExt,
|
43 |
+
},
|
44 |
+
},
|
45 |
+
},
|
46 |
+
},
|
47 |
+
{
|
48 |
+
rules: {
|
49 |
+
"require-yield": "off",
|
50 |
+
"@typescript-eslint/no-explicit-any": "error",
|
51 |
+
"@typescript-eslint/no-unused-expressions": "off",
|
52 |
+
// "@typescript-eslint/no-non-null-assertion": "error",
|
53 |
+
|
54 |
+
"@typescript-eslint/no-unused-vars": [
|
55 |
+
"error",
|
56 |
+
{
|
57 |
+
argsIgnorePattern: "^_",
|
58 |
+
},
|
59 |
+
],
|
60 |
+
|
61 |
+
"object-shorthand": ["error", "always"],
|
62 |
+
"svelte/no-at-html-tags": "off",
|
63 |
+
"svelte/require-each-key": "off",
|
64 |
+
"local/enforce-ext": [
|
65 |
+
"error",
|
66 |
+
{
|
67 |
+
includePaths: ["$lib/"],
|
68 |
+
aliases: {
|
69 |
+
$lib: "src/lib",
|
70 |
+
},
|
71 |
+
},
|
72 |
+
],
|
73 |
+
},
|
74 |
+
},
|
75 |
+
{
|
76 |
+
ignores: [
|
77 |
+
"**/*.cjs",
|
78 |
+
"**/.DS_Store",
|
79 |
+
"**/node_modules",
|
80 |
+
"build",
|
81 |
+
".svelte-kit",
|
82 |
+
"package",
|
83 |
+
"**/.env",
|
84 |
+
"**/.env.*",
|
85 |
+
"!**/.env.example",
|
86 |
+
"**/pnpm-lock.yaml",
|
87 |
+
"**/package-lock.json",
|
88 |
+
"**/yarn.lock",
|
89 |
+
],
|
90 |
+
},
|
91 |
+
{
|
92 |
+
languageOptions: {
|
93 |
+
globals: {
|
94 |
+
...globals.browser,
|
95 |
+
...globals.node,
|
96 |
+
},
|
97 |
+
},
|
98 |
+
}
|
99 |
+
);
|
package.json
CHANGED
@@ -9,46 +9,53 @@
|
|
9 |
"prepare": "ts-patch install && svelte-kit sync || echo ''",
|
10 |
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
11 |
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
12 |
-
"lint": "prettier . --check . && eslint
|
13 |
-
"format": "prettier . --write ."
|
|
|
14 |
},
|
15 |
"devDependencies": {
|
|
|
|
|
|
|
|
|
|
|
16 |
"@iconify-json/carbon": "^1.2.8",
|
|
|
17 |
"@ryoppippi/unplugin-typia": "^1.0.0",
|
18 |
"@samchon/openapi": "^3.0.0",
|
19 |
"@sveltejs/adapter-auto": "^3.2.2",
|
20 |
"@sveltejs/adapter-node": "^5.2.0",
|
21 |
-
"@sveltejs/kit": "^2.
|
22 |
-
"@sveltejs/vite-plugin-svelte": "^
|
|
|
23 |
"@tailwindcss/postcss": "^4.0.9",
|
24 |
-
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
25 |
-
"@typescript-eslint/parser": "^6.21.0",
|
26 |
"clsx": "^2.1.1",
|
27 |
-
"eslint": "^
|
28 |
-
"eslint-config-prettier": "^
|
29 |
-
"eslint-plugin-
|
|
|
30 |
"highlight.js": "^11.10.0",
|
|
|
|
|
31 |
"postcss": "^8.4.38",
|
32 |
"prettier": "^3.1.1",
|
33 |
-
"prettier-plugin-svelte": "^3.
|
34 |
"prettier-plugin-tailwindcss": "^0.6.11",
|
35 |
-
"
|
36 |
-
"svelte
|
|
|
37 |
"tailwind-merge": "^3.0.2",
|
38 |
"tailwindcss": "^4.0.9",
|
39 |
"ts-patch": "^3.3.0",
|
40 |
"tslib": "^2.4.1",
|
41 |
"typescript": "^5.8.2",
|
|
|
42 |
"unplugin-icons": "^22.1.0",
|
43 |
-
"vite": "^5.
|
44 |
},
|
45 |
"type": "module",
|
46 |
"dependencies": {
|
47 |
-
"
|
48 |
-
"@huggingface/inference": "^3.5.1",
|
49 |
-
"@huggingface/tasks": "^0.17.1",
|
50 |
-
"@melt-ui/svelte": "^0.86.3",
|
51 |
-
"@tailwindcss/container-queries": "^0.1.1",
|
52 |
"typia": "^8.0.0"
|
53 |
}
|
54 |
}
|
|
|
9 |
"prepare": "ts-patch install && svelte-kit sync || echo ''",
|
10 |
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
|
11 |
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
|
12 |
+
"lint": "prettier . --check . && eslint src/",
|
13 |
+
"format": "prettier . --write .",
|
14 |
+
"clean": "rm -rf ./node_modules/ && rm -rf ./.svelte-kit/ && ni && echo 'Project cleaned!'"
|
15 |
},
|
16 |
"devDependencies": {
|
17 |
+
"@eslint/eslintrc": "^3.3.0",
|
18 |
+
"@eslint/js": "^9.22.0",
|
19 |
+
"@huggingface/hub": "^1.0.1",
|
20 |
+
"@huggingface/inference": "^3.5.1",
|
21 |
+
"@huggingface/tasks": "^0.17.1",
|
22 |
"@iconify-json/carbon": "^1.2.8",
|
23 |
+
"@iconify-json/material-symbols": "^1.2.15",
|
24 |
"@ryoppippi/unplugin-typia": "^1.0.0",
|
25 |
"@samchon/openapi": "^3.0.0",
|
26 |
"@sveltejs/adapter-auto": "^3.2.2",
|
27 |
"@sveltejs/adapter-node": "^5.2.0",
|
28 |
+
"@sveltejs/kit": "^2.5.27",
|
29 |
+
"@sveltejs/vite-plugin-svelte": "^4.0.0",
|
30 |
+
"@tailwindcss/container-queries": "^0.1.1",
|
31 |
"@tailwindcss/postcss": "^4.0.9",
|
|
|
|
|
32 |
"clsx": "^2.1.1",
|
33 |
+
"eslint": "^9.22.0",
|
34 |
+
"eslint-config-prettier": "^10.1.1",
|
35 |
+
"eslint-plugin-prettier": "^5.2.3",
|
36 |
+
"globals": "^16.0.0",
|
37 |
"highlight.js": "^11.10.0",
|
38 |
+
"jiti": "^2.4.2",
|
39 |
+
"melt": "^0.18.4",
|
40 |
"postcss": "^8.4.38",
|
41 |
"prettier": "^3.1.1",
|
42 |
+
"prettier-plugin-svelte": "^3.2.6",
|
43 |
"prettier-plugin-tailwindcss": "^0.6.11",
|
44 |
+
"runed": "^0.24.0",
|
45 |
+
"svelte": "^5.20.4",
|
46 |
+
"svelte-check": "^4.0.0",
|
47 |
"tailwind-merge": "^3.0.2",
|
48 |
"tailwindcss": "^4.0.9",
|
49 |
"ts-patch": "^3.3.0",
|
50 |
"tslib": "^2.4.1",
|
51 |
"typescript": "^5.8.2",
|
52 |
+
"typescript-eslint": "^8.26.1",
|
53 |
"unplugin-icons": "^22.1.0",
|
54 |
+
"vite": "^5.4.4"
|
55 |
},
|
56 |
"type": "module",
|
57 |
"dependencies": {
|
58 |
+
"eslint-plugin-svelte": "^3.3.1",
|
|
|
|
|
|
|
|
|
59 |
"typia": "^8.0.0"
|
60 |
}
|
61 |
}
|
pnpm-lock.yaml
CHANGED
@@ -8,6 +8,19 @@ importers:
|
|
8 |
|
9 |
.:
|
10 |
dependencies:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
'@huggingface/hub':
|
12 |
specifier: ^1.0.1
|
13 |
version: 1.0.1
|
@@ -17,19 +30,12 @@ importers:
|
|
17 |
'@huggingface/tasks':
|
18 |
specifier: ^0.17.1
|
19 |
version: 0.17.1
|
20 |
-
'@melt-ui/svelte':
|
21 |
-
specifier: ^0.86.3
|
22 |
-
version: 0.86.3(svelte@4.2.19)
|
23 |
-
'@tailwindcss/container-queries':
|
24 |
-
specifier: ^0.1.1
|
25 |
-
version: 0.1.1(tailwindcss@4.0.9)
|
26 |
-
typia:
|
27 |
-
specifier: ^8.0.0
|
28 |
-
version: 8.0.0(@samchon/openapi@3.0.0)(typescript@5.8.2)
|
29 |
-
devDependencies:
|
30 |
'@iconify-json/carbon':
|
31 |
specifier: ^1.2.8
|
32 |
version: 1.2.8
|
|
|
|
|
|
|
33 |
'@ryoppippi/unplugin-typia':
|
34 |
specifier: ^1.0.0
|
35 |
version: 1.2.0(@samchon/openapi@3.0.0)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.34.9)(yaml@2.7.0)
|
@@ -38,40 +44,46 @@ importers:
|
|
38 |
version: 3.0.0
|
39 |
'@sveltejs/adapter-auto':
|
40 |
specifier: ^3.2.2
|
41 |
-
version: 3.3.1(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@
|
42 |
'@sveltejs/adapter-node':
|
43 |
specifier: ^5.2.0
|
44 |
-
version: 5.2.12(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@
|
45 |
'@sveltejs/kit':
|
46 |
-
specifier: ^2.
|
47 |
-
version: 2.18.0(@sveltejs/vite-plugin-svelte@
|
48 |
'@sveltejs/vite-plugin-svelte':
|
49 |
-
specifier: ^
|
50 |
-
version:
|
|
|
|
|
|
|
51 |
'@tailwindcss/postcss':
|
52 |
specifier: ^4.0.9
|
53 |
version: 4.0.9
|
54 |
-
'@typescript-eslint/eslint-plugin':
|
55 |
-
specifier: ^6.21.0
|
56 |
-
version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)
|
57 |
-
'@typescript-eslint/parser':
|
58 |
-
specifier: ^6.21.0
|
59 |
-
version: 6.21.0(eslint@8.57.1)(typescript@5.8.2)
|
60 |
clsx:
|
61 |
specifier: ^2.1.1
|
62 |
version: 2.1.1
|
63 |
eslint:
|
64 |
-
specifier: ^
|
65 |
-
version:
|
66 |
eslint-config-prettier:
|
67 |
-
specifier: ^
|
68 |
-
version:
|
69 |
-
eslint-plugin-
|
70 |
-
specifier: ^2.
|
71 |
-
version: 2.
|
|
|
|
|
|
|
72 |
highlight.js:
|
73 |
specifier: ^11.10.0
|
74 |
version: 11.11.1
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
postcss:
|
76 |
specifier: ^8.4.38
|
77 |
version: 8.5.3
|
@@ -79,17 +91,20 @@ importers:
|
|
79 |
specifier: ^3.1.1
|
80 |
version: 3.5.3
|
81 |
prettier-plugin-svelte:
|
82 |
-
specifier: ^3.
|
83 |
-
version: 3.3.3(prettier@3.5.3)(svelte@
|
84 |
prettier-plugin-tailwindcss:
|
85 |
specifier: ^0.6.11
|
86 |
-
version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@
|
|
|
|
|
|
|
87 |
svelte:
|
88 |
-
specifier: ^
|
89 |
-
version:
|
90 |
svelte-check:
|
91 |
-
specifier: ^
|
92 |
-
version:
|
93 |
tailwind-merge:
|
94 |
specifier: ^3.0.2
|
95 |
version: 3.0.2
|
@@ -105,11 +120,14 @@ importers:
|
|
105 |
typescript:
|
106 |
specifier: ^5.8.2
|
107 |
version: 5.8.2
|
|
|
|
|
|
|
108 |
unplugin-icons:
|
109 |
specifier: ^22.1.0
|
110 |
-
version: 22.1.0(svelte@
|
111 |
vite:
|
112 |
-
specifier: ^5.
|
113 |
version: 5.4.14(lightningcss@1.29.1)
|
114 |
|
115 |
packages:
|
@@ -426,13 +444,33 @@ packages:
|
|
426 |
resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
|
427 |
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
|
428 |
|
429 |
-
'@eslint/
|
430 |
-
resolution: {integrity: sha512-
|
431 |
-
engines: {node: ^
|
432 |
|
433 |
-
'@eslint/
|
434 |
-
resolution: {integrity: sha512-
|
435 |
-
engines: {node: ^
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
436 |
|
437 |
'@floating-ui/core@1.6.9':
|
438 |
resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
|
@@ -457,30 +495,41 @@ packages:
|
|
457 |
'@huggingface/tasks@0.17.1':
|
458 |
resolution: {integrity: sha512-kN5F/pzwxtmdZ0jORumNyegNKOX/ciU5G/DMZcqK3SJShod4C6yfvBRCMn5sEDzanxtU8VjX+7TaInQFmmU8Nw==}
|
459 |
|
460 |
-
'@
|
461 |
-
resolution: {integrity: sha512-
|
462 |
-
engines: {node: '>=
|
463 |
-
|
|
|
|
|
|
|
464 |
|
465 |
'@humanwhocodes/module-importer@1.0.1':
|
466 |
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
|
467 |
engines: {node: '>=12.22'}
|
468 |
|
469 |
-
'@humanwhocodes/
|
470 |
-
resolution: {integrity: sha512-
|
471 |
-
|
|
|
|
|
|
|
|
|
472 |
|
473 |
'@iconify-json/carbon@1.2.8':
|
474 |
resolution: {integrity: sha512-6xh4YiFBz6qoSnB3XMe23WvjTJroDFXB17J1MbiT7nATFe+70+em1acRXr8hgP/gYpwFMHFc4IvjA/IPTPnTzg==}
|
475 |
|
|
|
|
|
|
|
476 |
'@iconify/types@2.0.0':
|
477 |
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
|
478 |
|
479 |
'@iconify/utils@2.3.0':
|
480 |
resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
|
481 |
|
482 |
-
'@
|
483 |
-
resolution: {integrity: sha512-
|
|
|
484 |
|
485 |
'@jridgewell/gen-mapping@0.3.8':
|
486 |
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
|
@@ -500,11 +549,6 @@ packages:
|
|
500 |
'@jridgewell/trace-mapping@0.3.25':
|
501 |
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
|
502 |
|
503 |
-
'@melt-ui/svelte@0.86.3':
|
504 |
-
resolution: {integrity: sha512-ZsWmHGd6P636mws1CgatlX7JtLkWoUBPXeNzPzvHYgZdagp8io8MPFotDIfRyKwTEQFUqF9fhBks6CWr0Nupuw==}
|
505 |
-
peerDependencies:
|
506 |
-
svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.118
|
507 |
-
|
508 |
'@nodelib/fs.scandir@2.1.5':
|
509 |
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
510 |
engines: {node: '>= 8'}
|
@@ -517,6 +561,10 @@ packages:
|
|
517 |
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
518 |
engines: {node: '>= 8'}
|
519 |
|
|
|
|
|
|
|
|
|
520 |
'@polka/url@1.0.0-next.28':
|
521 |
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
|
522 |
|
@@ -657,6 +705,14 @@ packages:
|
|
657 |
'@samchon/openapi@3.0.0':
|
658 |
resolution: {integrity: sha512-eVQlyKRYv1/C2Mikc1xZr7c0jMjg1vjPkeY/gheKB4c5WOOWyTNZ1uvnXR+ETpPHwaQ54I9NrQZhoNk6BEGuuw==}
|
659 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
660 |
'@sveltejs/adapter-auto@3.3.1':
|
661 |
resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==}
|
662 |
peerDependencies:
|
@@ -676,24 +732,21 @@ packages:
|
|
676 |
svelte: ^4.0.0 || ^5.0.0-next.0
|
677 |
vite: ^5.0.3 || ^6.0.0
|
678 |
|
679 |
-
'@sveltejs/vite-plugin-svelte-inspector@
|
680 |
-
resolution: {integrity: sha512-
|
681 |
-
engines: {node: ^18.0.0 || >=
|
682 |
peerDependencies:
|
683 |
-
'@sveltejs/vite-plugin-svelte': ^
|
684 |
-
svelte: ^
|
685 |
vite: ^5.0.0
|
686 |
|
687 |
-
'@sveltejs/vite-plugin-svelte@
|
688 |
-
resolution: {integrity: sha512-
|
689 |
-
engines: {node: ^18.0.0 || >=
|
690 |
peerDependencies:
|
691 |
-
svelte: ^
|
692 |
vite: ^5.0.0
|
693 |
|
694 |
-
'@swc/helpers@0.5.15':
|
695 |
-
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
|
696 |
-
|
697 |
'@tailwindcss/container-queries@0.1.1':
|
698 |
resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==}
|
699 |
peerDependencies:
|
@@ -784,75 +837,55 @@ packages:
|
|
784 |
'@types/json-schema@7.0.15':
|
785 |
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
|
786 |
|
787 |
-
'@types/pug@2.0.10':
|
788 |
-
resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==}
|
789 |
-
|
790 |
'@types/resolve@1.20.2':
|
791 |
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
|
792 |
|
793 |
-
'@
|
794 |
-
resolution: {integrity: sha512-
|
795 |
-
|
796 |
-
'@typescript-eslint/eslint-plugin@6.21.0':
|
797 |
-
resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
|
798 |
-
engines: {node: ^16.0.0 || >=18.0.0}
|
799 |
peerDependencies:
|
800 |
-
'@typescript-eslint/parser': ^
|
801 |
-
eslint: ^
|
802 |
-
typescript: '
|
803 |
-
peerDependenciesMeta:
|
804 |
-
typescript:
|
805 |
-
optional: true
|
806 |
|
807 |
-
'@typescript-eslint/parser@
|
808 |
-
resolution: {integrity: sha512-
|
809 |
-
engines: {node: ^
|
810 |
peerDependencies:
|
811 |
-
eslint: ^
|
812 |
-
typescript: '
|
813 |
-
peerDependenciesMeta:
|
814 |
-
typescript:
|
815 |
-
optional: true
|
816 |
|
817 |
-
'@typescript-eslint/scope-manager@
|
818 |
-
resolution: {integrity: sha512-
|
819 |
-
engines: {node: ^
|
820 |
|
821 |
-
'@typescript-eslint/type-utils@
|
822 |
-
resolution: {integrity: sha512-
|
823 |
-
engines: {node: ^
|
824 |
peerDependencies:
|
825 |
-
eslint: ^
|
826 |
-
typescript: '
|
827 |
-
peerDependenciesMeta:
|
828 |
-
typescript:
|
829 |
-
optional: true
|
830 |
|
831 |
-
'@typescript-eslint/types@
|
832 |
-
resolution: {integrity: sha512-
|
833 |
-
engines: {node: ^
|
834 |
|
835 |
-
'@typescript-eslint/typescript-estree@
|
836 |
-
resolution: {integrity: sha512-
|
837 |
-
engines: {node: ^
|
838 |
peerDependencies:
|
839 |
-
typescript: '
|
840 |
-
peerDependenciesMeta:
|
841 |
-
typescript:
|
842 |
-
optional: true
|
843 |
|
844 |
-
'@typescript-eslint/utils@
|
845 |
-
resolution: {integrity: sha512-
|
846 |
-
engines: {node: ^
|
847 |
peerDependencies:
|
848 |
-
eslint: ^
|
849 |
-
|
850 |
-
'@typescript-eslint/visitor-keys@6.21.0':
|
851 |
-
resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
|
852 |
-
engines: {node: ^16.0.0 || >=18.0.0}
|
853 |
|
854 |
-
'@
|
855 |
-
resolution: {integrity: sha512-
|
|
|
856 |
|
857 |
acorn-jsx@5.3.2:
|
858 |
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
|
@@ -879,9 +912,9 @@ packages:
|
|
879 |
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
|
880 |
engines: {node: '>=8'}
|
881 |
|
882 |
-
|
883 |
-
resolution: {integrity: sha512-
|
884 |
-
engines: {node: '>=
|
885 |
|
886 |
argparse@2.0.1:
|
887 |
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
@@ -893,9 +926,9 @@ packages:
|
|
893 |
array-timsort@1.0.3:
|
894 |
resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
|
895 |
|
896 |
-
|
897 |
-
resolution: {integrity: sha512-
|
898 |
-
engines: {node: '>=
|
899 |
|
900 |
axobject-query@4.1.0:
|
901 |
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
|
@@ -907,10 +940,6 @@ packages:
|
|
907 |
base64-js@1.5.1:
|
908 |
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
909 |
|
910 |
-
binary-extensions@2.3.0:
|
911 |
-
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
|
912 |
-
engines: {node: '>=8'}
|
913 |
-
|
914 |
bl@4.1.0:
|
915 |
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
|
916 |
|
@@ -924,10 +953,6 @@ packages:
|
|
924 |
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
925 |
engines: {node: '>=8'}
|
926 |
|
927 |
-
buffer-crc32@1.0.0:
|
928 |
-
resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
|
929 |
-
engines: {node: '>=8.0.0'}
|
930 |
-
|
931 |
buffer@5.7.1:
|
932 |
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
|
933 |
|
@@ -942,9 +967,9 @@ packages:
|
|
942 |
chardet@0.7.0:
|
943 |
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
|
944 |
|
945 |
-
chokidar@
|
946 |
-
resolution: {integrity: sha512-
|
947 |
-
engines: {node: '>=
|
948 |
|
949 |
cli-cursor@3.1.0:
|
950 |
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
|
@@ -966,9 +991,6 @@ packages:
|
|
966 |
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
|
967 |
engines: {node: '>=6'}
|
968 |
|
969 |
-
code-red@1.0.4:
|
970 |
-
resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
|
971 |
-
|
972 |
color-convert@2.0.1:
|
973 |
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
974 |
engines: {node: '>=7.0.0'}
|
@@ -1014,10 +1036,6 @@ packages:
|
|
1014 |
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
1015 |
engines: {node: '>= 8'}
|
1016 |
|
1017 |
-
css-tree@2.3.1:
|
1018 |
-
resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
|
1019 |
-
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
|
1020 |
-
|
1021 |
cssesc@3.0.0:
|
1022 |
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
|
1023 |
engines: {node: '>=4'}
|
@@ -1045,14 +1063,6 @@ packages:
|
|
1045 |
defu@6.1.4:
|
1046 |
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
1047 |
|
1048 |
-
dequal@2.0.3:
|
1049 |
-
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
|
1050 |
-
engines: {node: '>=6'}
|
1051 |
-
|
1052 |
-
detect-indent@6.1.0:
|
1053 |
-
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
|
1054 |
-
engines: {node: '>=8'}
|
1055 |
-
|
1056 |
detect-libc@1.0.3:
|
1057 |
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
|
1058 |
engines: {node: '>=0.10'}
|
@@ -1064,13 +1074,9 @@ packages:
|
|
1064 |
diff-match-patch@1.0.5:
|
1065 |
resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==}
|
1066 |
|
1067 |
-
|
1068 |
-
resolution: {integrity: sha512-
|
1069 |
-
engines: {node:
|
1070 |
-
|
1071 |
-
doctrine@3.0.0:
|
1072 |
-
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
|
1073 |
-
engines: {node: '>=6.0.0'}
|
1074 |
|
1075 |
drange@1.1.1:
|
1076 |
resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==}
|
@@ -1083,9 +1089,6 @@ packages:
|
|
1083 |
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
|
1084 |
engines: {node: '>=10.13.0'}
|
1085 |
|
1086 |
-
es6-promise@3.3.1:
|
1087 |
-
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
|
1088 |
-
|
1089 |
esbuild@0.21.5:
|
1090 |
resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
|
1091 |
engines: {node: '>=12'}
|
@@ -1104,48 +1107,70 @@ packages:
|
|
1104 |
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
1105 |
engines: {node: '>=10'}
|
1106 |
|
1107 |
-
eslint-compat-utils@0.
|
1108 |
-
resolution: {integrity: sha512
|
1109 |
engines: {node: '>=12'}
|
1110 |
peerDependencies:
|
1111 |
eslint: '>=6.0.0'
|
1112 |
|
1113 |
-
eslint-config-prettier@
|
1114 |
-
resolution: {integrity: sha512-
|
1115 |
hasBin: true
|
1116 |
peerDependencies:
|
1117 |
eslint: '>=7.0.0'
|
1118 |
|
1119 |
-
eslint-plugin-
|
1120 |
-
resolution: {integrity: sha512-
|
1121 |
-
engines: {node: ^14.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1122 |
peerDependencies:
|
1123 |
-
eslint: ^
|
1124 |
svelte: ^3.37.0 || ^4.0.0 || ^5.0.0
|
1125 |
peerDependenciesMeta:
|
1126 |
svelte:
|
1127 |
optional: true
|
1128 |
|
1129 |
-
eslint-scope@
|
1130 |
-
resolution: {integrity: sha512-
|
1131 |
-
engines: {node: ^
|
1132 |
|
1133 |
eslint-visitor-keys@3.4.3:
|
1134 |
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
|
1135 |
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
1136 |
|
1137 |
-
eslint@
|
1138 |
-
resolution: {integrity: sha512-
|
1139 |
-
engines: {node: ^
|
1140 |
-
|
|
|
|
|
|
|
1141 |
hasBin: true
|
|
|
|
|
|
|
|
|
|
|
1142 |
|
1143 |
esm-env@1.2.2:
|
1144 |
resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
|
1145 |
|
1146 |
-
espree@
|
1147 |
-
resolution: {integrity: sha512-
|
1148 |
-
engines: {node: ^
|
1149 |
|
1150 |
esprima@4.0.1:
|
1151 |
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
|
@@ -1156,6 +1181,9 @@ packages:
|
|
1156 |
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
|
1157 |
engines: {node: '>=0.10'}
|
1158 |
|
|
|
|
|
|
|
1159 |
esrecurse@4.3.0:
|
1160 |
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
|
1161 |
engines: {node: '>=4.0'}
|
@@ -1167,9 +1195,6 @@ packages:
|
|
1167 |
estree-walker@2.0.2:
|
1168 |
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
|
1169 |
|
1170 |
-
estree-walker@3.0.3:
|
1171 |
-
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
|
1172 |
-
|
1173 |
esutils@2.0.3:
|
1174 |
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
1175 |
engines: {node: '>=0.10.0'}
|
@@ -1184,6 +1209,9 @@ packages:
|
|
1184 |
fast-deep-equal@3.1.3:
|
1185 |
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
|
1186 |
|
|
|
|
|
|
|
1187 |
fast-glob@3.3.3:
|
1188 |
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
|
1189 |
engines: {node: '>=8.6.0'}
|
@@ -1209,9 +1237,9 @@ packages:
|
|
1209 |
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
|
1210 |
engines: {node: '>=8'}
|
1211 |
|
1212 |
-
file-entry-cache@
|
1213 |
-
resolution: {integrity: sha512-
|
1214 |
-
engines: {node:
|
1215 |
|
1216 |
fill-range@7.1.1:
|
1217 |
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
|
@@ -1229,19 +1257,13 @@ packages:
|
|
1229 |
resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==}
|
1230 |
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
1231 |
|
1232 |
-
flat-cache@
|
1233 |
-
resolution: {integrity: sha512-
|
1234 |
-
engines: {node:
|
1235 |
|
1236 |
flatted@3.3.3:
|
1237 |
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
|
1238 |
|
1239 |
-
focus-trap@7.6.4:
|
1240 |
-
resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==}
|
1241 |
-
|
1242 |
-
fs.realpath@1.0.0:
|
1243 |
-
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
1244 |
-
|
1245 |
fsevents@2.3.3:
|
1246 |
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
1247 |
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
@@ -1258,25 +1280,21 @@ packages:
|
|
1258 |
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
1259 |
engines: {node: '>=10.13.0'}
|
1260 |
|
1261 |
-
glob@7.2.3:
|
1262 |
-
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
|
1263 |
-
deprecated: Glob versions prior to v9 are no longer supported
|
1264 |
-
|
1265 |
global-prefix@4.0.0:
|
1266 |
resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==}
|
1267 |
engines: {node: '>=16'}
|
1268 |
|
1269 |
-
globals@
|
1270 |
-
resolution: {integrity: sha512-
|
1271 |
-
engines: {node: '>=
|
1272 |
|
1273 |
globals@15.15.0:
|
1274 |
resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
|
1275 |
engines: {node: '>=18'}
|
1276 |
|
1277 |
-
|
1278 |
-
resolution: {integrity: sha512-
|
1279 |
-
engines: {node: '>=
|
1280 |
|
1281 |
graceful-fs@4.2.11:
|
1282 |
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
@@ -1322,10 +1340,6 @@ packages:
|
|
1322 |
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
|
1323 |
engines: {node: '>=0.8.19'}
|
1324 |
|
1325 |
-
inflight@1.0.6:
|
1326 |
-
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
|
1327 |
-
deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
|
1328 |
-
|
1329 |
inherits@2.0.4:
|
1330 |
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
1331 |
|
@@ -1337,10 +1351,6 @@ packages:
|
|
1337 |
resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
|
1338 |
engines: {node: '>=12.0.0'}
|
1339 |
|
1340 |
-
is-binary-path@2.1.0:
|
1341 |
-
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
|
1342 |
-
engines: {node: '>=8'}
|
1343 |
-
|
1344 |
is-core-module@2.16.1:
|
1345 |
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
|
1346 |
engines: {node: '>= 0.4'}
|
@@ -1368,10 +1378,6 @@ packages:
|
|
1368 |
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
|
1369 |
engines: {node: '>=0.12.0'}
|
1370 |
|
1371 |
-
is-path-inside@3.0.3:
|
1372 |
-
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
|
1373 |
-
engines: {node: '>=8'}
|
1374 |
-
|
1375 |
is-reference@1.2.1:
|
1376 |
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
|
1377 |
|
@@ -1389,6 +1395,22 @@ packages:
|
|
1389 |
resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
|
1390 |
engines: {node: '>=16'}
|
1391 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1392 |
jiti@2.4.2:
|
1393 |
resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
|
1394 |
hasBin: true
|
@@ -1495,10 +1517,6 @@ packages:
|
|
1495 |
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
|
1496 |
engines: {node: '>=10'}
|
1497 |
|
1498 |
-
lilconfig@3.1.3:
|
1499 |
-
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
|
1500 |
-
engines: {node: '>=14'}
|
1501 |
-
|
1502 |
local-pkg@1.1.1:
|
1503 |
resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
|
1504 |
engines: {node: '>=14'}
|
@@ -1527,8 +1545,11 @@ packages:
|
|
1527 |
magic-string@0.30.17:
|
1528 |
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
|
1529 |
|
1530 |
-
|
1531 |
-
resolution: {integrity: sha512-
|
|
|
|
|
|
|
1532 |
|
1533 |
merge2@1.4.1:
|
1534 |
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
@@ -1542,24 +1563,16 @@ packages:
|
|
1542 |
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
1543 |
engines: {node: '>=6'}
|
1544 |
|
1545 |
-
min-indent@1.0.1:
|
1546 |
-
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
|
1547 |
-
engines: {node: '>=4'}
|
1548 |
-
|
1549 |
minimatch@3.1.2:
|
1550 |
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
1551 |
|
1552 |
-
minimatch@9.0.
|
1553 |
-
resolution: {integrity: sha512-
|
1554 |
engines: {node: '>=16 || 14 >=14.17'}
|
1555 |
|
1556 |
minimist@1.2.8:
|
1557 |
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
|
1558 |
|
1559 |
-
mkdirp@0.5.6:
|
1560 |
-
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
|
1561 |
-
hasBin: true
|
1562 |
-
|
1563 |
mlly@1.7.4:
|
1564 |
resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
|
1565 |
|
@@ -1590,13 +1603,6 @@ packages:
|
|
1590 |
natural-compare@1.4.0:
|
1591 |
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
|
1592 |
|
1593 |
-
normalize-path@3.0.0:
|
1594 |
-
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
1595 |
-
engines: {node: '>=0.10.0'}
|
1596 |
-
|
1597 |
-
once@1.4.0:
|
1598 |
-
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
1599 |
-
|
1600 |
onetime@5.1.2:
|
1601 |
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
1602 |
engines: {node: '>=6'}
|
@@ -1644,10 +1650,6 @@ packages:
|
|
1644 |
resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
|
1645 |
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
1646 |
|
1647 |
-
path-is-absolute@1.0.1:
|
1648 |
-
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
|
1649 |
-
engines: {node: '>=0.10.0'}
|
1650 |
-
|
1651 |
path-key@3.1.1:
|
1652 |
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
1653 |
engines: {node: '>=8'}
|
@@ -1655,19 +1657,12 @@ packages:
|
|
1655 |
path-parse@1.0.7:
|
1656 |
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
1657 |
|
1658 |
-
path-type@4.0.0:
|
1659 |
-
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
|
1660 |
-
engines: {node: '>=8'}
|
1661 |
-
|
1662 |
pathe@1.1.2:
|
1663 |
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
|
1664 |
|
1665 |
pathe@2.0.3:
|
1666 |
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
|
1667 |
|
1668 |
-
periscopic@3.1.0:
|
1669 |
-
resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
|
1670 |
-
|
1671 |
picocolors@1.1.1:
|
1672 |
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
|
1673 |
|
@@ -1701,23 +1696,11 @@ packages:
|
|
1701 |
ts-node:
|
1702 |
optional: true
|
1703 |
|
1704 |
-
postcss-
|
1705 |
-
resolution: {integrity: sha512-
|
1706 |
-
engines: {node: '>=
|
1707 |
peerDependencies:
|
1708 |
-
postcss:
|
1709 |
-
ts-node: '>=9.0.0'
|
1710 |
-
peerDependenciesMeta:
|
1711 |
-
postcss:
|
1712 |
-
optional: true
|
1713 |
-
ts-node:
|
1714 |
-
optional: true
|
1715 |
-
|
1716 |
-
postcss-safe-parser@6.0.0:
|
1717 |
-
resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
|
1718 |
-
engines: {node: '>=12.0'}
|
1719 |
-
peerDependencies:
|
1720 |
-
postcss: ^8.3.3
|
1721 |
|
1722 |
postcss-scss@4.0.9:
|
1723 |
resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
|
@@ -1725,8 +1708,8 @@ packages:
|
|
1725 |
peerDependencies:
|
1726 |
postcss: ^8.4.29
|
1727 |
|
1728 |
-
postcss-selector-parser@
|
1729 |
-
resolution: {integrity: sha512-
|
1730 |
engines: {node: '>=4'}
|
1731 |
|
1732 |
postcss@8.5.3:
|
@@ -1737,6 +1720,10 @@ packages:
|
|
1737 |
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
1738 |
engines: {node: '>= 0.8.0'}
|
1739 |
|
|
|
|
|
|
|
|
|
1740 |
prettier-plugin-svelte@3.3.3:
|
1741 |
resolution: {integrity: sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==}
|
1742 |
peerDependencies:
|
@@ -1803,6 +1790,10 @@ packages:
|
|
1803 |
engines: {node: '>=14'}
|
1804 |
hasBin: true
|
1805 |
|
|
|
|
|
|
|
|
|
1806 |
punycode@2.3.1:
|
1807 |
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
1808 |
engines: {node: '>=6'}
|
@@ -1817,13 +1808,16 @@ packages:
|
|
1817 |
resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==}
|
1818 |
engines: {node: '>=4'}
|
1819 |
|
|
|
|
|
|
|
1820 |
readable-stream@3.6.2:
|
1821 |
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
|
1822 |
engines: {node: '>= 6'}
|
1823 |
|
1824 |
-
readdirp@
|
1825 |
-
resolution: {integrity: sha512-
|
1826 |
-
engines: {node: '>=
|
1827 |
|
1828 |
repeat-string@1.6.1:
|
1829 |
resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
|
@@ -1850,16 +1844,6 @@ packages:
|
|
1850 |
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
|
1851 |
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
1852 |
|
1853 |
-
rimraf@2.7.1:
|
1854 |
-
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
|
1855 |
-
deprecated: Rimraf versions prior to v4 are no longer supported
|
1856 |
-
hasBin: true
|
1857 |
-
|
1858 |
-
rimraf@3.0.2:
|
1859 |
-
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
|
1860 |
-
deprecated: Rimraf versions prior to v4 are no longer supported
|
1861 |
-
hasBin: true
|
1862 |
-
|
1863 |
rollup@4.34.9:
|
1864 |
resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==}
|
1865 |
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
@@ -1872,6 +1856,16 @@ packages:
|
|
1872 |
run-parallel@1.2.0:
|
1873 |
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
|
1874 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1875 |
rxjs@7.8.2:
|
1876 |
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
|
1877 |
|
@@ -1885,9 +1879,6 @@ packages:
|
|
1885 |
safer-buffer@2.1.2:
|
1886 |
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
1887 |
|
1888 |
-
sander@0.5.1:
|
1889 |
-
resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
|
1890 |
-
|
1891 |
semver@7.7.1:
|
1892 |
resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
|
1893 |
engines: {node: '>=10'}
|
@@ -1911,14 +1902,6 @@ packages:
|
|
1911 |
resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==}
|
1912 |
engines: {node: '>=18'}
|
1913 |
|
1914 |
-
slash@3.0.0:
|
1915 |
-
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
|
1916 |
-
engines: {node: '>=8'}
|
1917 |
-
|
1918 |
-
sorcery@0.11.1:
|
1919 |
-
resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==}
|
1920 |
-
hasBin: true
|
1921 |
-
|
1922 |
source-map-js@1.2.1:
|
1923 |
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
|
1924 |
engines: {node: '>=0.10.0'}
|
@@ -1934,10 +1917,6 @@ packages:
|
|
1934 |
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
|
1935 |
engines: {node: '>=8'}
|
1936 |
|
1937 |
-
strip-indent@3.0.0:
|
1938 |
-
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
|
1939 |
-
engines: {node: '>=8'}
|
1940 |
-
|
1941 |
strip-json-comments@3.1.1:
|
1942 |
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
1943 |
engines: {node: '>=8'}
|
@@ -1950,70 +1929,30 @@ packages:
|
|
1950 |
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
|
1951 |
engines: {node: '>= 0.4'}
|
1952 |
|
1953 |
-
svelte-check@
|
1954 |
-
resolution: {integrity: sha512-
|
|
|
1955 |
hasBin: true
|
1956 |
peerDependencies:
|
1957 |
-
svelte: ^
|
|
|
1958 |
|
1959 |
-
svelte-eslint-parser@
|
1960 |
-
resolution: {integrity: sha512-
|
1961 |
-
engines: {node: ^
|
1962 |
peerDependencies:
|
1963 |
svelte: ^3.37.0 || ^4.0.0 || ^5.0.0
|
1964 |
peerDependenciesMeta:
|
1965 |
svelte:
|
1966 |
optional: true
|
1967 |
|
1968 |
-
svelte
|
1969 |
-
resolution: {integrity: sha512-
|
1970 |
-
engines: {node:
|
1971 |
-
peerDependencies:
|
1972 |
-
svelte: ^3.19.0 || ^4.0.0
|
1973 |
-
|
1974 |
-
svelte-preprocess@5.1.4:
|
1975 |
-
resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==}
|
1976 |
-
engines: {node: '>= 16.0.0'}
|
1977 |
-
peerDependencies:
|
1978 |
-
'@babel/core': ^7.10.2
|
1979 |
-
coffeescript: ^2.5.1
|
1980 |
-
less: ^3.11.3 || ^4.0.0
|
1981 |
-
postcss: ^7 || ^8
|
1982 |
-
postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
|
1983 |
-
pug: ^3.0.0
|
1984 |
-
sass: ^1.26.8
|
1985 |
-
stylus: ^0.55.0
|
1986 |
-
sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0
|
1987 |
-
svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
|
1988 |
-
typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0'
|
1989 |
-
peerDependenciesMeta:
|
1990 |
-
'@babel/core':
|
1991 |
-
optional: true
|
1992 |
-
coffeescript:
|
1993 |
-
optional: true
|
1994 |
-
less:
|
1995 |
-
optional: true
|
1996 |
-
postcss:
|
1997 |
-
optional: true
|
1998 |
-
postcss-load-config:
|
1999 |
-
optional: true
|
2000 |
-
pug:
|
2001 |
-
optional: true
|
2002 |
-
sass:
|
2003 |
-
optional: true
|
2004 |
-
stylus:
|
2005 |
-
optional: true
|
2006 |
-
sugarss:
|
2007 |
-
optional: true
|
2008 |
-
typescript:
|
2009 |
-
optional: true
|
2010 |
-
|
2011 |
-
svelte@4.2.19:
|
2012 |
-
resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==}
|
2013 |
-
engines: {node: '>=16'}
|
2014 |
|
2015 |
-
|
2016 |
-
resolution: {integrity: sha512-
|
|
|
2017 |
|
2018 |
tailwind-merge@3.0.2:
|
2019 |
resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==}
|
@@ -2025,9 +1964,6 @@ packages:
|
|
2025 |
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
|
2026 |
engines: {node: '>=6'}
|
2027 |
|
2028 |
-
text-table@0.2.0:
|
2029 |
-
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
|
2030 |
-
|
2031 |
through@2.3.8:
|
2032 |
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
|
2033 |
|
@@ -2046,11 +1982,11 @@ packages:
|
|
2046 |
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
|
2047 |
engines: {node: '>=6'}
|
2048 |
|
2049 |
-
ts-api-utils@
|
2050 |
-
resolution: {integrity: sha512-
|
2051 |
-
engines: {node: '>=
|
2052 |
peerDependencies:
|
2053 |
-
typescript: '>=4.
|
2054 |
|
2055 |
ts-patch@3.3.0:
|
2056 |
resolution: {integrity: sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==}
|
@@ -2063,10 +1999,6 @@ packages:
|
|
2063 |
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
2064 |
engines: {node: '>= 0.8.0'}
|
2065 |
|
2066 |
-
type-fest@0.20.2:
|
2067 |
-
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
|
2068 |
-
engines: {node: '>=10'}
|
2069 |
-
|
2070 |
type-fest@0.21.3:
|
2071 |
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
|
2072 |
engines: {node: '>=10'}
|
@@ -2075,6 +2007,13 @@ packages:
|
|
2075 |
resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==}
|
2076 |
engines: {node: '>=16'}
|
2077 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2078 |
typescript@5.6.3:
|
2079 |
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
|
2080 |
engines: {node: '>=14.17'}
|
@@ -2210,10 +2149,10 @@ packages:
|
|
2210 |
yaml:
|
2211 |
optional: true
|
2212 |
|
2213 |
-
vitefu@0.
|
2214 |
-
resolution: {integrity: sha512
|
2215 |
peerDependencies:
|
2216 |
-
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
|
2217 |
peerDependenciesMeta:
|
2218 |
vite:
|
2219 |
optional: true
|
@@ -2242,9 +2181,6 @@ packages:
|
|
2242 |
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
|
2243 |
engines: {node: '>=8'}
|
2244 |
|
2245 |
-
wrappy@1.0.2:
|
2246 |
-
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
2247 |
-
|
2248 |
yaml@1.10.2:
|
2249 |
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
|
2250 |
engines: {node: '>= 6'}
|
@@ -2262,6 +2198,9 @@ packages:
|
|
2262 |
resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==}
|
2263 |
engines: {node: '>=12.20'}
|
2264 |
|
|
|
|
|
|
|
2265 |
snapshots:
|
2266 |
|
2267 |
'@alloc/quick-lru@5.2.0': {}
|
@@ -2422,19 +2361,33 @@ snapshots:
|
|
2422 |
'@esbuild/win32-x64@0.25.1':
|
2423 |
optional: true
|
2424 |
|
2425 |
-
'@eslint-community/eslint-utils@4.4.1(eslint@
|
2426 |
dependencies:
|
2427 |
-
eslint:
|
2428 |
eslint-visitor-keys: 3.4.3
|
2429 |
|
2430 |
'@eslint-community/regexpp@4.12.1': {}
|
2431 |
|
2432 |
-
'@eslint/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2433 |
dependencies:
|
2434 |
ajv: 6.12.6
|
2435 |
debug: 4.4.0
|
2436 |
-
espree:
|
2437 |
-
globals:
|
2438 |
ignore: 5.3.2
|
2439 |
import-fresh: 3.3.1
|
2440 |
js-yaml: 4.1.0
|
@@ -2443,7 +2396,14 @@ snapshots:
|
|
2443 |
transitivePeerDependencies:
|
2444 |
- supports-color
|
2445 |
|
2446 |
-
'@eslint/js@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2447 |
|
2448 |
'@floating-ui/core@1.6.9':
|
2449 |
dependencies:
|
@@ -2468,22 +2428,27 @@ snapshots:
|
|
2468 |
|
2469 |
'@huggingface/tasks@0.17.1': {}
|
2470 |
|
2471 |
-
'@
|
|
|
|
|
2472 |
dependencies:
|
2473 |
-
'@
|
2474 |
-
|
2475 |
-
minimatch: 3.1.2
|
2476 |
-
transitivePeerDependencies:
|
2477 |
-
- supports-color
|
2478 |
|
2479 |
'@humanwhocodes/module-importer@1.0.1': {}
|
2480 |
|
2481 |
-
'@humanwhocodes/
|
|
|
|
|
2482 |
|
2483 |
'@iconify-json/carbon@1.2.8':
|
2484 |
dependencies:
|
2485 |
'@iconify/types': 2.0.0
|
2486 |
|
|
|
|
|
|
|
|
|
2487 |
'@iconify/types@2.0.0': {}
|
2488 |
|
2489 |
'@iconify/utils@2.3.0':
|
@@ -2499,9 +2464,9 @@ snapshots:
|
|
2499 |
transitivePeerDependencies:
|
2500 |
- supports-color
|
2501 |
|
2502 |
-
'@
|
2503 |
dependencies:
|
2504 |
-
'@
|
2505 |
|
2506 |
'@jridgewell/gen-mapping@0.3.8':
|
2507 |
dependencies:
|
@@ -2520,16 +2485,6 @@ snapshots:
|
|
2520 |
'@jridgewell/resolve-uri': 3.1.2
|
2521 |
'@jridgewell/sourcemap-codec': 1.5.0
|
2522 |
|
2523 |
-
'@melt-ui/svelte@0.86.3(svelte@4.2.19)':
|
2524 |
-
dependencies:
|
2525 |
-
'@floating-ui/core': 1.6.9
|
2526 |
-
'@floating-ui/dom': 1.6.13
|
2527 |
-
'@internationalized/date': 3.7.0
|
2528 |
-
dequal: 2.0.3
|
2529 |
-
focus-trap: 7.6.4
|
2530 |
-
nanoid: 5.1.2
|
2531 |
-
svelte: 4.2.19
|
2532 |
-
|
2533 |
'@nodelib/fs.scandir@2.1.5':
|
2534 |
dependencies:
|
2535 |
'@nodelib/fs.stat': 2.0.5
|
@@ -2542,6 +2497,8 @@ snapshots:
|
|
2542 |
'@nodelib/fs.scandir': 2.1.5
|
2543 |
fastq: 1.19.1
|
2544 |
|
|
|
|
|
2545 |
'@polka/url@1.0.0-next.28': {}
|
2546 |
|
2547 |
'@rollup/plugin-commonjs@28.0.2(rollup@4.34.9)':
|
@@ -2669,22 +2626,28 @@ snapshots:
|
|
2669 |
|
2670 |
'@samchon/openapi@3.0.0': {}
|
2671 |
|
2672 |
-
'@
|
|
|
|
|
|
|
|
|
|
|
|
|
2673 |
dependencies:
|
2674 |
-
'@sveltejs/kit': 2.18.0(@sveltejs/vite-plugin-svelte@
|
2675 |
import-meta-resolve: 4.1.0
|
2676 |
|
2677 |
-
'@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@
|
2678 |
dependencies:
|
2679 |
'@rollup/plugin-commonjs': 28.0.2(rollup@4.34.9)
|
2680 |
'@rollup/plugin-json': 6.1.0(rollup@4.34.9)
|
2681 |
'@rollup/plugin-node-resolve': 16.0.0(rollup@4.34.9)
|
2682 |
-
'@sveltejs/kit': 2.18.0(@sveltejs/vite-plugin-svelte@
|
2683 |
rollup: 4.34.9
|
2684 |
|
2685 |
-
'@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@
|
2686 |
dependencies:
|
2687 |
-
'@sveltejs/vite-plugin-svelte':
|
2688 |
'@types/cookie': 0.6.0
|
2689 |
cookie: 0.6.0
|
2690 |
devalue: 5.1.1
|
@@ -2696,36 +2659,31 @@ snapshots:
|
|
2696 |
sade: 1.8.1
|
2697 |
set-cookie-parser: 2.7.1
|
2698 |
sirv: 3.0.1
|
2699 |
-
svelte:
|
2700 |
vite: 5.4.14(lightningcss@1.29.1)
|
2701 |
|
2702 |
-
'@sveltejs/vite-plugin-svelte-inspector@
|
2703 |
dependencies:
|
2704 |
-
'@sveltejs/vite-plugin-svelte':
|
2705 |
debug: 4.4.0
|
2706 |
-
svelte:
|
2707 |
vite: 5.4.14(lightningcss@1.29.1)
|
2708 |
transitivePeerDependencies:
|
2709 |
- supports-color
|
2710 |
|
2711 |
-
'@sveltejs/vite-plugin-svelte@
|
2712 |
dependencies:
|
2713 |
-
'@sveltejs/vite-plugin-svelte-inspector':
|
2714 |
debug: 4.4.0
|
2715 |
deepmerge: 4.3.1
|
2716 |
kleur: 4.1.5
|
2717 |
magic-string: 0.30.17
|
2718 |
-
svelte:
|
2719 |
-
svelte-hmr: 0.16.0(svelte@4.2.19)
|
2720 |
vite: 5.4.14(lightningcss@1.29.1)
|
2721 |
-
vitefu: 0.
|
2722 |
transitivePeerDependencies:
|
2723 |
- supports-color
|
2724 |
|
2725 |
-
'@swc/helpers@0.5.15':
|
2726 |
-
dependencies:
|
2727 |
-
tslib: 2.8.1
|
2728 |
-
|
2729 |
'@tailwindcss/container-queries@0.1.1(tailwindcss@4.0.9)':
|
2730 |
dependencies:
|
2731 |
tailwindcss: 4.0.9
|
@@ -2798,99 +2756,84 @@ snapshots:
|
|
2798 |
|
2799 |
'@types/json-schema@7.0.15': {}
|
2800 |
|
2801 |
-
'@types/pug@2.0.10': {}
|
2802 |
-
|
2803 |
'@types/resolve@1.20.2': {}
|
2804 |
|
2805 |
-
'@
|
2806 |
-
|
2807 |
-
'@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)':
|
2808 |
dependencies:
|
2809 |
'@eslint-community/regexpp': 4.12.1
|
2810 |
-
'@typescript-eslint/parser':
|
2811 |
-
'@typescript-eslint/scope-manager':
|
2812 |
-
'@typescript-eslint/type-utils':
|
2813 |
-
'@typescript-eslint/utils':
|
2814 |
-
'@typescript-eslint/visitor-keys':
|
2815 |
-
|
2816 |
-
eslint: 8.57.1
|
2817 |
graphemer: 1.4.0
|
2818 |
ignore: 5.3.2
|
2819 |
natural-compare: 1.4.0
|
2820 |
-
|
2821 |
-
ts-api-utils: 1.4.3(typescript@5.8.2)
|
2822 |
-
optionalDependencies:
|
2823 |
typescript: 5.8.2
|
2824 |
transitivePeerDependencies:
|
2825 |
- supports-color
|
2826 |
|
2827 |
-
'@typescript-eslint/parser@
|
2828 |
dependencies:
|
2829 |
-
'@typescript-eslint/scope-manager':
|
2830 |
-
'@typescript-eslint/types':
|
2831 |
-
'@typescript-eslint/typescript-estree':
|
2832 |
-
'@typescript-eslint/visitor-keys':
|
2833 |
debug: 4.4.0
|
2834 |
-
eslint:
|
2835 |
-
optionalDependencies:
|
2836 |
typescript: 5.8.2
|
2837 |
transitivePeerDependencies:
|
2838 |
- supports-color
|
2839 |
|
2840 |
-
'@typescript-eslint/scope-manager@
|
2841 |
dependencies:
|
2842 |
-
'@typescript-eslint/types':
|
2843 |
-
'@typescript-eslint/visitor-keys':
|
2844 |
|
2845 |
-
'@typescript-eslint/type-utils@
|
2846 |
dependencies:
|
2847 |
-
'@typescript-eslint/typescript-estree':
|
2848 |
-
'@typescript-eslint/utils':
|
2849 |
debug: 4.4.0
|
2850 |
-
eslint:
|
2851 |
-
ts-api-utils:
|
2852 |
-
optionalDependencies:
|
2853 |
typescript: 5.8.2
|
2854 |
transitivePeerDependencies:
|
2855 |
- supports-color
|
2856 |
|
2857 |
-
'@typescript-eslint/types@
|
2858 |
|
2859 |
-
'@typescript-eslint/typescript-estree@
|
2860 |
dependencies:
|
2861 |
-
'@typescript-eslint/types':
|
2862 |
-
'@typescript-eslint/visitor-keys':
|
2863 |
debug: 4.4.0
|
2864 |
-
|
2865 |
is-glob: 4.0.3
|
2866 |
-
minimatch: 9.0.
|
2867 |
semver: 7.7.1
|
2868 |
-
ts-api-utils:
|
2869 |
-
optionalDependencies:
|
2870 |
typescript: 5.8.2
|
2871 |
transitivePeerDependencies:
|
2872 |
- supports-color
|
2873 |
|
2874 |
-
'@typescript-eslint/utils@
|
2875 |
dependencies:
|
2876 |
-
'@eslint-community/eslint-utils': 4.4.1(eslint@
|
2877 |
-
'@
|
2878 |
-
'@types
|
2879 |
-
'@typescript-eslint/
|
2880 |
-
|
2881 |
-
|
2882 |
-
eslint: 8.57.1
|
2883 |
-
semver: 7.7.1
|
2884 |
transitivePeerDependencies:
|
2885 |
- supports-color
|
2886 |
-
- typescript
|
2887 |
|
2888 |
-
'@typescript-eslint/visitor-keys@
|
2889 |
dependencies:
|
2890 |
-
'@typescript-eslint/types':
|
2891 |
-
eslint-visitor-keys:
|
2892 |
-
|
2893 |
-
'@ungap/structured-clone@1.3.0': {}
|
2894 |
|
2895 |
acorn-jsx@5.3.2(acorn@8.14.0):
|
2896 |
dependencies:
|
@@ -2915,10 +2858,7 @@ snapshots:
|
|
2915 |
dependencies:
|
2916 |
color-convert: 2.0.1
|
2917 |
|
2918 |
-
|
2919 |
-
dependencies:
|
2920 |
-
normalize-path: 3.0.0
|
2921 |
-
picomatch: 2.3.1
|
2922 |
|
2923 |
argparse@2.0.1: {}
|
2924 |
|
@@ -2926,7 +2866,7 @@ snapshots:
|
|
2926 |
|
2927 |
array-timsort@1.0.3: {}
|
2928 |
|
2929 |
-
|
2930 |
|
2931 |
axobject-query@4.1.0: {}
|
2932 |
|
@@ -2934,8 +2874,6 @@ snapshots:
|
|
2934 |
|
2935 |
base64-js@1.5.1: {}
|
2936 |
|
2937 |
-
binary-extensions@2.3.0: {}
|
2938 |
-
|
2939 |
bl@4.1.0:
|
2940 |
dependencies:
|
2941 |
buffer: 5.7.1
|
@@ -2955,8 +2893,6 @@ snapshots:
|
|
2955 |
dependencies:
|
2956 |
fill-range: 7.1.1
|
2957 |
|
2958 |
-
buffer-crc32@1.0.0: {}
|
2959 |
-
|
2960 |
buffer@5.7.1:
|
2961 |
dependencies:
|
2962 |
base64-js: 1.5.1
|
@@ -2971,17 +2907,9 @@ snapshots:
|
|
2971 |
|
2972 |
chardet@0.7.0: {}
|
2973 |
|
2974 |
-
chokidar@
|
2975 |
dependencies:
|
2976 |
-
|
2977 |
-
braces: 3.0.3
|
2978 |
-
glob-parent: 5.1.2
|
2979 |
-
is-binary-path: 2.1.0
|
2980 |
-
is-glob: 4.0.3
|
2981 |
-
normalize-path: 3.0.0
|
2982 |
-
readdirp: 3.6.0
|
2983 |
-
optionalDependencies:
|
2984 |
-
fsevents: 2.3.3
|
2985 |
|
2986 |
cli-cursor@3.1.0:
|
2987 |
dependencies:
|
@@ -2995,14 +2923,6 @@ snapshots:
|
|
2995 |
|
2996 |
clsx@2.1.1: {}
|
2997 |
|
2998 |
-
code-red@1.0.4:
|
2999 |
-
dependencies:
|
3000 |
-
'@jridgewell/sourcemap-codec': 1.5.0
|
3001 |
-
'@types/estree': 1.0.6
|
3002 |
-
acorn: 8.14.0
|
3003 |
-
estree-walker: 3.0.3
|
3004 |
-
periscopic: 3.1.0
|
3005 |
-
|
3006 |
color-convert@2.0.1:
|
3007 |
dependencies:
|
3008 |
color-name: 1.1.4
|
@@ -3041,11 +2961,6 @@ snapshots:
|
|
3041 |
shebang-command: 2.0.0
|
3042 |
which: 2.0.2
|
3043 |
|
3044 |
-
css-tree@2.3.1:
|
3045 |
-
dependencies:
|
3046 |
-
mdn-data: 2.0.30
|
3047 |
-
source-map-js: 1.2.1
|
3048 |
-
|
3049 |
cssesc@3.0.0: {}
|
3050 |
|
3051 |
debug@4.4.0:
|
@@ -3062,23 +2977,13 @@ snapshots:
|
|
3062 |
|
3063 |
defu@6.1.4: {}
|
3064 |
|
3065 |
-
dequal@2.0.3: {}
|
3066 |
-
|
3067 |
-
detect-indent@6.1.0: {}
|
3068 |
-
|
3069 |
detect-libc@1.0.3: {}
|
3070 |
|
3071 |
devalue@5.1.1: {}
|
3072 |
|
3073 |
diff-match-patch@1.0.5: {}
|
3074 |
|
3075 |
-
|
3076 |
-
dependencies:
|
3077 |
-
path-type: 4.0.0
|
3078 |
-
|
3079 |
-
doctrine@3.0.0:
|
3080 |
-
dependencies:
|
3081 |
-
esutils: 2.0.3
|
3082 |
|
3083 |
drange@1.1.1: {}
|
3084 |
|
@@ -3089,8 +2994,6 @@ snapshots:
|
|
3089 |
graceful-fs: 4.2.11
|
3090 |
tapable: 2.2.1
|
3091 |
|
3092 |
-
es6-promise@3.3.1: {}
|
3093 |
-
|
3094 |
esbuild@0.21.5:
|
3095 |
optionalDependencies:
|
3096 |
'@esbuild/aix-ppc64': 0.21.5
|
@@ -3149,91 +3052,100 @@ snapshots:
|
|
3149 |
|
3150 |
escape-string-regexp@4.0.0: {}
|
3151 |
|
3152 |
-
eslint-compat-utils@0.
|
3153 |
dependencies:
|
3154 |
-
eslint:
|
3155 |
semver: 7.7.1
|
3156 |
|
3157 |
-
eslint-config-prettier@
|
|
|
|
|
|
|
|
|
3158 |
dependencies:
|
3159 |
-
eslint:
|
|
|
|
|
|
|
|
|
|
|
3160 |
|
3161 |
-
eslint-plugin-svelte@
|
3162 |
dependencies:
|
3163 |
-
'@eslint-community/eslint-utils': 4.4.1(eslint@
|
3164 |
'@jridgewell/sourcemap-codec': 1.5.0
|
3165 |
-
eslint:
|
3166 |
-
eslint-compat-utils: 0.
|
3167 |
esutils: 2.0.3
|
3168 |
known-css-properties: 0.35.0
|
3169 |
postcss: 8.5.3
|
3170 |
postcss-load-config: 3.1.4(postcss@8.5.3)
|
3171 |
-
postcss-safe-parser:
|
3172 |
-
postcss-selector-parser: 6.1.2
|
3173 |
semver: 7.7.1
|
3174 |
-
svelte-eslint-parser:
|
3175 |
optionalDependencies:
|
3176 |
-
svelte:
|
3177 |
transitivePeerDependencies:
|
3178 |
- ts-node
|
3179 |
|
3180 |
-
eslint-scope@
|
3181 |
dependencies:
|
3182 |
esrecurse: 4.3.0
|
3183 |
estraverse: 5.3.0
|
3184 |
|
3185 |
eslint-visitor-keys@3.4.3: {}
|
3186 |
|
3187 |
-
eslint@
|
|
|
|
|
3188 |
dependencies:
|
3189 |
-
'@eslint-community/eslint-utils': 4.4.1(eslint@
|
3190 |
'@eslint-community/regexpp': 4.12.1
|
3191 |
-
'@eslint/
|
3192 |
-
'@eslint/
|
3193 |
-
'@
|
|
|
|
|
|
|
|
|
3194 |
'@humanwhocodes/module-importer': 1.0.1
|
3195 |
-
'@
|
3196 |
-
'@
|
|
|
3197 |
ajv: 6.12.6
|
3198 |
chalk: 4.1.2
|
3199 |
cross-spawn: 7.0.6
|
3200 |
debug: 4.4.0
|
3201 |
-
doctrine: 3.0.0
|
3202 |
escape-string-regexp: 4.0.0
|
3203 |
-
eslint-scope:
|
3204 |
-
eslint-visitor-keys:
|
3205 |
-
espree:
|
3206 |
esquery: 1.6.0
|
3207 |
esutils: 2.0.3
|
3208 |
fast-deep-equal: 3.1.3
|
3209 |
-
file-entry-cache:
|
3210 |
find-up: 5.0.0
|
3211 |
glob-parent: 6.0.2
|
3212 |
-
globals: 13.24.0
|
3213 |
-
graphemer: 1.4.0
|
3214 |
ignore: 5.3.2
|
3215 |
imurmurhash: 0.1.4
|
3216 |
is-glob: 4.0.3
|
3217 |
-
is-path-inside: 3.0.3
|
3218 |
-
js-yaml: 4.1.0
|
3219 |
json-stable-stringify-without-jsonify: 1.0.1
|
3220 |
-
levn: 0.4.1
|
3221 |
lodash.merge: 4.6.2
|
3222 |
minimatch: 3.1.2
|
3223 |
natural-compare: 1.4.0
|
3224 |
optionator: 0.9.4
|
3225 |
-
|
3226 |
-
|
3227 |
transitivePeerDependencies:
|
3228 |
- supports-color
|
3229 |
|
3230 |
esm-env@1.2.2: {}
|
3231 |
|
3232 |
-
espree@
|
3233 |
dependencies:
|
3234 |
acorn: 8.14.0
|
3235 |
acorn-jsx: 5.3.2(acorn@8.14.0)
|
3236 |
-
eslint-visitor-keys:
|
3237 |
|
3238 |
esprima@4.0.1: {}
|
3239 |
|
@@ -3241,6 +3153,10 @@ snapshots:
|
|
3241 |
dependencies:
|
3242 |
estraverse: 5.3.0
|
3243 |
|
|
|
|
|
|
|
|
|
3244 |
esrecurse@4.3.0:
|
3245 |
dependencies:
|
3246 |
estraverse: 5.3.0
|
@@ -3249,10 +3165,6 @@ snapshots:
|
|
3249 |
|
3250 |
estree-walker@2.0.2: {}
|
3251 |
|
3252 |
-
estree-walker@3.0.3:
|
3253 |
-
dependencies:
|
3254 |
-
'@types/estree': 1.0.6
|
3255 |
-
|
3256 |
esutils@2.0.3: {}
|
3257 |
|
3258 |
exsolve@1.0.4: {}
|
@@ -3265,6 +3177,8 @@ snapshots:
|
|
3265 |
|
3266 |
fast-deep-equal@3.1.3: {}
|
3267 |
|
|
|
|
|
3268 |
fast-glob@3.3.3:
|
3269 |
dependencies:
|
3270 |
'@nodelib/fs.stat': 2.0.5
|
@@ -3289,9 +3203,9 @@ snapshots:
|
|
3289 |
dependencies:
|
3290 |
escape-string-regexp: 1.0.5
|
3291 |
|
3292 |
-
file-entry-cache@
|
3293 |
dependencies:
|
3294 |
-
flat-cache:
|
3295 |
|
3296 |
fill-range@7.1.1:
|
3297 |
dependencies:
|
@@ -3312,20 +3226,13 @@ snapshots:
|
|
3312 |
locate-path: 7.2.0
|
3313 |
path-exists: 5.0.0
|
3314 |
|
3315 |
-
flat-cache@
|
3316 |
dependencies:
|
3317 |
flatted: 3.3.3
|
3318 |
keyv: 4.5.4
|
3319 |
-
rimraf: 3.0.2
|
3320 |
|
3321 |
flatted@3.3.3: {}
|
3322 |
|
3323 |
-
focus-trap@7.6.4:
|
3324 |
-
dependencies:
|
3325 |
-
tabbable: 6.2.0
|
3326 |
-
|
3327 |
-
fs.realpath@1.0.0: {}
|
3328 |
-
|
3329 |
fsevents@2.3.3:
|
3330 |
optional: true
|
3331 |
|
@@ -3339,35 +3246,17 @@ snapshots:
|
|
3339 |
dependencies:
|
3340 |
is-glob: 4.0.3
|
3341 |
|
3342 |
-
glob@7.2.3:
|
3343 |
-
dependencies:
|
3344 |
-
fs.realpath: 1.0.0
|
3345 |
-
inflight: 1.0.6
|
3346 |
-
inherits: 2.0.4
|
3347 |
-
minimatch: 3.1.2
|
3348 |
-
once: 1.4.0
|
3349 |
-
path-is-absolute: 1.0.1
|
3350 |
-
|
3351 |
global-prefix@4.0.0:
|
3352 |
dependencies:
|
3353 |
ini: 4.1.3
|
3354 |
kind-of: 6.0.3
|
3355 |
which: 4.0.0
|
3356 |
|
3357 |
-
globals@
|
3358 |
-
dependencies:
|
3359 |
-
type-fest: 0.20.2
|
3360 |
|
3361 |
globals@15.15.0: {}
|
3362 |
|
3363 |
-
|
3364 |
-
dependencies:
|
3365 |
-
array-union: 2.1.0
|
3366 |
-
dir-glob: 3.0.1
|
3367 |
-
fast-glob: 3.3.3
|
3368 |
-
ignore: 5.3.2
|
3369 |
-
merge2: 1.4.1
|
3370 |
-
slash: 3.0.0
|
3371 |
|
3372 |
graceful-fs@4.2.11: {}
|
3373 |
|
@@ -3400,11 +3289,6 @@ snapshots:
|
|
3400 |
|
3401 |
imurmurhash@0.1.4: {}
|
3402 |
|
3403 |
-
inflight@1.0.6:
|
3404 |
-
dependencies:
|
3405 |
-
once: 1.4.0
|
3406 |
-
wrappy: 1.0.2
|
3407 |
-
|
3408 |
inherits@2.0.4: {}
|
3409 |
|
3410 |
ini@4.1.3: {}
|
@@ -3427,10 +3311,6 @@ snapshots:
|
|
3427 |
through: 2.3.8
|
3428 |
wrap-ansi: 6.2.0
|
3429 |
|
3430 |
-
is-binary-path@2.1.0:
|
3431 |
-
dependencies:
|
3432 |
-
binary-extensions: 2.3.0
|
3433 |
-
|
3434 |
is-core-module@2.16.1:
|
3435 |
dependencies:
|
3436 |
hasown: 2.0.2
|
@@ -3449,8 +3329,6 @@ snapshots:
|
|
3449 |
|
3450 |
is-number@7.0.0: {}
|
3451 |
|
3452 |
-
is-path-inside@3.0.3: {}
|
3453 |
-
|
3454 |
is-reference@1.2.1:
|
3455 |
dependencies:
|
3456 |
'@types/estree': 1.0.6
|
@@ -3465,6 +3343,29 @@ snapshots:
|
|
3465 |
|
3466 |
isexe@3.1.1: {}
|
3467 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3468 |
jiti@2.4.2: {}
|
3469 |
|
3470 |
js-yaml@4.1.0:
|
@@ -3541,9 +3442,6 @@ snapshots:
|
|
3541 |
|
3542 |
lilconfig@2.1.0: {}
|
3543 |
|
3544 |
-
lilconfig@3.1.3:
|
3545 |
-
optional: true
|
3546 |
-
|
3547 |
local-pkg@1.1.1:
|
3548 |
dependencies:
|
3549 |
mlly: 1.7.4
|
@@ -3573,7 +3471,13 @@ snapshots:
|
|
3573 |
dependencies:
|
3574 |
'@jridgewell/sourcemap-codec': 1.5.0
|
3575 |
|
3576 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
3577 |
|
3578 |
merge2@1.4.1: {}
|
3579 |
|
@@ -3584,22 +3488,16 @@ snapshots:
|
|
3584 |
|
3585 |
mimic-fn@2.1.0: {}
|
3586 |
|
3587 |
-
min-indent@1.0.1: {}
|
3588 |
-
|
3589 |
minimatch@3.1.2:
|
3590 |
dependencies:
|
3591 |
brace-expansion: 1.1.11
|
3592 |
|
3593 |
-
minimatch@9.0.
|
3594 |
dependencies:
|
3595 |
brace-expansion: 2.0.1
|
3596 |
|
3597 |
minimist@1.2.8: {}
|
3598 |
|
3599 |
-
mkdirp@0.5.6:
|
3600 |
-
dependencies:
|
3601 |
-
minimist: 1.2.8
|
3602 |
-
|
3603 |
mlly@1.7.4:
|
3604 |
dependencies:
|
3605 |
acorn: 8.14.0
|
@@ -3621,12 +3519,6 @@ snapshots:
|
|
3621 |
|
3622 |
natural-compare@1.4.0: {}
|
3623 |
|
3624 |
-
normalize-path@3.0.0: {}
|
3625 |
-
|
3626 |
-
once@1.4.0:
|
3627 |
-
dependencies:
|
3628 |
-
wrappy: 1.0.2
|
3629 |
-
|
3630 |
onetime@5.1.2:
|
3631 |
dependencies:
|
3632 |
mimic-fn: 2.1.0
|
@@ -3682,24 +3574,14 @@ snapshots:
|
|
3682 |
|
3683 |
path-exists@5.0.0: {}
|
3684 |
|
3685 |
-
path-is-absolute@1.0.1: {}
|
3686 |
-
|
3687 |
path-key@3.1.1: {}
|
3688 |
|
3689 |
path-parse@1.0.7: {}
|
3690 |
|
3691 |
-
path-type@4.0.0: {}
|
3692 |
-
|
3693 |
pathe@1.1.2: {}
|
3694 |
|
3695 |
pathe@2.0.3: {}
|
3696 |
|
3697 |
-
periscopic@3.1.0:
|
3698 |
-
dependencies:
|
3699 |
-
'@types/estree': 1.0.6
|
3700 |
-
estree-walker: 3.0.3
|
3701 |
-
is-reference: 3.0.3
|
3702 |
-
|
3703 |
picocolors@1.1.1: {}
|
3704 |
|
3705 |
picomatch@2.3.1: {}
|
@@ -3729,15 +3611,7 @@ snapshots:
|
|
3729 |
optionalDependencies:
|
3730 |
postcss: 8.5.3
|
3731 |
|
3732 |
-
postcss-
|
3733 |
-
dependencies:
|
3734 |
-
lilconfig: 3.1.3
|
3735 |
-
yaml: 2.7.0
|
3736 |
-
optionalDependencies:
|
3737 |
-
postcss: 8.5.3
|
3738 |
-
optional: true
|
3739 |
-
|
3740 |
-
postcss-safe-parser@6.0.0(postcss@8.5.3):
|
3741 |
dependencies:
|
3742 |
postcss: 8.5.3
|
3743 |
|
@@ -3745,7 +3619,7 @@ snapshots:
|
|
3745 |
dependencies:
|
3746 |
postcss: 8.5.3
|
3747 |
|
3748 |
-
postcss-selector-parser@
|
3749 |
dependencies:
|
3750 |
cssesc: 3.0.0
|
3751 |
util-deprecate: 1.0.2
|
@@ -3758,19 +3632,29 @@ snapshots:
|
|
3758 |
|
3759 |
prelude-ls@1.2.1: {}
|
3760 |
|
3761 |
-
prettier-
|
|
|
|
|
|
|
|
|
3762 |
dependencies:
|
3763 |
prettier: 3.5.3
|
3764 |
-
svelte:
|
3765 |
|
3766 |
-
prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@
|
3767 |
dependencies:
|
3768 |
prettier: 3.5.3
|
3769 |
optionalDependencies:
|
3770 |
-
prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@
|
3771 |
|
3772 |
prettier@3.5.3: {}
|
3773 |
|
|
|
|
|
|
|
|
|
|
|
|
|
3774 |
punycode@2.3.1: {}
|
3775 |
|
3776 |
quansync@0.2.8: {}
|
@@ -3782,15 +3666,15 @@ snapshots:
|
|
3782 |
drange: 1.1.1
|
3783 |
ret: 0.2.2
|
3784 |
|
|
|
|
|
3785 |
readable-stream@3.6.2:
|
3786 |
dependencies:
|
3787 |
inherits: 2.0.4
|
3788 |
string_decoder: 1.3.0
|
3789 |
util-deprecate: 1.0.2
|
3790 |
|
3791 |
-
readdirp@
|
3792 |
-
dependencies:
|
3793 |
-
picomatch: 2.3.1
|
3794 |
|
3795 |
repeat-string@1.6.1: {}
|
3796 |
|
@@ -3811,14 +3695,6 @@ snapshots:
|
|
3811 |
|
3812 |
reusify@1.1.0: {}
|
3813 |
|
3814 |
-
rimraf@2.7.1:
|
3815 |
-
dependencies:
|
3816 |
-
glob: 7.2.3
|
3817 |
-
|
3818 |
-
rimraf@3.0.2:
|
3819 |
-
dependencies:
|
3820 |
-
glob: 7.2.3
|
3821 |
-
|
3822 |
rollup@4.34.9:
|
3823 |
dependencies:
|
3824 |
'@types/estree': 1.0.6
|
@@ -3850,6 +3726,16 @@ snapshots:
|
|
3850 |
dependencies:
|
3851 |
queue-microtask: 1.2.3
|
3852 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3853 |
rxjs@7.8.2:
|
3854 |
dependencies:
|
3855 |
tslib: 2.8.1
|
@@ -3862,13 +3748,6 @@ snapshots:
|
|
3862 |
|
3863 |
safer-buffer@2.1.2: {}
|
3864 |
|
3865 |
-
sander@0.5.1:
|
3866 |
-
dependencies:
|
3867 |
-
es6-promise: 3.3.1
|
3868 |
-
graceful-fs: 4.2.11
|
3869 |
-
mkdirp: 0.5.6
|
3870 |
-
rimraf: 2.7.1
|
3871 |
-
|
3872 |
semver@7.7.1: {}
|
3873 |
|
3874 |
set-cookie-parser@2.7.1: {}
|
@@ -3887,15 +3766,6 @@ snapshots:
|
|
3887 |
mrmime: 2.0.1
|
3888 |
totalist: 3.0.1
|
3889 |
|
3890 |
-
slash@3.0.0: {}
|
3891 |
-
|
3892 |
-
sorcery@0.11.1:
|
3893 |
-
dependencies:
|
3894 |
-
'@jridgewell/sourcemap-codec': 1.5.0
|
3895 |
-
buffer-crc32: 1.0.0
|
3896 |
-
minimist: 1.2.8
|
3897 |
-
sander: 0.5.1
|
3898 |
-
|
3899 |
source-map-js@1.2.1: {}
|
3900 |
|
3901 |
string-width@4.2.3:
|
@@ -3912,10 +3782,6 @@ snapshots:
|
|
3912 |
dependencies:
|
3913 |
ansi-regex: 5.0.1
|
3914 |
|
3915 |
-
strip-indent@3.0.0:
|
3916 |
-
dependencies:
|
3917 |
-
min-indent: 1.0.1
|
3918 |
-
|
3919 |
strip-json-comments@3.1.1: {}
|
3920 |
|
3921 |
supports-color@7.2.0:
|
@@ -3924,71 +3790,50 @@ snapshots:
|
|
3924 |
|
3925 |
supports-preserve-symlinks-flag@1.0.0: {}
|
3926 |
|
3927 |
-
svelte-check@
|
3928 |
dependencies:
|
3929 |
'@jridgewell/trace-mapping': 0.3.25
|
3930 |
-
chokidar:
|
|
|
3931 |
picocolors: 1.1.1
|
3932 |
sade: 1.8.1
|
3933 |
-
svelte:
|
3934 |
-
svelte-preprocess: 5.1.4(postcss-load-config@4.0.2(postcss@8.5.3))(postcss@8.5.3)(svelte@4.2.19)(typescript@5.8.2)
|
3935 |
typescript: 5.8.2
|
3936 |
transitivePeerDependencies:
|
3937 |
-
-
|
3938 |
-
- coffeescript
|
3939 |
-
- less
|
3940 |
-
- postcss
|
3941 |
-
- postcss-load-config
|
3942 |
-
- pug
|
3943 |
-
- sass
|
3944 |
-
- stylus
|
3945 |
-
- sugarss
|
3946 |
|
3947 |
-
svelte-eslint-parser@
|
3948 |
dependencies:
|
3949 |
-
eslint-scope:
|
3950 |
-
eslint-visitor-keys:
|
3951 |
-
espree:
|
3952 |
postcss: 8.5.3
|
3953 |
postcss-scss: 4.0.9(postcss@8.5.3)
|
|
|
3954 |
optionalDependencies:
|
3955 |
-
svelte:
|
3956 |
-
|
3957 |
-
svelte-hmr@0.16.0(svelte@4.2.19):
|
3958 |
-
dependencies:
|
3959 |
-
svelte: 4.2.19
|
3960 |
-
|
3961 |
-
svelte-preprocess@5.1.4(postcss-load-config@4.0.2(postcss@8.5.3))(postcss@8.5.3)(svelte@4.2.19)(typescript@5.8.2):
|
3962 |
-
dependencies:
|
3963 |
-
'@types/pug': 2.0.10
|
3964 |
-
detect-indent: 6.1.0
|
3965 |
-
magic-string: 0.30.17
|
3966 |
-
sorcery: 0.11.1
|
3967 |
-
strip-indent: 3.0.0
|
3968 |
-
svelte: 4.2.19
|
3969 |
-
optionalDependencies:
|
3970 |
-
postcss: 8.5.3
|
3971 |
-
postcss-load-config: 4.0.2(postcss@8.5.3)
|
3972 |
-
typescript: 5.8.2
|
3973 |
|
3974 |
-
svelte@
|
3975 |
dependencies:
|
3976 |
'@ampproject/remapping': 2.3.0
|
3977 |
'@jridgewell/sourcemap-codec': 1.5.0
|
3978 |
-
'@
|
3979 |
'@types/estree': 1.0.6
|
3980 |
acorn: 8.14.0
|
3981 |
aria-query: 5.3.2
|
3982 |
axobject-query: 4.1.0
|
3983 |
-
|
3984 |
-
|
3985 |
-
|
3986 |
is-reference: 3.0.3
|
3987 |
locate-character: 3.0.0
|
3988 |
magic-string: 0.30.17
|
3989 |
-
|
3990 |
|
3991 |
-
|
|
|
|
|
|
|
3992 |
|
3993 |
tailwind-merge@3.0.2: {}
|
3994 |
|
@@ -3996,8 +3841,6 @@ snapshots:
|
|
3996 |
|
3997 |
tapable@2.2.1: {}
|
3998 |
|
3999 |
-
text-table@0.2.0: {}
|
4000 |
-
|
4001 |
through@2.3.8: {}
|
4002 |
|
4003 |
tinyexec@0.3.2: {}
|
@@ -4012,7 +3855,7 @@ snapshots:
|
|
4012 |
|
4013 |
totalist@3.0.1: {}
|
4014 |
|
4015 |
-
ts-api-utils@
|
4016 |
dependencies:
|
4017 |
typescript: 5.8.2
|
4018 |
|
@@ -4031,12 +3874,20 @@ snapshots:
|
|
4031 |
dependencies:
|
4032 |
prelude-ls: 1.2.1
|
4033 |
|
4034 |
-
type-fest@0.20.2: {}
|
4035 |
-
|
4036 |
type-fest@0.21.3: {}
|
4037 |
|
4038 |
type-fest@4.37.0: {}
|
4039 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4040 |
typescript@5.6.3: {}
|
4041 |
|
4042 |
typescript@5.8.2: {}
|
@@ -4063,7 +3914,7 @@ snapshots:
|
|
4063 |
|
4064 |
ufo@1.5.4: {}
|
4065 |
|
4066 |
-
unplugin-icons@22.1.0(svelte@
|
4067 |
dependencies:
|
4068 |
'@antfu/install-pkg': 1.0.0
|
4069 |
'@iconify/utils': 2.3.0
|
@@ -4071,7 +3922,7 @@ snapshots:
|
|
4071 |
local-pkg: 1.1.1
|
4072 |
unplugin: 2.2.0
|
4073 |
optionalDependencies:
|
4074 |
-
svelte:
|
4075 |
transitivePeerDependencies:
|
4076 |
- supports-color
|
4077 |
|
@@ -4111,7 +3962,7 @@ snapshots:
|
|
4111 |
lightningcss: 1.29.1
|
4112 |
yaml: 2.7.0
|
4113 |
|
4114 |
-
vitefu@0.
|
4115 |
optionalDependencies:
|
4116 |
vite: 5.4.14(lightningcss@1.29.1)
|
4117 |
|
@@ -4137,8 +3988,6 @@ snapshots:
|
|
4137 |
string-width: 4.2.3
|
4138 |
strip-ansi: 6.0.1
|
4139 |
|
4140 |
-
wrappy@1.0.2: {}
|
4141 |
-
|
4142 |
yaml@1.10.2: {}
|
4143 |
|
4144 |
yaml@2.7.0:
|
@@ -4147,3 +3996,5 @@ snapshots:
|
|
4147 |
yocto-queue@0.1.0: {}
|
4148 |
|
4149 |
yocto-queue@1.2.0: {}
|
|
|
|
|
|
8 |
|
9 |
.:
|
10 |
dependencies:
|
11 |
+
eslint-plugin-svelte:
|
12 |
+
specifier: ^3.3.1
|
13 |
+
version: 3.3.1(eslint@9.22.0(jiti@2.4.2))(svelte@5.23.0)
|
14 |
+
typia:
|
15 |
+
specifier: ^8.0.0
|
16 |
+
version: 8.0.0(@samchon/openapi@3.0.0)(typescript@5.8.2)
|
17 |
+
devDependencies:
|
18 |
+
'@eslint/eslintrc':
|
19 |
+
specifier: ^3.3.0
|
20 |
+
version: 3.3.0
|
21 |
+
'@eslint/js':
|
22 |
+
specifier: ^9.22.0
|
23 |
+
version: 9.22.0
|
24 |
'@huggingface/hub':
|
25 |
specifier: ^1.0.1
|
26 |
version: 1.0.1
|
|
|
30 |
'@huggingface/tasks':
|
31 |
specifier: ^0.17.1
|
32 |
version: 0.17.1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
'@iconify-json/carbon':
|
34 |
specifier: ^1.2.8
|
35 |
version: 1.2.8
|
36 |
+
'@iconify-json/material-symbols':
|
37 |
+
specifier: ^1.2.15
|
38 |
+
version: 1.2.15
|
39 |
'@ryoppippi/unplugin-typia':
|
40 |
specifier: ^1.0.0
|
41 |
version: 1.2.0(@samchon/openapi@3.0.0)(jiti@2.4.2)(lightningcss@1.29.1)(rollup@4.34.9)(yaml@2.7.0)
|
|
|
44 |
version: 3.0.0
|
45 |
'@sveltejs/adapter-auto':
|
46 |
specifier: ^3.2.2
|
47 |
+
version: 3.3.1(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))
|
48 |
'@sveltejs/adapter-node':
|
49 |
specifier: ^5.2.0
|
50 |
+
version: 5.2.12(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))
|
51 |
'@sveltejs/kit':
|
52 |
+
specifier: ^2.5.27
|
53 |
+
version: 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))
|
54 |
'@sveltejs/vite-plugin-svelte':
|
55 |
+
specifier: ^4.0.0
|
56 |
+
version: 4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))
|
57 |
+
'@tailwindcss/container-queries':
|
58 |
+
specifier: ^0.1.1
|
59 |
+
version: 0.1.1(tailwindcss@4.0.9)
|
60 |
'@tailwindcss/postcss':
|
61 |
specifier: ^4.0.9
|
62 |
version: 4.0.9
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
clsx:
|
64 |
specifier: ^2.1.1
|
65 |
version: 2.1.1
|
66 |
eslint:
|
67 |
+
specifier: ^9.22.0
|
68 |
+
version: 9.22.0(jiti@2.4.2)
|
69 |
eslint-config-prettier:
|
70 |
+
specifier: ^10.1.1
|
71 |
+
version: 10.1.1(eslint@9.22.0(jiti@2.4.2))
|
72 |
+
eslint-plugin-prettier:
|
73 |
+
specifier: ^5.2.3
|
74 |
+
version: 5.2.3(eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2))(prettier@3.5.3)
|
75 |
+
globals:
|
76 |
+
specifier: ^16.0.0
|
77 |
+
version: 16.0.0
|
78 |
highlight.js:
|
79 |
specifier: ^11.10.0
|
80 |
version: 11.11.1
|
81 |
+
jiti:
|
82 |
+
specifier: ^2.4.2
|
83 |
+
version: 2.4.2
|
84 |
+
melt:
|
85 |
+
specifier: ^0.18.4
|
86 |
+
version: 0.18.4(@floating-ui/dom@1.6.13)(svelte@5.23.0)
|
87 |
postcss:
|
88 |
specifier: ^8.4.38
|
89 |
version: 8.5.3
|
|
|
91 |
specifier: ^3.1.1
|
92 |
version: 3.5.3
|
93 |
prettier-plugin-svelte:
|
94 |
+
specifier: ^3.2.6
|
95 |
+
version: 3.3.3(prettier@3.5.3)(svelte@5.23.0)
|
96 |
prettier-plugin-tailwindcss:
|
97 |
specifier: ^0.6.11
|
98 |
+
version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.23.0))(prettier@3.5.3)
|
99 |
+
runed:
|
100 |
+
specifier: ^0.24.0
|
101 |
+
version: 0.24.0(svelte@5.23.0)
|
102 |
svelte:
|
103 |
+
specifier: ^5.20.4
|
104 |
+
version: 5.23.0
|
105 |
svelte-check:
|
106 |
+
specifier: ^4.0.0
|
107 |
+
version: 4.1.5(picomatch@4.0.2)(svelte@5.23.0)(typescript@5.8.2)
|
108 |
tailwind-merge:
|
109 |
specifier: ^3.0.2
|
110 |
version: 3.0.2
|
|
|
120 |
typescript:
|
121 |
specifier: ^5.8.2
|
122 |
version: 5.8.2
|
123 |
+
typescript-eslint:
|
124 |
+
specifier: ^8.26.1
|
125 |
+
version: 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
|
126 |
unplugin-icons:
|
127 |
specifier: ^22.1.0
|
128 |
+
version: 22.1.0(svelte@5.23.0)
|
129 |
vite:
|
130 |
+
specifier: ^5.4.4
|
131 |
version: 5.4.14(lightningcss@1.29.1)
|
132 |
|
133 |
packages:
|
|
|
444 |
resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
|
445 |
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
|
446 |
|
447 |
+
'@eslint/config-array@0.19.2':
|
448 |
+
resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==}
|
449 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
450 |
|
451 |
+
'@eslint/config-helpers@0.1.0':
|
452 |
+
resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==}
|
453 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
454 |
+
|
455 |
+
'@eslint/core@0.12.0':
|
456 |
+
resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==}
|
457 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
458 |
+
|
459 |
+
'@eslint/eslintrc@3.3.0':
|
460 |
+
resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==}
|
461 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
462 |
+
|
463 |
+
'@eslint/js@9.22.0':
|
464 |
+
resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==}
|
465 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
466 |
+
|
467 |
+
'@eslint/object-schema@2.1.6':
|
468 |
+
resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
|
469 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
470 |
+
|
471 |
+
'@eslint/plugin-kit@0.2.7':
|
472 |
+
resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==}
|
473 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
474 |
|
475 |
'@floating-ui/core@1.6.9':
|
476 |
resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
|
|
|
495 |
'@huggingface/tasks@0.17.1':
|
496 |
resolution: {integrity: sha512-kN5F/pzwxtmdZ0jORumNyegNKOX/ciU5G/DMZcqK3SJShod4C6yfvBRCMn5sEDzanxtU8VjX+7TaInQFmmU8Nw==}
|
497 |
|
498 |
+
'@humanfs/core@0.19.1':
|
499 |
+
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
|
500 |
+
engines: {node: '>=18.18.0'}
|
501 |
+
|
502 |
+
'@humanfs/node@0.16.6':
|
503 |
+
resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
|
504 |
+
engines: {node: '>=18.18.0'}
|
505 |
|
506 |
'@humanwhocodes/module-importer@1.0.1':
|
507 |
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
|
508 |
engines: {node: '>=12.22'}
|
509 |
|
510 |
+
'@humanwhocodes/retry@0.3.1':
|
511 |
+
resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
|
512 |
+
engines: {node: '>=18.18'}
|
513 |
+
|
514 |
+
'@humanwhocodes/retry@0.4.2':
|
515 |
+
resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
|
516 |
+
engines: {node: '>=18.18'}
|
517 |
|
518 |
'@iconify-json/carbon@1.2.8':
|
519 |
resolution: {integrity: sha512-6xh4YiFBz6qoSnB3XMe23WvjTJroDFXB17J1MbiT7nATFe+70+em1acRXr8hgP/gYpwFMHFc4IvjA/IPTPnTzg==}
|
520 |
|
521 |
+
'@iconify-json/material-symbols@1.2.15':
|
522 |
+
resolution: {integrity: sha512-KkHRnMh1s08N1Olf3xk+z3ZIrke/7Ys3uUIMfKuSkZPbNssG4IApKkJOV5po6mg6oxMooXdNpab4PS0S5LMSOA==}
|
523 |
+
|
524 |
'@iconify/types@2.0.0':
|
525 |
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
|
526 |
|
527 |
'@iconify/utils@2.3.0':
|
528 |
resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
|
529 |
|
530 |
+
'@jest/schemas@29.6.3':
|
531 |
+
resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
|
532 |
+
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
533 |
|
534 |
'@jridgewell/gen-mapping@0.3.8':
|
535 |
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
|
|
|
549 |
'@jridgewell/trace-mapping@0.3.25':
|
550 |
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
|
551 |
|
|
|
|
|
|
|
|
|
|
|
552 |
'@nodelib/fs.scandir@2.1.5':
|
553 |
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
554 |
engines: {node: '>= 8'}
|
|
|
561 |
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
562 |
engines: {node: '>= 8'}
|
563 |
|
564 |
+
'@pkgr/core@0.1.1':
|
565 |
+
resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
|
566 |
+
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
|
567 |
+
|
568 |
'@polka/url@1.0.0-next.28':
|
569 |
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
|
570 |
|
|
|
705 |
'@samchon/openapi@3.0.0':
|
706 |
resolution: {integrity: sha512-eVQlyKRYv1/C2Mikc1xZr7c0jMjg1vjPkeY/gheKB4c5WOOWyTNZ1uvnXR+ETpPHwaQ54I9NrQZhoNk6BEGuuw==}
|
707 |
|
708 |
+
'@sinclair/typebox@0.27.8':
|
709 |
+
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
|
710 |
+
|
711 |
+
'@sveltejs/acorn-typescript@1.0.5':
|
712 |
+
resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==}
|
713 |
+
peerDependencies:
|
714 |
+
acorn: ^8.9.0
|
715 |
+
|
716 |
'@sveltejs/adapter-auto@3.3.1':
|
717 |
resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==}
|
718 |
peerDependencies:
|
|
|
732 |
svelte: ^4.0.0 || ^5.0.0-next.0
|
733 |
vite: ^5.0.3 || ^6.0.0
|
734 |
|
735 |
+
'@sveltejs/vite-plugin-svelte-inspector@3.0.1':
|
736 |
+
resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==}
|
737 |
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22}
|
738 |
peerDependencies:
|
739 |
+
'@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0
|
740 |
+
svelte: ^5.0.0-next.96 || ^5.0.0
|
741 |
vite: ^5.0.0
|
742 |
|
743 |
+
'@sveltejs/vite-plugin-svelte@4.0.4':
|
744 |
+
resolution: {integrity: sha512-0ba1RQ/PHen5FGpdSrW7Y3fAMQjrXantECALeOiOdBdzR5+5vPP6HVZRLmZaQL+W8m++o+haIAKq5qT+MiZ7VA==}
|
745 |
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22}
|
746 |
peerDependencies:
|
747 |
+
svelte: ^5.0.0-next.96 || ^5.0.0
|
748 |
vite: ^5.0.0
|
749 |
|
|
|
|
|
|
|
750 |
'@tailwindcss/container-queries@0.1.1':
|
751 |
resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==}
|
752 |
peerDependencies:
|
|
|
837 |
'@types/json-schema@7.0.15':
|
838 |
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
|
839 |
|
|
|
|
|
|
|
840 |
'@types/resolve@1.20.2':
|
841 |
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
|
842 |
|
843 |
+
'@typescript-eslint/eslint-plugin@8.26.1':
|
844 |
+
resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==}
|
845 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
|
|
|
|
|
|
846 |
peerDependencies:
|
847 |
+
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
|
848 |
+
eslint: ^8.57.0 || ^9.0.0
|
849 |
+
typescript: '>=4.8.4 <5.9.0'
|
|
|
|
|
|
|
850 |
|
851 |
+
'@typescript-eslint/parser@8.26.1':
|
852 |
+
resolution: {integrity: sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==}
|
853 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
854 |
peerDependencies:
|
855 |
+
eslint: ^8.57.0 || ^9.0.0
|
856 |
+
typescript: '>=4.8.4 <5.9.0'
|
|
|
|
|
|
|
857 |
|
858 |
+
'@typescript-eslint/scope-manager@8.26.1':
|
859 |
+
resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==}
|
860 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
861 |
|
862 |
+
'@typescript-eslint/type-utils@8.26.1':
|
863 |
+
resolution: {integrity: sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==}
|
864 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
865 |
peerDependencies:
|
866 |
+
eslint: ^8.57.0 || ^9.0.0
|
867 |
+
typescript: '>=4.8.4 <5.9.0'
|
|
|
|
|
|
|
868 |
|
869 |
+
'@typescript-eslint/types@8.26.1':
|
870 |
+
resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==}
|
871 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
872 |
|
873 |
+
'@typescript-eslint/typescript-estree@8.26.1':
|
874 |
+
resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==}
|
875 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
876 |
peerDependencies:
|
877 |
+
typescript: '>=4.8.4 <5.9.0'
|
|
|
|
|
|
|
878 |
|
879 |
+
'@typescript-eslint/utils@8.26.1':
|
880 |
+
resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==}
|
881 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
882 |
peerDependencies:
|
883 |
+
eslint: ^8.57.0 || ^9.0.0
|
884 |
+
typescript: '>=4.8.4 <5.9.0'
|
|
|
|
|
|
|
885 |
|
886 |
+
'@typescript-eslint/visitor-keys@8.26.1':
|
887 |
+
resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==}
|
888 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
889 |
|
890 |
acorn-jsx@5.3.2:
|
891 |
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
|
|
|
912 |
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
|
913 |
engines: {node: '>=8'}
|
914 |
|
915 |
+
ansi-styles@5.2.0:
|
916 |
+
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
|
917 |
+
engines: {node: '>=10'}
|
918 |
|
919 |
argparse@2.0.1:
|
920 |
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
|
|
926 |
array-timsort@1.0.3:
|
927 |
resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
|
928 |
|
929 |
+
axe-core@4.9.1:
|
930 |
+
resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==}
|
931 |
+
engines: {node: '>=4'}
|
932 |
|
933 |
axobject-query@4.1.0:
|
934 |
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
|
|
|
940 |
base64-js@1.5.1:
|
941 |
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
942 |
|
|
|
|
|
|
|
|
|
943 |
bl@4.1.0:
|
944 |
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
|
945 |
|
|
|
953 |
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
954 |
engines: {node: '>=8'}
|
955 |
|
|
|
|
|
|
|
|
|
956 |
buffer@5.7.1:
|
957 |
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
|
958 |
|
|
|
967 |
chardet@0.7.0:
|
968 |
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
|
969 |
|
970 |
+
chokidar@4.0.3:
|
971 |
+
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
|
972 |
+
engines: {node: '>= 14.16.0'}
|
973 |
|
974 |
cli-cursor@3.1.0:
|
975 |
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
|
|
|
991 |
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
|
992 |
engines: {node: '>=6'}
|
993 |
|
|
|
|
|
|
|
994 |
color-convert@2.0.1:
|
995 |
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
996 |
engines: {node: '>=7.0.0'}
|
|
|
1036 |
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
1037 |
engines: {node: '>= 8'}
|
1038 |
|
|
|
|
|
|
|
|
|
1039 |
cssesc@3.0.0:
|
1040 |
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
|
1041 |
engines: {node: '>=4'}
|
|
|
1063 |
defu@6.1.4:
|
1064 |
resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
|
1065 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1066 |
detect-libc@1.0.3:
|
1067 |
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
|
1068 |
engines: {node: '>=0.10'}
|
|
|
1074 |
diff-match-patch@1.0.5:
|
1075 |
resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==}
|
1076 |
|
1077 |
+
diff-sequences@29.6.3:
|
1078 |
+
resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
|
1079 |
+
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
|
|
|
|
|
|
|
|
1080 |
|
1081 |
drange@1.1.1:
|
1082 |
resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==}
|
|
|
1089 |
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
|
1090 |
engines: {node: '>=10.13.0'}
|
1091 |
|
|
|
|
|
|
|
1092 |
esbuild@0.21.5:
|
1093 |
resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
|
1094 |
engines: {node: '>=12'}
|
|
|
1107 |
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
1108 |
engines: {node: '>=10'}
|
1109 |
|
1110 |
+
eslint-compat-utils@0.6.4:
|
1111 |
+
resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==}
|
1112 |
engines: {node: '>=12'}
|
1113 |
peerDependencies:
|
1114 |
eslint: '>=6.0.0'
|
1115 |
|
1116 |
+
eslint-config-prettier@10.1.1:
|
1117 |
+
resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
|
1118 |
hasBin: true
|
1119 |
peerDependencies:
|
1120 |
eslint: '>=7.0.0'
|
1121 |
|
1122 |
+
eslint-plugin-prettier@5.2.3:
|
1123 |
+
resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==}
|
1124 |
+
engines: {node: ^14.18.0 || >=16.0.0}
|
1125 |
+
peerDependencies:
|
1126 |
+
'@types/eslint': '>=8.0.0'
|
1127 |
+
eslint: '>=8.0.0'
|
1128 |
+
eslint-config-prettier: '*'
|
1129 |
+
prettier: '>=3.0.0'
|
1130 |
+
peerDependenciesMeta:
|
1131 |
+
'@types/eslint':
|
1132 |
+
optional: true
|
1133 |
+
eslint-config-prettier:
|
1134 |
+
optional: true
|
1135 |
+
|
1136 |
+
eslint-plugin-svelte@3.3.1:
|
1137 |
+
resolution: {integrity: sha512-5p3JGBMautDKtQdNmHkp33akcssAqZObV955UREa8v1thDDRG6sCj8gQMztQRRDFJiGsBdWgLWEB5HrdKg5B2w==}
|
1138 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
1139 |
peerDependencies:
|
1140 |
+
eslint: ^8.57.1 || ^9.0.0
|
1141 |
svelte: ^3.37.0 || ^4.0.0 || ^5.0.0
|
1142 |
peerDependenciesMeta:
|
1143 |
svelte:
|
1144 |
optional: true
|
1145 |
|
1146 |
+
eslint-scope@8.3.0:
|
1147 |
+
resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==}
|
1148 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
1149 |
|
1150 |
eslint-visitor-keys@3.4.3:
|
1151 |
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
|
1152 |
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
1153 |
|
1154 |
+
eslint-visitor-keys@4.2.0:
|
1155 |
+
resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
|
1156 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
1157 |
+
|
1158 |
+
eslint@9.22.0:
|
1159 |
+
resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==}
|
1160 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
1161 |
hasBin: true
|
1162 |
+
peerDependencies:
|
1163 |
+
jiti: '*'
|
1164 |
+
peerDependenciesMeta:
|
1165 |
+
jiti:
|
1166 |
+
optional: true
|
1167 |
|
1168 |
esm-env@1.2.2:
|
1169 |
resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
|
1170 |
|
1171 |
+
espree@10.3.0:
|
1172 |
+
resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
|
1173 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
1174 |
|
1175 |
esprima@4.0.1:
|
1176 |
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
|
|
|
1181 |
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
|
1182 |
engines: {node: '>=0.10'}
|
1183 |
|
1184 |
+
esrap@1.4.5:
|
1185 |
+
resolution: {integrity: sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g==}
|
1186 |
+
|
1187 |
esrecurse@4.3.0:
|
1188 |
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
|
1189 |
engines: {node: '>=4.0'}
|
|
|
1195 |
estree-walker@2.0.2:
|
1196 |
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
|
1197 |
|
|
|
|
|
|
|
1198 |
esutils@2.0.3:
|
1199 |
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
1200 |
engines: {node: '>=0.10.0'}
|
|
|
1209 |
fast-deep-equal@3.1.3:
|
1210 |
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
|
1211 |
|
1212 |
+
fast-diff@1.3.0:
|
1213 |
+
resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
|
1214 |
+
|
1215 |
fast-glob@3.3.3:
|
1216 |
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
|
1217 |
engines: {node: '>=8.6.0'}
|
|
|
1237 |
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
|
1238 |
engines: {node: '>=8'}
|
1239 |
|
1240 |
+
file-entry-cache@8.0.0:
|
1241 |
+
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
|
1242 |
+
engines: {node: '>=16.0.0'}
|
1243 |
|
1244 |
fill-range@7.1.1:
|
1245 |
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
|
|
|
1257 |
resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==}
|
1258 |
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
1259 |
|
1260 |
+
flat-cache@4.0.1:
|
1261 |
+
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
|
1262 |
+
engines: {node: '>=16'}
|
1263 |
|
1264 |
flatted@3.3.3:
|
1265 |
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
|
1266 |
|
|
|
|
|
|
|
|
|
|
|
|
|
1267 |
fsevents@2.3.3:
|
1268 |
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
1269 |
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
|
|
1280 |
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
1281 |
engines: {node: '>=10.13.0'}
|
1282 |
|
|
|
|
|
|
|
|
|
1283 |
global-prefix@4.0.0:
|
1284 |
resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==}
|
1285 |
engines: {node: '>=16'}
|
1286 |
|
1287 |
+
globals@14.0.0:
|
1288 |
+
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
|
1289 |
+
engines: {node: '>=18'}
|
1290 |
|
1291 |
globals@15.15.0:
|
1292 |
resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
|
1293 |
engines: {node: '>=18'}
|
1294 |
|
1295 |
+
globals@16.0.0:
|
1296 |
+
resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==}
|
1297 |
+
engines: {node: '>=18'}
|
1298 |
|
1299 |
graceful-fs@4.2.11:
|
1300 |
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
|
|
1340 |
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
|
1341 |
engines: {node: '>=0.8.19'}
|
1342 |
|
|
|
|
|
|
|
|
|
1343 |
inherits@2.0.4:
|
1344 |
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
1345 |
|
|
|
1351 |
resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
|
1352 |
engines: {node: '>=12.0.0'}
|
1353 |
|
|
|
|
|
|
|
|
|
1354 |
is-core-module@2.16.1:
|
1355 |
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
|
1356 |
engines: {node: '>= 0.4'}
|
|
|
1378 |
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
|
1379 |
engines: {node: '>=0.12.0'}
|
1380 |
|
|
|
|
|
|
|
|
|
1381 |
is-reference@1.2.1:
|
1382 |
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
|
1383 |
|
|
|
1395 |
resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
|
1396 |
engines: {node: '>=16'}
|
1397 |
|
1398 |
+
jest-axe@9.0.0:
|
1399 |
+
resolution: {integrity: sha512-Xt7O0+wIpW31lv0SO1wQZUTyJE7DEmnDEZeTt9/S9L5WUywxrv8BrgvTuQEqujtfaQOcJ70p4wg7UUgK1E2F5g==}
|
1400 |
+
engines: {node: '>= 16.0.0'}
|
1401 |
+
|
1402 |
+
jest-diff@29.7.0:
|
1403 |
+
resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
|
1404 |
+
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
1405 |
+
|
1406 |
+
jest-get-type@29.6.3:
|
1407 |
+
resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
|
1408 |
+
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
1409 |
+
|
1410 |
+
jest-matcher-utils@29.2.2:
|
1411 |
+
resolution: {integrity: sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==}
|
1412 |
+
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
1413 |
+
|
1414 |
jiti@2.4.2:
|
1415 |
resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
|
1416 |
hasBin: true
|
|
|
1517 |
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
|
1518 |
engines: {node: '>=10'}
|
1519 |
|
|
|
|
|
|
|
|
|
1520 |
local-pkg@1.1.1:
|
1521 |
resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
|
1522 |
engines: {node: '>=14'}
|
|
|
1545 |
magic-string@0.30.17:
|
1546 |
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
|
1547 |
|
1548 |
+
melt@0.18.4:
|
1549 |
+
resolution: {integrity: sha512-AH7im4MEmHS/8MFhGDnfiuF4ibdm0guFWiBvBaF93YIzA0hhuWMcGxD8HdEsQ8q1Q6xIIRm9FdGd0WICc7Nk2A==}
|
1550 |
+
peerDependencies:
|
1551 |
+
'@floating-ui/dom': ^1.6.0
|
1552 |
+
svelte: ^5.0.0
|
1553 |
|
1554 |
merge2@1.4.1:
|
1555 |
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
|
|
1563 |
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
|
1564 |
engines: {node: '>=6'}
|
1565 |
|
|
|
|
|
|
|
|
|
1566 |
minimatch@3.1.2:
|
1567 |
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
1568 |
|
1569 |
+
minimatch@9.0.5:
|
1570 |
+
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
|
1571 |
engines: {node: '>=16 || 14 >=14.17'}
|
1572 |
|
1573 |
minimist@1.2.8:
|
1574 |
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
|
1575 |
|
|
|
|
|
|
|
|
|
1576 |
mlly@1.7.4:
|
1577 |
resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
|
1578 |
|
|
|
1603 |
natural-compare@1.4.0:
|
1604 |
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
|
1605 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1606 |
onetime@5.1.2:
|
1607 |
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
|
1608 |
engines: {node: '>=6'}
|
|
|
1650 |
resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
|
1651 |
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
1652 |
|
|
|
|
|
|
|
|
|
1653 |
path-key@3.1.1:
|
1654 |
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
1655 |
engines: {node: '>=8'}
|
|
|
1657 |
path-parse@1.0.7:
|
1658 |
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
1659 |
|
|
|
|
|
|
|
|
|
1660 |
pathe@1.1.2:
|
1661 |
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
|
1662 |
|
1663 |
pathe@2.0.3:
|
1664 |
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
|
1665 |
|
|
|
|
|
|
|
1666 |
picocolors@1.1.1:
|
1667 |
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
|
1668 |
|
|
|
1696 |
ts-node:
|
1697 |
optional: true
|
1698 |
|
1699 |
+
postcss-safe-parser@7.0.1:
|
1700 |
+
resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==}
|
1701 |
+
engines: {node: '>=18.0'}
|
1702 |
peerDependencies:
|
1703 |
+
postcss: ^8.4.31
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1704 |
|
1705 |
postcss-scss@4.0.9:
|
1706 |
resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
|
|
|
1708 |
peerDependencies:
|
1709 |
postcss: ^8.4.29
|
1710 |
|
1711 |
+
postcss-selector-parser@7.1.0:
|
1712 |
+
resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
|
1713 |
engines: {node: '>=4'}
|
1714 |
|
1715 |
postcss@8.5.3:
|
|
|
1720 |
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
1721 |
engines: {node: '>= 0.8.0'}
|
1722 |
|
1723 |
+
prettier-linter-helpers@1.0.0:
|
1724 |
+
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
|
1725 |
+
engines: {node: '>=6.0.0'}
|
1726 |
+
|
1727 |
prettier-plugin-svelte@3.3.3:
|
1728 |
resolution: {integrity: sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==}
|
1729 |
peerDependencies:
|
|
|
1790 |
engines: {node: '>=14'}
|
1791 |
hasBin: true
|
1792 |
|
1793 |
+
pretty-format@29.7.0:
|
1794 |
+
resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
|
1795 |
+
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
1796 |
+
|
1797 |
punycode@2.3.1:
|
1798 |
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
1799 |
engines: {node: '>=6'}
|
|
|
1808 |
resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==}
|
1809 |
engines: {node: '>=4'}
|
1810 |
|
1811 |
+
react-is@18.3.1:
|
1812 |
+
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
|
1813 |
+
|
1814 |
readable-stream@3.6.2:
|
1815 |
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
|
1816 |
engines: {node: '>= 6'}
|
1817 |
|
1818 |
+
readdirp@4.1.2:
|
1819 |
+
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
|
1820 |
+
engines: {node: '>= 14.18.0'}
|
1821 |
|
1822 |
repeat-string@1.6.1:
|
1823 |
resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
|
|
|
1844 |
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
|
1845 |
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
|
1846 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1847 |
rollup@4.34.9:
|
1848 |
resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==}
|
1849 |
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
|
|
1856 |
run-parallel@1.2.0:
|
1857 |
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
|
1858 |
|
1859 |
+
runed@0.23.4:
|
1860 |
+
resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==}
|
1861 |
+
peerDependencies:
|
1862 |
+
svelte: ^5.7.0
|
1863 |
+
|
1864 |
+
runed@0.24.0:
|
1865 |
+
resolution: {integrity: sha512-kLp0qUdiwEn1Q9zrQlToN7g1PQ+F0XI7J3eABPi/hSwMMy0vEQAdmZQkCvy1BtynAmGiD8CwNSy06KH7iUsCNg==}
|
1866 |
+
peerDependencies:
|
1867 |
+
svelte: ^5.7.0
|
1868 |
+
|
1869 |
rxjs@7.8.2:
|
1870 |
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
|
1871 |
|
|
|
1879 |
safer-buffer@2.1.2:
|
1880 |
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
1881 |
|
|
|
|
|
|
|
1882 |
semver@7.7.1:
|
1883 |
resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
|
1884 |
engines: {node: '>=10'}
|
|
|
1902 |
resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==}
|
1903 |
engines: {node: '>=18'}
|
1904 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1905 |
source-map-js@1.2.1:
|
1906 |
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
|
1907 |
engines: {node: '>=0.10.0'}
|
|
|
1917 |
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
|
1918 |
engines: {node: '>=8'}
|
1919 |
|
|
|
|
|
|
|
|
|
1920 |
strip-json-comments@3.1.1:
|
1921 |
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
1922 |
engines: {node: '>=8'}
|
|
|
1929 |
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
|
1930 |
engines: {node: '>= 0.4'}
|
1931 |
|
1932 |
+
svelte-check@4.1.5:
|
1933 |
+
resolution: {integrity: sha512-Gb0T2IqBNe1tLB9EB1Qh+LOe+JB8wt2/rNBDGvkxQVvk8vNeAoG+vZgFB/3P5+zC7RWlyBlzm9dVjZFph/maIg==}
|
1934 |
+
engines: {node: '>= 18.0.0'}
|
1935 |
hasBin: true
|
1936 |
peerDependencies:
|
1937 |
+
svelte: ^4.0.0 || ^5.0.0-next.0
|
1938 |
+
typescript: '>=5.0.0'
|
1939 |
|
1940 |
+
svelte-eslint-parser@1.1.0:
|
1941 |
+
resolution: {integrity: sha512-JP0v/wzDXWxza6c8K9ZjKKHYfgt0KidlbWx1e9n9UV4q+o28GTkk71fR0IDZDmLUDYs3vSq0+Tm9fofDqzGe1w==}
|
1942 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
1943 |
peerDependencies:
|
1944 |
svelte: ^3.37.0 || ^4.0.0 || ^5.0.0
|
1945 |
peerDependenciesMeta:
|
1946 |
svelte:
|
1947 |
optional: true
|
1948 |
|
1949 |
+
svelte@5.23.0:
|
1950 |
+
resolution: {integrity: sha512-v0lL3NuKontiCxholEiAXCB+BYbndlKbwlDMK0DS86WgGELMJSpyqCSbJeMEMBDwOglnS7Ar2Rq0wwa/z2L8Vg==}
|
1951 |
+
engines: {node: '>=18'}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1952 |
|
1953 |
+
synckit@0.9.2:
|
1954 |
+
resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
|
1955 |
+
engines: {node: ^14.18.0 || >=16.0.0}
|
1956 |
|
1957 |
tailwind-merge@3.0.2:
|
1958 |
resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==}
|
|
|
1964 |
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
|
1965 |
engines: {node: '>=6'}
|
1966 |
|
|
|
|
|
|
|
1967 |
through@2.3.8:
|
1968 |
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
|
1969 |
|
|
|
1982 |
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
|
1983 |
engines: {node: '>=6'}
|
1984 |
|
1985 |
+
ts-api-utils@2.0.1:
|
1986 |
+
resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==}
|
1987 |
+
engines: {node: '>=18.12'}
|
1988 |
peerDependencies:
|
1989 |
+
typescript: '>=4.8.4'
|
1990 |
|
1991 |
ts-patch@3.3.0:
|
1992 |
resolution: {integrity: sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==}
|
|
|
1999 |
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
2000 |
engines: {node: '>= 0.8.0'}
|
2001 |
|
|
|
|
|
|
|
|
|
2002 |
type-fest@0.21.3:
|
2003 |
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
|
2004 |
engines: {node: '>=10'}
|
|
|
2007 |
resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==}
|
2008 |
engines: {node: '>=16'}
|
2009 |
|
2010 |
+
typescript-eslint@8.26.1:
|
2011 |
+
resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==}
|
2012 |
+
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
2013 |
+
peerDependencies:
|
2014 |
+
eslint: ^8.57.0 || ^9.0.0
|
2015 |
+
typescript: '>=4.8.4 <5.9.0'
|
2016 |
+
|
2017 |
typescript@5.6.3:
|
2018 |
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
|
2019 |
engines: {node: '>=14.17'}
|
|
|
2149 |
yaml:
|
2150 |
optional: true
|
2151 |
|
2152 |
+
vitefu@1.0.6:
|
2153 |
+
resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==}
|
2154 |
peerDependencies:
|
2155 |
+
vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
|
2156 |
peerDependenciesMeta:
|
2157 |
vite:
|
2158 |
optional: true
|
|
|
2181 |
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
|
2182 |
engines: {node: '>=8'}
|
2183 |
|
|
|
|
|
|
|
2184 |
yaml@1.10.2:
|
2185 |
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
|
2186 |
engines: {node: '>= 6'}
|
|
|
2198 |
resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==}
|
2199 |
engines: {node: '>=12.20'}
|
2200 |
|
2201 |
+
zimmerframe@1.1.2:
|
2202 |
+
resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==}
|
2203 |
+
|
2204 |
snapshots:
|
2205 |
|
2206 |
'@alloc/quick-lru@5.2.0': {}
|
|
|
2361 |
'@esbuild/win32-x64@0.25.1':
|
2362 |
optional: true
|
2363 |
|
2364 |
+
'@eslint-community/eslint-utils@4.4.1(eslint@9.22.0(jiti@2.4.2))':
|
2365 |
dependencies:
|
2366 |
+
eslint: 9.22.0(jiti@2.4.2)
|
2367 |
eslint-visitor-keys: 3.4.3
|
2368 |
|
2369 |
'@eslint-community/regexpp@4.12.1': {}
|
2370 |
|
2371 |
+
'@eslint/config-array@0.19.2':
|
2372 |
+
dependencies:
|
2373 |
+
'@eslint/object-schema': 2.1.6
|
2374 |
+
debug: 4.4.0
|
2375 |
+
minimatch: 3.1.2
|
2376 |
+
transitivePeerDependencies:
|
2377 |
+
- supports-color
|
2378 |
+
|
2379 |
+
'@eslint/config-helpers@0.1.0': {}
|
2380 |
+
|
2381 |
+
'@eslint/core@0.12.0':
|
2382 |
+
dependencies:
|
2383 |
+
'@types/json-schema': 7.0.15
|
2384 |
+
|
2385 |
+
'@eslint/eslintrc@3.3.0':
|
2386 |
dependencies:
|
2387 |
ajv: 6.12.6
|
2388 |
debug: 4.4.0
|
2389 |
+
espree: 10.3.0
|
2390 |
+
globals: 14.0.0
|
2391 |
ignore: 5.3.2
|
2392 |
import-fresh: 3.3.1
|
2393 |
js-yaml: 4.1.0
|
|
|
2396 |
transitivePeerDependencies:
|
2397 |
- supports-color
|
2398 |
|
2399 |
+
'@eslint/js@9.22.0': {}
|
2400 |
+
|
2401 |
+
'@eslint/object-schema@2.1.6': {}
|
2402 |
+
|
2403 |
+
'@eslint/plugin-kit@0.2.7':
|
2404 |
+
dependencies:
|
2405 |
+
'@eslint/core': 0.12.0
|
2406 |
+
levn: 0.4.1
|
2407 |
|
2408 |
'@floating-ui/core@1.6.9':
|
2409 |
dependencies:
|
|
|
2428 |
|
2429 |
'@huggingface/tasks@0.17.1': {}
|
2430 |
|
2431 |
+
'@humanfs/core@0.19.1': {}
|
2432 |
+
|
2433 |
+
'@humanfs/node@0.16.6':
|
2434 |
dependencies:
|
2435 |
+
'@humanfs/core': 0.19.1
|
2436 |
+
'@humanwhocodes/retry': 0.3.1
|
|
|
|
|
|
|
2437 |
|
2438 |
'@humanwhocodes/module-importer@1.0.1': {}
|
2439 |
|
2440 |
+
'@humanwhocodes/retry@0.3.1': {}
|
2441 |
+
|
2442 |
+
'@humanwhocodes/retry@0.4.2': {}
|
2443 |
|
2444 |
'@iconify-json/carbon@1.2.8':
|
2445 |
dependencies:
|
2446 |
'@iconify/types': 2.0.0
|
2447 |
|
2448 |
+
'@iconify-json/material-symbols@1.2.15':
|
2449 |
+
dependencies:
|
2450 |
+
'@iconify/types': 2.0.0
|
2451 |
+
|
2452 |
'@iconify/types@2.0.0': {}
|
2453 |
|
2454 |
'@iconify/utils@2.3.0':
|
|
|
2464 |
transitivePeerDependencies:
|
2465 |
- supports-color
|
2466 |
|
2467 |
+
'@jest/schemas@29.6.3':
|
2468 |
dependencies:
|
2469 |
+
'@sinclair/typebox': 0.27.8
|
2470 |
|
2471 |
'@jridgewell/gen-mapping@0.3.8':
|
2472 |
dependencies:
|
|
|
2485 |
'@jridgewell/resolve-uri': 3.1.2
|
2486 |
'@jridgewell/sourcemap-codec': 1.5.0
|
2487 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2488 |
'@nodelib/fs.scandir@2.1.5':
|
2489 |
dependencies:
|
2490 |
'@nodelib/fs.stat': 2.0.5
|
|
|
2497 |
'@nodelib/fs.scandir': 2.1.5
|
2498 |
fastq: 1.19.1
|
2499 |
|
2500 |
+
'@pkgr/core@0.1.1': {}
|
2501 |
+
|
2502 |
'@polka/url@1.0.0-next.28': {}
|
2503 |
|
2504 |
'@rollup/plugin-commonjs@28.0.2(rollup@4.34.9)':
|
|
|
2626 |
|
2627 |
'@samchon/openapi@3.0.0': {}
|
2628 |
|
2629 |
+
'@sinclair/typebox@0.27.8': {}
|
2630 |
+
|
2631 |
+
'@sveltejs/acorn-typescript@1.0.5(acorn@8.14.0)':
|
2632 |
+
dependencies:
|
2633 |
+
acorn: 8.14.0
|
2634 |
+
|
2635 |
+
'@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))':
|
2636 |
dependencies:
|
2637 |
+
'@sveltejs/kit': 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))
|
2638 |
import-meta-resolve: 4.1.0
|
2639 |
|
2640 |
+
'@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))':
|
2641 |
dependencies:
|
2642 |
'@rollup/plugin-commonjs': 28.0.2(rollup@4.34.9)
|
2643 |
'@rollup/plugin-json': 6.1.0(rollup@4.34.9)
|
2644 |
'@rollup/plugin-node-resolve': 16.0.0(rollup@4.34.9)
|
2645 |
+
'@sveltejs/kit': 2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))
|
2646 |
rollup: 4.34.9
|
2647 |
|
2648 |
+
'@sveltejs/kit@2.18.0(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))':
|
2649 |
dependencies:
|
2650 |
+
'@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))
|
2651 |
'@types/cookie': 0.6.0
|
2652 |
cookie: 0.6.0
|
2653 |
devalue: 5.1.1
|
|
|
2659 |
sade: 1.8.1
|
2660 |
set-cookie-parser: 2.7.1
|
2661 |
sirv: 3.0.1
|
2662 |
+
svelte: 5.23.0
|
2663 |
vite: 5.4.14(lightningcss@1.29.1)
|
2664 |
|
2665 |
+
'@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))':
|
2666 |
dependencies:
|
2667 |
+
'@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))
|
2668 |
debug: 4.4.0
|
2669 |
+
svelte: 5.23.0
|
2670 |
vite: 5.4.14(lightningcss@1.29.1)
|
2671 |
transitivePeerDependencies:
|
2672 |
- supports-color
|
2673 |
|
2674 |
+
'@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))':
|
2675 |
dependencies:
|
2676 |
+
'@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1)))(svelte@5.23.0)(vite@5.4.14(lightningcss@1.29.1))
|
2677 |
debug: 4.4.0
|
2678 |
deepmerge: 4.3.1
|
2679 |
kleur: 4.1.5
|
2680 |
magic-string: 0.30.17
|
2681 |
+
svelte: 5.23.0
|
|
|
2682 |
vite: 5.4.14(lightningcss@1.29.1)
|
2683 |
+
vitefu: 1.0.6(vite@5.4.14(lightningcss@1.29.1))
|
2684 |
transitivePeerDependencies:
|
2685 |
- supports-color
|
2686 |
|
|
|
|
|
|
|
|
|
2687 |
'@tailwindcss/container-queries@0.1.1(tailwindcss@4.0.9)':
|
2688 |
dependencies:
|
2689 |
tailwindcss: 4.0.9
|
|
|
2756 |
|
2757 |
'@types/json-schema@7.0.15': {}
|
2758 |
|
|
|
|
|
2759 |
'@types/resolve@1.20.2': {}
|
2760 |
|
2761 |
+
'@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)':
|
|
|
|
|
2762 |
dependencies:
|
2763 |
'@eslint-community/regexpp': 4.12.1
|
2764 |
+
'@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
|
2765 |
+
'@typescript-eslint/scope-manager': 8.26.1
|
2766 |
+
'@typescript-eslint/type-utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
|
2767 |
+
'@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
|
2768 |
+
'@typescript-eslint/visitor-keys': 8.26.1
|
2769 |
+
eslint: 9.22.0(jiti@2.4.2)
|
|
|
2770 |
graphemer: 1.4.0
|
2771 |
ignore: 5.3.2
|
2772 |
natural-compare: 1.4.0
|
2773 |
+
ts-api-utils: 2.0.1(typescript@5.8.2)
|
|
|
|
|
2774 |
typescript: 5.8.2
|
2775 |
transitivePeerDependencies:
|
2776 |
- supports-color
|
2777 |
|
2778 |
+
'@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)':
|
2779 |
dependencies:
|
2780 |
+
'@typescript-eslint/scope-manager': 8.26.1
|
2781 |
+
'@typescript-eslint/types': 8.26.1
|
2782 |
+
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2)
|
2783 |
+
'@typescript-eslint/visitor-keys': 8.26.1
|
2784 |
debug: 4.4.0
|
2785 |
+
eslint: 9.22.0(jiti@2.4.2)
|
|
|
2786 |
typescript: 5.8.2
|
2787 |
transitivePeerDependencies:
|
2788 |
- supports-color
|
2789 |
|
2790 |
+
'@typescript-eslint/scope-manager@8.26.1':
|
2791 |
dependencies:
|
2792 |
+
'@typescript-eslint/types': 8.26.1
|
2793 |
+
'@typescript-eslint/visitor-keys': 8.26.1
|
2794 |
|
2795 |
+
'@typescript-eslint/type-utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)':
|
2796 |
dependencies:
|
2797 |
+
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2)
|
2798 |
+
'@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
|
2799 |
debug: 4.4.0
|
2800 |
+
eslint: 9.22.0(jiti@2.4.2)
|
2801 |
+
ts-api-utils: 2.0.1(typescript@5.8.2)
|
|
|
2802 |
typescript: 5.8.2
|
2803 |
transitivePeerDependencies:
|
2804 |
- supports-color
|
2805 |
|
2806 |
+
'@typescript-eslint/types@8.26.1': {}
|
2807 |
|
2808 |
+
'@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2)':
|
2809 |
dependencies:
|
2810 |
+
'@typescript-eslint/types': 8.26.1
|
2811 |
+
'@typescript-eslint/visitor-keys': 8.26.1
|
2812 |
debug: 4.4.0
|
2813 |
+
fast-glob: 3.3.3
|
2814 |
is-glob: 4.0.3
|
2815 |
+
minimatch: 9.0.5
|
2816 |
semver: 7.7.1
|
2817 |
+
ts-api-utils: 2.0.1(typescript@5.8.2)
|
|
|
2818 |
typescript: 5.8.2
|
2819 |
transitivePeerDependencies:
|
2820 |
- supports-color
|
2821 |
|
2822 |
+
'@typescript-eslint/utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)':
|
2823 |
dependencies:
|
2824 |
+
'@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2))
|
2825 |
+
'@typescript-eslint/scope-manager': 8.26.1
|
2826 |
+
'@typescript-eslint/types': 8.26.1
|
2827 |
+
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2)
|
2828 |
+
eslint: 9.22.0(jiti@2.4.2)
|
2829 |
+
typescript: 5.8.2
|
|
|
|
|
2830 |
transitivePeerDependencies:
|
2831 |
- supports-color
|
|
|
2832 |
|
2833 |
+
'@typescript-eslint/visitor-keys@8.26.1':
|
2834 |
dependencies:
|
2835 |
+
'@typescript-eslint/types': 8.26.1
|
2836 |
+
eslint-visitor-keys: 4.2.0
|
|
|
|
|
2837 |
|
2838 |
acorn-jsx@5.3.2(acorn@8.14.0):
|
2839 |
dependencies:
|
|
|
2858 |
dependencies:
|
2859 |
color-convert: 2.0.1
|
2860 |
|
2861 |
+
ansi-styles@5.2.0: {}
|
|
|
|
|
|
|
2862 |
|
2863 |
argparse@2.0.1: {}
|
2864 |
|
|
|
2866 |
|
2867 |
array-timsort@1.0.3: {}
|
2868 |
|
2869 |
+
axe-core@4.9.1: {}
|
2870 |
|
2871 |
axobject-query@4.1.0: {}
|
2872 |
|
|
|
2874 |
|
2875 |
base64-js@1.5.1: {}
|
2876 |
|
|
|
|
|
2877 |
bl@4.1.0:
|
2878 |
dependencies:
|
2879 |
buffer: 5.7.1
|
|
|
2893 |
dependencies:
|
2894 |
fill-range: 7.1.1
|
2895 |
|
|
|
|
|
2896 |
buffer@5.7.1:
|
2897 |
dependencies:
|
2898 |
base64-js: 1.5.1
|
|
|
2907 |
|
2908 |
chardet@0.7.0: {}
|
2909 |
|
2910 |
+
chokidar@4.0.3:
|
2911 |
dependencies:
|
2912 |
+
readdirp: 4.1.2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2913 |
|
2914 |
cli-cursor@3.1.0:
|
2915 |
dependencies:
|
|
|
2923 |
|
2924 |
clsx@2.1.1: {}
|
2925 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2926 |
color-convert@2.0.1:
|
2927 |
dependencies:
|
2928 |
color-name: 1.1.4
|
|
|
2961 |
shebang-command: 2.0.0
|
2962 |
which: 2.0.2
|
2963 |
|
|
|
|
|
|
|
|
|
|
|
2964 |
cssesc@3.0.0: {}
|
2965 |
|
2966 |
debug@4.4.0:
|
|
|
2977 |
|
2978 |
defu@6.1.4: {}
|
2979 |
|
|
|
|
|
|
|
|
|
2980 |
detect-libc@1.0.3: {}
|
2981 |
|
2982 |
devalue@5.1.1: {}
|
2983 |
|
2984 |
diff-match-patch@1.0.5: {}
|
2985 |
|
2986 |
+
diff-sequences@29.6.3: {}
|
|
|
|
|
|
|
|
|
|
|
|
|
2987 |
|
2988 |
drange@1.1.1: {}
|
2989 |
|
|
|
2994 |
graceful-fs: 4.2.11
|
2995 |
tapable: 2.2.1
|
2996 |
|
|
|
|
|
2997 |
esbuild@0.21.5:
|
2998 |
optionalDependencies:
|
2999 |
'@esbuild/aix-ppc64': 0.21.5
|
|
|
3052 |
|
3053 |
escape-string-regexp@4.0.0: {}
|
3054 |
|
3055 |
+
eslint-compat-utils@0.6.4(eslint@9.22.0(jiti@2.4.2)):
|
3056 |
dependencies:
|
3057 |
+
eslint: 9.22.0(jiti@2.4.2)
|
3058 |
semver: 7.7.1
|
3059 |
|
3060 |
+
eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)):
|
3061 |
+
dependencies:
|
3062 |
+
eslint: 9.22.0(jiti@2.4.2)
|
3063 |
+
|
3064 |
+
eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.1(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2))(prettier@3.5.3):
|
3065 |
dependencies:
|
3066 |
+
eslint: 9.22.0(jiti@2.4.2)
|
3067 |
+
prettier: 3.5.3
|
3068 |
+
prettier-linter-helpers: 1.0.0
|
3069 |
+
synckit: 0.9.2
|
3070 |
+
optionalDependencies:
|
3071 |
+
eslint-config-prettier: 10.1.1(eslint@9.22.0(jiti@2.4.2))
|
3072 |
|
3073 |
+
eslint-plugin-svelte@3.3.1(eslint@9.22.0(jiti@2.4.2))(svelte@5.23.0):
|
3074 |
dependencies:
|
3075 |
+
'@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2))
|
3076 |
'@jridgewell/sourcemap-codec': 1.5.0
|
3077 |
+
eslint: 9.22.0(jiti@2.4.2)
|
3078 |
+
eslint-compat-utils: 0.6.4(eslint@9.22.0(jiti@2.4.2))
|
3079 |
esutils: 2.0.3
|
3080 |
known-css-properties: 0.35.0
|
3081 |
postcss: 8.5.3
|
3082 |
postcss-load-config: 3.1.4(postcss@8.5.3)
|
3083 |
+
postcss-safe-parser: 7.0.1(postcss@8.5.3)
|
|
|
3084 |
semver: 7.7.1
|
3085 |
+
svelte-eslint-parser: 1.1.0(svelte@5.23.0)
|
3086 |
optionalDependencies:
|
3087 |
+
svelte: 5.23.0
|
3088 |
transitivePeerDependencies:
|
3089 |
- ts-node
|
3090 |
|
3091 |
+
eslint-scope@8.3.0:
|
3092 |
dependencies:
|
3093 |
esrecurse: 4.3.0
|
3094 |
estraverse: 5.3.0
|
3095 |
|
3096 |
eslint-visitor-keys@3.4.3: {}
|
3097 |
|
3098 |
+
eslint-visitor-keys@4.2.0: {}
|
3099 |
+
|
3100 |
+
eslint@9.22.0(jiti@2.4.2):
|
3101 |
dependencies:
|
3102 |
+
'@eslint-community/eslint-utils': 4.4.1(eslint@9.22.0(jiti@2.4.2))
|
3103 |
'@eslint-community/regexpp': 4.12.1
|
3104 |
+
'@eslint/config-array': 0.19.2
|
3105 |
+
'@eslint/config-helpers': 0.1.0
|
3106 |
+
'@eslint/core': 0.12.0
|
3107 |
+
'@eslint/eslintrc': 3.3.0
|
3108 |
+
'@eslint/js': 9.22.0
|
3109 |
+
'@eslint/plugin-kit': 0.2.7
|
3110 |
+
'@humanfs/node': 0.16.6
|
3111 |
'@humanwhocodes/module-importer': 1.0.1
|
3112 |
+
'@humanwhocodes/retry': 0.4.2
|
3113 |
+
'@types/estree': 1.0.6
|
3114 |
+
'@types/json-schema': 7.0.15
|
3115 |
ajv: 6.12.6
|
3116 |
chalk: 4.1.2
|
3117 |
cross-spawn: 7.0.6
|
3118 |
debug: 4.4.0
|
|
|
3119 |
escape-string-regexp: 4.0.0
|
3120 |
+
eslint-scope: 8.3.0
|
3121 |
+
eslint-visitor-keys: 4.2.0
|
3122 |
+
espree: 10.3.0
|
3123 |
esquery: 1.6.0
|
3124 |
esutils: 2.0.3
|
3125 |
fast-deep-equal: 3.1.3
|
3126 |
+
file-entry-cache: 8.0.0
|
3127 |
find-up: 5.0.0
|
3128 |
glob-parent: 6.0.2
|
|
|
|
|
3129 |
ignore: 5.3.2
|
3130 |
imurmurhash: 0.1.4
|
3131 |
is-glob: 4.0.3
|
|
|
|
|
3132 |
json-stable-stringify-without-jsonify: 1.0.1
|
|
|
3133 |
lodash.merge: 4.6.2
|
3134 |
minimatch: 3.1.2
|
3135 |
natural-compare: 1.4.0
|
3136 |
optionator: 0.9.4
|
3137 |
+
optionalDependencies:
|
3138 |
+
jiti: 2.4.2
|
3139 |
transitivePeerDependencies:
|
3140 |
- supports-color
|
3141 |
|
3142 |
esm-env@1.2.2: {}
|
3143 |
|
3144 |
+
espree@10.3.0:
|
3145 |
dependencies:
|
3146 |
acorn: 8.14.0
|
3147 |
acorn-jsx: 5.3.2(acorn@8.14.0)
|
3148 |
+
eslint-visitor-keys: 4.2.0
|
3149 |
|
3150 |
esprima@4.0.1: {}
|
3151 |
|
|
|
3153 |
dependencies:
|
3154 |
estraverse: 5.3.0
|
3155 |
|
3156 |
+
esrap@1.4.5:
|
3157 |
+
dependencies:
|
3158 |
+
'@jridgewell/sourcemap-codec': 1.5.0
|
3159 |
+
|
3160 |
esrecurse@4.3.0:
|
3161 |
dependencies:
|
3162 |
estraverse: 5.3.0
|
|
|
3165 |
|
3166 |
estree-walker@2.0.2: {}
|
3167 |
|
|
|
|
|
|
|
|
|
3168 |
esutils@2.0.3: {}
|
3169 |
|
3170 |
exsolve@1.0.4: {}
|
|
|
3177 |
|
3178 |
fast-deep-equal@3.1.3: {}
|
3179 |
|
3180 |
+
fast-diff@1.3.0: {}
|
3181 |
+
|
3182 |
fast-glob@3.3.3:
|
3183 |
dependencies:
|
3184 |
'@nodelib/fs.stat': 2.0.5
|
|
|
3203 |
dependencies:
|
3204 |
escape-string-regexp: 1.0.5
|
3205 |
|
3206 |
+
file-entry-cache@8.0.0:
|
3207 |
dependencies:
|
3208 |
+
flat-cache: 4.0.1
|
3209 |
|
3210 |
fill-range@7.1.1:
|
3211 |
dependencies:
|
|
|
3226 |
locate-path: 7.2.0
|
3227 |
path-exists: 5.0.0
|
3228 |
|
3229 |
+
flat-cache@4.0.1:
|
3230 |
dependencies:
|
3231 |
flatted: 3.3.3
|
3232 |
keyv: 4.5.4
|
|
|
3233 |
|
3234 |
flatted@3.3.3: {}
|
3235 |
|
|
|
|
|
|
|
|
|
|
|
|
|
3236 |
fsevents@2.3.3:
|
3237 |
optional: true
|
3238 |
|
|
|
3246 |
dependencies:
|
3247 |
is-glob: 4.0.3
|
3248 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3249 |
global-prefix@4.0.0:
|
3250 |
dependencies:
|
3251 |
ini: 4.1.3
|
3252 |
kind-of: 6.0.3
|
3253 |
which: 4.0.0
|
3254 |
|
3255 |
+
globals@14.0.0: {}
|
|
|
|
|
3256 |
|
3257 |
globals@15.15.0: {}
|
3258 |
|
3259 |
+
globals@16.0.0: {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3260 |
|
3261 |
graceful-fs@4.2.11: {}
|
3262 |
|
|
|
3289 |
|
3290 |
imurmurhash@0.1.4: {}
|
3291 |
|
|
|
|
|
|
|
|
|
|
|
3292 |
inherits@2.0.4: {}
|
3293 |
|
3294 |
ini@4.1.3: {}
|
|
|
3311 |
through: 2.3.8
|
3312 |
wrap-ansi: 6.2.0
|
3313 |
|
|
|
|
|
|
|
|
|
3314 |
is-core-module@2.16.1:
|
3315 |
dependencies:
|
3316 |
hasown: 2.0.2
|
|
|
3329 |
|
3330 |
is-number@7.0.0: {}
|
3331 |
|
|
|
|
|
3332 |
is-reference@1.2.1:
|
3333 |
dependencies:
|
3334 |
'@types/estree': 1.0.6
|
|
|
3343 |
|
3344 |
isexe@3.1.1: {}
|
3345 |
|
3346 |
+
jest-axe@9.0.0:
|
3347 |
+
dependencies:
|
3348 |
+
axe-core: 4.9.1
|
3349 |
+
chalk: 4.1.2
|
3350 |
+
jest-matcher-utils: 29.2.2
|
3351 |
+
lodash.merge: 4.6.2
|
3352 |
+
|
3353 |
+
jest-diff@29.7.0:
|
3354 |
+
dependencies:
|
3355 |
+
chalk: 4.1.2
|
3356 |
+
diff-sequences: 29.6.3
|
3357 |
+
jest-get-type: 29.6.3
|
3358 |
+
pretty-format: 29.7.0
|
3359 |
+
|
3360 |
+
jest-get-type@29.6.3: {}
|
3361 |
+
|
3362 |
+
jest-matcher-utils@29.2.2:
|
3363 |
+
dependencies:
|
3364 |
+
chalk: 4.1.2
|
3365 |
+
jest-diff: 29.7.0
|
3366 |
+
jest-get-type: 29.6.3
|
3367 |
+
pretty-format: 29.7.0
|
3368 |
+
|
3369 |
jiti@2.4.2: {}
|
3370 |
|
3371 |
js-yaml@4.1.0:
|
|
|
3442 |
|
3443 |
lilconfig@2.1.0: {}
|
3444 |
|
|
|
|
|
|
|
3445 |
local-pkg@1.1.1:
|
3446 |
dependencies:
|
3447 |
mlly: 1.7.4
|
|
|
3471 |
dependencies:
|
3472 |
'@jridgewell/sourcemap-codec': 1.5.0
|
3473 |
|
3474 |
+
melt@0.18.4(@floating-ui/dom@1.6.13)(svelte@5.23.0):
|
3475 |
+
dependencies:
|
3476 |
+
'@floating-ui/dom': 1.6.13
|
3477 |
+
jest-axe: 9.0.0
|
3478 |
+
nanoid: 5.1.2
|
3479 |
+
runed: 0.23.4(svelte@5.23.0)
|
3480 |
+
svelte: 5.23.0
|
3481 |
|
3482 |
merge2@1.4.1: {}
|
3483 |
|
|
|
3488 |
|
3489 |
mimic-fn@2.1.0: {}
|
3490 |
|
|
|
|
|
3491 |
minimatch@3.1.2:
|
3492 |
dependencies:
|
3493 |
brace-expansion: 1.1.11
|
3494 |
|
3495 |
+
minimatch@9.0.5:
|
3496 |
dependencies:
|
3497 |
brace-expansion: 2.0.1
|
3498 |
|
3499 |
minimist@1.2.8: {}
|
3500 |
|
|
|
|
|
|
|
|
|
3501 |
mlly@1.7.4:
|
3502 |
dependencies:
|
3503 |
acorn: 8.14.0
|
|
|
3519 |
|
3520 |
natural-compare@1.4.0: {}
|
3521 |
|
|
|
|
|
|
|
|
|
|
|
|
|
3522 |
onetime@5.1.2:
|
3523 |
dependencies:
|
3524 |
mimic-fn: 2.1.0
|
|
|
3574 |
|
3575 |
path-exists@5.0.0: {}
|
3576 |
|
|
|
|
|
3577 |
path-key@3.1.1: {}
|
3578 |
|
3579 |
path-parse@1.0.7: {}
|
3580 |
|
|
|
|
|
3581 |
pathe@1.1.2: {}
|
3582 |
|
3583 |
pathe@2.0.3: {}
|
3584 |
|
|
|
|
|
|
|
|
|
|
|
|
|
3585 |
picocolors@1.1.1: {}
|
3586 |
|
3587 |
picomatch@2.3.1: {}
|
|
|
3611 |
optionalDependencies:
|
3612 |
postcss: 8.5.3
|
3613 |
|
3614 |
+
postcss-safe-parser@7.0.1(postcss@8.5.3):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3615 |
dependencies:
|
3616 |
postcss: 8.5.3
|
3617 |
|
|
|
3619 |
dependencies:
|
3620 |
postcss: 8.5.3
|
3621 |
|
3622 |
+
postcss-selector-parser@7.1.0:
|
3623 |
dependencies:
|
3624 |
cssesc: 3.0.0
|
3625 |
util-deprecate: 1.0.2
|
|
|
3632 |
|
3633 |
prelude-ls@1.2.1: {}
|
3634 |
|
3635 |
+
prettier-linter-helpers@1.0.0:
|
3636 |
+
dependencies:
|
3637 |
+
fast-diff: 1.3.0
|
3638 |
+
|
3639 |
+
prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.23.0):
|
3640 |
dependencies:
|
3641 |
prettier: 3.5.3
|
3642 |
+
svelte: 5.23.0
|
3643 |
|
3644 |
+
prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.23.0))(prettier@3.5.3):
|
3645 |
dependencies:
|
3646 |
prettier: 3.5.3
|
3647 |
optionalDependencies:
|
3648 |
+
prettier-plugin-svelte: 3.3.3(prettier@3.5.3)(svelte@5.23.0)
|
3649 |
|
3650 |
prettier@3.5.3: {}
|
3651 |
|
3652 |
+
pretty-format@29.7.0:
|
3653 |
+
dependencies:
|
3654 |
+
'@jest/schemas': 29.6.3
|
3655 |
+
ansi-styles: 5.2.0
|
3656 |
+
react-is: 18.3.1
|
3657 |
+
|
3658 |
punycode@2.3.1: {}
|
3659 |
|
3660 |
quansync@0.2.8: {}
|
|
|
3666 |
drange: 1.1.1
|
3667 |
ret: 0.2.2
|
3668 |
|
3669 |
+
react-is@18.3.1: {}
|
3670 |
+
|
3671 |
readable-stream@3.6.2:
|
3672 |
dependencies:
|
3673 |
inherits: 2.0.4
|
3674 |
string_decoder: 1.3.0
|
3675 |
util-deprecate: 1.0.2
|
3676 |
|
3677 |
+
readdirp@4.1.2: {}
|
|
|
|
|
3678 |
|
3679 |
repeat-string@1.6.1: {}
|
3680 |
|
|
|
3695 |
|
3696 |
reusify@1.1.0: {}
|
3697 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3698 |
rollup@4.34.9:
|
3699 |
dependencies:
|
3700 |
'@types/estree': 1.0.6
|
|
|
3726 |
dependencies:
|
3727 |
queue-microtask: 1.2.3
|
3728 |
|
3729 |
+
runed@0.23.4(svelte@5.23.0):
|
3730 |
+
dependencies:
|
3731 |
+
esm-env: 1.2.2
|
3732 |
+
svelte: 5.23.0
|
3733 |
+
|
3734 |
+
runed@0.24.0(svelte@5.23.0):
|
3735 |
+
dependencies:
|
3736 |
+
esm-env: 1.2.2
|
3737 |
+
svelte: 5.23.0
|
3738 |
+
|
3739 |
rxjs@7.8.2:
|
3740 |
dependencies:
|
3741 |
tslib: 2.8.1
|
|
|
3748 |
|
3749 |
safer-buffer@2.1.2: {}
|
3750 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3751 |
semver@7.7.1: {}
|
3752 |
|
3753 |
set-cookie-parser@2.7.1: {}
|
|
|
3766 |
mrmime: 2.0.1
|
3767 |
totalist: 3.0.1
|
3768 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3769 |
source-map-js@1.2.1: {}
|
3770 |
|
3771 |
string-width@4.2.3:
|
|
|
3782 |
dependencies:
|
3783 |
ansi-regex: 5.0.1
|
3784 |
|
|
|
|
|
|
|
|
|
3785 |
strip-json-comments@3.1.1: {}
|
3786 |
|
3787 |
supports-color@7.2.0:
|
|
|
3790 |
|
3791 |
supports-preserve-symlinks-flag@1.0.0: {}
|
3792 |
|
3793 |
+
svelte-check@4.1.5(picomatch@4.0.2)(svelte@5.23.0)(typescript@5.8.2):
|
3794 |
dependencies:
|
3795 |
'@jridgewell/trace-mapping': 0.3.25
|
3796 |
+
chokidar: 4.0.3
|
3797 |
+
fdir: 6.4.3(picomatch@4.0.2)
|
3798 |
picocolors: 1.1.1
|
3799 |
sade: 1.8.1
|
3800 |
+
svelte: 5.23.0
|
|
|
3801 |
typescript: 5.8.2
|
3802 |
transitivePeerDependencies:
|
3803 |
+
- picomatch
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3804 |
|
3805 |
+
svelte-eslint-parser@1.1.0(svelte@5.23.0):
|
3806 |
dependencies:
|
3807 |
+
eslint-scope: 8.3.0
|
3808 |
+
eslint-visitor-keys: 4.2.0
|
3809 |
+
espree: 10.3.0
|
3810 |
postcss: 8.5.3
|
3811 |
postcss-scss: 4.0.9(postcss@8.5.3)
|
3812 |
+
postcss-selector-parser: 7.1.0
|
3813 |
optionalDependencies:
|
3814 |
+
svelte: 5.23.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3815 |
|
3816 |
+
svelte@5.23.0:
|
3817 |
dependencies:
|
3818 |
'@ampproject/remapping': 2.3.0
|
3819 |
'@jridgewell/sourcemap-codec': 1.5.0
|
3820 |
+
'@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.0)
|
3821 |
'@types/estree': 1.0.6
|
3822 |
acorn: 8.14.0
|
3823 |
aria-query: 5.3.2
|
3824 |
axobject-query: 4.1.0
|
3825 |
+
clsx: 2.1.1
|
3826 |
+
esm-env: 1.2.2
|
3827 |
+
esrap: 1.4.5
|
3828 |
is-reference: 3.0.3
|
3829 |
locate-character: 3.0.0
|
3830 |
magic-string: 0.30.17
|
3831 |
+
zimmerframe: 1.1.2
|
3832 |
|
3833 |
+
synckit@0.9.2:
|
3834 |
+
dependencies:
|
3835 |
+
'@pkgr/core': 0.1.1
|
3836 |
+
tslib: 2.8.1
|
3837 |
|
3838 |
tailwind-merge@3.0.2: {}
|
3839 |
|
|
|
3841 |
|
3842 |
tapable@2.2.1: {}
|
3843 |
|
|
|
|
|
3844 |
through@2.3.8: {}
|
3845 |
|
3846 |
tinyexec@0.3.2: {}
|
|
|
3855 |
|
3856 |
totalist@3.0.1: {}
|
3857 |
|
3858 |
+
ts-api-utils@2.0.1(typescript@5.8.2):
|
3859 |
dependencies:
|
3860 |
typescript: 5.8.2
|
3861 |
|
|
|
3874 |
dependencies:
|
3875 |
prelude-ls: 1.2.1
|
3876 |
|
|
|
|
|
3877 |
type-fest@0.21.3: {}
|
3878 |
|
3879 |
type-fest@4.37.0: {}
|
3880 |
|
3881 |
+
typescript-eslint@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2):
|
3882 |
+
dependencies:
|
3883 |
+
'@typescript-eslint/eslint-plugin': 8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
|
3884 |
+
'@typescript-eslint/parser': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
|
3885 |
+
'@typescript-eslint/utils': 8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)
|
3886 |
+
eslint: 9.22.0(jiti@2.4.2)
|
3887 |
+
typescript: 5.8.2
|
3888 |
+
transitivePeerDependencies:
|
3889 |
+
- supports-color
|
3890 |
+
|
3891 |
typescript@5.6.3: {}
|
3892 |
|
3893 |
typescript@5.8.2: {}
|
|
|
3914 |
|
3915 |
ufo@1.5.4: {}
|
3916 |
|
3917 |
+
unplugin-icons@22.1.0(svelte@5.23.0):
|
3918 |
dependencies:
|
3919 |
'@antfu/install-pkg': 1.0.0
|
3920 |
'@iconify/utils': 2.3.0
|
|
|
3922 |
local-pkg: 1.1.1
|
3923 |
unplugin: 2.2.0
|
3924 |
optionalDependencies:
|
3925 |
+
svelte: 5.23.0
|
3926 |
transitivePeerDependencies:
|
3927 |
- supports-color
|
3928 |
|
|
|
3962 |
lightningcss: 1.29.1
|
3963 |
yaml: 2.7.0
|
3964 |
|
3965 |
+
vitefu@1.0.6(vite@5.4.14(lightningcss@1.29.1)):
|
3966 |
optionalDependencies:
|
3967 |
vite: 5.4.14(lightningcss@1.29.1)
|
3968 |
|
|
|
3988 |
string-width: 4.2.3
|
3989 |
strip-ansi: 6.0.1
|
3990 |
|
|
|
|
|
3991 |
yaml@1.10.2: {}
|
3992 |
|
3993 |
yaml@2.7.0:
|
|
|
3996 |
yocto-queue@0.1.0: {}
|
3997 |
|
3998 |
yocto-queue@1.2.0: {}
|
3999 |
+
|
4000 |
+
zimmerframe@1.1.2: {}
|
src/lib/actions/autofocus.ts
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { tick } from "svelte";
|
2 |
+
|
3 |
+
export function autofocus(node: HTMLElement) {
|
4 |
+
tick().then(() => {
|
5 |
+
node.focus();
|
6 |
+
});
|
7 |
+
}
|
src/lib/components/DebugMenu.svelte
DELETED
@@ -1,81 +0,0 @@
|
|
1 |
-
<script lang="ts">
|
2 |
-
import { dev } from "$app/environment";
|
3 |
-
import { session } from "$lib/stores/session";
|
4 |
-
import { createPopover } from "@melt-ui/svelte";
|
5 |
-
import { prompt } from "./Prompts.svelte";
|
6 |
-
import { token } from "$lib/stores/token";
|
7 |
-
|
8 |
-
let innerWidth: number;
|
9 |
-
let innerHeight: number;
|
10 |
-
|
11 |
-
function toggleTheme() {
|
12 |
-
document.body.classList.toggle("dark");
|
13 |
-
}
|
14 |
-
|
15 |
-
const {
|
16 |
-
elements: { trigger, content },
|
17 |
-
} = createPopover();
|
18 |
-
</script>
|
19 |
-
|
20 |
-
<svelte:window bind:innerWidth bind:innerHeight />
|
21 |
-
|
22 |
-
{#if dev}
|
23 |
-
<div class="abs-x-center fixed bottom-0 z-50">
|
24 |
-
<button class="rounded-t-md bg-gray-500 px-3 py-1 text-xs text-white hover:bg-gray-600" {...$trigger} use:trigger>
|
25 |
-
Debug
|
26 |
-
</button>
|
27 |
-
|
28 |
-
<div
|
29 |
-
class="mb-2 w-64 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-700 dark:bg-gray-800"
|
30 |
-
{...$content}
|
31 |
-
use:content
|
32 |
-
>
|
33 |
-
<h3 class="mb-3 text-lg font-semibold dark:text-white">Debug Menu</h3>
|
34 |
-
|
35 |
-
<div class="space-y-3">
|
36 |
-
<div class="text-sm dark:text-gray-300">
|
37 |
-
<p>Viewport: {innerWidth}x{innerHeight}</p>
|
38 |
-
<p>Environment: {import.meta.env.MODE}</p>
|
39 |
-
</div>
|
40 |
-
|
41 |
-
<div class="flex flex-col gap-2">
|
42 |
-
<button
|
43 |
-
class="rounded-md bg-gray-200 px-3 py-1 text-sm hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600"
|
44 |
-
on:click={toggleTheme}
|
45 |
-
>
|
46 |
-
Toggle Theme
|
47 |
-
</button>
|
48 |
-
<button
|
49 |
-
class="rounded-md bg-gray-200 px-3 py-1 text-sm hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600"
|
50 |
-
on:click={() => {
|
51 |
-
console.log($session);
|
52 |
-
}}
|
53 |
-
>
|
54 |
-
Log session to console
|
55 |
-
</button>
|
56 |
-
<button
|
57 |
-
class="rounded-md bg-gray-200 px-3 py-1 text-sm hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600"
|
58 |
-
on:click={async () => {
|
59 |
-
console.log(await prompt("Test prompt"));
|
60 |
-
}}
|
61 |
-
>
|
62 |
-
Test prompt
|
63 |
-
</button>
|
64 |
-
|
65 |
-
<button
|
66 |
-
class="rounded-md bg-gray-200 px-3 py-1 text-sm hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600"
|
67 |
-
on:click={async () => {
|
68 |
-
$token.showModal = true;
|
69 |
-
}}
|
70 |
-
>
|
71 |
-
Show token modal
|
72 |
-
</button>
|
73 |
-
</div>
|
74 |
-
</div>
|
75 |
-
</div>
|
76 |
-
</div>
|
77 |
-
{/if}
|
78 |
-
|
79 |
-
<style>
|
80 |
-
/* Add any additional styles here */
|
81 |
-
</style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/components/InferencePlayground/InferencePlaygroundModelSelectorModal.svelte
DELETED
@@ -1,175 +0,0 @@
|
|
1 |
-
<script lang="ts">
|
2 |
-
import type { Conversation } from "$lib/types";
|
3 |
-
|
4 |
-
import { createEventDispatcher, onMount, tick } from "svelte";
|
5 |
-
|
6 |
-
import { models } from "$lib/stores/models";
|
7 |
-
import IconSearch from "~icons/carbon/search";
|
8 |
-
import IconStar from "~icons/carbon/star";
|
9 |
-
import { getTrending } from "$lib/utils/model";
|
10 |
-
import fuzzysearch from "$lib/utils/search";
|
11 |
-
|
12 |
-
export let conversation: Conversation;
|
13 |
-
|
14 |
-
let backdropEl: HTMLDivElement;
|
15 |
-
let highlightIdx = 0;
|
16 |
-
let ignoreCursorHighlight = false;
|
17 |
-
let containerEl: HTMLDivElement;
|
18 |
-
let query = "";
|
19 |
-
|
20 |
-
const dispatch = createEventDispatcher<{ modelSelected: string; close: void }>();
|
21 |
-
|
22 |
-
$: trendingModels = getTrending($models);
|
23 |
-
|
24 |
-
$: featuredModels = fuzzysearch({ needle: query, haystack: trendingModels, property: "id" });
|
25 |
-
$: otherModels = fuzzysearch({ needle: query, haystack: $models, property: "id" });
|
26 |
-
|
27 |
-
onMount(() => {
|
28 |
-
if (featuredModels.findIndex(model => model.id === conversation.model.id) !== -1) {
|
29 |
-
highlightIdx = featuredModels.findIndex(model => model.id === conversation.model.id);
|
30 |
-
} else {
|
31 |
-
highlightIdx = featuredModels.length + otherModels.findIndex(model => model.id === conversation.model.id);
|
32 |
-
}
|
33 |
-
});
|
34 |
-
|
35 |
-
function handleKeydown(event: KeyboardEvent) {
|
36 |
-
const { key } = event;
|
37 |
-
let scrollLogicalPosition: ScrollLogicalPosition = "end";
|
38 |
-
if (key === "Escape") {
|
39 |
-
event.preventDefault();
|
40 |
-
dispatch("close");
|
41 |
-
} else if (key === "Enter") {
|
42 |
-
event.preventDefault();
|
43 |
-
const highlightedEl = document.querySelector(".highlighted");
|
44 |
-
if (highlightedEl) {
|
45 |
-
(highlightedEl as HTMLButtonElement).click();
|
46 |
-
}
|
47 |
-
} else if (key === "ArrowUp") {
|
48 |
-
event.preventDefault();
|
49 |
-
highlightIdx--;
|
50 |
-
scrollLogicalPosition = "start";
|
51 |
-
ignoreCursorHighlight = true;
|
52 |
-
} else if (key === "ArrowDown") {
|
53 |
-
event.preventDefault();
|
54 |
-
highlightIdx++;
|
55 |
-
ignoreCursorHighlight = true;
|
56 |
-
}
|
57 |
-
const n = featuredModels.length + otherModels.length;
|
58 |
-
highlightIdx = ((highlightIdx % n) + n) % n;
|
59 |
-
scrollToResult(scrollLogicalPosition);
|
60 |
-
}
|
61 |
-
|
62 |
-
async function scrollToResult(block: ScrollLogicalPosition) {
|
63 |
-
await tick();
|
64 |
-
const highlightedEl = document.querySelector(".highlighted");
|
65 |
-
if (containerEl && highlightedEl) {
|
66 |
-
const { bottom: containerBottom, top: containerTop } = containerEl.getBoundingClientRect();
|
67 |
-
const { bottom: highlightedBottom, top: highlightedTop } = highlightedEl.getBoundingClientRect();
|
68 |
-
if (highlightedBottom > containerBottom || containerTop > highlightedTop) {
|
69 |
-
highlightedEl.scrollIntoView({ block });
|
70 |
-
}
|
71 |
-
}
|
72 |
-
}
|
73 |
-
|
74 |
-
function highlightRow(idx: number) {
|
75 |
-
if (!ignoreCursorHighlight) {
|
76 |
-
highlightIdx = idx;
|
77 |
-
}
|
78 |
-
}
|
79 |
-
|
80 |
-
function handleBackdropClick(event: MouseEvent) {
|
81 |
-
if (window?.getSelection()?.toString()) {
|
82 |
-
return;
|
83 |
-
}
|
84 |
-
if (event.target === backdropEl) {
|
85 |
-
dispatch("close");
|
86 |
-
}
|
87 |
-
}
|
88 |
-
</script>
|
89 |
-
|
90 |
-
<svelte:window on:keydown={handleKeydown} on:mousemove={() => (ignoreCursorHighlight = false)} />
|
91 |
-
|
92 |
-
<!-- svelte-ignore a11y-no-static-element-interactions a11y-click-events-have-key-events -->
|
93 |
-
<div
|
94 |
-
class="fixed inset-0 z-10 flex h-screen items-start justify-center bg-black/85 pt-32"
|
95 |
-
bind:this={backdropEl}
|
96 |
-
on:click|stopPropagation={handleBackdropClick}
|
97 |
-
>
|
98 |
-
<div class="flex w-full max-w-[600px] items-start justify-center overflow-hidden p-10 text-left whitespace-nowrap">
|
99 |
-
<div
|
100 |
-
class="flex h-full w-full flex-col overflow-hidden rounded-lg border bg-white text-gray-900 shadow-md dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300"
|
101 |
-
bind:this={containerEl}
|
102 |
-
>
|
103 |
-
<div class="flex items-center border-b px-3 dark:border-gray-800">
|
104 |
-
<div class="mr-2 text-sm">
|
105 |
-
<IconSearch />
|
106 |
-
</div>
|
107 |
-
<!-- svelte-ignore a11y-autofocus -->
|
108 |
-
<input
|
109 |
-
autofocus
|
110 |
-
class="flex h-10 w-full rounded-md bg-transparent py-3 text-sm placeholder-gray-400 outline-hidden"
|
111 |
-
placeholder="Search models ..."
|
112 |
-
bind:value={query}
|
113 |
-
/>
|
114 |
-
</div>
|
115 |
-
<div class="max-h-[300px] overflow-x-hidden overflow-y-auto">
|
116 |
-
{#if featuredModels.length}
|
117 |
-
<div>
|
118 |
-
<div class="px-2 py-1.5 text-xs font-medium text-gray-500">Trending</div>
|
119 |
-
<div>
|
120 |
-
{#each featuredModels as model, idx}
|
121 |
-
{@const [nameSpace, modelName] = model.id.split("/")}
|
122 |
-
<button
|
123 |
-
class="flex w-full cursor-pointer items-center px-2 py-1.5 text-sm {highlightIdx === idx
|
124 |
-
? 'highlighted bg-gray-100 dark:bg-gray-800'
|
125 |
-
: ''}"
|
126 |
-
on:mouseenter={() => highlightRow(idx)}
|
127 |
-
on:click={() => {
|
128 |
-
dispatch("modelSelected", model.id);
|
129 |
-
dispatch("close");
|
130 |
-
}}
|
131 |
-
>
|
132 |
-
<div class="lucide lucide-star mr-1.5 size-4 text-yellow-400">
|
133 |
-
<IconStar />
|
134 |
-
</div>
|
135 |
-
<span class="inline-flex items-center"
|
136 |
-
><span class="text-gray-500 dark:text-gray-400">{nameSpace}</span><span
|
137 |
-
class="mx-1 text-gray-300 dark:text-gray-700">/</span
|
138 |
-
><span class="text-black dark:text-white">{modelName}</span></span
|
139 |
-
>
|
140 |
-
</button>
|
141 |
-
{/each}
|
142 |
-
</div>
|
143 |
-
</div>
|
144 |
-
{/if}
|
145 |
-
{#if otherModels.length}
|
146 |
-
<div>
|
147 |
-
<div class="px-2 py-1.5 text-xs font-medium text-gray-500">Other Models</div>
|
148 |
-
<div>
|
149 |
-
{#each otherModels as model, _idx}
|
150 |
-
{@const [nameSpace, modelName] = model.id.split("/")}
|
151 |
-
{@const idx = featuredModels.length + _idx}
|
152 |
-
<button
|
153 |
-
class="flex w-full cursor-pointer items-center px-2 py-1.5 text-sm {highlightIdx === idx
|
154 |
-
? 'highlighted bg-gray-100 dark:bg-gray-800'
|
155 |
-
: ''}"
|
156 |
-
on:mouseenter={() => highlightRow(idx)}
|
157 |
-
on:click={() => {
|
158 |
-
dispatch("modelSelected", model.id);
|
159 |
-
dispatch("close");
|
160 |
-
}}
|
161 |
-
>
|
162 |
-
<span class="inline-flex items-center"
|
163 |
-
><span class="text-gray-500 dark:text-gray-400">{nameSpace}</span><span
|
164 |
-
class="mx-1 text-gray-300 dark:text-gray-700">/</span
|
165 |
-
><span class="text-black dark:text-white">{modelName}</span></span
|
166 |
-
>
|
167 |
-
</button>
|
168 |
-
{/each}
|
169 |
-
</div>
|
170 |
-
</div>
|
171 |
-
{/if}
|
172 |
-
</div>
|
173 |
-
</div>
|
174 |
-
</div>
|
175 |
-
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/components/{Avatar.svelte β avatar.svelte}
RENAMED
@@ -1,8 +1,12 @@
|
|
1 |
<script lang="ts">
|
2 |
-
|
3 |
-
|
|
|
|
|
|
|
|
|
4 |
|
5 |
-
|
6 |
|
7 |
async function getAvatarUrl(orgName?: string) {
|
8 |
if (!orgName) return;
|
|
|
1 |
<script lang="ts">
|
2 |
+
interface Props {
|
3 |
+
orgName: string | undefined;
|
4 |
+
size?: "sm" | "md";
|
5 |
+
}
|
6 |
+
|
7 |
+
let { orgName, size = "md" }: Props = $props();
|
8 |
|
9 |
+
let sizeClass = $derived(size === "sm" ? "size-3" : "size-4");
|
10 |
|
11 |
async function getAvatarUrl(orgName?: string) {
|
12 |
if (!orgName) return;
|
src/lib/components/debug-menu.svelte
ADDED
@@ -0,0 +1,123 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script lang="ts">
|
2 |
+
import { dev } from "$app/environment";
|
3 |
+
import { session } from "$lib/state/session.svelte.js";
|
4 |
+
import { token } from "$lib/state/token.svelte.js";
|
5 |
+
import { compareStr } from "$lib/utils/compare.js";
|
6 |
+
import { Popover } from "melt/builders";
|
7 |
+
import { prompt } from "./prompts.svelte";
|
8 |
+
import { showQuotaModal } from "./quota-modal.svelte";
|
9 |
+
import type { ToastData } from "./toaster.svelte.js";
|
10 |
+
import { addToast } from "./toaster.svelte.js";
|
11 |
+
|
12 |
+
let innerWidth = $state<number>();
|
13 |
+
let innerHeight = $state<number>();
|
14 |
+
|
15 |
+
function toggleTheme() {
|
16 |
+
document.body.classList.toggle("dark");
|
17 |
+
}
|
18 |
+
|
19 |
+
const popover = new Popover();
|
20 |
+
|
21 |
+
type Action = {
|
22 |
+
label: string;
|
23 |
+
cb: () => void;
|
24 |
+
};
|
25 |
+
|
26 |
+
const actions: Action[] = [
|
27 |
+
{ label: "Toggle Theme", cb: toggleTheme },
|
28 |
+
{
|
29 |
+
label: "Log session to console",
|
30 |
+
cb: () => {
|
31 |
+
console.log(session.$);
|
32 |
+
},
|
33 |
+
},
|
34 |
+
{
|
35 |
+
label: "Test prompt",
|
36 |
+
cb: async () => {
|
37 |
+
console.log(await prompt("Test prompt"));
|
38 |
+
},
|
39 |
+
},
|
40 |
+
{
|
41 |
+
label: "Show quota modal",
|
42 |
+
cb: () => {
|
43 |
+
showQuotaModal();
|
44 |
+
},
|
45 |
+
},
|
46 |
+
{
|
47 |
+
label: "Show token modal",
|
48 |
+
cb: () => {
|
49 |
+
token.showModal = true;
|
50 |
+
},
|
51 |
+
},
|
52 |
+
{
|
53 |
+
label: "Test toast",
|
54 |
+
cb: () => {
|
55 |
+
const toastData: ToastData[] = [
|
56 |
+
{
|
57 |
+
title: "Success",
|
58 |
+
description: "Congratulations! It worked!",
|
59 |
+
variant: "success",
|
60 |
+
},
|
61 |
+
{
|
62 |
+
title: "Warning",
|
63 |
+
description: "Please check again.",
|
64 |
+
variant: "warning",
|
65 |
+
},
|
66 |
+
{
|
67 |
+
title: "Error",
|
68 |
+
description: "Something did not work!",
|
69 |
+
variant: "error",
|
70 |
+
},
|
71 |
+
|
72 |
+
{
|
73 |
+
title: "Big one",
|
74 |
+
description:
|
75 |
+
"This one has a lot of text. like seriously. its a lot. so this toast should be really big! and we see how that affects the other ones. ",
|
76 |
+
variant: "success",
|
77 |
+
},
|
78 |
+
];
|
79 |
+
|
80 |
+
addToast(toastData[Math.floor(Math.random() * toastData.length)]!);
|
81 |
+
},
|
82 |
+
},
|
83 |
+
].toSorted((a, b) => compareStr(a.label, b.label));
|
84 |
+
</script>
|
85 |
+
|
86 |
+
<svelte:window bind:innerWidth bind:innerHeight />
|
87 |
+
|
88 |
+
{#if dev}
|
89 |
+
<div class="abs-x-center fixed bottom-0 z-50">
|
90 |
+
<button class="rounded-t-md bg-gray-500 px-3 py-1 text-xs text-white hover:bg-gray-600" {...popover.trigger}>
|
91 |
+
Debug
|
92 |
+
</button>
|
93 |
+
|
94 |
+
<div
|
95 |
+
class="mb-2 w-128 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-700 dark:bg-gray-800"
|
96 |
+
{...popover.content}
|
97 |
+
>
|
98 |
+
<h3 class="mb-3 text-lg font-semibold dark:text-white">Debug Menu</h3>
|
99 |
+
|
100 |
+
<div class="space-y-3">
|
101 |
+
<div class="text-sm dark:text-gray-300">
|
102 |
+
<p>Viewport: {innerWidth}x{innerHeight}</p>
|
103 |
+
<p>Environment: {import.meta.env.MODE}</p>
|
104 |
+
</div>
|
105 |
+
|
106 |
+
<div class="grid grid-cols-2 gap-2">
|
107 |
+
{#each actions as { label, cb }}
|
108 |
+
<button
|
109 |
+
class="rounded-md bg-gray-200 px-3 py-1 text-sm hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600"
|
110 |
+
onclick={cb}
|
111 |
+
>
|
112 |
+
{label}
|
113 |
+
</button>
|
114 |
+
{/each}
|
115 |
+
</div>
|
116 |
+
</div>
|
117 |
+
</div>
|
118 |
+
</div>
|
119 |
+
{/if}
|
120 |
+
|
121 |
+
<style>
|
122 |
+
/* Add any additional styles here */
|
123 |
+
</style>
|
src/lib/components/{Icons/IconProvider.svelte β icon-provider.svelte}
RENAMED
@@ -1,5 +1,10 @@
|
|
1 |
<script lang="ts">
|
2 |
-
|
|
|
|
|
|
|
|
|
|
|
3 |
</script>
|
4 |
|
5 |
{#if provider === "sambanova"}
|
@@ -293,8 +298,6 @@
|
|
293 |
fill="#814D00"
|
294 |
></path></svg
|
295 |
>
|
296 |
-
{:else}
|
297 |
-
<
|
298 |
-
<div class="size-4 flex-none rounded-sm bg-gray-200"></div>
|
299 |
-
</slot>
|
300 |
{/if}
|
|
|
1 |
<script lang="ts">
|
2 |
+
interface Props {
|
3 |
+
provider: string | undefined;
|
4 |
+
children?: import("svelte").Snippet;
|
5 |
+
}
|
6 |
+
|
7 |
+
let { provider, children }: Props = $props();
|
8 |
</script>
|
9 |
|
10 |
{#if provider === "sambanova"}
|
|
|
298 |
fill="#814D00"
|
299 |
></path></svg
|
300 |
>
|
301 |
+
{:else if children}{@render children()}{:else}
|
302 |
+
<div class="size-4 flex-none rounded-sm bg-gray-200"></div>
|
|
|
|
|
303 |
{/if}
|
src/lib/components/{InferencePlayground/InferencePlaygroundCodeSnippets.svelte β inference-playground/code-snippets.svelte}
RENAMED
@@ -1,5 +1,5 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import type { Conversation } from "$lib/types";
|
3 |
|
4 |
import hljs from "highlight.js/lib/core";
|
5 |
import http from "highlight.js/lib/languages/http";
|
@@ -7,22 +7,22 @@
|
|
7 |
import python from "highlight.js/lib/languages/python";
|
8 |
import { createEventDispatcher } from "svelte";
|
9 |
|
10 |
-
import { token } from "$lib/
|
11 |
-
import { entries, fromEntries, keys } from "$lib/utils/object";
|
12 |
import type { InferenceProvider } from "@huggingface/inference";
|
13 |
-
import IconCopyCode from "~icons/carbon/copy";
|
14 |
import IconExternal from "~icons/carbon/arrow-up-right";
|
15 |
-
import
|
16 |
-
|
17 |
-
type GetInferenceSnippetReturn,
|
18 |
-
type InferenceSnippetLanguage,
|
19 |
-
} from "./inferencePlaygroundUtils";
|
20 |
|
21 |
hljs.registerLanguage("javascript", javascript);
|
22 |
hljs.registerLanguage("python", python);
|
23 |
hljs.registerLanguage("http", http);
|
24 |
|
25 |
-
|
|
|
|
|
|
|
|
|
26 |
|
27 |
const dispatch = createEventDispatcher<{ closeCode: void }>();
|
28 |
|
@@ -33,10 +33,8 @@
|
|
33 |
} as const satisfies Record<string, string>;
|
34 |
type Language = keyof typeof labelsByLanguage;
|
35 |
|
36 |
-
let lang: Language = "javascript";
|
37 |
-
let showToken = false;
|
38 |
-
|
39 |
-
$: tokenStr = getTokenStr(showToken);
|
40 |
|
41 |
type GetSnippetArgs = {
|
42 |
tokenStr: string;
|
@@ -53,54 +51,24 @@
|
|
53 |
});
|
54 |
}
|
55 |
|
56 |
-
$: snippetsByLang = {
|
57 |
-
javascript: getSnippet({ lang: "js", tokenStr, conversation }),
|
58 |
-
python: getSnippet({ lang: "python", tokenStr, conversation }),
|
59 |
-
http: getSnippet({ lang: "curl", tokenStr, conversation }),
|
60 |
-
} as Record<Language, GetInferenceSnippetReturn>;
|
61 |
-
|
62 |
// { javascript: 0, python: 0, http: 0 } at first
|
63 |
-
const selectedSnippetIdxByLang: Record<Language, number> =
|
64 |
-
|
65 |
-
|
66 |
-
|
|
|
|
|
67 |
);
|
68 |
-
$: selectedSnippet = snippetsByLang[lang][selectedSnippetIdxByLang[lang]];
|
69 |
|
70 |
type InstallInstructions = {
|
71 |
title: string;
|
72 |
content: string;
|
73 |
docs: string;
|
74 |
};
|
75 |
-
$: installInstructions = (function getInstallInstructions(): InstallInstructions | undefined {
|
76 |
-
if (lang === "javascript") {
|
77 |
-
const isHugging = selectedSnippet?.client.includes("hugging");
|
78 |
-
const toInstall = isHugging ? "@huggingface/inference" : "openai";
|
79 |
-
const docs = isHugging
|
80 |
-
? "https://huggingface.co/docs/huggingface.js/inference/README"
|
81 |
-
: "https://platform.openai.com/docs/libraries";
|
82 |
-
return {
|
83 |
-
title: `Install ${toInstall}`,
|
84 |
-
content: `npm install --save ${toInstall}`,
|
85 |
-
docs,
|
86 |
-
};
|
87 |
-
} else if (lang === "python") {
|
88 |
-
const isHugging = selectedSnippet?.client.includes("hugging");
|
89 |
-
const toInstall = isHugging ? "huggingface_hub" : "openai";
|
90 |
-
const docs = isHugging
|
91 |
-
? "https://huggingface.co/docs/huggingface_hub/guides/inference"
|
92 |
-
: "https://platform.openai.com/docs/libraries";
|
93 |
-
return {
|
94 |
-
title: `Install the latest`,
|
95 |
-
content: `pip install --upgrade ${toInstall}`,
|
96 |
-
docs,
|
97 |
-
};
|
98 |
-
}
|
99 |
-
})();
|
100 |
|
101 |
function getTokenStr(showToken: boolean) {
|
102 |
-
if (
|
103 |
-
return
|
104 |
}
|
105 |
return "YOUR_HF_TOKEN";
|
106 |
}
|
@@ -136,6 +104,40 @@
|
|
136 |
},
|
137 |
};
|
138 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
</script>
|
140 |
|
141 |
<div class="px-2 pt-2">
|
@@ -146,7 +148,7 @@
|
|
146 |
{#each entries(labelsByLanguage) as [language, label]}
|
147 |
<li>
|
148 |
<button
|
149 |
-
|
150 |
class="inline-block rounded-t-lg border-b-2 p-4 {lang === language
|
151 |
? 'border-black text-black dark:border-blue-500 dark:text-blue-500'
|
152 |
: 'border-transparent hover:border-gray-300 hover:text-gray-600 dark:hover:text-gray-300'}"
|
@@ -156,7 +158,7 @@
|
|
156 |
{/each}
|
157 |
<li class="ml-auto self-center max-sm:hidden">
|
158 |
<button
|
159 |
-
|
160 |
dispatch("closeCode");
|
161 |
}}
|
162 |
class="flex size-7 items-center justify-center rounded-lg px-3 py-2.5 text-xs font-medium text-gray-900 focus:ring-4 focus:ring-gray-100 focus:outline-hidden dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
|
@@ -176,7 +178,7 @@
|
|
176 |
{isActive
|
177 |
? 'bg-black text-gray-100 dark:border-gray-500 dark:bg-gray-700 dark:text-white'
|
178 |
: 'text-gray-500 hover:text-gray-600 dark:border-gray-600 dark:hover:text-gray-400'}"
|
179 |
-
|
180 |
>
|
181 |
{/each}
|
182 |
</div>
|
|
|
1 |
<script lang="ts">
|
2 |
+
import type { Conversation } from "$lib/types.js";
|
3 |
|
4 |
import hljs from "highlight.js/lib/core";
|
5 |
import http from "highlight.js/lib/languages/http";
|
|
|
7 |
import python from "highlight.js/lib/languages/python";
|
8 |
import { createEventDispatcher } from "svelte";
|
9 |
|
10 |
+
import { token } from "$lib/state/token.svelte.js";
|
11 |
+
import { entries, fromEntries, keys } from "$lib/utils/object.js";
|
12 |
import type { InferenceProvider } from "@huggingface/inference";
|
|
|
13 |
import IconExternal from "~icons/carbon/arrow-up-right";
|
14 |
+
import IconCopyCode from "~icons/carbon/copy";
|
15 |
+
import { getInferenceSnippet, type GetInferenceSnippetReturn, type InferenceSnippetLanguage } from "./utils.js";
|
|
|
|
|
|
|
16 |
|
17 |
hljs.registerLanguage("javascript", javascript);
|
18 |
hljs.registerLanguage("python", python);
|
19 |
hljs.registerLanguage("http", http);
|
20 |
|
21 |
+
interface Props {
|
22 |
+
conversation: Conversation;
|
23 |
+
}
|
24 |
+
|
25 |
+
let { conversation }: Props = $props();
|
26 |
|
27 |
const dispatch = createEventDispatcher<{ closeCode: void }>();
|
28 |
|
|
|
33 |
} as const satisfies Record<string, string>;
|
34 |
type Language = keyof typeof labelsByLanguage;
|
35 |
|
36 |
+
let lang: Language = $state("javascript");
|
37 |
+
let showToken = $state(false);
|
|
|
|
|
38 |
|
39 |
type GetSnippetArgs = {
|
40 |
tokenStr: string;
|
|
|
51 |
});
|
52 |
}
|
53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
// { javascript: 0, python: 0, http: 0 } at first
|
55 |
+
const selectedSnippetIdxByLang: Record<Language, number> = $state(
|
56 |
+
fromEntries(
|
57 |
+
keys(labelsByLanguage).map(lang => {
|
58 |
+
return [lang, 0];
|
59 |
+
})
|
60 |
+
)
|
61 |
);
|
|
|
62 |
|
63 |
type InstallInstructions = {
|
64 |
title: string;
|
65 |
content: string;
|
66 |
docs: string;
|
67 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
|
69 |
function getTokenStr(showToken: boolean) {
|
70 |
+
if (token.value && showToken) {
|
71 |
+
return token.value;
|
72 |
}
|
73 |
return "YOUR_HF_TOKEN";
|
74 |
}
|
|
|
104 |
},
|
105 |
};
|
106 |
}
|
107 |
+
let tokenStr = $derived(getTokenStr(showToken));
|
108 |
+
let snippetsByLang = $derived({
|
109 |
+
javascript: getSnippet({ lang: "js", tokenStr, conversation }),
|
110 |
+
python: getSnippet({ lang: "python", tokenStr, conversation }),
|
111 |
+
http: getSnippet({ lang: "curl", tokenStr, conversation }),
|
112 |
+
} as Record<Language, GetInferenceSnippetReturn>);
|
113 |
+
let selectedSnippet = $derived(snippetsByLang[lang][selectedSnippetIdxByLang[lang]]);
|
114 |
+
let installInstructions = $derived(
|
115 |
+
(function getInstallInstructions(): InstallInstructions | undefined {
|
116 |
+
if (lang === "javascript") {
|
117 |
+
const isHugging = selectedSnippet?.client.includes("hugging");
|
118 |
+
const toInstall = isHugging ? "@huggingface/inference" : "openai";
|
119 |
+
const docs = isHugging
|
120 |
+
? "https://huggingface.co/docs/huggingface.js/inference/README"
|
121 |
+
: "https://platform.openai.com/docs/libraries";
|
122 |
+
return {
|
123 |
+
title: `Install ${toInstall}`,
|
124 |
+
content: `npm install --save ${toInstall}`,
|
125 |
+
docs,
|
126 |
+
};
|
127 |
+
} else if (lang === "python") {
|
128 |
+
const isHugging = selectedSnippet?.client.includes("hugging");
|
129 |
+
const toInstall = isHugging ? "huggingface_hub" : "openai";
|
130 |
+
const docs = isHugging
|
131 |
+
? "https://huggingface.co/docs/huggingface_hub/guides/inference"
|
132 |
+
: "https://platform.openai.com/docs/libraries";
|
133 |
+
return {
|
134 |
+
title: `Install the latest`,
|
135 |
+
content: `pip install --upgrade ${toInstall}`,
|
136 |
+
docs,
|
137 |
+
};
|
138 |
+
}
|
139 |
+
})()
|
140 |
+
);
|
141 |
</script>
|
142 |
|
143 |
<div class="px-2 pt-2">
|
|
|
148 |
{#each entries(labelsByLanguage) as [language, label]}
|
149 |
<li>
|
150 |
<button
|
151 |
+
onclick={() => (lang = language)}
|
152 |
class="inline-block rounded-t-lg border-b-2 p-4 {lang === language
|
153 |
? 'border-black text-black dark:border-blue-500 dark:text-blue-500'
|
154 |
: 'border-transparent hover:border-gray-300 hover:text-gray-600 dark:hover:text-gray-300'}"
|
|
|
158 |
{/each}
|
159 |
<li class="ml-auto self-center max-sm:hidden">
|
160 |
<button
|
161 |
+
onclick={() => {
|
162 |
dispatch("closeCode");
|
163 |
}}
|
164 |
class="flex size-7 items-center justify-center rounded-lg px-3 py-2.5 text-xs font-medium text-gray-900 focus:ring-4 focus:ring-gray-100 focus:outline-hidden dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
|
|
|
178 |
{isActive
|
179 |
? 'bg-black text-gray-100 dark:border-gray-500 dark:bg-gray-700 dark:text-white'
|
180 |
: 'text-gray-500 hover:text-gray-600 dark:border-gray-600 dark:hover:text-gray-400'}"
|
181 |
+
onclick={() => (selectedSnippetIdxByLang[lang] = idx)}>{client}</button
|
182 |
>
|
183 |
{/each}
|
184 |
</div>
|
src/lib/components/{InferencePlayground/InferencePlaygroundConversationHeader.svelte β inference-playground/conversation-header.svelte}
RENAMED
@@ -1,24 +1,28 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import type { Conversation, ModelWithTokenizer } from "$lib/types";
|
3 |
|
4 |
import { createEventDispatcher } from "svelte";
|
5 |
|
6 |
-
import { models } from "$lib/
|
7 |
-
import Avatar from "../Avatar.svelte";
|
8 |
import IconCog from "~icons/carbon/settings";
|
9 |
-
import
|
10 |
-
import
|
11 |
-
import
|
|
|
12 |
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
15 |
|
16 |
const dispatch = createEventDispatcher<{ close: string }>();
|
17 |
|
18 |
-
let modelSelectorOpen = false;
|
19 |
|
20 |
function changeModel(newModelId: ModelWithTokenizer["id"]) {
|
21 |
-
const model =
|
22 |
if (!model) {
|
23 |
return;
|
24 |
}
|
@@ -26,15 +30,11 @@
|
|
26 |
conversation.provider = undefined;
|
27 |
}
|
28 |
|
29 |
-
|
30 |
</script>
|
31 |
|
32 |
{#if modelSelectorOpen}
|
33 |
-
<ModelSelectorModal
|
34 |
-
{conversation}
|
35 |
-
on:modelSelected={e => changeModel(e.detail)}
|
36 |
-
on:close={() => (modelSelectorOpen = false)}
|
37 |
-
/>
|
38 |
{/if}
|
39 |
|
40 |
<div
|
@@ -43,12 +43,12 @@
|
|
43 |
: 'mx-4'} flex h-11 flex-none items-center gap-2 rounded-lg border border-gray-200/80 bg-white pr-2 pl-3 text-sm leading-none whitespace-nowrap shadow-xs *:flex-none max-sm:mt-4 dark:border-white/5 dark:bg-gray-800/70 dark:hover:bg-gray-800"
|
44 |
>
|
45 |
<Avatar orgName={nameSpace} size="md" />
|
46 |
-
<button class="flex-1! self-stretch text-left hover:underline"
|
47 |
>{conversation.model.id}</button
|
48 |
>
|
49 |
<button
|
50 |
class="borderdark:border-white/5 flex size-6 items-center justify-center rounded-sm bg-gray-50 text-xs hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600"
|
51 |
-
|
52 |
>
|
53 |
β
|
54 |
</button>
|
@@ -68,7 +68,7 @@
|
|
68 |
? 'mr-4 max-sm:ml-4'
|
69 |
: 'mx-4'} mt-2 h-11 text-sm leading-none whitespace-nowrap max-sm:mt-4"
|
70 |
>
|
71 |
-
<
|
72 |
bind:conversation
|
73 |
class="rounded-lg border border-gray-200/80 bg-white dark:border-white/5 dark:bg-gray-800/70 dark:hover:bg-gray-800"
|
74 |
/>
|
|
|
1 |
<script lang="ts">
|
2 |
+
import type { Conversation, ModelWithTokenizer } from "$lib/types.js";
|
3 |
|
4 |
import { createEventDispatcher } from "svelte";
|
5 |
|
6 |
+
import { models } from "$lib/state/models.svelte.js";
|
|
|
7 |
import IconCog from "~icons/carbon/settings";
|
8 |
+
import Avatar from "../avatar.svelte";
|
9 |
+
import GenerationConfig from "./generation-config.svelte";
|
10 |
+
import ModelSelectorModal from "./model-selector-modal.svelte";
|
11 |
+
import ProviderSelect from "./provider-select.svelte";
|
12 |
|
13 |
+
interface Props {
|
14 |
+
conversation: Conversation;
|
15 |
+
conversationIdx: number;
|
16 |
+
}
|
17 |
+
|
18 |
+
let { conversation = $bindable(), conversationIdx }: Props = $props();
|
19 |
|
20 |
const dispatch = createEventDispatcher<{ close: string }>();
|
21 |
|
22 |
+
let modelSelectorOpen = $state(false);
|
23 |
|
24 |
function changeModel(newModelId: ModelWithTokenizer["id"]) {
|
25 |
+
const model = models.all.find(m => m.id === newModelId);
|
26 |
if (!model) {
|
27 |
return;
|
28 |
}
|
|
|
30 |
conversation.provider = undefined;
|
31 |
}
|
32 |
|
33 |
+
let nameSpace = $derived(conversation.model.id.split("/")[0] ?? "");
|
34 |
</script>
|
35 |
|
36 |
{#if modelSelectorOpen}
|
37 |
+
<ModelSelectorModal {conversation} onModelSelect={changeModel} onClose={() => (modelSelectorOpen = false)} />
|
|
|
|
|
|
|
|
|
38 |
{/if}
|
39 |
|
40 |
<div
|
|
|
43 |
: 'mx-4'} flex h-11 flex-none items-center gap-2 rounded-lg border border-gray-200/80 bg-white pr-2 pl-3 text-sm leading-none whitespace-nowrap shadow-xs *:flex-none max-sm:mt-4 dark:border-white/5 dark:bg-gray-800/70 dark:hover:bg-gray-800"
|
44 |
>
|
45 |
<Avatar orgName={nameSpace} size="md" />
|
46 |
+
<button class="flex-1! self-stretch text-left hover:underline" onclick={() => (modelSelectorOpen = true)}
|
47 |
>{conversation.model.id}</button
|
48 |
>
|
49 |
<button
|
50 |
class="borderdark:border-white/5 flex size-6 items-center justify-center rounded-sm bg-gray-50 text-xs hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-600"
|
51 |
+
onclick={() => dispatch("close", conversation.model.id)}
|
52 |
>
|
53 |
β
|
54 |
</button>
|
|
|
68 |
? 'mr-4 max-sm:ml-4'
|
69 |
: 'mx-4'} mt-2 h-11 text-sm leading-none whitespace-nowrap max-sm:mt-4"
|
70 |
>
|
71 |
+
<ProviderSelect
|
72 |
bind:conversation
|
73 |
class="rounded-lg border border-gray-200/80 bg-white dark:border-white/5 dark:bg-gray-800/70 dark:hover:bg-gray-800"
|
74 |
/>
|
src/lib/components/{InferencePlayground/InferencePlaygroundConversation.svelte β inference-playground/conversation.svelte}
RENAMED
@@ -1,36 +1,26 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import
|
3 |
|
4 |
-
import {
|
5 |
|
6 |
import IconPlus from "~icons/carbon/add";
|
7 |
-
import CodeSnippets from "./
|
8 |
-
import Message from "./
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
|
|
|
|
14 |
|
15 |
-
let
|
16 |
-
let isProgrammaticScroll = true;
|
17 |
-
let conversationLength = conversation.messages.length;
|
18 |
|
19 |
-
let
|
|
|
|
|
20 |
|
21 |
-
|
22 |
-
// ideally we would use CSS "field-sizing:content". However, it is currently only supported on Chrome.
|
23 |
-
await tick();
|
24 |
-
if (messageContainer) {
|
25 |
-
const containerScrollTop = messageContainer.scrollTop;
|
26 |
-
const textareaEls = messageContainer.querySelectorAll("textarea");
|
27 |
-
for (const textarea of textareaEls) {
|
28 |
-
textarea.style.height = "0px";
|
29 |
-
textarea.style.height = textarea.scrollHeight + "px";
|
30 |
-
}
|
31 |
-
messageContainer.scrollTop = containerScrollTop;
|
32 |
-
}
|
33 |
-
}
|
34 |
|
35 |
function scrollToBottom() {
|
36 |
if (messageContainer) {
|
@@ -39,22 +29,21 @@
|
|
39 |
}
|
40 |
}
|
41 |
|
42 |
-
|
43 |
if (conversation.messages.at(-1)) {
|
44 |
-
resizeMessageTextAreas();
|
45 |
if (shouldScrollToBottom) {
|
46 |
scrollToBottom();
|
47 |
}
|
48 |
}
|
49 |
-
}
|
50 |
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
|
59 |
function addMessage() {
|
60 |
const msgs = conversation.messages.slice();
|
@@ -69,20 +58,17 @@
|
|
69 |
}
|
70 |
|
71 |
function deleteMessage(idx: number) {
|
72 |
-
conversation.messages.
|
73 |
-
conversation = conversation;
|
74 |
}
|
75 |
</script>
|
76 |
|
77 |
-
<svelte:window on:resize={resizeMessageTextAreas} />
|
78 |
-
|
79 |
<div
|
80 |
class="@container flex flex-col overflow-x-hidden overflow-y-auto {compareActive
|
81 |
? 'max-h-[calc(100dvh-5.8rem-2.5rem-75px)] md:max-h-[calc(100dvh-5.8rem-2.5rem)]'
|
82 |
: 'max-h-[calc(100dvh-5.8rem-2.5rem-75px)] md:max-h-[calc(100dvh-5.8rem)]'}"
|
83 |
class:animate-pulse={loading && !conversation.streaming}
|
84 |
bind:this={messageContainer}
|
85 |
-
|
86 |
// disable automatic scrolling is user initiates scroll
|
87 |
if (!isProgrammaticScroll) {
|
88 |
shouldScrollToBottom = false;
|
@@ -91,20 +77,19 @@
|
|
91 |
}}
|
92 |
>
|
93 |
{#if !viewCode}
|
94 |
-
{#each conversation.messages as
|
95 |
<Message
|
96 |
-
|
97 |
-
|
|
|
98 |
{loading}
|
99 |
-
|
100 |
-
on:delete={() => deleteMessage(messageIdx)}
|
101 |
-
autofocus={!loading && messageIdx === conversation.messages.length - 1}
|
102 |
/>
|
103 |
{/each}
|
104 |
|
105 |
<button
|
106 |
class="flex px-3.5 py-6 hover:bg-gray-50 md:px-6 dark:hover:bg-gray-800/50"
|
107 |
-
|
108 |
disabled={loading}
|
109 |
>
|
110 |
<div class="flex items-center gap-2 p-0! text-sm font-semibold">
|
|
|
1 |
<script lang="ts">
|
2 |
+
import { run } from "svelte/legacy";
|
3 |
|
4 |
+
import type { Conversation } from "$lib/types.js";
|
5 |
|
6 |
import IconPlus from "~icons/carbon/add";
|
7 |
+
import CodeSnippets from "./code-snippets.svelte";
|
8 |
+
import Message from "./message.svelte";
|
9 |
|
10 |
+
interface Props {
|
11 |
+
conversation: Conversation;
|
12 |
+
loading: boolean;
|
13 |
+
viewCode: boolean;
|
14 |
+
compareActive: boolean;
|
15 |
+
}
|
16 |
|
17 |
+
let { conversation = $bindable(), loading, viewCode, compareActive }: Props = $props();
|
|
|
|
|
18 |
|
19 |
+
let shouldScrollToBottom = $state(true);
|
20 |
+
let isProgrammaticScroll = $state(true);
|
21 |
+
let conversationLength = $state(conversation.messages.length);
|
22 |
|
23 |
+
let messageContainer: HTMLDivElement | null = $state(null);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
function scrollToBottom() {
|
26 |
if (messageContainer) {
|
|
|
29 |
}
|
30 |
}
|
31 |
|
32 |
+
run(() => {
|
33 |
if (conversation.messages.at(-1)) {
|
|
|
34 |
if (shouldScrollToBottom) {
|
35 |
scrollToBottom();
|
36 |
}
|
37 |
}
|
38 |
+
});
|
39 |
|
40 |
+
run(() => {
|
41 |
+
if (conversation.messages.length !== conversationLength) {
|
42 |
+
// enable automatic scrolling when new message was added
|
43 |
+
conversationLength = conversation.messages.length;
|
44 |
+
shouldScrollToBottom = true;
|
45 |
+
}
|
46 |
+
});
|
47 |
|
48 |
function addMessage() {
|
49 |
const msgs = conversation.messages.slice();
|
|
|
58 |
}
|
59 |
|
60 |
function deleteMessage(idx: number) {
|
61 |
+
conversation.messages = conversation.messages.slice(0, idx);
|
|
|
62 |
}
|
63 |
</script>
|
64 |
|
|
|
|
|
65 |
<div
|
66 |
class="@container flex flex-col overflow-x-hidden overflow-y-auto {compareActive
|
67 |
? 'max-h-[calc(100dvh-5.8rem-2.5rem-75px)] md:max-h-[calc(100dvh-5.8rem-2.5rem)]'
|
68 |
: 'max-h-[calc(100dvh-5.8rem-2.5rem-75px)] md:max-h-[calc(100dvh-5.8rem)]'}"
|
69 |
class:animate-pulse={loading && !conversation.streaming}
|
70 |
bind:this={messageContainer}
|
71 |
+
onscroll={() => {
|
72 |
// disable automatic scrolling is user initiates scroll
|
73 |
if (!isProgrammaticScroll) {
|
74 |
shouldScrollToBottom = false;
|
|
|
77 |
}}
|
78 |
>
|
79 |
{#if !viewCode}
|
80 |
+
{#each conversation.messages as _msg, idx}
|
81 |
<Message
|
82 |
+
bind:content={conversation.messages[idx]!.content}
|
83 |
+
role={conversation.messages[idx]!.role}
|
84 |
+
autofocus={idx === conversation.messages.length - 1}
|
85 |
{loading}
|
86 |
+
onDelete={() => deleteMessage(idx)}
|
|
|
|
|
87 |
/>
|
88 |
{/each}
|
89 |
|
90 |
<button
|
91 |
class="flex px-3.5 py-6 hover:bg-gray-50 md:px-6 dark:hover:bg-gray-800/50"
|
92 |
+
onclick={addMessage}
|
93 |
disabled={loading}
|
94 |
>
|
95 |
<div class="flex items-center gap-2 p-0! text-sm font-semibold">
|
src/lib/components/{InferencePlayground/generationConfigSettings.ts β inference-playground/generation-config-settings.ts}
RENAMED
File without changes
|
src/lib/components/{InferencePlayground/InferencePlaygroundGenerationConfig.svelte β inference-playground/generation-config.svelte}
RENAMED
@@ -1,14 +1,20 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import type { Conversation } from "$lib/types";
|
3 |
|
4 |
-
import { GENERATION_CONFIG_KEYS, GENERATION_CONFIG_SETTINGS } from "./
|
5 |
-
import { customMaxTokens } from "./
|
6 |
|
7 |
-
|
8 |
-
|
|
|
|
|
9 |
|
10 |
-
|
11 |
-
|
|
|
|
|
|
|
|
|
12 |
</script>
|
13 |
|
14 |
<div class="flex flex-col gap-y-7 {classNames}">
|
|
|
1 |
<script lang="ts">
|
2 |
+
import type { Conversation } from "$lib/types.js";
|
3 |
|
4 |
+
import { GENERATION_CONFIG_KEYS, GENERATION_CONFIG_SETTINGS } from "./generation-config-settings.js";
|
5 |
+
import { customMaxTokens } from "./utils.js";
|
6 |
|
7 |
+
interface Props {
|
8 |
+
conversation: Conversation;
|
9 |
+
classNames?: string;
|
10 |
+
}
|
11 |
|
12 |
+
let { conversation = $bindable(), classNames = "" }: Props = $props();
|
13 |
+
|
14 |
+
let modelMaxLength = $derived(
|
15 |
+
customMaxTokens[conversation.model.id] ?? conversation.model.tokenizerConfig.model_max_length
|
16 |
+
);
|
17 |
+
let maxTokens = $derived(Math.min(modelMaxLength ?? GENERATION_CONFIG_SETTINGS["max_tokens"].max, 64_000));
|
18 |
</script>
|
19 |
|
20 |
<div class="flex flex-col gap-y-7 {classNames}">
|
src/lib/components/{InferencePlayground/InferencePlaygroundHFTokenModal.svelte β inference-playground/hf-token-modal.svelte}
RENAMED
@@ -1,13 +1,21 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import {
|
|
|
|
|
|
|
3 |
import { createEventDispatcher, onDestroy, onMount } from "svelte";
|
4 |
|
5 |
import IconCross from "~icons/carbon/close";
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
-
|
8 |
|
9 |
-
let backdropEl
|
10 |
-
let modalEl
|
11 |
|
12 |
const dispatch = createEventDispatcher<{ close: void }>();
|
13 |
|
@@ -21,7 +29,6 @@
|
|
21 |
|
22 |
onMount(() => {
|
23 |
document.getElementById("app")?.setAttribute("inert", "true");
|
24 |
-
modalEl.focus();
|
25 |
});
|
26 |
|
27 |
onDestroy(() => {
|
@@ -32,7 +39,6 @@
|
|
32 |
});
|
33 |
</script>
|
34 |
|
35 |
-
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
|
36 |
<div
|
37 |
id="default-modal"
|
38 |
aria-hidden="true"
|
@@ -44,10 +50,10 @@
|
|
44 |
tabindex="-1"
|
45 |
class="relative max-h-full w-full max-w-xl p-4 outline-hidden"
|
46 |
bind:this={modalEl}
|
47 |
-
|
48 |
use:clickOutside={() => dispatch("close")}
|
49 |
>
|
50 |
-
<form
|
51 |
<div class="flex items-center justify-between rounded-t border-b p-4 md:px-5 md:py-4 dark:border-gray-800">
|
52 |
<h3 class="flex items-center gap-2.5 text-lg font-semibold text-gray-900 dark:text-white">
|
53 |
<img
|
@@ -58,7 +64,7 @@
|
|
58 |
</h3>
|
59 |
<button
|
60 |
type="button"
|
61 |
-
|
62 |
class="ms-auto inline-flex h-8 w-8 items-center justify-center rounded-lg bg-transparent text-sm text-gray-400 hover:bg-gray-200 hover:text-gray-900 dark:hover:bg-gray-600 dark:hover:text-white"
|
63 |
>
|
64 |
<div class="text-xl">
|
@@ -79,6 +85,7 @@
|
|
79 |
>Hugging Face Token</label
|
80 |
>
|
81 |
<input
|
|
|
82 |
required
|
83 |
placeholder="Enter HF Token"
|
84 |
type="text"
|
|
|
1 |
<script lang="ts">
|
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;
|
13 |
+
}
|
14 |
|
15 |
+
let { storeLocallyHfToken = $bindable(false) }: Props = $props();
|
16 |
|
17 |
+
let backdropEl = $state<HTMLDivElement>();
|
18 |
+
let modalEl = $state<HTMLDivElement>();
|
19 |
|
20 |
const dispatch = createEventDispatcher<{ close: void }>();
|
21 |
|
|
|
29 |
|
30 |
onMount(() => {
|
31 |
document.getElementById("app")?.setAttribute("inert", "true");
|
|
|
32 |
});
|
33 |
|
34 |
onDestroy(() => {
|
|
|
39 |
});
|
40 |
</script>
|
41 |
|
|
|
42 |
<div
|
43 |
id="default-modal"
|
44 |
aria-hidden="true"
|
|
|
50 |
tabindex="-1"
|
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">
|
58 |
<h3 class="flex items-center gap-2.5 text-lg font-semibold text-gray-900 dark:text-white">
|
59 |
<img
|
|
|
64 |
</h3>
|
65 |
<button
|
66 |
type="button"
|
67 |
+
onclick={() => dispatch("close")}
|
68 |
class="ms-auto inline-flex h-8 w-8 items-center justify-center rounded-lg bg-transparent text-sm text-gray-400 hover:bg-gray-200 hover:text-gray-900 dark:hover:bg-gray-600 dark:hover:text-white"
|
69 |
>
|
70 |
<div class="text-xl">
|
|
|
85 |
>Hugging Face Token</label
|
86 |
>
|
87 |
<input
|
88 |
+
use:autofocus
|
89 |
required
|
90 |
placeholder="Enter HF Token"
|
91 |
type="text"
|
src/lib/components/{InferencePlayground/InferencePlaygroundMessage.svelte β inference-playground/message.svelte}
RENAMED
@@ -1,39 +1,46 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import {
|
3 |
-
import type { ConversationMessage } from "$lib/types";
|
4 |
|
5 |
-
|
6 |
-
|
7 |
-
|
|
|
|
|
|
|
|
|
8 |
|
9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
</script>
|
11 |
|
12 |
<div
|
13 |
-
class="group/message group grid grid-cols-[1fr_2.5rem] items-start gap-2 px-3.5 pt-4 pb-6 hover:bg-gray-100/70 @-2xl:grid-cols-[130px_1fr_2.5rem] @2xl:grid-rows-1 @2xl:gap-4 @2xl:px-6 dark:border-gray-800 dark:hover:bg-gray-800/30
|
14 |
class:pointer-events-none={loading}
|
15 |
>
|
16 |
<div class="col-span-2 pt-3 pb-1 text-sm font-semibold uppercase @2xl:col-span-1 @2xl:pb-2">
|
17 |
-
{
|
18 |
</div>
|
19 |
-
<!-- svelte-ignore
|
20 |
-
<!-- svelte-ignore
|
21 |
<textarea
|
|
|
22 |
{autofocus}
|
23 |
-
bind:value={
|
24 |
-
placeholder="Enter {
|
25 |
class="resize-none overflow-hidden rounded-sm bg-transparent px-2 py-2.5 ring-gray-100 outline-none group-hover/message:ring-3 hover:resize-y hover:bg-white focus:resize-y focus:bg-white focus:ring-3 @2xl:px-3 dark:ring-gray-600 dark:hover:bg-gray-900 dark:focus:bg-gray-900"
|
26 |
rows="1"
|
27 |
tabindex="2"
|
28 |
-
on:input={() => {
|
29 |
-
dispatch("input");
|
30 |
-
}}
|
31 |
></textarea>
|
32 |
<button
|
33 |
tabindex="0"
|
34 |
-
|
35 |
-
dispatch("delete");
|
36 |
-
}}
|
37 |
type="button"
|
38 |
class="mt-1.5 size-8 rounded-lg border border-gray-200 bg-white text-xs font-medium text-gray-900 group-hover/message:block hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-100 focus:outline-hidden sm:hidden dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
|
39 |
>β</button
|
|
|
1 |
<script lang="ts">
|
2 |
+
import { TextareaAutosize } from "$lib/spells/textarea-autosize.svelte.js";
|
3 |
+
import type { ConversationMessage } from "$lib/types.js";
|
4 |
|
5 |
+
type Props = {
|
6 |
+
content: ConversationMessage["content"];
|
7 |
+
role: ConversationMessage["role"];
|
8 |
+
loading?: boolean;
|
9 |
+
autofocus?: boolean;
|
10 |
+
onDelete?: () => void;
|
11 |
+
};
|
12 |
|
13 |
+
let { content = $bindable(""), role, loading, autofocus, onDelete }: Props = $props();
|
14 |
+
|
15 |
+
let element = $state<HTMLTextAreaElement>();
|
16 |
+
new TextareaAutosize({
|
17 |
+
styleProp: "minHeight",
|
18 |
+
element: () => element,
|
19 |
+
input: () => content,
|
20 |
+
});
|
21 |
</script>
|
22 |
|
23 |
<div
|
24 |
+
class=" group/message group grid grid-cols-[1fr_2.5rem] items-start gap-2 border-b px-3.5 pt-4 pb-6 hover:bg-gray-100/70 @-2xl:grid-cols-[130px_1fr_2.5rem] @2xl:grid-rows-1 @2xl:gap-4 @2xl:px-6 dark:border-gray-800 dark:hover:bg-gray-800/30"
|
25 |
class:pointer-events-none={loading}
|
26 |
>
|
27 |
<div class="col-span-2 pt-3 pb-1 text-sm font-semibold uppercase @2xl:col-span-1 @2xl:pb-2">
|
28 |
+
{role}
|
29 |
</div>
|
30 |
+
<!-- svelte-ignore a11y_autofocus -->
|
31 |
+
<!-- svelte-ignore a11y_positive_tabindex -->
|
32 |
<textarea
|
33 |
+
bind:this={element}
|
34 |
{autofocus}
|
35 |
+
bind:value={content}
|
36 |
+
placeholder="Enter {role} message"
|
37 |
class="resize-none overflow-hidden rounded-sm bg-transparent px-2 py-2.5 ring-gray-100 outline-none group-hover/message:ring-3 hover:resize-y hover:bg-white focus:resize-y focus:bg-white focus:ring-3 @2xl:px-3 dark:ring-gray-600 dark:hover:bg-gray-900 dark:focus:bg-gray-900"
|
38 |
rows="1"
|
39 |
tabindex="2"
|
|
|
|
|
|
|
40 |
></textarea>
|
41 |
<button
|
42 |
tabindex="0"
|
43 |
+
onclick={onDelete}
|
|
|
|
|
44 |
type="button"
|
45 |
class="mt-1.5 size-8 rounded-lg border border-gray-200 bg-white text-xs font-medium text-gray-900 group-hover/message:block hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-100 focus:outline-hidden sm:hidden dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
|
46 |
>β</button
|
src/lib/components/inference-playground/model-selector-modal.svelte
ADDED
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script lang="ts">
|
2 |
+
import type { Conversation, ModelWithTokenizer } from "$lib/types.js";
|
3 |
+
|
4 |
+
import { tick } from "svelte";
|
5 |
+
|
6 |
+
import { autofocus } from "$lib/actions/autofocus.js";
|
7 |
+
import { models } from "$lib/state/models.svelte.js";
|
8 |
+
import fuzzysearch from "$lib/utils/search.js";
|
9 |
+
import { watch } from "runed";
|
10 |
+
import IconSearch from "~icons/carbon/search";
|
11 |
+
import IconStar from "~icons/carbon/star";
|
12 |
+
|
13 |
+
interface Props {
|
14 |
+
onModelSelect?: (model: string) => void;
|
15 |
+
onClose?: () => void;
|
16 |
+
conversation: Conversation;
|
17 |
+
}
|
18 |
+
|
19 |
+
let { onModelSelect, onClose, conversation }: Props = $props();
|
20 |
+
|
21 |
+
let backdropEl = $state<HTMLDivElement>();
|
22 |
+
let highlightIdx = $state(-1);
|
23 |
+
let ignoreCursorHighlight = $state(false);
|
24 |
+
let containerEl = $state<HTMLDivElement>();
|
25 |
+
let query = $state("");
|
26 |
+
|
27 |
+
const trending = $derived(fuzzysearch({ needle: query, haystack: models.trending, property: "id" }));
|
28 |
+
const other = $derived(fuzzysearch({ needle: query, haystack: models.nonTrending, property: "id" }));
|
29 |
+
const queried = $derived(trending.concat(other));
|
30 |
+
function getModelIdx(model: ModelWithTokenizer) {
|
31 |
+
return queried.findIndex(m => m.id === model.id);
|
32 |
+
}
|
33 |
+
const highlighted = $derived(queried[highlightIdx]);
|
34 |
+
|
35 |
+
watch(
|
36 |
+
() => queried,
|
37 |
+
(curr, prev) => {
|
38 |
+
const prevModel = prev?.[highlightIdx];
|
39 |
+
if (prevModel) {
|
40 |
+
// maintain model selection
|
41 |
+
highlightIdx = Math.max(
|
42 |
+
0,
|
43 |
+
curr.findIndex(model => model.id === prevModel?.id)
|
44 |
+
);
|
45 |
+
} else {
|
46 |
+
highlightIdx = curr.findIndex(model => model.id === conversation.model.id);
|
47 |
+
}
|
48 |
+
scrollToResult();
|
49 |
+
}
|
50 |
+
);
|
51 |
+
|
52 |
+
function selectModel(model: ModelWithTokenizer) {
|
53 |
+
onModelSelect?.(model.id);
|
54 |
+
onClose?.();
|
55 |
+
}
|
56 |
+
|
57 |
+
function handleKeydown(e: KeyboardEvent) {
|
58 |
+
if (e.key === "Escape") {
|
59 |
+
onClose?.();
|
60 |
+
} else if (e.key === "Enter") {
|
61 |
+
if (highlighted) selectModel(highlighted);
|
62 |
+
} else if (e.key === "ArrowUp") {
|
63 |
+
if (highlightIdx > 0) highlightIdx--;
|
64 |
+
ignoreCursorHighlight = true;
|
65 |
+
} else if (e.key === "ArrowDown") {
|
66 |
+
if (highlightIdx < queried.length - 1) highlightIdx++;
|
67 |
+
ignoreCursorHighlight = true;
|
68 |
+
} else {
|
69 |
+
return;
|
70 |
+
}
|
71 |
+
e.preventDefault();
|
72 |
+
|
73 |
+
scrollToResult();
|
74 |
+
}
|
75 |
+
|
76 |
+
async function scrollToResult() {
|
77 |
+
await tick();
|
78 |
+
const highlightedEl = document.querySelector("[data-model][data-highlighted]");
|
79 |
+
highlightedEl?.scrollIntoView({ block: "nearest" });
|
80 |
+
}
|
81 |
+
|
82 |
+
function highlightRow(idx: number) {
|
83 |
+
if (ignoreCursorHighlight) return;
|
84 |
+
highlightIdx = idx;
|
85 |
+
}
|
86 |
+
|
87 |
+
function handleBackdropClick(event: MouseEvent) {
|
88 |
+
event.stopPropagation();
|
89 |
+
if (window?.getSelection()?.toString()) {
|
90 |
+
return;
|
91 |
+
}
|
92 |
+
if (event.target === backdropEl) {
|
93 |
+
onClose?.();
|
94 |
+
}
|
95 |
+
}
|
96 |
+
</script>
|
97 |
+
|
98 |
+
<svelte:window onkeydown={handleKeydown} onmousemove={() => (ignoreCursorHighlight = false)} />
|
99 |
+
|
100 |
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
101 |
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
102 |
+
<div
|
103 |
+
class="fixed inset-0 z-10 flex h-screen items-start justify-center bg-black/85 pt-32"
|
104 |
+
bind:this={backdropEl}
|
105 |
+
onclick={handleBackdropClick}
|
106 |
+
>
|
107 |
+
<div class="flex w-full max-w-[600px] items-start justify-center overflow-hidden p-10 text-left whitespace-nowrap">
|
108 |
+
<div
|
109 |
+
class="flex h-full w-full flex-col overflow-hidden rounded-lg border bg-white text-gray-900 shadow-md dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300"
|
110 |
+
bind:this={containerEl}
|
111 |
+
>
|
112 |
+
<div class="flex items-center border-b px-3 dark:border-gray-800">
|
113 |
+
<div class="mr-2 text-sm">
|
114 |
+
<IconSearch />
|
115 |
+
</div>
|
116 |
+
<input
|
117 |
+
use:autofocus
|
118 |
+
class="flex h-10 w-full rounded-md bg-transparent py-3 text-sm placeholder-gray-400 outline-hidden"
|
119 |
+
placeholder="Search models ..."
|
120 |
+
bind:value={query}
|
121 |
+
/>
|
122 |
+
</div>
|
123 |
+
<div class="max-h-[300px] overflow-x-hidden overflow-y-auto">
|
124 |
+
{#snippet modelEntry(model: ModelWithTokenizer, trending?: boolean)}
|
125 |
+
{@const idx = getModelIdx(model)}
|
126 |
+
{@const [nameSpace, modelName] = model.id.split("/")}
|
127 |
+
<button
|
128 |
+
class="flex w-full cursor-pointer items-center px-2 py-1.5 text-sm
|
129 |
+
data-[highlighted]:bg-gray-100 data-[highlighted]:dark:bg-gray-800"
|
130 |
+
data-highlighted={highlightIdx === idx ? true : undefined}
|
131 |
+
data-model
|
132 |
+
onmouseenter={() => highlightRow(idx)}
|
133 |
+
onclick={() => {
|
134 |
+
onModelSelect?.(model.id);
|
135 |
+
onClose?.();
|
136 |
+
}}
|
137 |
+
>
|
138 |
+
{#if trending}
|
139 |
+
<div class="lucide lucide-star mr-1.5 size-4 text-yellow-400">
|
140 |
+
<IconStar />
|
141 |
+
</div>
|
142 |
+
{/if}
|
143 |
+
<span class="inline-flex items-center"
|
144 |
+
><span class="text-gray-500 dark:text-gray-400">{nameSpace}</span><span
|
145 |
+
class="mx-1 text-gray-300 dark:text-gray-700">/</span
|
146 |
+
><span class="text-black dark:text-white">{modelName}</span></span
|
147 |
+
>
|
148 |
+
</button>
|
149 |
+
{/snippet}
|
150 |
+
{#if trending.length > 0}
|
151 |
+
<div class="px-2 py-1.5 text-xs font-medium text-gray-500">Trending</div>
|
152 |
+
{#each trending as model}
|
153 |
+
{@render modelEntry(model, true)}
|
154 |
+
{/each}
|
155 |
+
{/if}
|
156 |
+
{#if other.length > 0}
|
157 |
+
<div class="px-2 py-1.5 text-xs font-medium text-gray-500">Other models</div>
|
158 |
+
{#each other as model}
|
159 |
+
{@render modelEntry(model, false)}
|
160 |
+
{/each}
|
161 |
+
{/if}
|
162 |
+
</div>
|
163 |
+
</div>
|
164 |
+
</div>
|
165 |
+
</div>
|
src/lib/components/{InferencePlayground/InferencePlaygroundModelSelector.svelte β inference-playground/model-selector.svelte}
RENAMED
@@ -1,20 +1,24 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import type { Conversation, ModelWithTokenizer } from "$lib/types";
|
3 |
|
4 |
-
import { models } from "$lib/
|
5 |
import IconCaret from "~icons/carbon/chevron-down";
|
6 |
-
import Avatar from "../
|
7 |
-
import ModelSelectorModal from "./
|
8 |
-
import ProviderSelect from "./
|
9 |
-
import { defaultSystemMessage } from "./
|
10 |
|
11 |
-
|
|
|
|
|
|
|
|
|
12 |
|
13 |
-
let showModelPickerModal = false;
|
14 |
|
15 |
// Model
|
16 |
function changeModel(modelId: ModelWithTokenizer["id"]) {
|
17 |
-
const model =
|
18 |
if (!model) {
|
19 |
return;
|
20 |
}
|
@@ -23,20 +27,20 @@
|
|
23 |
conversation.provider = undefined;
|
24 |
}
|
25 |
|
26 |
-
|
27 |
-
|
28 |
const id = crypto.randomUUID();
|
29 |
</script>
|
30 |
|
31 |
<div class="flex flex-col gap-2">
|
32 |
<label for={id} class="flex items-baseline gap-2 text-sm font-medium text-gray-900 dark:text-white">
|
33 |
-
Models<span class="text-xs font-normal text-gray-400">{
|
34 |
</label>
|
35 |
|
36 |
<button
|
37 |
{id}
|
38 |
class="relative flex items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110"
|
39 |
-
|
40 |
>
|
41 |
<div class="flex flex-col items-start">
|
42 |
<div class="flex items-center gap-1 text-sm text-gray-500 dark:text-gray-300">
|
@@ -54,11 +58,7 @@
|
|
54 |
</div>
|
55 |
|
56 |
{#if showModelPickerModal}
|
57 |
-
<ModelSelectorModal
|
58 |
-
{conversation}
|
59 |
-
on:modelSelected={e => changeModel(e.detail)}
|
60 |
-
on:close={() => (showModelPickerModal = false)}
|
61 |
-
/>
|
62 |
{/if}
|
63 |
|
64 |
<ProviderSelect bind:conversation />
|
|
|
1 |
<script lang="ts">
|
2 |
+
import type { Conversation, ModelWithTokenizer } from "$lib/types.js";
|
3 |
|
4 |
+
import { models } from "$lib/state/models.svelte.js";
|
5 |
import IconCaret from "~icons/carbon/chevron-down";
|
6 |
+
import Avatar from "../avatar.svelte";
|
7 |
+
import ModelSelectorModal from "./model-selector-modal.svelte";
|
8 |
+
import ProviderSelect from "./provider-select.svelte";
|
9 |
+
import { defaultSystemMessage } from "./utils.js";
|
10 |
|
11 |
+
interface Props {
|
12 |
+
conversation: Conversation;
|
13 |
+
}
|
14 |
+
|
15 |
+
let { conversation = $bindable() }: Props = $props();
|
16 |
|
17 |
+
let showModelPickerModal = $state(false);
|
18 |
|
19 |
// Model
|
20 |
function changeModel(modelId: ModelWithTokenizer["id"]) {
|
21 |
+
const model = models.all.find(m => m.id === modelId);
|
22 |
if (!model) {
|
23 |
return;
|
24 |
}
|
|
|
27 |
conversation.provider = undefined;
|
28 |
}
|
29 |
|
30 |
+
let nameSpace = $derived(conversation.model.id.split("/")[0] ?? "");
|
31 |
+
let modelName = $derived(conversation.model.id.split("/")[1] ?? "");
|
32 |
const id = crypto.randomUUID();
|
33 |
</script>
|
34 |
|
35 |
<div class="flex flex-col gap-2">
|
36 |
<label for={id} class="flex items-baseline gap-2 text-sm font-medium text-gray-900 dark:text-white">
|
37 |
+
Models<span class="text-xs font-normal text-gray-400">{models.all.length}</span>
|
38 |
</label>
|
39 |
|
40 |
<button
|
41 |
{id}
|
42 |
class="relative flex items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110"
|
43 |
+
onclick={() => (showModelPickerModal = true)}
|
44 |
>
|
45 |
<div class="flex flex-col items-start">
|
46 |
<div class="flex items-center gap-1 text-sm text-gray-500 dark:text-gray-300">
|
|
|
58 |
</div>
|
59 |
|
60 |
{#if showModelPickerModal}
|
61 |
+
<ModelSelectorModal {conversation} onModelSelect={changeModel} onClose={() => (showModelPickerModal = false)} />
|
|
|
|
|
|
|
|
|
62 |
{/if}
|
63 |
|
64 |
<ProviderSelect bind:conversation />
|
src/lib/components/{InferencePlayground/InferencePlayground.svelte β inference-playground/playground.svelte}
RENAMED
@@ -1,109 +1,99 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import type {
|
3 |
-
|
4 |
-
import {
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
} from "
|
9 |
-
|
10 |
-
import {
|
11 |
-
import { project, session } from "$lib/stores/session";
|
12 |
-
import { token } from "$lib/stores/token";
|
13 |
-
import { isMac } from "$lib/utils/platform";
|
14 |
import { HfInference } from "@huggingface/inference";
|
15 |
-
import { onDestroy } from "svelte";
|
16 |
import IconExternal from "~icons/carbon/arrow-up-right";
|
17 |
import IconCode from "~icons/carbon/code";
|
18 |
import IconCompare from "~icons/carbon/compare";
|
19 |
import IconInfo from "~icons/carbon/information";
|
20 |
import { default as IconDelete, default as IconThrashcan } from "~icons/carbon/trash-can";
|
21 |
-
import
|
22 |
-
import PlaygroundConversationHeader from "./
|
23 |
-
import
|
24 |
-
import
|
25 |
-
import
|
26 |
-
import ModelSelectorModal from "./
|
27 |
-
import
|
|
|
|
|
|
|
28 |
|
29 |
const startMessageUser: ConversationMessage = { role: "user", content: "" };
|
30 |
|
31 |
-
let viewCode = false;
|
32 |
-
let viewSettings = false;
|
33 |
-
let loading = false;
|
34 |
-
|
35 |
-
|
36 |
-
let selectCompareModelOpen = false;
|
37 |
|
38 |
interface GenerationStatistics {
|
39 |
latency: number;
|
40 |
generatedTokensCount: number;
|
41 |
}
|
42 |
-
let generationStats = $
|
43 |
-
|
44 |
-
|
|
|
|
|
45 |
|
46 |
-
|
47 |
-
|
|
|
|
|
48 |
|
49 |
function reset() {
|
50 |
-
|
51 |
-
|
52 |
-
|
|
|
|
|
|
|
53 |
});
|
54 |
-
$session = $session;
|
55 |
}
|
56 |
|
57 |
-
function
|
58 |
-
|
59 |
-
|
60 |
-
abortController.abort();
|
61 |
-
}
|
62 |
-
abortControllers = [];
|
63 |
-
}
|
64 |
-
loading = false;
|
65 |
-
waitForNonStreaming = false;
|
66 |
-
}
|
67 |
|
68 |
-
async function runInference(conversation: Conversation, conversationIdx: number) {
|
69 |
const startTime = performance.now();
|
70 |
-
const hf = new HfInference(
|
71 |
|
72 |
if (conversation.streaming) {
|
73 |
-
let
|
74 |
-
|
75 |
-
const abortController = new AbortController();
|
76 |
-
abortControllers.push(abortController);
|
77 |
|
78 |
await handleStreamingResponse(
|
79 |
hf,
|
80 |
conversation,
|
81 |
content => {
|
82 |
-
if (streamingMessage)
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
}
|
88 |
-
$session = $session;
|
89 |
-
const c = generationStats[conversationIdx];
|
90 |
-
if (c) c.generatedTokensCount += 1;
|
91 |
}
|
|
|
|
|
|
|
92 |
},
|
93 |
-
|
94 |
);
|
95 |
} else {
|
96 |
-
waitForNonStreaming = true;
|
97 |
const { message: newMessage, completion_tokens: newTokensCount } = await handleNonStreamingResponse(
|
98 |
hf,
|
99 |
conversation
|
100 |
);
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
const c = generationStats[conversationIdx];
|
105 |
-
if (c) c.generatedTokensCount += newTokensCount;
|
106 |
-
}
|
107 |
}
|
108 |
|
109 |
const endTime = performance.now();
|
@@ -112,48 +102,58 @@
|
|
112 |
}
|
113 |
|
114 |
async function submit() {
|
115 |
-
if (
|
116 |
-
|
117 |
return;
|
118 |
}
|
119 |
|
120 |
-
for (const [idx, conversation] of
|
121 |
-
if (conversation.messages.at(-1)?.role
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
}
|
126 |
-
return alert(`${prefix}Messages must alternate between user/assistant roles.`);
|
127 |
}
|
|
|
|
|
|
|
|
|
|
|
128 |
}
|
129 |
|
130 |
(document.activeElement as HTMLElement).blur();
|
131 |
loading = true;
|
132 |
|
133 |
try {
|
134 |
-
const promises =
|
135 |
await Promise.all(promises);
|
136 |
} catch (error) {
|
137 |
-
for (const conversation of
|
138 |
if (conversation.messages.at(-1)?.role === "assistant" && !conversation.messages.at(-1)?.content?.trim()) {
|
139 |
conversation.messages.pop();
|
140 |
conversation.messages = [...conversation.messages];
|
141 |
}
|
142 |
-
|
143 |
}
|
|
|
144 |
if (error instanceof Error) {
|
|
|
|
|
|
|
|
|
|
|
145 |
if (error.message.includes("token seems invalid")) {
|
146 |
token.reset();
|
147 |
}
|
|
|
148 |
if (error.name !== "AbortError") {
|
149 |
-
|
150 |
}
|
151 |
} else {
|
152 |
-
|
153 |
}
|
154 |
} finally {
|
155 |
loading = false;
|
156 |
-
|
157 |
}
|
158 |
}
|
159 |
|
@@ -169,7 +169,7 @@
|
|
169 |
const submittedHfToken = (formData.get("hf-token") as string).trim() ?? "";
|
170 |
const RE_HF_TOKEN = /\bhf_[a-zA-Z0-9]{34}\b/;
|
171 |
if (RE_HF_TOKEN.test(submittedHfToken)) {
|
172 |
-
token.
|
173 |
submit();
|
174 |
} else {
|
175 |
alert("Please provide a valid HF token.");
|
@@ -177,46 +177,41 @@
|
|
177 |
}
|
178 |
|
179 |
function addCompareModel(modelId: ModelWithTokenizer["id"]) {
|
180 |
-
const model =
|
181 |
-
if (!model ||
|
182 |
return;
|
183 |
}
|
184 |
-
const newConversation = { ...JSON.parse(JSON.stringify(
|
185 |
-
|
186 |
generationStats = [generationStats[0], { latency: 0, generatedTokensCount: 0 }];
|
187 |
}
|
188 |
|
189 |
function removeCompareModal(conversationIdx: number) {
|
190 |
-
|
191 |
-
|
192 |
generationStats.splice(conversationIdx, 1)[0];
|
193 |
generationStats = generationStats;
|
194 |
}
|
195 |
-
|
196 |
-
onDestroy(() => {
|
197 |
-
for (const abortController of abortControllers) {
|
198 |
-
abortController.abort();
|
199 |
-
}
|
200 |
-
});
|
201 |
</script>
|
202 |
|
203 |
-
{#if
|
204 |
<HFTokenModal
|
205 |
-
bind:storeLocallyHfToken={
|
206 |
-
on:close={() => (
|
207 |
on:submit={handleTokenSubmit}
|
208 |
/>
|
209 |
{/if}
|
210 |
|
211 |
-
<!-- svelte-ignore
|
212 |
<div
|
213 |
class="motion-safe:animate-fade-in grid h-dvh divide-gray-200 overflow-hidden bg-gray-100/50 max-md:grid-rows-[120px_1fr] max-md:divide-y dark:divide-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:[color-scheme:dark] {compareActive
|
214 |
? 'md:grid-cols-[clamp(220px,20%,350px)_minmax(0,1fr)]'
|
215 |
: 'md:grid-cols-[clamp(220px,20%,350px)_minmax(0,1fr)_clamp(270px,25%,300px)]'}"
|
216 |
>
|
|
|
217 |
<div class="flex flex-col gap-2 overflow-y-auto py-3 pr-3 max-md:pl-3">
|
218 |
<div class="pl-2">
|
219 |
-
<
|
220 |
</div>
|
221 |
<div
|
222 |
class="relative flex flex-1 flex-col gap-6 overflow-y-hidden rounded-r-xl border-x border-y border-gray-200/80 bg-linear-to-b from-white via-white p-3 shadow-xs max-md:rounded-xl dark:border-white/5 dark:from-gray-800/40 dark:via-gray-800/40"
|
@@ -230,33 +225,39 @@
|
|
230 |
placeholder={systemPromptSupported
|
231 |
? "Enter a custom prompt"
|
232 |
: "System prompt is not supported with the chosen model."}
|
233 |
-
value={systemPromptSupported ?
|
234 |
-
|
235 |
-
for (const conversation of
|
236 |
conversation.systemMessage.content = e.currentTarget.value;
|
237 |
}
|
238 |
-
|
239 |
}}
|
240 |
class="absolute inset-x-0 bottom-0 h-full resize-none bg-transparent px-3 pt-10 text-sm outline-hidden"
|
241 |
></textarea>
|
242 |
</div>
|
243 |
</div>
|
244 |
-
|
|
|
|
|
|
|
245 |
<div
|
246 |
class="flex h-[calc(100dvh-5rem-120px)] divide-x divide-gray-200 overflow-x-auto overflow-y-hidden *:w-full max-sm:w-dvw md:h-[calc(100dvh-5rem)] md:pt-3 dark:divide-gray-800"
|
247 |
>
|
248 |
-
{#each
|
249 |
<div class="max-sm:min-w-full">
|
250 |
{#if compareActive}
|
251 |
<PlaygroundConversationHeader
|
252 |
{conversationIdx}
|
253 |
-
bind:conversation
|
254 |
on:close={() => removeCompareModal(conversationIdx)}
|
255 |
/>
|
256 |
{/if}
|
257 |
<PlaygroundConversation
|
258 |
{loading}
|
259 |
-
bind:conversation
|
|
|
|
|
|
|
260 |
{viewCode}
|
261 |
{compareActive}
|
262 |
on:closeCode={() => (viewCode = false)}
|
@@ -271,7 +272,7 @@
|
|
271 |
{#if !compareActive}
|
272 |
<button
|
273 |
type="button"
|
274 |
-
|
275 |
class="flex h-[39px] items-center gap-1 rounded-lg border border-gray-200 bg-white px-3 py-2.5 text-sm font-medium text-gray-900 hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-100 focus:outline-hidden md:hidden dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
|
276 |
>
|
277 |
<div class="text-black dark:text-white">
|
@@ -280,7 +281,7 @@
|
|
280 |
{!viewSettings ? "Settings" : "Hide Settings"}
|
281 |
</button>
|
282 |
{/if}
|
283 |
-
<button type="button"
|
284 |
<IconDelete />
|
285 |
</button>
|
286 |
</div>
|
@@ -290,14 +291,14 @@
|
|
290 |
{/each}
|
291 |
</div>
|
292 |
<div class="flex flex-1 justify-end gap-x-2">
|
293 |
-
<button type="button"
|
294 |
<IconCode />
|
295 |
{!viewCode ? "View Code" : "Hide Code"}</button
|
296 |
>
|
297 |
<button
|
298 |
-
|
299 |
viewCode = false;
|
300 |
-
loading ?
|
301 |
}}
|
302 |
type="button"
|
303 |
class="flex h-[39px] w-24 items-center justify-center gap-2 rounded-lg px-5 py-2.5 text-sm font-medium text-white focus:ring-4 focus:ring-gray-300 focus:outline-hidden dark:border-gray-700 dark:focus:ring-gray-700 {loading
|
@@ -307,24 +308,18 @@
|
|
307 |
{#if loading}
|
308 |
<div class="flex flex-none items-center gap-[3px]">
|
309 |
<span class="mr-2">
|
310 |
-
{#if
|
311 |
Stop
|
312 |
{:else}
|
313 |
Cancel
|
314 |
{/if}
|
315 |
</span>
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
style="animation-delay: 0.5s;"
|
323 |
-
/>
|
324 |
-
<div
|
325 |
-
class="h-1 w-1 flex-none animate-bounce rounded-full bg-gray-500 dark:bg-gray-100"
|
326 |
-
style="animation-delay: 0.75s;"
|
327 |
-
/>
|
328 |
</div>
|
329 |
{:else}
|
330 |
Run <span
|
@@ -336,24 +331,26 @@
|
|
336 |
</div>
|
337 |
</div>
|
338 |
</div>
|
|
|
|
|
339 |
{#if !compareActive}
|
340 |
<div class="flex flex-col p-3 {viewSettings ? 'max-md:fixed' : 'max-md:hidden'} max-md:inset-x-0 max-md:bottom-20">
|
341 |
<div
|
342 |
class="flex flex-1 flex-col gap-6 overflow-y-hidden rounded-xl border border-gray-200/80 bg-white bg-linear-to-b from-white via-white p-3 shadow-xs dark:border-white/5 dark:bg-gray-900 dark:from-gray-800/40 dark:via-gray-800/40"
|
343 |
>
|
344 |
<div class="flex flex-col gap-2">
|
345 |
-
<ModelSelector bind:conversation={
|
346 |
<div class="flex items-center gap-2 self-end px-2 text-xs whitespace-nowrap">
|
347 |
<button
|
348 |
class="flex items-center gap-0.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
|
349 |
-
|
350 |
>
|
351 |
<IconCompare />
|
352 |
Compare
|
353 |
</button>
|
354 |
<a
|
355 |
-
href="https://huggingface.co/{
|
356 |
-
.conversations[0]
|
357 |
target="_blank"
|
358 |
class="flex items-center gap-0.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
|
359 |
>
|
@@ -363,10 +360,10 @@
|
|
363 |
</div>
|
364 |
</div>
|
365 |
|
366 |
-
<GenerationConfig bind:conversation={
|
367 |
-
{#if
|
368 |
<button
|
369 |
-
|
370 |
class="mt-auto flex items-center gap-1 self-end text-sm text-gray-500 underline decoration-gray-300 hover:text-gray-800 dark:text-gray-400 dark:decoration-gray-600 dark:hover:text-gray-200"
|
371 |
><svg xmlns="http://www.w3.org/2000/svg" class="text-xs" width="1em" height="1em" viewBox="0 0 32 32"
|
372 |
><path
|
@@ -422,8 +419,8 @@
|
|
422 |
|
423 |
{#if selectCompareModelOpen}
|
424 |
<ModelSelectorModal
|
425 |
-
conversation={
|
426 |
-
|
427 |
-
|
428 |
/>
|
429 |
{/if}
|
|
|
1 |
<script lang="ts">
|
2 |
+
import type { ConversationMessage, ModelWithTokenizer } from "$lib/types.js";
|
3 |
+
|
4 |
+
import { handleNonStreamingResponse, handleStreamingResponse, isSystemPromptSupported } from "./utils.js";
|
5 |
+
|
6 |
+
import { AbortManager } from "$lib/spells/abort-manager.svelte.js";
|
7 |
+
import { models } from "$lib/state/models.svelte.js";
|
8 |
+
import { session } from "$lib/state/session.svelte.js";
|
9 |
+
import { token } from "$lib/state/token.svelte.js";
|
10 |
+
import { isMac } from "$lib/utils/platform.js";
|
|
|
|
|
|
|
11 |
import { HfInference } from "@huggingface/inference";
|
|
|
12 |
import IconExternal from "~icons/carbon/arrow-up-right";
|
13 |
import IconCode from "~icons/carbon/code";
|
14 |
import IconCompare from "~icons/carbon/compare";
|
15 |
import IconInfo from "~icons/carbon/information";
|
16 |
import { default as IconDelete, default as IconThrashcan } from "~icons/carbon/trash-can";
|
17 |
+
import { addToast } from "../toaster.svelte.js";
|
18 |
+
import PlaygroundConversationHeader from "./conversation-header.svelte";
|
19 |
+
import PlaygroundConversation from "./conversation.svelte";
|
20 |
+
import GenerationConfig from "./generation-config.svelte";
|
21 |
+
import HFTokenModal from "./hf-token-modal.svelte";
|
22 |
+
import ModelSelectorModal from "./model-selector-modal.svelte";
|
23 |
+
import ModelSelector from "./model-selector.svelte";
|
24 |
+
import ProjectSelect from "./project-select.svelte";
|
25 |
+
import { showQuotaModal } from "../quota-modal.svelte";
|
26 |
+
import Toaster from "../toaster.svelte";
|
27 |
|
28 |
const startMessageUser: ConversationMessage = { role: "user", content: "" };
|
29 |
|
30 |
+
let viewCode = $state(false);
|
31 |
+
let viewSettings = $state(false);
|
32 |
+
let loading = $state(false);
|
33 |
+
|
34 |
+
const abortManager = new AbortManager();
|
35 |
+
let selectCompareModelOpen = $state(false);
|
36 |
|
37 |
interface GenerationStatistics {
|
38 |
latency: number;
|
39 |
generatedTokensCount: number;
|
40 |
}
|
41 |
+
let generationStats = $state(
|
42 |
+
session.project.conversations.map(_ => ({ latency: 0, generatedTokensCount: 0 })) as
|
43 |
+
| [GenerationStatistics]
|
44 |
+
| [GenerationStatistics, GenerationStatistics]
|
45 |
+
);
|
46 |
|
47 |
+
const systemPromptSupported = $derived(
|
48 |
+
session.project.conversations.some(conversation => isSystemPromptSupported(conversation.model))
|
49 |
+
);
|
50 |
+
const compareActive = $derived(session.project.conversations.length === 2);
|
51 |
|
52 |
function reset() {
|
53 |
+
session.project.conversations = session.project.conversations.map(conversation => {
|
54 |
+
return {
|
55 |
+
...conversation,
|
56 |
+
systemMessage: { role: "system", content: "" },
|
57 |
+
messages: [{ ...startMessageUser }],
|
58 |
+
};
|
59 |
});
|
|
|
60 |
}
|
61 |
|
62 |
+
async function runInference(conversationIdx: number) {
|
63 |
+
const conversation = session.project.conversations[conversationIdx];
|
64 |
+
if (!conversation) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
|
|
|
66 |
const startTime = performance.now();
|
67 |
+
const hf = new HfInference(token.value);
|
68 |
|
69 |
if (conversation.streaming) {
|
70 |
+
let addedMessage = false;
|
71 |
+
let streamingMessage = $state({ role: "assistant", content: "" });
|
|
|
|
|
72 |
|
73 |
await handleStreamingResponse(
|
74 |
hf,
|
75 |
conversation,
|
76 |
content => {
|
77 |
+
if (!streamingMessage) return;
|
78 |
+
streamingMessage.content = content;
|
79 |
+
if (!addedMessage) {
|
80 |
+
conversation.messages = [...conversation.messages, streamingMessage];
|
81 |
+
addedMessage = true;
|
|
|
|
|
|
|
|
|
82 |
}
|
83 |
+
// session.project.conversations[conversationIdx] = conversation;
|
84 |
+
const c = generationStats[conversationIdx];
|
85 |
+
if (c) c.generatedTokensCount += 1;
|
86 |
},
|
87 |
+
abortManager.createController()
|
88 |
);
|
89 |
} else {
|
|
|
90 |
const { message: newMessage, completion_tokens: newTokensCount } = await handleNonStreamingResponse(
|
91 |
hf,
|
92 |
conversation
|
93 |
);
|
94 |
+
conversation.messages = [...conversation.messages, newMessage];
|
95 |
+
const c = generationStats[conversationIdx];
|
96 |
+
if (c) c.generatedTokensCount += newTokensCount;
|
|
|
|
|
|
|
97 |
}
|
98 |
|
99 |
const endTime = performance.now();
|
|
|
102 |
}
|
103 |
|
104 |
async function submit() {
|
105 |
+
if (!token.value) {
|
106 |
+
token.showModal = true;
|
107 |
return;
|
108 |
}
|
109 |
|
110 |
+
for (const [idx, conversation] of session.project.conversations.entries()) {
|
111 |
+
if (conversation.messages.at(-1)?.role !== "assistant") continue;
|
112 |
+
let prefix = "";
|
113 |
+
if (session.project.conversations.length === 2) {
|
114 |
+
prefix = `Error on ${idx === 0 ? "left" : "right"} conversation. `;
|
|
|
|
|
115 |
}
|
116 |
+
return addToast({
|
117 |
+
title: "Failed to run inference",
|
118 |
+
description: `${prefix}Messages must alternate between user/assistant roles.`,
|
119 |
+
variant: "error",
|
120 |
+
});
|
121 |
}
|
122 |
|
123 |
(document.activeElement as HTMLElement).blur();
|
124 |
loading = true;
|
125 |
|
126 |
try {
|
127 |
+
const promises = session.project.conversations.map((_, idx) => runInference(idx));
|
128 |
await Promise.all(promises);
|
129 |
} catch (error) {
|
130 |
+
for (const conversation of session.project.conversations) {
|
131 |
if (conversation.messages.at(-1)?.role === "assistant" && !conversation.messages.at(-1)?.content?.trim()) {
|
132 |
conversation.messages.pop();
|
133 |
conversation.messages = [...conversation.messages];
|
134 |
}
|
135 |
+
session.$ = session.$;
|
136 |
}
|
137 |
+
|
138 |
if (error instanceof Error) {
|
139 |
+
const msg = error.message;
|
140 |
+
if (msg.toLowerCase().includes("montly") || msg.toLowerCase().includes("pro")) {
|
141 |
+
showQuotaModal();
|
142 |
+
}
|
143 |
+
|
144 |
if (error.message.includes("token seems invalid")) {
|
145 |
token.reset();
|
146 |
}
|
147 |
+
|
148 |
if (error.name !== "AbortError") {
|
149 |
+
addToast({ title: "Error", description: error.message, variant: "error" });
|
150 |
}
|
151 |
} else {
|
152 |
+
addToast({ title: "Error", description: "An unknown error occurred", variant: "error" });
|
153 |
}
|
154 |
} finally {
|
155 |
loading = false;
|
156 |
+
abortManager.clear();
|
157 |
}
|
158 |
}
|
159 |
|
|
|
169 |
const submittedHfToken = (formData.get("hf-token") as string).trim() ?? "";
|
170 |
const RE_HF_TOKEN = /\bhf_[a-zA-Z0-9]{34}\b/;
|
171 |
if (RE_HF_TOKEN.test(submittedHfToken)) {
|
172 |
+
token.value = submittedHfToken;
|
173 |
submit();
|
174 |
} else {
|
175 |
alert("Please provide a valid HF token.");
|
|
|
177 |
}
|
178 |
|
179 |
function addCompareModel(modelId: ModelWithTokenizer["id"]) {
|
180 |
+
const model = models.all.find(m => m.id === modelId);
|
181 |
+
if (!model || session.project.conversations.length === 2) {
|
182 |
return;
|
183 |
}
|
184 |
+
const newConversation = { ...JSON.parse(JSON.stringify(session.project.conversations[0])), model };
|
185 |
+
session.project.conversations = [...session.project.conversations, newConversation];
|
186 |
generationStats = [generationStats[0], { latency: 0, generatedTokensCount: 0 }];
|
187 |
}
|
188 |
|
189 |
function removeCompareModal(conversationIdx: number) {
|
190 |
+
session.project.conversations.splice(conversationIdx, 1)[0];
|
191 |
+
session.$ = session.$;
|
192 |
generationStats.splice(conversationIdx, 1)[0];
|
193 |
generationStats = generationStats;
|
194 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
195 |
</script>
|
196 |
|
197 |
+
{#if token.showModal}
|
198 |
<HFTokenModal
|
199 |
+
bind:storeLocallyHfToken={token.writeToLocalStorage}
|
200 |
+
on:close={() => (token.showModal = false)}
|
201 |
on:submit={handleTokenSubmit}
|
202 |
/>
|
203 |
{/if}
|
204 |
|
205 |
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
206 |
<div
|
207 |
class="motion-safe:animate-fade-in grid h-dvh divide-gray-200 overflow-hidden bg-gray-100/50 max-md:grid-rows-[120px_1fr] max-md:divide-y dark:divide-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:[color-scheme:dark] {compareActive
|
208 |
? 'md:grid-cols-[clamp(220px,20%,350px)_minmax(0,1fr)]'
|
209 |
: 'md:grid-cols-[clamp(220px,20%,350px)_minmax(0,1fr)_clamp(270px,25%,300px)]'}"
|
210 |
>
|
211 |
+
<!-- First column -->
|
212 |
<div class="flex flex-col gap-2 overflow-y-auto py-3 pr-3 max-md:pl-3">
|
213 |
<div class="pl-2">
|
214 |
+
<ProjectSelect />
|
215 |
</div>
|
216 |
<div
|
217 |
class="relative flex flex-1 flex-col gap-6 overflow-y-hidden rounded-r-xl border-x border-y border-gray-200/80 bg-linear-to-b from-white via-white p-3 shadow-xs max-md:rounded-xl dark:border-white/5 dark:from-gray-800/40 dark:via-gray-800/40"
|
|
|
225 |
placeholder={systemPromptSupported
|
226 |
? "Enter a custom prompt"
|
227 |
: "System prompt is not supported with the chosen model."}
|
228 |
+
value={systemPromptSupported ? session.project.conversations[0]?.systemMessage.content : ""}
|
229 |
+
oninput={e => {
|
230 |
+
for (const conversation of session.project.conversations) {
|
231 |
conversation.systemMessage.content = e.currentTarget.value;
|
232 |
}
|
233 |
+
session.$ = session.$;
|
234 |
}}
|
235 |
class="absolute inset-x-0 bottom-0 h-full resize-none bg-transparent px-3 pt-10 text-sm outline-hidden"
|
236 |
></textarea>
|
237 |
</div>
|
238 |
</div>
|
239 |
+
|
240 |
+
<!-- Center column -->
|
241 |
+
<div class="relative divide-y divide-gray-200 dark:divide-gray-800" onkeydown={onKeydown}>
|
242 |
+
<Toaster />
|
243 |
<div
|
244 |
class="flex h-[calc(100dvh-5rem-120px)] divide-x divide-gray-200 overflow-x-auto overflow-y-hidden *:w-full max-sm:w-dvw md:h-[calc(100dvh-5rem)] md:pt-3 dark:divide-gray-800"
|
245 |
>
|
246 |
+
{#each session.project.conversations as conversation, conversationIdx (conversation)}
|
247 |
<div class="max-sm:min-w-full">
|
248 |
{#if compareActive}
|
249 |
<PlaygroundConversationHeader
|
250 |
{conversationIdx}
|
251 |
+
bind:conversation={session.project.conversations[conversationIdx]!}
|
252 |
on:close={() => removeCompareModal(conversationIdx)}
|
253 |
/>
|
254 |
{/if}
|
255 |
<PlaygroundConversation
|
256 |
{loading}
|
257 |
+
bind:conversation={
|
258 |
+
() => session.project.conversations[conversationIdx]!,
|
259 |
+
v => (session.project.conversations[conversationIdx] = v)
|
260 |
+
}
|
261 |
{viewCode}
|
262 |
{compareActive}
|
263 |
on:closeCode={() => (viewCode = false)}
|
|
|
272 |
{#if !compareActive}
|
273 |
<button
|
274 |
type="button"
|
275 |
+
onclick={() => (viewSettings = !viewSettings)}
|
276 |
class="flex h-[39px] items-center gap-1 rounded-lg border border-gray-200 bg-white px-3 py-2.5 text-sm font-medium text-gray-900 hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-100 focus:outline-hidden md:hidden dark:border-gray-600 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
|
277 |
>
|
278 |
<div class="text-black dark:text-white">
|
|
|
281 |
{!viewSettings ? "Settings" : "Hide Settings"}
|
282 |
</button>
|
283 |
{/if}
|
284 |
+
<button type="button" onclick={reset} class="btn size-[39px]">
|
285 |
<IconDelete />
|
286 |
</button>
|
287 |
</div>
|
|
|
291 |
{/each}
|
292 |
</div>
|
293 |
<div class="flex flex-1 justify-end gap-x-2">
|
294 |
+
<button type="button" onclick={() => (viewCode = !viewCode)} class="btn">
|
295 |
<IconCode />
|
296 |
{!viewCode ? "View Code" : "Hide Code"}</button
|
297 |
>
|
298 |
<button
|
299 |
+
onclick={() => {
|
300 |
viewCode = false;
|
301 |
+
loading ? abortManager.abortAll() : submit();
|
302 |
}}
|
303 |
type="button"
|
304 |
class="flex h-[39px] w-24 items-center justify-center gap-2 rounded-lg px-5 py-2.5 text-sm font-medium text-white focus:ring-4 focus:ring-gray-300 focus:outline-hidden dark:border-gray-700 dark:focus:ring-gray-700 {loading
|
|
|
308 |
{#if loading}
|
309 |
<div class="flex flex-none items-center gap-[3px]">
|
310 |
<span class="mr-2">
|
311 |
+
{#if session.project.conversations[0]?.streaming || session.project.conversations[1]?.streaming}
|
312 |
Stop
|
313 |
{:else}
|
314 |
Cancel
|
315 |
{/if}
|
316 |
</span>
|
317 |
+
{#each { length: 3 } as _, i}
|
318 |
+
<div
|
319 |
+
class="h-1 w-1 flex-none animate-bounce rounded-full bg-gray-500 dark:bg-gray-100"
|
320 |
+
style="animation-delay: {(i + 1) * 0.25}s;"
|
321 |
+
></div>
|
322 |
+
{/each}
|
|
|
|
|
|
|
|
|
|
|
|
|
323 |
</div>
|
324 |
{:else}
|
325 |
Run <span
|
|
|
331 |
</div>
|
332 |
</div>
|
333 |
</div>
|
334 |
+
|
335 |
+
<!-- Last column -->
|
336 |
{#if !compareActive}
|
337 |
<div class="flex flex-col p-3 {viewSettings ? 'max-md:fixed' : 'max-md:hidden'} max-md:inset-x-0 max-md:bottom-20">
|
338 |
<div
|
339 |
class="flex flex-1 flex-col gap-6 overflow-y-hidden rounded-xl border border-gray-200/80 bg-white bg-linear-to-b from-white via-white p-3 shadow-xs dark:border-white/5 dark:bg-gray-900 dark:from-gray-800/40 dark:via-gray-800/40"
|
340 |
>
|
341 |
<div class="flex flex-col gap-2">
|
342 |
+
<ModelSelector bind:conversation={session.project.conversations[0]!} />
|
343 |
<div class="flex items-center gap-2 self-end px-2 text-xs whitespace-nowrap">
|
344 |
<button
|
345 |
class="flex items-center gap-0.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
|
346 |
+
onclick={() => (selectCompareModelOpen = true)}
|
347 |
>
|
348 |
<IconCompare />
|
349 |
Compare
|
350 |
</button>
|
351 |
<a
|
352 |
+
href="https://huggingface.co/{session.project.conversations[0]?.model.id}?inference_provider={session
|
353 |
+
.project.conversations[0]?.provider}"
|
354 |
target="_blank"
|
355 |
class="flex items-center gap-0.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300"
|
356 |
>
|
|
|
360 |
</div>
|
361 |
</div>
|
362 |
|
363 |
+
<GenerationConfig bind:conversation={session.project.conversations[0]!} />
|
364 |
+
{#if token.value}
|
365 |
<button
|
366 |
+
onclick={token.reset}
|
367 |
class="mt-auto flex items-center gap-1 self-end text-sm text-gray-500 underline decoration-gray-300 hover:text-gray-800 dark:text-gray-400 dark:decoration-gray-600 dark:hover:text-gray-200"
|
368 |
><svg xmlns="http://www.w3.org/2000/svg" class="text-xs" width="1em" height="1em" viewBox="0 0 32 32"
|
369 |
><path
|
|
|
419 |
|
420 |
{#if selectCompareModelOpen}
|
421 |
<ModelSelectorModal
|
422 |
+
conversation={session.project.conversations[0]!}
|
423 |
+
onModelSelect={addCompareModel}
|
424 |
+
onClose={() => (selectCompareModelOpen = false)}
|
425 |
/>
|
426 |
{/if}
|
src/lib/components/{InferencePlayground/InferencePlaygroundProjectSelect.svelte β inference-playground/project-select.svelte}
RENAMED
@@ -1,45 +1,45 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import {
|
3 |
-
import { cn } from "$lib/utils/cn";
|
4 |
-
import {
|
5 |
import IconCaret from "~icons/carbon/chevron-down";
|
6 |
import IconCross from "~icons/carbon/close";
|
7 |
import IconEdit from "~icons/carbon/edit";
|
8 |
import IconSave from "~icons/carbon/save";
|
9 |
import IconDelete from "~icons/carbon/trash-can";
|
10 |
-
import { prompt } from "../
|
11 |
|
12 |
-
|
13 |
-
|
|
|
|
|
|
|
14 |
|
15 |
-
|
16 |
|
17 |
-
const {
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
if (!p) return;
|
24 |
-
$session.activeProjectId = p?.value;
|
25 |
});
|
26 |
|
27 |
async function saveProject() {
|
28 |
-
session.saveProject((await prompt("Set project name")) || "Project #" + (
|
29 |
}
|
30 |
</script>
|
31 |
|
32 |
<div class={cn("flex w-full items-stretch gap-2 ", classNames)}>
|
33 |
<button
|
34 |
-
{
|
35 |
-
use:trigger
|
36 |
class={cn(
|
37 |
"relative flex grow items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
38 |
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110"
|
39 |
)}
|
40 |
>
|
41 |
<div class="flex items-center gap-1 text-sm">
|
42 |
-
{
|
43 |
</div>
|
44 |
<div
|
45 |
class="absolute right-2 grid size-4 flex-none place-items-center rounded-sm bg-gray-100 text-xs dark:bg-gray-600"
|
@@ -48,19 +48,20 @@
|
|
48 |
</div>
|
49 |
</button>
|
50 |
{#if isDefault}
|
51 |
-
<button class="btn size-[32px] p-0"
|
52 |
<IconSave />
|
53 |
</button>
|
54 |
{:else}
|
55 |
-
<button class="btn size-[32px] p-0"
|
56 |
<IconCross />
|
57 |
</button>
|
58 |
{/if}
|
59 |
</div>
|
60 |
|
61 |
-
<div {
|
62 |
-
{#each
|
63 |
-
|
|
|
64 |
<div
|
65 |
class="flex items-center gap-2 rounded-md py-1.5 pr-1 pl-2 group-data-[highlighted]:bg-gray-200 dark:group-data-[highlighted]:bg-gray-700"
|
66 |
>
|
@@ -69,7 +70,7 @@
|
|
69 |
<div class="ml-auto flex items-center gap-1">
|
70 |
<button
|
71 |
class="grid place-items-center rounded-md p-1 text-xs hover:bg-gray-300 dark:hover:bg-gray-600"
|
72 |
-
|
73 |
e.stopPropagation();
|
74 |
session.updateProject(id, { name: (await prompt("Edit project name", name)) || name });
|
75 |
}}
|
@@ -78,7 +79,7 @@
|
|
78 |
</button>
|
79 |
<button
|
80 |
class="grid place-items-center rounded-md p-1 text-xs hover:bg-gray-300 dark:hover:bg-gray-600"
|
81 |
-
|
82 |
e.stopPropagation();
|
83 |
session.deleteProject(id);
|
84 |
}}
|
@@ -88,6 +89,6 @@
|
|
88 |
</div>
|
89 |
{/if}
|
90 |
</div>
|
91 |
-
</
|
92 |
{/each}
|
93 |
</div>
|
|
|
1 |
<script lang="ts">
|
2 |
+
import { session } from "$lib/state/session.svelte.js";
|
3 |
+
import { cn } from "$lib/utils/cn.js";
|
4 |
+
import { Select } from "melt/builders";
|
5 |
import IconCaret from "~icons/carbon/chevron-down";
|
6 |
import IconCross from "~icons/carbon/close";
|
7 |
import IconEdit from "~icons/carbon/edit";
|
8 |
import IconSave from "~icons/carbon/save";
|
9 |
import IconDelete from "~icons/carbon/trash-can";
|
10 |
+
import { prompt } from "../prompts.svelte";
|
11 |
|
12 |
+
interface Props {
|
13 |
+
class?: string;
|
14 |
+
}
|
15 |
+
|
16 |
+
let { class: classNames = "" }: Props = $props();
|
17 |
|
18 |
+
const isDefault = $derived(session.$.activeProjectId === "default");
|
19 |
|
20 |
+
const select = new Select({
|
21 |
+
value: () => session.$.activeProjectId,
|
22 |
+
onValueChange(v) {
|
23 |
+
if (v) session.$.activeProjectId = v;
|
24 |
+
},
|
25 |
+
sameWidth: true,
|
|
|
|
|
26 |
});
|
27 |
|
28 |
async function saveProject() {
|
29 |
+
session.saveProject((await prompt("Set project name")) || "Project #" + (session.$.projects.length + 1));
|
30 |
}
|
31 |
</script>
|
32 |
|
33 |
<div class={cn("flex w-full items-stretch gap-2 ", classNames)}>
|
34 |
<button
|
35 |
+
{...select.trigger}
|
|
|
36 |
class={cn(
|
37 |
"relative flex grow items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
38 |
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110"
|
39 |
)}
|
40 |
>
|
41 |
<div class="flex items-center gap-1 text-sm">
|
42 |
+
{session.project.name}
|
43 |
</div>
|
44 |
<div
|
45 |
class="absolute right-2 grid size-4 flex-none place-items-center rounded-sm bg-gray-100 text-xs dark:bg-gray-600"
|
|
|
48 |
</div>
|
49 |
</button>
|
50 |
{#if isDefault}
|
51 |
+
<button class="btn size-[32px] p-0" onclick={saveProject}>
|
52 |
<IconSave />
|
53 |
</button>
|
54 |
{:else}
|
55 |
+
<button class="btn size-[32px] p-0" onclick={() => (session.$.activeProjectId = "default")}>
|
56 |
<IconCross />
|
57 |
</button>
|
58 |
{/if}
|
59 |
</div>
|
60 |
|
61 |
+
<div {...select.content} class="rounded-lg border bg-gray-100 dark:border-gray-700 dark:bg-gray-800">
|
62 |
+
{#each session.$.projects as { name, id } (id)}
|
63 |
+
{@const option = select.getOption(id)}
|
64 |
+
<div {...option} class="group block w-full p-1 text-sm dark:text-white">
|
65 |
<div
|
66 |
class="flex items-center gap-2 rounded-md py-1.5 pr-1 pl-2 group-data-[highlighted]:bg-gray-200 dark:group-data-[highlighted]:bg-gray-700"
|
67 |
>
|
|
|
70 |
<div class="ml-auto flex items-center gap-1">
|
71 |
<button
|
72 |
class="grid place-items-center rounded-md p-1 text-xs hover:bg-gray-300 dark:hover:bg-gray-600"
|
73 |
+
onclick={async e => {
|
74 |
e.stopPropagation();
|
75 |
session.updateProject(id, { name: (await prompt("Edit project name", name)) || name });
|
76 |
}}
|
|
|
79 |
</button>
|
80 |
<button
|
81 |
class="grid place-items-center rounded-md p-1 text-xs hover:bg-gray-300 dark:hover:bg-gray-600"
|
82 |
+
onclick={e => {
|
83 |
e.stopPropagation();
|
84 |
session.deleteProject(id);
|
85 |
}}
|
|
|
89 |
</div>
|
90 |
{/if}
|
91 |
</div>
|
92 |
+
</div>
|
93 |
{/each}
|
94 |
</div>
|
src/lib/components/{InferencePlayground/InferencePlaygroundProviderSelect.svelte β inference-playground/provider-select.svelte}
RENAMED
@@ -1,15 +1,20 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import
|
3 |
|
4 |
-
import {
|
5 |
-
|
6 |
-
import {
|
|
|
|
|
7 |
import IconCaret from "~icons/carbon/chevron-down";
|
8 |
-
import IconProvider from "../
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
-
|
11 |
-
let classes: string | undefined = undefined;
|
12 |
-
export { classes as class };
|
13 |
|
14 |
function reset(providers: typeof conversation.model.inferenceProviderMapping) {
|
15 |
const validProvider = providers.find(p => p.provider === conversation.provider);
|
@@ -17,18 +22,17 @@
|
|
17 |
conversation.provider = randomPick(providers)?.provider;
|
18 |
}
|
19 |
|
20 |
-
|
21 |
-
|
|
|
|
|
22 |
|
23 |
-
const {
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
conversation.provider ? { value: conversation.provider } : undefined,
|
30 |
-
p => (conversation.provider = p?.value)
|
31 |
-
);
|
32 |
|
33 |
const nameMap: Record<string, string> = {
|
34 |
"sambanova": "SambaNova",
|
@@ -72,8 +76,7 @@
|
|
72 |
-->
|
73 |
|
74 |
<button
|
75 |
-
{
|
76 |
-
use:trigger
|
77 |
class={cn(
|
78 |
"relative flex items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
79 |
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110",
|
@@ -91,9 +94,9 @@
|
|
91 |
</div>
|
92 |
</button>
|
93 |
|
94 |
-
<div {
|
95 |
{#each conversation.model.inferenceProviderMapping as { provider, providerId } (provider + providerId)}
|
96 |
-
<button {
|
97 |
<div
|
98 |
class="flex items-center gap-2 rounded-md px-2 py-1.5 group-data-[highlighted]:bg-gray-200 dark:group-data-[highlighted]:bg-gray-700"
|
99 |
>
|
|
|
1 |
<script lang="ts">
|
2 |
+
import { run } from "svelte/legacy";
|
3 |
|
4 |
+
import type { Conversation } from "$lib/types.js";
|
5 |
+
|
6 |
+
import { randomPick } from "$lib/utils/array.js";
|
7 |
+
import { cn } from "$lib/utils/cn.js";
|
8 |
+
import { Select } from "melt/builders";
|
9 |
import IconCaret from "~icons/carbon/chevron-down";
|
10 |
+
import IconProvider from "../icon-provider.svelte";
|
11 |
+
|
12 |
+
interface Props {
|
13 |
+
conversation: Conversation;
|
14 |
+
class?: string | undefined;
|
15 |
+
}
|
16 |
|
17 |
+
let { conversation = $bindable(), class: classes = undefined }: Props = $props();
|
|
|
|
|
18 |
|
19 |
function reset(providers: typeof conversation.model.inferenceProviderMapping) {
|
20 |
const validProvider = providers.find(p => p.provider === conversation.provider);
|
|
|
22 |
conversation.provider = randomPick(providers)?.provider;
|
23 |
}
|
24 |
|
25 |
+
let providers = $derived(conversation.model.inferenceProviderMapping);
|
26 |
+
run(() => {
|
27 |
+
reset(providers);
|
28 |
+
});
|
29 |
|
30 |
+
const select = new Select<string, false>({
|
31 |
+
value: () => conversation.provider,
|
32 |
+
onValueChange(v) {
|
33 |
+
conversation.provider = v;
|
34 |
+
},
|
35 |
+
});
|
|
|
|
|
|
|
36 |
|
37 |
const nameMap: Record<string, string> = {
|
38 |
"sambanova": "SambaNova",
|
|
|
76 |
-->
|
77 |
|
78 |
<button
|
79 |
+
{...select.trigger}
|
|
|
80 |
class={cn(
|
81 |
"relative flex items-center justify-between gap-6 overflow-hidden rounded-lg border bg-gray-100/80 px-3 py-1.5 leading-tight whitespace-nowrap shadow-sm",
|
82 |
"hover:brightness-95 dark:border-gray-700 dark:bg-gray-800 dark:hover:brightness-110",
|
|
|
94 |
</div>
|
95 |
</button>
|
96 |
|
97 |
+
<div {...select.content} class="rounded-lg border bg-gray-100 dark:border-gray-700 dark:bg-gray-800">
|
98 |
{#each conversation.model.inferenceProviderMapping as { provider, providerId } (provider + providerId)}
|
99 |
+
<button {...select.getOption(provider)} class="group block w-full p-1 text-sm dark:text-white">
|
100 |
<div
|
101 |
class="flex items-center gap-2 rounded-md px-2 py-1.5 group-data-[highlighted]:bg-gray-200 dark:group-data-[highlighted]:bg-gray-700"
|
102 |
>
|
src/lib/components/{InferencePlayground/inferencePlaygroundUtils.ts β inference-playground/utils.ts}
RENAMED
@@ -1,4 +1,4 @@
|
|
1 |
-
import type { Conversation, ModelWithTokenizer } from "$lib/types";
|
2 |
import type { InferenceSnippet } from "@huggingface/tasks";
|
3 |
import { type ChatCompletionOutputMessage } from "@huggingface/tasks";
|
4 |
|
@@ -50,7 +50,6 @@ export async function handleNonStreamingResponse(
|
|
50 |
});
|
51 |
|
52 |
if (response.choices && response.choices.length > 0) {
|
53 |
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
54 |
const { message } = response.choices[0]!;
|
55 |
const { completion_tokens } = response.usage;
|
56 |
return { message, completion_tokens };
|
|
|
1 |
+
import type { Conversation, ModelWithTokenizer } from "$lib/types.js";
|
2 |
import type { InferenceSnippet } from "@huggingface/tasks";
|
3 |
import { type ChatCompletionOutputMessage } from "@huggingface/tasks";
|
4 |
|
|
|
50 |
});
|
51 |
|
52 |
if (response.choices && response.choices.length > 0) {
|
|
|
53 |
const { message } = response.choices[0]!;
|
54 |
const { completion_tokens } = response.usage;
|
55 |
return { message, completion_tokens };
|
src/lib/components/label-pro.svelte
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script lang="ts">
|
2 |
+
interface Props {
|
3 |
+
class?: string;
|
4 |
+
size?: "xs" | "sm" | "md";
|
5 |
+
}
|
6 |
+
|
7 |
+
let { class: classNames = "", size = "md" }: Props = $props();
|
8 |
+
|
9 |
+
const sizeClasses: Record<string, string> = {
|
10 |
+
xs: "rounded-md px-1 py-0",
|
11 |
+
sm: "rounded-md px-1.5 py-0",
|
12 |
+
md: "rounded-lg px-2.5 py-0.5",
|
13 |
+
};
|
14 |
+
</script>
|
15 |
+
|
16 |
+
<span
|
17 |
+
class="inline-block -skew-x-12 border border-gray-200 bg-linear-to-br from-pink-300 via-emerald-200 to-yellow-200
|
18 |
+
text-sm font-bold text-black shadow-lg shadow-emerald-500/10 dark:border-gray-800
|
19 |
+
dark:from-pink-500 dark:via-emerald-500 dark:to-yellow-500 dark:text-black dark:shadow-emerald-500/20
|
20 |
+
{sizeClasses[size]} {classNames}"
|
21 |
+
>
|
22 |
+
PRO
|
23 |
+
</span>
|
src/lib/components/{Prompts.svelte β prompts.svelte}
RENAMED
@@ -1,6 +1,6 @@
|
|
1 |
-
<script lang="ts"
|
2 |
-
import {
|
3 |
-
import {
|
4 |
import IconCross from "~icons/carbon/close";
|
5 |
|
6 |
type Prompt = {
|
@@ -10,32 +10,32 @@
|
|
10 |
callback: (value: string) => void;
|
11 |
};
|
12 |
|
13 |
-
|
|
|
14 |
|
15 |
export function resolvePrompt() {
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
});
|
20 |
}
|
21 |
|
22 |
-
export async function prompt(label: string,
|
23 |
return new Promise(res => {
|
24 |
-
prompts.
|
25 |
});
|
26 |
}
|
27 |
</script>
|
28 |
|
29 |
<script lang="ts">
|
30 |
-
|
31 |
-
|
32 |
-
let dialog: HTMLDialogElement | undefined;
|
33 |
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
|
|
|
|
39 |
|
40 |
function onSubmit(e: Event) {
|
41 |
e.preventDefault();
|
@@ -43,11 +43,11 @@
|
|
43 |
}
|
44 |
</script>
|
45 |
|
46 |
-
<dialog bind:this={dialog}
|
47 |
{#if current}
|
48 |
<div class="fixed inset-0 z-50 flex items-center justify-center overflow-hidden bg-black/85">
|
49 |
<form
|
50 |
-
|
51 |
class="relative w-xl rounded-lg bg-white shadow-sm dark:bg-gray-900"
|
52 |
use:clickOutside={resolvePrompt}
|
53 |
>
|
@@ -58,7 +58,7 @@
|
|
58 |
<button
|
59 |
type="button"
|
60 |
class="ms-auto inline-flex h-8 w-8 items-center justify-center rounded-lg bg-transparent text-sm text-gray-400 hover:bg-gray-200 hover:text-gray-900 dark:hover:bg-gray-600 dark:hover:text-white"
|
61 |
-
|
62 |
>
|
63 |
<div class="text-xl">
|
64 |
<IconCross />
|
@@ -69,13 +69,11 @@
|
|
69 |
<!-- Modal body -->
|
70 |
<div class="p-4 md:p-5">
|
71 |
<label class="flex flex-col gap-2 font-medium text-gray-900 dark:text-white">
|
72 |
-
<!-- This is fine in dialogs -->
|
73 |
-
<!-- svelte-ignore a11y-autofocus -->
|
74 |
<input
|
75 |
bind:value={current.value}
|
76 |
placeholder={current.placeholder}
|
77 |
-
autofocus
|
78 |
required
|
|
|
79 |
type="text"
|
80 |
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"
|
81 |
/>
|
|
|
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 = {
|
|
|
10 |
callback: (value: string) => void;
|
11 |
};
|
12 |
|
13 |
+
let prompts = $state<Prompt[]>([]);
|
14 |
+
const current = $derived(prompts[0]);
|
15 |
|
16 |
export function resolvePrompt() {
|
17 |
+
if (!current) return;
|
18 |
+
current.callback(current.value ?? "");
|
19 |
+
prompts.splice(0, 1);
|
|
|
20 |
}
|
21 |
|
22 |
+
export async function prompt(label: string, defaultValue?: string): Promise<string> {
|
23 |
return new Promise(res => {
|
24 |
+
prompts.push({ label, value: defaultValue, callback: res });
|
25 |
});
|
26 |
}
|
27 |
</script>
|
28 |
|
29 |
<script lang="ts">
|
30 |
+
let dialog: HTMLDialogElement | undefined = $state();
|
|
|
|
|
31 |
|
32 |
+
$effect(() => {
|
33 |
+
if (current) {
|
34 |
+
dialog?.showModal();
|
35 |
+
} else {
|
36 |
+
dialog?.close();
|
37 |
+
}
|
38 |
+
});
|
39 |
|
40 |
function onSubmit(e: Event) {
|
41 |
e.preventDefault();
|
|
|
43 |
}
|
44 |
</script>
|
45 |
|
46 |
+
<dialog bind:this={dialog} onclose={resolvePrompt}>
|
47 |
{#if current}
|
48 |
<div class="fixed inset-0 z-50 flex items-center justify-center overflow-hidden bg-black/85">
|
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 |
>
|
|
|
58 |
<button
|
59 |
type="button"
|
60 |
class="ms-auto inline-flex h-8 w-8 items-center justify-center rounded-lg bg-transparent text-sm text-gray-400 hover:bg-gray-200 hover:text-gray-900 dark:hover:bg-gray-600 dark:hover:text-white"
|
61 |
+
onclick={resolvePrompt}
|
62 |
>
|
63 |
<div class="text-xl">
|
64 |
<IconCross />
|
|
|
69 |
<!-- Modal body -->
|
70 |
<div class="p-4 md:p-5">
|
71 |
<label class="flex flex-col gap-2 font-medium text-gray-900 dark:text-white">
|
|
|
|
|
72 |
<input
|
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 |
/>
|
src/lib/components/quota-modal.svelte
ADDED
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script lang="ts" module>
|
2 |
+
let open = $state(false);
|
3 |
+
|
4 |
+
export function showQuotaModal() {
|
5 |
+
open = true;
|
6 |
+
}
|
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";
|
14 |
+
import { fade, scale } from "svelte/transition";
|
15 |
+
import LabelPro from "./label-pro.svelte";
|
16 |
+
let dialog: HTMLDialogElement | undefined = $state();
|
17 |
+
|
18 |
+
$effect(() => {
|
19 |
+
if (open) {
|
20 |
+
dialog?.showModal();
|
21 |
+
} else {
|
22 |
+
setTimeout(() => dialog?.close(), 250);
|
23 |
+
}
|
24 |
+
});
|
25 |
+
|
26 |
+
const actions: string[] = [
|
27 |
+
"Exchange a million words with leading models",
|
28 |
+
"Use the fastest inference providers",
|
29 |
+
"Compare 80+ conversational models",
|
30 |
+
"Process hundreds of images",
|
31 |
+
];
|
32 |
+
</script>
|
33 |
+
|
34 |
+
<dialog class="backdrop:bg-transparent" bind:this={dialog} onclose={() => (open = false)}>
|
35 |
+
{#if open}
|
36 |
+
<!-- Backdrop -->
|
37 |
+
<div
|
38 |
+
class="fixed inset-0 z-50 flex items-center justify-center overflow-hidden bg-black/50 backdrop-blur-sm"
|
39 |
+
transition:fade={{ duration: 150 }}
|
40 |
+
>
|
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">
|
48 |
+
Upgrade Your AI Experience with a <LabelPro
|
49 |
+
class="mx-0.5 -translate-y-px align-middle leading-6 max-sm:py-0! sm:text-xl"
|
50 |
+
/> Account
|
51 |
+
</h2>
|
52 |
+
<button
|
53 |
+
type="button"
|
54 |
+
class="absolute top-3 right-3 inline-flex h-8 w-8 items-center justify-center rounded-lg bg-transparent text-sm text-gray-400 hover:bg-gray-200 hover:text-gray-900 dark:hover:bg-gray-600 dark:hover:text-white"
|
55 |
+
onclick={() => (open = false)}
|
56 |
+
aria-label="Close modal"
|
57 |
+
>
|
58 |
+
<div class="text-xl">
|
59 |
+
<IconCross />
|
60 |
+
</div>
|
61 |
+
</button>
|
62 |
+
|
63 |
+
<!-- Modal body -->
|
64 |
+
<div class="p-4 md:p-5 dark:text-white">
|
65 |
+
<p
|
66 |
+
class="rounded-xl border border-amber-900 bg-amber-700/25 p-4 font-medium text-amber-800 dark:bg-amber-800/25 dark:text-amber-200"
|
67 |
+
>
|
68 |
+
You have reached your usage limits. To continue using the playground, please consider creating a PRO
|
69 |
+
account!
|
70 |
+
</p>
|
71 |
+
<p class="mt-4 text-gray-600 dark:text-gray-400">
|
72 |
+
By subscribing to PRO, you get <span class="text-black dark:text-white"
|
73 |
+
>$2 worth of Inference credits every month.</span
|
74 |
+
> Meaning you could:
|
75 |
+
</p>
|
76 |
+
<ul class="mt-4 flex flex-col gap-2">
|
77 |
+
{#each actions as action}
|
78 |
+
<li class="flex items-center justify-start gap-2.5">
|
79 |
+
<div
|
80 |
+
class="flex size-5 items-center justify-center rounded-full border border-green-500/15 bg-green-500/10 dark:bg-green-500/20"
|
81 |
+
>
|
82 |
+
<IconCheck class="text-xs text-green-600 dark:text-green-300" />
|
83 |
+
</div>
|
84 |
+
{action}
|
85 |
+
</li>
|
86 |
+
{/each}
|
87 |
+
</ul>
|
88 |
+
</div>
|
89 |
+
|
90 |
+
<!-- Modal footer -->
|
91 |
+
<div class="flex rounded-b p-4 !pb-8 md:p-5 dark:border-gray-800">
|
92 |
+
<a
|
93 |
+
href="https://huggingface.co/settings/billing/subscription#subscribe"
|
94 |
+
class="mx-auto mt-1 flex w-fit items-center justify-between gap-6 rounded-full bg-black py-2.5 pr-4 pl-5 text-white hover:bg-gray-900 dark:bg-white/85 dark:text-black dark:hover:bg-white"
|
95 |
+
>
|
96 |
+
<p>
|
97 |
+
Subscribe to PRO
|
98 |
+
<span class="text-gray-400 dark:text-gray-500">($9/month)</span>
|
99 |
+
</p>
|
100 |
+
<IconExternal />
|
101 |
+
</a>
|
102 |
+
</div>
|
103 |
+
</div>
|
104 |
+
</div>
|
105 |
+
{/if}
|
106 |
+
</dialog>
|
src/lib/components/toaster.svelte
ADDED
@@ -0,0 +1,171 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script lang="ts">
|
2 |
+
import { fly } from "svelte/transition";
|
3 |
+
import { toaster } from "./toaster.svelte.js";
|
4 |
+
import { Progress } from "melt/components";
|
5 |
+
import Close from "~icons/carbon/close";
|
6 |
+
import { omit } from "$lib/utils/object.js";
|
7 |
+
import { session } from "$lib/state/session.svelte.js";
|
8 |
+
import { AnimationFrames } from "runed";
|
9 |
+
|
10 |
+
let toastHeights = $state<number[]>([]);
|
11 |
+
new AnimationFrames(() => {
|
12 |
+
const rootEl = document.getElementById(toaster.root.id);
|
13 |
+
if (!rootEl) return;
|
14 |
+
|
15 |
+
const toastEls = Array.from(rootEl.querySelectorAll("[data-melt-toaster-toast-content]"));
|
16 |
+
toastHeights = toastEls.map(el => el.clientHeight);
|
17 |
+
// console.log(toastHeights);
|
18 |
+
});
|
19 |
+
|
20 |
+
const isComparing = $derived(session.project.conversations.length > 1);
|
21 |
+
|
22 |
+
const GAP = 8;
|
23 |
+
|
24 |
+
function getToastStyle(i: number) {
|
25 |
+
// Remember, the order is reversed! Meaning i=0 was the first toast, so its the last
|
26 |
+
// we want to show.
|
27 |
+
const n = toaster.toasts.length - i - 1;
|
28 |
+
if (n === 0) return "";
|
29 |
+
const reversedHeights = toastHeights.toReversed();
|
30 |
+
const yHover = -1 * reversedHeights.slice(0, n).reduce((a, b) => a + b + GAP, 0);
|
31 |
+
|
32 |
+
const y = -n * 10;
|
33 |
+
|
34 |
+
return `
|
35 |
+
--y-hover: ${yHover}px;
|
36 |
+
--y: ${y}px;
|
37 |
+
`;
|
38 |
+
}
|
39 |
+
|
40 |
+
function getRootStyle() {
|
41 |
+
const heightHover = toastHeights.reduce((a, b) => a + b + GAP, 0);
|
42 |
+
return `
|
43 |
+
--h-hover: ${heightHover}px;
|
44 |
+
`;
|
45 |
+
}
|
46 |
+
</script>
|
47 |
+
|
48 |
+
<div
|
49 |
+
{...omit(toaster.root, "popover")}
|
50 |
+
class={["absolute right-2 bottom-23 flex w-[300px] flex-col ", !isComparing && "md:right-0"]}
|
51 |
+
style:--toasts={toaster.toasts.length}
|
52 |
+
style={getRootStyle()}
|
53 |
+
>
|
54 |
+
{#each toaster.toasts as toast, i (toast.id)}
|
55 |
+
<div
|
56 |
+
class="flex w-full flex-col justify-center rounded-xl bg-white px-4 py-4 text-left transition dark:bg-gray-800"
|
57 |
+
{...toast.content}
|
58 |
+
style:--n={toaster.toasts.length - i}
|
59 |
+
in:fly={{ y: 20, opacity: 0 }}
|
60 |
+
out:fly={{ y: 20 }}
|
61 |
+
style={getToastStyle(i)}
|
62 |
+
>
|
63 |
+
<h3 {...toast.title} class="text-sm font-semibold whitespace-nowrap text-gray-700 dark:text-gray-300">
|
64 |
+
{toast.data.title}
|
65 |
+
</h3>
|
66 |
+
|
67 |
+
{#if toast.data.description}
|
68 |
+
<p {...toast.description} class="max-w-[200px] text-xs text-gray-700 dark:text-gray-300">
|
69 |
+
{toast.data.description}
|
70 |
+
</p>
|
71 |
+
{/if}
|
72 |
+
|
73 |
+
<button
|
74 |
+
{...toast.close}
|
75 |
+
aria-label="dismiss toast"
|
76 |
+
class="absolute top-2 right-2 bg-transparent text-gray-300 hover:text-gray-400 dark:hover:text-gray-100"
|
77 |
+
>
|
78 |
+
<Close class="size-4" />
|
79 |
+
</button>
|
80 |
+
|
81 |
+
{#if toast.closeDelay !== 0}
|
82 |
+
<div class="absolute right-4 bottom-4 h-[4px] w-[30px] overflow-hidden rounded-full">
|
83 |
+
<Progress value={toast.percentage}>
|
84 |
+
{#snippet children(progress)}
|
85 |
+
<div {...progress.root} class="relative h-full w-full overflow-hidden bg-gray-200 dark:bg-gray-950">
|
86 |
+
<div
|
87 |
+
{...progress.progress}
|
88 |
+
class="h-full w-full -translate-x-(--progress)"
|
89 |
+
class:bg-green-400={toast.data.variant === "success"}
|
90 |
+
class:bg-orange-400={toast.data.variant === "warning"}
|
91 |
+
class:bg-red-500={toast.data.variant === "error"}
|
92 |
+
></div>
|
93 |
+
</div>
|
94 |
+
{/snippet}
|
95 |
+
</Progress>
|
96 |
+
</div>
|
97 |
+
{/if}
|
98 |
+
</div>
|
99 |
+
{/each}
|
100 |
+
</div>
|
101 |
+
|
102 |
+
<style>
|
103 |
+
:global([popover]) {
|
104 |
+
inset: unset;
|
105 |
+
}
|
106 |
+
|
107 |
+
[data-melt-toaster-root] {
|
108 |
+
--gap: 0.75rem;
|
109 |
+
--hover-offset: 0rem;
|
110 |
+
/* --toast-height: 4.5rem; */
|
111 |
+
--hidden-offset: 0.75rem;
|
112 |
+
|
113 |
+
--hidden-toasts: calc(var(--toasts) - 1);
|
114 |
+
|
115 |
+
overflow: visible;
|
116 |
+
gap: 0;
|
117 |
+
background: unset;
|
118 |
+
padding: 0;
|
119 |
+
|
120 |
+
border: none;
|
121 |
+
height: var(--h);
|
122 |
+
}
|
123 |
+
|
124 |
+
[data-melt-toaster-root]:hover {
|
125 |
+
height: var(--h-hover);
|
126 |
+
}
|
127 |
+
|
128 |
+
[data-melt-toaster-toast-content] {
|
129 |
+
position: absolute;
|
130 |
+
pointer-events: auto;
|
131 |
+
bottom: 0;
|
132 |
+
left: 0;
|
133 |
+
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
|
134 |
+
|
135 |
+
transform-origin: 50% 0%;
|
136 |
+
transition: all 350ms ease;
|
137 |
+
|
138 |
+
translate: 0 var(--y);
|
139 |
+
}
|
140 |
+
|
141 |
+
:global(.dark [data-melt-toaster-toast-content]) {
|
142 |
+
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.25);
|
143 |
+
}
|
144 |
+
|
145 |
+
[data-melt-toaster-toast-content]:nth-last-child(n + 4) {
|
146 |
+
z-index: 1;
|
147 |
+
scale: 0.925;
|
148 |
+
opacity: 0;
|
149 |
+
}
|
150 |
+
|
151 |
+
[data-melt-toaster-toast-content]:nth-last-child(-n + 3) {
|
152 |
+
z-index: 2;
|
153 |
+
scale: 0.95;
|
154 |
+
}
|
155 |
+
|
156 |
+
[data-melt-toaster-toast-content]:nth-last-child(-n + 2) {
|
157 |
+
z-index: 3;
|
158 |
+
scale: 0.975;
|
159 |
+
}
|
160 |
+
|
161 |
+
[data-melt-toaster-toast-content]:nth-last-child(-n + 1) {
|
162 |
+
z-index: 4;
|
163 |
+
scale: 1;
|
164 |
+
}
|
165 |
+
|
166 |
+
[data-melt-toaster-root]:hover [data-melt-toaster-toast-content] {
|
167 |
+
scale: 1;
|
168 |
+
opacity: 1;
|
169 |
+
translate: 0 var(--y-hover);
|
170 |
+
}
|
171 |
+
</style>
|
src/lib/components/toaster.svelte.ts
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { Toaster } from "melt/builders";
|
2 |
+
|
3 |
+
export type ToastData = {
|
4 |
+
title: string;
|
5 |
+
description: string;
|
6 |
+
variant: "success" | "warning" | "error";
|
7 |
+
};
|
8 |
+
|
9 |
+
export const toaster = new Toaster<ToastData>({
|
10 |
+
hover: "pause-all",
|
11 |
+
// closeDelay: 0,
|
12 |
+
});
|
13 |
+
|
14 |
+
export function addToast(data: ToastData) {
|
15 |
+
toaster.addToast({ data });
|
16 |
+
}
|
17 |
+
|
18 |
+
export function removeToast(id: string) {
|
19 |
+
toaster.removeToast(id);
|
20 |
+
}
|
21 |
+
|
22 |
+
// Debugging
|
23 |
+
// addToast({
|
24 |
+
// title: "Hello World 1",
|
25 |
+
// description: "hey",
|
26 |
+
// variant: "success",
|
27 |
+
// });
|
28 |
+
//
|
29 |
+
// addToast({
|
30 |
+
// title: "Hello World 2",
|
31 |
+
// description: "hey",
|
32 |
+
// variant: "success",
|
33 |
+
// });
|
34 |
+
//
|
35 |
+
// addToast({
|
36 |
+
// title: "Hello World 3",
|
37 |
+
// description: "hi",
|
38 |
+
// variant: "success",
|
39 |
+
// });
|
src/lib/spells/README.md
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
# Spells
|
2 |
+
|
3 |
+
Spells are special functions that use Runes under the hood, akin to Vue's composables or React hooks. They are only meant to be used inside other Spells, or within Svelte components.
|
src/lib/spells/abort-manager.svelte.ts
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { onDestroy } from "svelte";
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Manages abort controllers, and aborts them when the component unmounts.
|
5 |
+
*/
|
6 |
+
export class AbortManager {
|
7 |
+
private controllers: AbortController[] = [];
|
8 |
+
|
9 |
+
constructor() {
|
10 |
+
onDestroy(() => this.abortAll());
|
11 |
+
}
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Creates a new abort controller and adds it to the manager.
|
15 |
+
*/
|
16 |
+
public createController(): AbortController {
|
17 |
+
const controller = new AbortController();
|
18 |
+
this.controllers.push(controller);
|
19 |
+
return controller;
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Aborts all controllers and clears the manager.
|
24 |
+
*/
|
25 |
+
public abortAll(): void {
|
26 |
+
this.controllers.forEach(controller => controller.abort());
|
27 |
+
this.controllers = [];
|
28 |
+
}
|
29 |
+
|
30 |
+
/** Clears the manager without aborting the controllers. */
|
31 |
+
public clear(): void {
|
32 |
+
this.controllers = [];
|
33 |
+
}
|
34 |
+
}
|
src/lib/spells/create-init.svelte.ts
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export function createInit(cb: () => void) {
|
2 |
+
let called = $state(false);
|
3 |
+
|
4 |
+
return {
|
5 |
+
fn: () => {
|
6 |
+
if (called) return;
|
7 |
+
called = true;
|
8 |
+
cb();
|
9 |
+
},
|
10 |
+
get called() {
|
11 |
+
return called;
|
12 |
+
},
|
13 |
+
};
|
14 |
+
}
|
src/lib/spells/extract.svelte.ts
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { isFunction } from "$lib/utils/is.js";
|
2 |
+
import type { MaybeGetter } from "$lib/types.js";
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Extracts the value from a getter or a value.
|
6 |
+
* Optionally, a default value can be provided.
|
7 |
+
*/
|
8 |
+
export function extract<T, D extends T>(
|
9 |
+
value: MaybeGetter<T>,
|
10 |
+
defaultValue?: D
|
11 |
+
): D extends undefined | null ? T : Exclude<T, undefined | null> | D {
|
12 |
+
if (isFunction(value)) {
|
13 |
+
const getter = value;
|
14 |
+
const gotten = getter();
|
15 |
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
16 |
+
return (gotten ?? defaultValue ?? gotten) as any;
|
17 |
+
}
|
18 |
+
|
19 |
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
20 |
+
return (value ?? defaultValue ?? value) as any;
|
21 |
+
}
|
src/lib/spells/textarea-autosize.svelte.ts
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import type { Getter } from "melt";
|
2 |
+
import { extract } from "./extract.svelte.js";
|
3 |
+
import { useResizeObserver, watch } from "runed";
|
4 |
+
import { tick } from "svelte";
|
5 |
+
|
6 |
+
export interface TextareaAutosizeOptions {
|
7 |
+
/** Textarea element to autosize. */
|
8 |
+
element: Getter<HTMLElement | undefined>;
|
9 |
+
/** Textarea content. */
|
10 |
+
input: Getter<string>;
|
11 |
+
/** Function called when the textarea size changes. */
|
12 |
+
onResize?: () => void;
|
13 |
+
/**
|
14 |
+
* Specify the style property that will be used to manipulate height. Can be `height | minHeight`.
|
15 |
+
* @default `height`
|
16 |
+
**/
|
17 |
+
styleProp?: "height" | "minHeight";
|
18 |
+
}
|
19 |
+
|
20 |
+
export class TextareaAutosize {
|
21 |
+
#options: TextareaAutosizeOptions;
|
22 |
+
element = $derived.by(() => extract(this.#options.element));
|
23 |
+
input = $derived.by(() => extract(this.#options.input));
|
24 |
+
styleProp = $derived.by(() => extract(this.#options.styleProp, "height"));
|
25 |
+
|
26 |
+
textareaScrollHeight = $state(1);
|
27 |
+
textareaOldWidth = $state(0);
|
28 |
+
|
29 |
+
constructor(options: TextareaAutosizeOptions) {
|
30 |
+
this.#options = options;
|
31 |
+
|
32 |
+
watch([() => this.input, () => this.element], () => {
|
33 |
+
tick().then(() => this.triggerResize());
|
34 |
+
});
|
35 |
+
|
36 |
+
watch(
|
37 |
+
() => this.textareaScrollHeight,
|
38 |
+
() => options?.onResize?.()
|
39 |
+
);
|
40 |
+
|
41 |
+
useResizeObserver(
|
42 |
+
() => this.element,
|
43 |
+
([entry]) => {
|
44 |
+
if (!entry) return;
|
45 |
+
const { contentRect } = entry;
|
46 |
+
if (this.textareaOldWidth === contentRect.width) return;
|
47 |
+
|
48 |
+
requestAnimationFrame(() => {
|
49 |
+
this.textareaOldWidth = contentRect.width;
|
50 |
+
this.triggerResize();
|
51 |
+
});
|
52 |
+
}
|
53 |
+
);
|
54 |
+
}
|
55 |
+
|
56 |
+
triggerResize = () => {
|
57 |
+
if (!this.element) return;
|
58 |
+
|
59 |
+
let height = "";
|
60 |
+
|
61 |
+
this.element.style[this.styleProp] = "1px";
|
62 |
+
this.textareaScrollHeight = this.element?.scrollHeight;
|
63 |
+
height = `${this.textareaScrollHeight}px`;
|
64 |
+
|
65 |
+
this.element.style[this.styleProp] = height;
|
66 |
+
};
|
67 |
+
}
|
src/lib/state/models.svelte.ts
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { page } from "$app/state";
|
2 |
+
import type { ModelWithTokenizer } from "$lib/types.js";
|
3 |
+
|
4 |
+
class Models {
|
5 |
+
all = $derived(page.data.models as ModelWithTokenizer[]);
|
6 |
+
trending = $derived(this.all.toSorted((a, b) => b.trendingScore - a.trendingScore).slice(0, 5));
|
7 |
+
nonTrending = $derived(this.all.filter(m => !this.trending.includes(m)));
|
8 |
+
}
|
9 |
+
|
10 |
+
export const models = new Models();
|
src/lib/{stores/session.ts β state/session.svelte.ts}
RENAMED
@@ -1,5 +1,5 @@
|
|
1 |
-
import { defaultGenerationConfig } from "$lib/components/
|
2 |
-
import {
|
3 |
import {
|
4 |
PipelineTag,
|
5 |
type Conversation,
|
@@ -8,11 +8,10 @@ import {
|
|
8 |
type ModelWithTokenizer,
|
9 |
type Project,
|
10 |
type Session,
|
11 |
-
} from "$lib/types";
|
12 |
-
import { safeParse } from "$lib/utils/json";
|
13 |
-
import { getTrending } from "$lib/utils/model";
|
14 |
-
import { get, writable } from "svelte/store";
|
15 |
import typia from "typia";
|
|
|
16 |
|
17 |
const LOCAL_STORAGE_KEY = "hf_inference_playground_session";
|
18 |
|
@@ -38,9 +37,7 @@ const emptyModel: ModelWithTokenizer = {
|
|
38 |
};
|
39 |
|
40 |
function getDefaults() {
|
41 |
-
const
|
42 |
-
const featured = getTrending($models);
|
43 |
-
const defaultModel = featured[0] ?? $models[0] ?? emptyModel;
|
44 |
|
45 |
const defaultConversation: Conversation = {
|
46 |
model: defaultModel,
|
@@ -59,8 +56,11 @@ function getDefaults() {
|
|
59 |
return { defaultProject, defaultConversation };
|
60 |
}
|
61 |
|
62 |
-
|
63 |
-
|
|
|
|
|
|
|
64 |
const { defaultConversation, defaultProject } = getDefaults();
|
65 |
|
66 |
// Get saved session from localStorage if available
|
@@ -86,12 +86,11 @@ function createSessionStore() {
|
|
86 |
// is the maximum between the two.
|
87 |
const dp = savedSession.projects.find(p => p.id === "default");
|
88 |
if (typia.is<DefaultProject>(dp)) {
|
89 |
-
const $models = get(models);
|
90 |
// Parse URL query parameters
|
91 |
const searchParams = new URLSearchParams(window.location.search);
|
92 |
const searchProviders = searchParams.getAll("provider");
|
93 |
const searchModelIds = searchParams.getAll("modelId");
|
94 |
-
const modelsFromSearch = searchModelIds.map(id =>
|
95 |
if (modelsFromSearch.length > 0) savedSession.activeProjectId = "default";
|
96 |
|
97 |
const max = Math.max(dp.conversations.length, modelsFromSearch.length, searchProviders.length);
|
@@ -105,110 +104,78 @@ function createSessionStore() {
|
|
105 |
}
|
106 |
}
|
107 |
|
108 |
-
|
109 |
});
|
110 |
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
return s;
|
123 |
});
|
124 |
-
};
|
125 |
-
|
126 |
-
const set: typeof store.set = (...args) => {
|
127 |
-
update(_ => args[0]);
|
128 |
-
};
|
129 |
-
|
130 |
-
// Add a method to clear localStorage
|
131 |
-
function clearSavedSession() {
|
132 |
-
localStorage.removeItem(LOCAL_STORAGE_KEY);
|
133 |
}
|
134 |
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
function saveProject(name: string) {
|
139 |
-
update(s => {
|
140 |
-
const defaultProject = s.projects.find(p => p.id === "default");
|
141 |
-
if (!defaultProject) return s;
|
142 |
-
|
143 |
-
const project: Project = {
|
144 |
-
...defaultProject,
|
145 |
-
name,
|
146 |
-
id: crypto.randomUUID(),
|
147 |
-
};
|
148 |
-
|
149 |
-
defaultProject.conversations = [getDefaults().defaultConversation];
|
150 |
-
|
151 |
-
return { ...s, projects: [...s.projects, project], activeProjectId: project.id };
|
152 |
-
});
|
153 |
}
|
154 |
|
155 |
-
|
156 |
-
|
157 |
-
if (id === "default") return;
|
158 |
-
|
159 |
-
update(s => {
|
160 |
-
const projects = s.projects.filter(p => p.id !== id);
|
161 |
-
if (projects.length === 0) {
|
162 |
-
const { defaultProject } = getDefaults();
|
163 |
-
const newSession = { ...s, projects: [defaultProject], activeProjectId: defaultProject.id };
|
164 |
-
return typia.is<Session>(newSession) ? newSession : s;
|
165 |
-
}
|
166 |
-
|
167 |
-
const currProject = projects.find(p => p.id === s.activeProjectId);
|
168 |
-
const newSession = { ...s, projects, activeProjectId: currProject?.id ?? projects[0]?.id };
|
169 |
-
return typia.is<Session>(newSession) ? newSession : s;
|
170 |
-
});
|
171 |
}
|
172 |
|
173 |
-
|
174 |
-
|
175 |
-
const projects = s.projects.map(p => (p.id === id ? { ...p, ...data } : p));
|
176 |
-
const newSession = { ...s, projects };
|
177 |
-
return typia.is<Session>(newSession) ? newSession : s;
|
178 |
-
});
|
179 |
}
|
180 |
|
181 |
-
|
182 |
-
|
|
|
183 |
|
184 |
-
|
|
|
|
|
|
|
|
|
185 |
|
186 |
-
|
187 |
-
return s.projects.find(p => p.id === s.activeProjectId) ?? s.projects[0];
|
188 |
-
}
|
189 |
|
190 |
-
|
191 |
-
|
192 |
-
return session.subscribe(s => {
|
193 |
-
set(getActiveProject(s));
|
194 |
-
});
|
195 |
-
});
|
196 |
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
|
|
|
|
|
|
|
|
205 |
};
|
206 |
|
207 |
-
|
208 |
-
|
|
|
209 |
};
|
210 |
|
211 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
212 |
}
|
213 |
|
214 |
-
export const
|
|
|
1 |
+
import { defaultGenerationConfig } from "$lib/components/inference-playground/generation-config-settings.js";
|
2 |
+
import { createInit } from "$lib/spells/create-init.svelte.js";
|
3 |
import {
|
4 |
PipelineTag,
|
5 |
type Conversation,
|
|
|
8 |
type ModelWithTokenizer,
|
9 |
type Project,
|
10 |
type Session,
|
11 |
+
} from "$lib/types.js";
|
12 |
+
import { safeParse } from "$lib/utils/json.js";
|
|
|
|
|
13 |
import typia from "typia";
|
14 |
+
import { models } from "./models.svelte";
|
15 |
|
16 |
const LOCAL_STORAGE_KEY = "hf_inference_playground_session";
|
17 |
|
|
|
37 |
};
|
38 |
|
39 |
function getDefaults() {
|
40 |
+
const defaultModel = models.trending[0] ?? models.all[0] ?? emptyModel;
|
|
|
|
|
41 |
|
42 |
const defaultConversation: Conversation = {
|
43 |
model: defaultModel,
|
|
|
56 |
return { defaultProject, defaultConversation };
|
57 |
}
|
58 |
|
59 |
+
class SessionState {
|
60 |
+
#value = $state<Session>({} as Session);
|
61 |
+
// Call this only when the value is read, otherwise some values may have not
|
62 |
+
// been loaded yet (page.data, for example)
|
63 |
+
#init = createInit(() => {
|
64 |
const { defaultConversation, defaultProject } = getDefaults();
|
65 |
|
66 |
// Get saved session from localStorage if available
|
|
|
86 |
// is the maximum between the two.
|
87 |
const dp = savedSession.projects.find(p => p.id === "default");
|
88 |
if (typia.is<DefaultProject>(dp)) {
|
|
|
89 |
// Parse URL query parameters
|
90 |
const searchParams = new URLSearchParams(window.location.search);
|
91 |
const searchProviders = searchParams.getAll("provider");
|
92 |
const searchModelIds = searchParams.getAll("modelId");
|
93 |
+
const modelsFromSearch = searchModelIds.map(id => models.all.find(model => model.id === id)).filter(Boolean);
|
94 |
if (modelsFromSearch.length > 0) savedSession.activeProjectId = "default";
|
95 |
|
96 |
const max = Math.max(dp.conversations.length, modelsFromSearch.length, searchProviders.length);
|
|
|
104 |
}
|
105 |
}
|
106 |
|
107 |
+
this.$ = savedSession;
|
108 |
});
|
109 |
|
110 |
+
constructor() {
|
111 |
+
$effect.root(() => {
|
112 |
+
$effect(() => {
|
113 |
+
if (!this.#init.called) return;
|
114 |
+
const v = $state.snapshot(this.#value);
|
115 |
+
try {
|
116 |
+
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(v));
|
117 |
+
} catch (e) {
|
118 |
+
console.error("Failed to save session to localStorage:", e);
|
119 |
+
}
|
120 |
+
});
|
|
|
121 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
}
|
123 |
|
124 |
+
get $() {
|
125 |
+
this.#init.fn();
|
126 |
+
return this.#value;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
}
|
128 |
|
129 |
+
set $(v: Session) {
|
130 |
+
this.#value = v;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
131 |
}
|
132 |
|
133 |
+
#setAnySession(s: unknown) {
|
134 |
+
if (typia.is<Session>(s)) this.$ = s;
|
|
|
|
|
|
|
|
|
135 |
}
|
136 |
|
137 |
+
saveProject = (name: string) => {
|
138 |
+
const defaultProject = this.$.projects.find(p => p.id === "default");
|
139 |
+
if (!defaultProject) return;
|
140 |
|
141 |
+
const project: Project = {
|
142 |
+
...defaultProject,
|
143 |
+
name,
|
144 |
+
id: crypto.randomUUID(),
|
145 |
+
};
|
146 |
|
147 |
+
defaultProject.conversations = [getDefaults().defaultConversation];
|
|
|
|
|
148 |
|
149 |
+
this.$ = { ...this.$, projects: [...this.$.projects, project], activeProjectId: project.id };
|
150 |
+
};
|
|
|
|
|
|
|
|
|
151 |
|
152 |
+
deleteProject = (id: string) => {
|
153 |
+
// Can't delete default project!
|
154 |
+
if (id === "default") return;
|
155 |
+
|
156 |
+
const projects = this.$.projects.filter(p => p.id !== id);
|
157 |
+
if (projects.length === 0) {
|
158 |
+
const { defaultProject } = getDefaults();
|
159 |
+
this.#setAnySession({ ...this.$, projects: [defaultProject], activeProjectId: defaultProject.id });
|
160 |
+
}
|
161 |
+
|
162 |
+
const currProject = projects.find(p => p.id === this.$.activeProjectId);
|
163 |
+
this.#setAnySession({ ...this.$, projects, activeProjectId: currProject?.id ?? projects[0]?.id });
|
164 |
};
|
165 |
|
166 |
+
updateProject = (id: string, data: Partial<Project>) => {
|
167 |
+
const projects = this.$.projects.map(p => (p.id === id ? { ...p, ...data } : p));
|
168 |
+
this.#setAnySession({ ...this.$, projects });
|
169 |
};
|
170 |
|
171 |
+
get project() {
|
172 |
+
return this.$.projects.find(p => p.id === this.$.activeProjectId) ?? this.$.projects[0];
|
173 |
+
}
|
174 |
+
|
175 |
+
set project(np: Project) {
|
176 |
+
const projects = this.$.projects.map(p => (p.id === np.id ? np : p));
|
177 |
+
this.#setAnySession({ ...this.$, projects });
|
178 |
+
}
|
179 |
}
|
180 |
|
181 |
+
export const session = new SessionState();
|
src/lib/state/token.svelte.ts
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { safeParse } from "$lib/utils/json.js";
|
2 |
+
import typia from "typia";
|
3 |
+
|
4 |
+
const key = "hf_token";
|
5 |
+
|
6 |
+
class Token {
|
7 |
+
#value = $state("");
|
8 |
+
writeToLocalStorage = $state(true);
|
9 |
+
showModal = $state(false);
|
10 |
+
|
11 |
+
constructor() {
|
12 |
+
const storedHfToken = localStorage.getItem(key);
|
13 |
+
const parsed = safeParse(storedHfToken ?? "");
|
14 |
+
this.value = typia.is<string>(parsed) ? parsed : "";
|
15 |
+
}
|
16 |
+
|
17 |
+
get value() {
|
18 |
+
return this.#value;
|
19 |
+
}
|
20 |
+
|
21 |
+
set value(token: string) {
|
22 |
+
if (this.writeToLocalStorage) {
|
23 |
+
localStorage.setItem(key, JSON.stringify(token));
|
24 |
+
}
|
25 |
+
this.#value = token;
|
26 |
+
this.showModal = !token.length;
|
27 |
+
}
|
28 |
+
|
29 |
+
reset = () => {
|
30 |
+
this.value = "";
|
31 |
+
localStorage.removeItem(key);
|
32 |
+
};
|
33 |
+
}
|
34 |
+
|
35 |
+
export const token = new Token();
|
src/lib/stores/models.ts
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
import { page } from "$app/stores";
|
2 |
-
import type { ModelWithTokenizer } from "$lib/types";
|
3 |
-
import { readable } from "svelte/store";
|
4 |
-
|
5 |
-
export const models = readable<ModelWithTokenizer[]>(undefined, set => {
|
6 |
-
const unsub = page.subscribe($p => set($p.data?.models));
|
7 |
-
return unsub;
|
8 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/stores/mounted.ts
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
import { onMount } from "svelte";
|
2 |
-
import { readonly, writable } from "svelte/store";
|
3 |
-
|
4 |
-
export function isMounted() {
|
5 |
-
const store = writable(false);
|
6 |
-
onMount(() => store.set(true));
|
7 |
-
|
8 |
-
return readonly(store);
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/stores/token.ts
DELETED
@@ -1,31 +0,0 @@
|
|
1 |
-
import { writable } from "svelte/store";
|
2 |
-
|
3 |
-
const key = "hf_token";
|
4 |
-
|
5 |
-
function createTokenStore() {
|
6 |
-
const store = writable({ value: "", writeToLocalStorage: true, showModal: false });
|
7 |
-
|
8 |
-
function setValue(token: string) {
|
9 |
-
store.update(s => {
|
10 |
-
if (s.writeToLocalStorage) localStorage.setItem(key, JSON.stringify(token));
|
11 |
-
return { ...s, value: token, showModal: !token.length };
|
12 |
-
});
|
13 |
-
}
|
14 |
-
|
15 |
-
const storedHfToken = localStorage.getItem(key);
|
16 |
-
if (storedHfToken !== null) {
|
17 |
-
setValue(JSON.parse(storedHfToken));
|
18 |
-
}
|
19 |
-
|
20 |
-
return {
|
21 |
-
...store,
|
22 |
-
setValue,
|
23 |
-
reset() {
|
24 |
-
setValue("");
|
25 |
-
localStorage.removeItem(key);
|
26 |
-
store.update(s => ({ ...s, showModal: true }));
|
27 |
-
},
|
28 |
-
};
|
29 |
-
}
|
30 |
-
|
31 |
-
export const token = createTokenStore();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/types.ts
CHANGED
@@ -1,7 +1,9 @@
|
|
1 |
-
import type { GenerationConfig } from "$lib/components/
|
2 |
import type { ChatCompletionInputMessage } from "@huggingface/tasks";
|
3 |
|
4 |
-
export type ConversationMessage =
|
|
|
|
|
5 |
|
6 |
export type Conversation = {
|
7 |
model: ModelWithTokenizer;
|
@@ -13,7 +15,7 @@ export type Conversation = {
|
|
13 |
};
|
14 |
|
15 |
export type Project = {
|
16 |
-
conversations:
|
17 |
id: string;
|
18 |
name: string;
|
19 |
};
|
@@ -168,3 +170,7 @@ export enum LibraryName {
|
|
168 |
export enum PipelineTag {
|
169 |
TextGeneration = "text-generation",
|
170 |
}
|
|
|
|
|
|
|
|
|
|
1 |
+
import type { GenerationConfig } from "$lib/components/inference-playground/generation-config-settings.js";
|
2 |
import type { ChatCompletionInputMessage } from "@huggingface/tasks";
|
3 |
|
4 |
+
export type ConversationMessage = Pick<ChatCompletionInputMessage, "name" | "role" | "tool_calls"> & {
|
5 |
+
content?: string;
|
6 |
+
};
|
7 |
|
8 |
export type Conversation = {
|
9 |
model: ModelWithTokenizer;
|
|
|
15 |
};
|
16 |
|
17 |
export type Project = {
|
18 |
+
conversations: Conversation[];
|
19 |
id: string;
|
20 |
name: string;
|
21 |
};
|
|
|
170 |
export enum PipelineTag {
|
171 |
TextGeneration = "text-generation",
|
172 |
}
|
173 |
+
|
174 |
+
export type MaybeGetter<T> = T | (() => T);
|
175 |
+
|
176 |
+
export type ValueOf<T> = T[keyof T];
|
src/lib/utils/compare.ts
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
export function compareStr(a: string, b: string) {
|
2 |
+
return a.toLowerCase().localeCompare(b.toLowerCase());
|
3 |
+
}
|
src/lib/utils/effect.ts
DELETED
@@ -1,51 +0,0 @@
|
|
1 |
-
import type { Stores, StoresValues } from "svelte/store";
|
2 |
-
import { derived } from "svelte/store";
|
3 |
-
import { safeOnDestroy } from "./lifecycle";
|
4 |
-
import { noop } from "./noop";
|
5 |
-
|
6 |
-
type EffectOptions = {
|
7 |
-
/**
|
8 |
-
* Whether to skip the first run
|
9 |
-
* @default undefined
|
10 |
-
*/
|
11 |
-
skipFirstRun?: boolean;
|
12 |
-
};
|
13 |
-
|
14 |
-
/**
|
15 |
-
* A utility function that creates an effect from a set of stores and a function.
|
16 |
-
* The effect is automatically cleaned up when the component is destroyed.
|
17 |
-
*
|
18 |
-
* @template S - The type of the stores object
|
19 |
-
* @param stores - The stores object to derive from
|
20 |
-
* @param fn - The function to run when the stores change
|
21 |
-
* @param opts {@link EffectOptions}
|
22 |
-
* @returns A function that can be used to unsubscribe the effect
|
23 |
-
*/
|
24 |
-
export function effect<S extends Stores>(
|
25 |
-
stores: S,
|
26 |
-
fn: (values: StoresValues<S>) => (() => void) | void,
|
27 |
-
opts: EffectOptions = {}
|
28 |
-
): () => void {
|
29 |
-
const { skipFirstRun } = opts;
|
30 |
-
let isFirstRun = true;
|
31 |
-
let cb: (() => void) | void = undefined;
|
32 |
-
|
33 |
-
// Create a derived store that contains the stores object and an onUnsubscribe function
|
34 |
-
const destroy = derived(stores, stores => {
|
35 |
-
cb?.();
|
36 |
-
if (isFirstRun && skipFirstRun) {
|
37 |
-
isFirstRun = false;
|
38 |
-
} else {
|
39 |
-
cb = fn(stores);
|
40 |
-
}
|
41 |
-
}).subscribe(noop);
|
42 |
-
|
43 |
-
const unsub = () => {
|
44 |
-
destroy();
|
45 |
-
cb?.();
|
46 |
-
};
|
47 |
-
|
48 |
-
// Automatically unsubscribe the effect when the component is destroyed
|
49 |
-
safeOnDestroy(unsub);
|
50 |
-
return unsub;
|
51 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/utils/is.ts
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { SvelteSet } from "svelte/reactivity";
|
2 |
+
|
3 |
+
export function isHtmlElement(element: unknown): element is HTMLElement {
|
4 |
+
return element instanceof HTMLElement;
|
5 |
+
}
|
6 |
+
|
7 |
+
export function isFunction(value: unknown): value is (...args: unknown[]) => unknown {
|
8 |
+
return typeof value === "function";
|
9 |
+
}
|
10 |
+
|
11 |
+
export function isSvelteSet(value: unknown): value is SvelteSet<unknown> {
|
12 |
+
return value instanceof SvelteSet;
|
13 |
+
}
|
14 |
+
|
15 |
+
export function isIterable(value: unknown): value is Iterable<unknown> {
|
16 |
+
return value !== null && typeof value === "object" && Symbol.iterator in value;
|
17 |
+
}
|
18 |
+
|
19 |
+
export function isObject(value: unknown): value is Record<PropertyKey, unknown> {
|
20 |
+
return value !== null && typeof value === "object";
|
21 |
+
}
|
22 |
+
|
23 |
+
export function isHtmlInputElement(element: unknown): element is HTMLInputElement {
|
24 |
+
return element instanceof HTMLInputElement;
|
25 |
+
}
|
26 |
+
|
27 |
+
export function isString(value: unknown): value is string {
|
28 |
+
return typeof value === "string";
|
29 |
+
}
|
30 |
+
|
31 |
+
export function isTouch(event: PointerEvent): boolean {
|
32 |
+
return event.pointerType === "touch";
|
33 |
+
}
|
34 |
+
|
35 |
+
export function isPromise(value: unknown): value is Promise<unknown> {
|
36 |
+
return value instanceof Promise;
|
37 |
+
}
|
src/lib/utils/model.ts
DELETED
@@ -1,5 +0,0 @@
|
|
1 |
-
import type { ModelWithTokenizer } from "$lib/types";
|
2 |
-
|
3 |
-
export function getTrending(models: ModelWithTokenizer[], limit = 5) {
|
4 |
-
return models.toSorted((a, b) => b.trendingScore - a.trendingScore).slice(0, limit);
|
5 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/utils/object.ts
CHANGED
@@ -1,3 +1,5 @@
|
|
|
|
|
|
1 |
// typed Object.keys
|
2 |
export function keys<T extends object>(o: T): (keyof T)[] {
|
3 |
return Object.keys(o) as (keyof T)[];
|
@@ -12,3 +14,21 @@ export function entries<T extends object>(o: T): [keyof T, T[keyof T]][] {
|
|
12 |
export function fromEntries<T extends object>(entries: [keyof T, T[keyof T]][]): T {
|
13 |
return Object.fromEntries(entries) as T;
|
14 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import type { ValueOf } from "$lib/types.js";
|
2 |
+
|
3 |
// typed Object.keys
|
4 |
export function keys<T extends object>(o: T): (keyof T)[] {
|
5 |
return Object.keys(o) as (keyof T)[];
|
|
|
14 |
export function fromEntries<T extends object>(entries: [keyof T, T[keyof T]][]): T {
|
15 |
return Object.fromEntries(entries) as T;
|
16 |
}
|
17 |
+
|
18 |
+
export function omit<T extends Record<string, unknown>, K extends keyof T>(obj: T, ...keys: K[]): Omit<T, K> {
|
19 |
+
const result = {} as Omit<T, K>;
|
20 |
+
for (const key of Object.keys(obj)) {
|
21 |
+
if (!keys.includes(key as unknown as K)) {
|
22 |
+
result[key as keyof Omit<T, K>] = obj[key] as ValueOf<Omit<T, K>>;
|
23 |
+
}
|
24 |
+
}
|
25 |
+
return result;
|
26 |
+
}
|
27 |
+
|
28 |
+
export function pick<T extends Record<string, unknown>, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
|
29 |
+
const result = {} as Pick<T, K>;
|
30 |
+
for (const key of keys) {
|
31 |
+
result[key] = obj[key] as ValueOf<Pick<T, K>>;
|
32 |
+
}
|
33 |
+
return result;
|
34 |
+
}
|
src/routes/+layout.svelte
CHANGED
@@ -1,9 +1,16 @@
|
|
1 |
<script lang="ts">
|
|
|
|
|
|
|
2 |
import "../app.css";
|
3 |
-
|
4 |
-
|
|
|
|
|
|
|
5 |
</script>
|
6 |
|
7 |
-
|
8 |
<DebugMenu />
|
9 |
<Prompts />
|
|
|
|
1 |
<script lang="ts">
|
2 |
+
import DebugMenu from "$lib/components/debug-menu.svelte";
|
3 |
+
import Prompts from "$lib/components/prompts.svelte";
|
4 |
+
import QuotaModal from "$lib/components/quota-modal.svelte";
|
5 |
import "../app.css";
|
6 |
+
interface Props {
|
7 |
+
children?: import("svelte").Snippet;
|
8 |
+
}
|
9 |
+
|
10 |
+
let { children }: Props = $props();
|
11 |
</script>
|
12 |
|
13 |
+
{@render children?.()}
|
14 |
<DebugMenu />
|
15 |
<Prompts />
|
16 |
+
<QuotaModal />
|
src/routes/+page.svelte
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
<script lang="ts">
|
2 |
-
import
|
3 |
</script>
|
4 |
|
5 |
-
<
|
|
|
1 |
<script lang="ts">
|
2 |
+
import Playground from "$lib/components/inference-playground/playground.svelte";
|
3 |
</script>
|
4 |
|
5 |
+
<Playground />
|
src/routes/+page.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
-
import type { ModelWithTokenizer } from "$lib/types";
|
2 |
-
import type { PageLoad } from "./$types";
|
3 |
|
4 |
export const load: PageLoad = async ({ fetch }) => {
|
5 |
const res = await fetch("/api/models");
|
|
|
1 |
+
import type { ModelWithTokenizer } from "$lib/types.js";
|
2 |
+
import type { PageLoad } from "./$types.js";
|
3 |
|
4 |
export const load: PageLoad = async ({ fetch }) => {
|
5 |
const res = await fetch("/api/models");
|