1ffy 1 mesiac pred
rodič
commit
94263311ec

+ 24 - 24
.gitignore

@@ -1,24 +1,24 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
-dist
-dist-ssr
-*.local
-
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 159 - 159
bun.lock

@@ -1,159 +1,159 @@
-{
-  "lockfileVersion": 1,
-  "workspaces": {
-    "": {
-      "name": "economics-svelte",
-      "devDependencies": {
-        "@sveltejs/vite-plugin-svelte": "^6.2.1",
-        "svelte": "^5.39.6",
-        "vite": "npm:rolldown-vite@7.1.14",
-      },
-    },
-  },
-  "overrides": {
-    "vite": "npm:rolldown-vite@7.1.14",
-  },
-  "packages": {
-    "@emnapi/core": ["@emnapi/core@1.6.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg=="],
-
-    "@emnapi/runtime": ["@emnapi/runtime@1.6.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA=="],
-
-    "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
-
-    "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
-
-    "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
-
-    "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
-
-    "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
-
-    "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
-
-    "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="],
-
-    "@oxc-project/runtime": ["@oxc-project/runtime@0.92.0", "", {}, "sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw=="],
-
-    "@oxc-project/types": ["@oxc-project/types@0.93.0", "", {}, "sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg=="],
-
-    "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.41", "", { "os": "android", "cpu": "arm64" }, "sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ=="],
-
-    "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.41", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw=="],
-
-    "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.41", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ=="],
-
-    "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.41", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g=="],
-
-    "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41", "", { "os": "linux", "cpu": "arm" }, "sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA=="],
-
-    "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41", "", { "os": "linux", "cpu": "arm64" }, "sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg=="],
-
-    "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.41", "", { "os": "linux", "cpu": "arm64" }, "sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg=="],
-
-    "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.41", "", { "os": "linux", "cpu": "x64" }, "sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g=="],
-
-    "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.41", "", { "os": "linux", "cpu": "x64" }, "sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q=="],
-
-    "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.41", "", { "os": "none", "cpu": "arm64" }, "sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg=="],
-
-    "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.41", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.5" }, "cpu": "none" }, "sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ=="],
-
-    "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41", "", { "os": "win32", "cpu": "arm64" }, "sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg=="],
-
-    "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41", "", { "os": "win32", "cpu": "ia32" }, "sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw=="],
-
-    "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.41", "", { "os": "win32", "cpu": "x64" }, "sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg=="],
-
-    "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.41", "", {}, "sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw=="],
-
-    "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.6", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ=="],
-
-    "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.2.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ=="],
-
-    "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.1", "", { "dependencies": { "debug": "^4.4.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA=="],
-
-    "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
-
-    "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
-
-    "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
-
-    "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="],
-
-    "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
-
-    "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
-
-    "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
-
-    "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
-
-    "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
-
-    "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
-
-    "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
-
-    "esrap": ["esrap@2.1.2", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg=="],
-
-    "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
-
-    "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
-
-    "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
-
-    "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="],
-
-    "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="],
-
-    "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="],
-
-    "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="],
-
-    "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="],
-
-    "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="],
-
-    "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="],
-
-    "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="],
-
-    "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="],
-
-    "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="],
-
-    "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="],
-
-    "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="],
-
-    "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],
-
-    "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
-
-    "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
-
-    "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
-
-    "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
-
-    "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
-
-    "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
-
-    "rolldown": ["rolldown@1.0.0-beta.41", "", { "dependencies": { "@oxc-project/types": "=0.93.0", "@rolldown/pluginutils": "1.0.0-beta.41", "ansis": "=4.2.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.41", "@rolldown/binding-darwin-arm64": "1.0.0-beta.41", "@rolldown/binding-darwin-x64": "1.0.0-beta.41", "@rolldown/binding-freebsd-x64": "1.0.0-beta.41", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.41", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.41", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.41", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.41", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.41", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.41", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.41", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.41", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.41", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.41" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg=="],
-
-    "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
-
-    "svelte": ["svelte@5.43.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-ro1umEzX8rT5JpCmlf0PPv7ncD8MdVob9e18bhwqTKNoLjS8kDvhVpaoYVPc+qMwDAOfcwJtyY7ZFSDbOaNPgA=="],
-
-    "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
-
-    "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
-
-    "vite": ["rolldown-vite@7.1.14", "", { "dependencies": { "@oxc-project/runtime": "0.92.0", "fdir": "^6.5.0", "lightningcss": "^1.30.1", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rolldown": "1.0.0-beta.41", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "esbuild": "^0.25.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw=="],
-
-    "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="],
-
-    "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="],
-  }
-}
+{
+  "lockfileVersion": 1,
+  "workspaces": {
+    "": {
+      "name": "economics-svelte",
+      "devDependencies": {
+        "@sveltejs/vite-plugin-svelte": "^6.2.1",
+        "svelte": "^5.39.6",
+        "vite": "npm:rolldown-vite@7.1.14",
+      },
+    },
+  },
+  "overrides": {
+    "vite": "npm:rolldown-vite@7.1.14",
+  },
+  "packages": {
+    "@emnapi/core": ["@emnapi/core@1.6.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg=="],
+
+    "@emnapi/runtime": ["@emnapi/runtime@1.6.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA=="],
+
+    "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
+
+    "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+    "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
+
+    "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+    "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+    "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+    "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="],
+
+    "@oxc-project/runtime": ["@oxc-project/runtime@0.92.0", "", {}, "sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw=="],
+
+    "@oxc-project/types": ["@oxc-project/types@0.93.0", "", {}, "sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg=="],
+
+    "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-beta.41", "", { "os": "android", "cpu": "arm64" }, "sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ=="],
+
+    "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-beta.41", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw=="],
+
+    "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-beta.41", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ=="],
+
+    "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-beta.41", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g=="],
+
+    "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41", "", { "os": "linux", "cpu": "arm" }, "sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA=="],
+
+    "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41", "", { "os": "linux", "cpu": "arm64" }, "sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg=="],
+
+    "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-beta.41", "", { "os": "linux", "cpu": "arm64" }, "sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg=="],
+
+    "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-beta.41", "", { "os": "linux", "cpu": "x64" }, "sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g=="],
+
+    "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-beta.41", "", { "os": "linux", "cpu": "x64" }, "sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q=="],
+
+    "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-beta.41", "", { "os": "none", "cpu": "arm64" }, "sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg=="],
+
+    "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-beta.41", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.0.5" }, "cpu": "none" }, "sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ=="],
+
+    "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41", "", { "os": "win32", "cpu": "arm64" }, "sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg=="],
+
+    "@rolldown/binding-win32-ia32-msvc": ["@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41", "", { "os": "win32", "cpu": "ia32" }, "sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw=="],
+
+    "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-beta.41", "", { "os": "win32", "cpu": "x64" }, "sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg=="],
+
+    "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.41", "", {}, "sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw=="],
+
+    "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.6", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ=="],
+
+    "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.2.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ=="],
+
+    "@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@5.0.1", "", { "dependencies": { "debug": "^4.4.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA=="],
+
+    "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
+
+    "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+    "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
+    "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="],
+
+    "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
+    "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
+    "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+    "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+    "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
+
+    "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
+
+    "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
+
+    "esrap": ["esrap@2.1.2", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg=="],
+
+    "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+    "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+    "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
+
+    "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="],
+
+    "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="],
+
+    "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="],
+
+    "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="],
+
+    "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="],
+
+    "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="],
+
+    "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="],
+
+    "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="],
+
+    "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="],
+
+    "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="],
+
+    "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="],
+
+    "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="],
+
+    "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],
+
+    "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+    "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+    "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+    "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+    "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+
+    "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+
+    "rolldown": ["rolldown@1.0.0-beta.41", "", { "dependencies": { "@oxc-project/types": "=0.93.0", "@rolldown/pluginutils": "1.0.0-beta.41", "ansis": "=4.2.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-beta.41", "@rolldown/binding-darwin-arm64": "1.0.0-beta.41", "@rolldown/binding-darwin-x64": "1.0.0-beta.41", "@rolldown/binding-freebsd-x64": "1.0.0-beta.41", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.41", "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.41", "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.41", "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.41", "@rolldown/binding-linux-x64-musl": "1.0.0-beta.41", "@rolldown/binding-openharmony-arm64": "1.0.0-beta.41", "@rolldown/binding-wasm32-wasi": "1.0.0-beta.41", "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.41", "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.41", "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.41" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg=="],
+
+    "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+    "svelte": ["svelte@5.43.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^2.1.0", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-ro1umEzX8rT5JpCmlf0PPv7ncD8MdVob9e18bhwqTKNoLjS8kDvhVpaoYVPc+qMwDAOfcwJtyY7ZFSDbOaNPgA=="],
+
+    "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
+    "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+    "vite": ["rolldown-vite@7.1.14", "", { "dependencies": { "@oxc-project/runtime": "0.92.0", "fdir": "^6.5.0", "lightningcss": "^1.30.1", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rolldown": "1.0.0-beta.41", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "esbuild": "^0.25.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw=="],
+
+    "vitefu": ["vitefu@1.1.1", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["vite"] }, "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ=="],
+
+    "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="],
+  }
+}

+ 27 - 0
flake.lock

@@ -0,0 +1,27 @@
+{
+  "nodes": {
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1762756533,
+        "narHash": "sha256-HiRDeUOD1VLklHeOmaKDzf+8Hb7vSWPVFcWwaTrpm+U=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c2448301fb856e351aab33e64c33a3fc8bcf637d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-25.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}

+ 54 - 0
flake.nix

@@ -0,0 +1,54 @@
+{
+  description = "Econom_app NixOS module";
+
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
+  };
+
+  outputs = { self, nixpkgs }:
+  let
+    pkgs = nixpkgs.legacyPackages."x86_64-linux";
+  in
+  {
+    packages."x86_64-linux" = rec {
+      econom-app = pkgs.buildNpmPackage {
+        pname = "econom-app";
+        version = "1.0.0";
+        src = ./.;
+
+        npmDepsHash = "sha256-HzJV9bXwgn9WE9llPHLnYLNUIL6PDeoOh+K+RJ6Dd9s=";
+
+        installPhase = ''
+          mkdir -p $out;
+          mv dist $out;
+        '';
+      };
+      default = econom-app;
+    };
+
+    nixosModules.econom-app = { config, lib, pkgs, ... }:
+      with lib;
+      let cfg = config.services.econom-app;
+      in {
+        options.services.econom-app = {
+          enable = mkEnableOption "Deploy the econom-app service";
+
+          domain = mkOption {
+            type = types.str;
+            default = "localhost";
+            description = "Dommain name to serve econom-app on.";
+          };
+        };
+
+        config = mkIf cfg.enable {
+          services.nginx.virtualHosts.${cfg.domain} = {
+            root = "${self.packages.econom-app}/dist";
+            locations."/" = {
+              index = "index.html";
+              tryFiles = "$uri $uri/ /index.html";
+            };
+          };
+        };
+      };
+  };
+}

+ 13 - 13
index.html

@@ -1,13 +1,13 @@
-<!doctype html>
-<html lang="en">
-  <head>
-    <meta charset="UTF-8" />
-    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>economics-svelte</title>
-  </head>
-  <body>
-    <div id="app"></div>
-    <script type="module" src="/src/main.js"></script>
-  </body>
-</html>
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>economics-svelte</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 33 - 33
jsconfig.json

@@ -1,33 +1,33 @@
-{
-  "compilerOptions": {
-    "moduleResolution": "bundler",
-    "target": "ESNext",
-    "module": "ESNext",
-    /**
-     * svelte-preprocess cannot figure out whether you have
-     * a value or a type, so tell TypeScript to enforce using
-     * `import type` instead of `import` for Types.
-     */
-    "verbatimModuleSyntax": true,
-    "isolatedModules": true,
-    "resolveJsonModule": true,
-    /**
-     * To have warnings / errors of the Svelte compiler at the
-     * correct position, enable source maps by default.
-     */
-    "sourceMap": true,
-    "esModuleInterop": true,
-    "types": ["vite/client"],
-    "skipLibCheck": true,
-    /**
-     * Typecheck JS in `.svelte` and `.js` files by default.
-     * Disable this if you'd like to use dynamic types.
-     */
-    "checkJs": true
-  },
-  /**
-   * Use global.d.ts instead of compilerOptions.types
-   * to avoid limiting type declarations.
-   */
-  "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"]
-}
+{
+  "compilerOptions": {
+    "moduleResolution": "bundler",
+    "target": "ESNext",
+    "module": "ESNext",
+    /**
+     * svelte-preprocess cannot figure out whether you have
+     * a value or a type, so tell TypeScript to enforce using
+     * `import type` instead of `import` for Types.
+     */
+    "verbatimModuleSyntax": true,
+    "isolatedModules": true,
+    "resolveJsonModule": true,
+    /**
+     * To have warnings / errors of the Svelte compiler at the
+     * correct position, enable source maps by default.
+     */
+    "sourceMap": true,
+    "esModuleInterop": true,
+    "types": ["vite/client"],
+    "skipLibCheck": true,
+    /**
+     * Typecheck JS in `.svelte` and `.js` files by default.
+     * Disable this if you'd like to use dynamic types.
+     */
+    "checkJs": true
+  },
+  /**
+   * Use global.d.ts instead of compilerOptions.types
+   * to avoid limiting type declarations.
+   */
+  "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"]
+}

+ 1154 - 0
package-lock.json

@@ -0,0 +1,1154 @@
+{
+  "name": "economics-svelte",
+  "version": "0.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "economics-svelte",
+      "version": "0.0.0",
+      "devDependencies": {
+        "@sveltejs/vite-plugin-svelte": "^6.2.1",
+        "svelte": "^5.39.6",
+        "vite": "npm:rolldown-vite@7.1.14"
+      }
+    },
+    "node_modules/@emnapi/core": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz",
+      "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/wasi-threads": "1.1.0",
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/runtime": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz",
+      "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/wasi-threads": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+      "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.13",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+      "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/remapping": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+      "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+      "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.31",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+      "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@napi-rs/wasm-runtime": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz",
+      "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^1.5.0",
+        "@emnapi/runtime": "^1.5.0",
+        "@tybys/wasm-util": "^0.10.1"
+      }
+    },
+    "node_modules/@oxc-project/runtime": {
+      "version": "0.92.0",
+      "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.92.0.tgz",
+      "integrity": "sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@oxc-project/types": {
+      "version": "0.93.0",
+      "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.93.0.tgz",
+      "integrity": "sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/Boshen"
+      }
+    },
+    "node_modules/@rolldown/binding-android-arm64": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.41.tgz",
+      "integrity": "sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-darwin-arm64": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.41.tgz",
+      "integrity": "sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-darwin-x64": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.41.tgz",
+      "integrity": "sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-freebsd-x64": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.41.tgz",
+      "integrity": "sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.41.tgz",
+      "integrity": "sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-arm64-gnu": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.41.tgz",
+      "integrity": "sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-arm64-musl": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.41.tgz",
+      "integrity": "sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-x64-gnu": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.41.tgz",
+      "integrity": "sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-linux-x64-musl": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.41.tgz",
+      "integrity": "sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-openharmony-arm64": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.41.tgz",
+      "integrity": "sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-wasm32-wasi": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.41.tgz",
+      "integrity": "sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==",
+      "cpu": [
+        "wasm32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "@napi-rs/wasm-runtime": "^1.0.5"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@rolldown/binding-win32-arm64-msvc": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.41.tgz",
+      "integrity": "sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-win32-ia32-msvc": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.41.tgz",
+      "integrity": "sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/binding-win32-x64-msvc": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.41.tgz",
+      "integrity": "sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      }
+    },
+    "node_modules/@rolldown/pluginutils": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.41.tgz",
+      "integrity": "sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@sveltejs/acorn-typescript": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz",
+      "integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "acorn": "^8.9.0"
+      }
+    },
+    "node_modules/@sveltejs/vite-plugin-svelte": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz",
+      "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==",
+      "dev": true,
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0",
+        "debug": "^4.4.1",
+        "deepmerge": "^4.3.1",
+        "magic-string": "^0.30.17",
+        "vitefu": "^1.1.1"
+      },
+      "engines": {
+        "node": "^20.19 || ^22.12 || >=24"
+      },
+      "peerDependencies": {
+        "svelte": "^5.0.0",
+        "vite": "^6.3.0 || ^7.0.0"
+      }
+    },
+    "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz",
+      "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.4.1"
+      },
+      "engines": {
+        "node": "^20.19 || ^22.12 || >=24"
+      },
+      "peerDependencies": {
+        "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0",
+        "svelte": "^5.0.0",
+        "vite": "^6.3.0 || ^7.0.0"
+      }
+    },
+    "node_modules/@tybys/wasm-util": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+      "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/acorn": {
+      "version": "8.15.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+      "dev": true,
+      "license": "MIT",
+      "peer": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/ansis": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz",
+      "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/aria-query": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+      "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/axobject-query": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+      "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/clsx": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+      "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/deepmerge": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+      "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/esm-env": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
+      "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/esrap": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.2.tgz",
+      "integrity": "sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.4.15"
+      }
+    },
+    "node_modules/fdir": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+      "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/is-reference": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
+      "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "^1.0.6"
+      }
+    },
+    "node_modules/lightningcss": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
+      "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+      "dev": true,
+      "license": "MPL-2.0",
+      "dependencies": {
+        "detect-libc": "^2.0.3"
+      },
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "lightningcss-android-arm64": "1.30.2",
+        "lightningcss-darwin-arm64": "1.30.2",
+        "lightningcss-darwin-x64": "1.30.2",
+        "lightningcss-freebsd-x64": "1.30.2",
+        "lightningcss-linux-arm-gnueabihf": "1.30.2",
+        "lightningcss-linux-arm64-gnu": "1.30.2",
+        "lightningcss-linux-arm64-musl": "1.30.2",
+        "lightningcss-linux-x64-gnu": "1.30.2",
+        "lightningcss-linux-x64-musl": "1.30.2",
+        "lightningcss-win32-arm64-msvc": "1.30.2",
+        "lightningcss-win32-x64-msvc": "1.30.2"
+      }
+    },
+    "node_modules/lightningcss-android-arm64": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz",
+      "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-darwin-arm64": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
+      "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-darwin-x64": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz",
+      "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-freebsd-x64": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz",
+      "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm-gnueabihf": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz",
+      "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm64-gnu": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz",
+      "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-arm64-musl": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz",
+      "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-x64-gnu": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz",
+      "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-linux-x64-musl": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz",
+      "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-win32-arm64-msvc": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz",
+      "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/lightningcss-win32-x64-msvc": {
+      "version": "1.30.2",
+      "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
+      "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MPL-2.0",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/locate-character": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+      "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.21",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+      "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.5"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.11",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/picomatch": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+      "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+      "dev": true,
+      "license": "MIT",
+      "peer": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.5.6",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.11",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/rolldown": {
+      "version": "1.0.0-beta.41",
+      "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.41.tgz",
+      "integrity": "sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@oxc-project/types": "=0.93.0",
+        "@rolldown/pluginutils": "1.0.0-beta.41",
+        "ansis": "=4.2.0"
+      },
+      "bin": {
+        "rolldown": "bin/cli.mjs"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "optionalDependencies": {
+        "@rolldown/binding-android-arm64": "1.0.0-beta.41",
+        "@rolldown/binding-darwin-arm64": "1.0.0-beta.41",
+        "@rolldown/binding-darwin-x64": "1.0.0-beta.41",
+        "@rolldown/binding-freebsd-x64": "1.0.0-beta.41",
+        "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.41",
+        "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.41",
+        "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.41",
+        "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.41",
+        "@rolldown/binding-linux-x64-musl": "1.0.0-beta.41",
+        "@rolldown/binding-openharmony-arm64": "1.0.0-beta.41",
+        "@rolldown/binding-wasm32-wasi": "1.0.0-beta.41",
+        "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.41",
+        "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.41",
+        "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.41"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/svelte": {
+      "version": "5.43.6",
+      "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.43.6.tgz",
+      "integrity": "sha512-RnyO9VXI85Bmsf4b8AuQFBKFYL3LKUl+ZrifOjvlrQoboAROj5IITVLK1yOXBjwUWUn2BI5cfmurktgCzuZ5QA==",
+      "dev": true,
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@jridgewell/remapping": "^2.3.4",
+        "@jridgewell/sourcemap-codec": "^1.5.0",
+        "@sveltejs/acorn-typescript": "^1.0.5",
+        "@types/estree": "^1.0.5",
+        "acorn": "^8.12.1",
+        "aria-query": "^5.3.1",
+        "axobject-query": "^4.1.0",
+        "clsx": "^2.1.1",
+        "esm-env": "^1.2.1",
+        "esrap": "^2.1.0",
+        "is-reference": "^3.0.3",
+        "locate-character": "^3.0.0",
+        "magic-string": "^0.30.11",
+        "zimmerframe": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.15",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+      "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.5.0",
+        "picomatch": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "dev": true,
+      "license": "0BSD",
+      "optional": true
+    },
+    "node_modules/vite": {
+      "name": "rolldown-vite",
+      "version": "7.1.14",
+      "resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-7.1.14.tgz",
+      "integrity": "sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==",
+      "dev": true,
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@oxc-project/runtime": "0.92.0",
+        "fdir": "^6.5.0",
+        "lightningcss": "^1.30.1",
+        "picomatch": "^4.0.3",
+        "postcss": "^8.5.6",
+        "rolldown": "1.0.0-beta.41",
+        "tinyglobby": "^0.2.15"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^20.19.0 || >=22.12.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^20.19.0 || >=22.12.0",
+        "esbuild": "^0.25.0",
+        "jiti": ">=1.21.0",
+        "less": "^4.0.0",
+        "sass": "^1.70.0",
+        "sass-embedded": "^1.70.0",
+        "stylus": ">=0.54.8",
+        "sugarss": "^5.0.0",
+        "terser": "^5.16.0",
+        "tsx": "^4.8.1",
+        "yaml": "^2.4.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "esbuild": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vitefu": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz",
+      "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==",
+      "dev": true,
+      "license": "MIT",
+      "workspaces": [
+        "tests/deps/*",
+        "tests/projects/*",
+        "tests/projects/workspace/packages/*"
+      ],
+      "peerDependencies": {
+        "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0"
+      },
+      "peerDependenciesMeta": {
+        "vite": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/zimmerframe": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
+      "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
+      "dev": true,
+      "license": "MIT"
+    }
+  }
+}

+ 19 - 19
package.json

@@ -1,19 +1,19 @@
-{
-  "name": "economics-svelte",
-  "private": true,
-  "version": "0.0.0",
-  "type": "module",
-  "scripts": {
-    "dev": "vite",
-    "build": "vite build",
-    "preview": "vite preview"
-  },
-  "devDependencies": {
-    "@sveltejs/vite-plugin-svelte": "^6.2.1",
-    "svelte": "^5.39.6",
-    "vite": "npm:rolldown-vite@7.1.14"
-  },
-  "overrides": {
-    "vite": "npm:rolldown-vite@7.1.14"
-  }
-}
+{
+  "name": "economics-svelte",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "devDependencies": {
+    "@sveltejs/vite-plugin-svelte": "^6.2.1",
+    "svelte": "^5.39.6",
+    "vite": "npm:rolldown-vite@7.1.14"
+  },
+  "overrides": {
+    "vite": "npm:rolldown-vite@7.1.14"
+  }
+}

+ 1 - 0
result

@@ -0,0 +1 @@
+/nix/store/gysk7ilhm7a32msmr13mwg79w8rsvr5h-econom-app-1.0.0

+ 10 - 10
src/App.svelte

@@ -1,10 +1,10 @@
-<script>
-  import Wizard from "./lib/components/Wizard.svelte";
-</script>
-
-<main>
-  <Wizard />
-</main>
-
-<style>
-</style>
+<script>
+  import Wizard from "./lib/components/Wizard.svelte";
+</script>
+
+<main>
+  <Wizard />
+</main>
+
+<style>
+</style>

+ 81 - 81
src/app.css

@@ -1,82 +1,82 @@
-:root {
-  font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
-  line-height: 1.5;
-  font-weight: 400;
-
-  color-scheme: light;
-  
-  font-synthesis: none;
-  text-rendering: optimizeLegibility;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  
-  color: #213547;
-  background-color: #f1f5f9;
-}
-
-a {
-  font-weight: 500;
-  color: #646cff;
-  text-decoration: inherit;
-}
-a:hover {
-  color: #535bf2;
-}
-
-body {
-  margin: 0;
-  display: flex;
-  place-items: center;
-  min-width: 320px;
-  min-height: 100vh;
-}
-
-h1 {
-  font-size: 3.2em;
-  line-height: 1.1;
-}
-
-.card {
-  padding: 2em;
-}
-
-#app {
-  max-width: 1280px;
-  margin: 0 auto;
-  padding: 2rem;
-  text-align: center;
-}
-
-button {
-  border-radius: 8px;
-  border: 1px solid transparent;
-  padding: 0.6em 1.2em;
-  font-size: 1em;
-  font-weight: 500;
-  font-family: inherit;
-  background-color: #1a1a1a;
-  cursor: pointer;
-  transition: border-color 0.25s;
-}
-button:hover {
-  border-color: #646cff;
-}
-button:focus,
-button:focus-visible {
-  outline: 4px auto -webkit-focus-ring-color;
-}
-
-/* Светлая тема */
-@media (prefers-color-scheme: light) {
-  :root {
-    color: #213547;
-    background-color: #ffffff;
-  }
-  a:hover {
-    color: #747bff;
-  }
-  button {
-    background-color: #f9f9f9;
-    color: #213547;
-  }
+:root {
+  font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  font-weight: 400;
+
+  color-scheme: light;
+  
+  font-synthesis: none;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  
+  color: #213547;
+  background-color: #f1f5f9;
+}
+
+a {
+  font-weight: 500;
+  color: #646cff;
+  text-decoration: inherit;
+}
+a:hover {
+  color: #535bf2;
+}
+
+body {
+  margin: 0;
+  display: flex;
+  place-items: center;
+  min-width: 320px;
+  min-height: 100vh;
+}
+
+h1 {
+  font-size: 3.2em;
+  line-height: 1.1;
+}
+
+.card {
+  padding: 2em;
+}
+
+#app {
+  max-width: 1280px;
+  margin: 0 auto;
+  padding: 2rem;
+  text-align: center;
+}
+
+button {
+  border-radius: 8px;
+  border: 1px solid transparent;
+  padding: 0.6em 1.2em;
+  font-size: 1em;
+  font-weight: 500;
+  font-family: inherit;
+  background-color: #1a1a1a;
+  cursor: pointer;
+  transition: border-color 0.25s;
+}
+button:hover {
+  border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+  outline: 4px auto -webkit-focus-ring-color;
+}
+
+/* Светлая тема */
+@media (prefers-color-scheme: light) {
+  :root {
+    color: #213547;
+    background-color: #ffffff;
+  }
+  a:hover {
+    color: #747bff;
+  }
+  button {
+    background-color: #f9f9f9;
+    color: #213547;
+  }
 }

+ 50 - 50
src/lib/components/ProgressBar.svelte

@@ -1,51 +1,51 @@
-<script>
-    export let step;
-    export let total;
-</script>
-
-<div class="progress-container">
-    <div class="progress-bar" style:width={`${(step / total) * 100}%`}></div>
-</div>
-<div class="steps">
-    {#each Array(total) as _, i}
-        <span
-            class="step-dot"
-            class:active={step > i + 1}
-            class:current={step === i + 1}
-        ></span>
-    {/each}
-</div>
-
-<style>
-    .progress-container {
-        height: 8px;
-        background: #e2e8f0;
-        border-radius: 4px;
-        overflow: hidden;
-        margin-bottom: 2rem;
-    }
-    .progress-bar {
-        height: 100%;
-        background: #2563eb;
-        transition: width 0.3s ease;
-    }
-    .steps {
-        display: flex;
-        justify-content: space-between;
-        margin-bottom: 1rem;
-    }
-    .step-dot {
-        width: 12px;
-        height: 12px;
-        background: #cbd5e1;
-        border-radius: 50%;
-        transition: all 0.2s;
-    }
-    .step-dot.active {
-        background: #2563eb;
-    }
-    .step-dot.current {
-        background: #1d4ed8;
-        transform: scale(1.3);
-    }
+<script>
+    export let step;
+    export let total;
+</script>
+
+<div class="progress-container">
+    <div class="progress-bar" style:width={`${(step / total) * 100}%`}></div>
+</div>
+<div class="steps">
+    {#each Array(total) as _, i}
+        <span
+            class="step-dot"
+            class:active={step > i + 1}
+            class:current={step === i + 1}
+        ></span>
+    {/each}
+</div>
+
+<style>
+    .progress-container {
+        height: 8px;
+        background: #e2e8f0;
+        border-radius: 4px;
+        overflow: hidden;
+        margin-bottom: 2rem;
+    }
+    .progress-bar {
+        height: 100%;
+        background: #2563eb;
+        transition: width 0.3s ease;
+    }
+    .steps {
+        display: flex;
+        justify-content: space-between;
+        margin-bottom: 1rem;
+    }
+    .step-dot {
+        width: 12px;
+        height: 12px;
+        background: #cbd5e1;
+        border-radius: 50%;
+        transition: all 0.2s;
+    }
+    .step-dot.active {
+        background: #2563eb;
+    }
+    .step-dot.current {
+        background: #1d4ed8;
+        transform: scale(1.3);
+    }
 </style>

+ 173 - 173
src/lib/components/ResultCard.svelte

@@ -1,173 +1,173 @@
-<script>
-    let { result, reset } = $props();
-</script>
-
-<div class="result-card">
-    {#if result}
-        <h2>Рекомендуем: <strong>{result.recommendation}</strong></h2>
-        <p>{result.description}</p>
-
-        <div class="section">
-            <h4>Налоговый режим:</h4>
-            <ul>
-                {#each result.taxes as tax}
-                    <li>
-                        <strong>{tax.name}</strong>: {tax.rate} →
-                        <em>{tax.note}</em>
-                    </li>
-                {/each}
-            </ul>
-        </div>
-
-        <div class="pros-cons">
-            <div>
-                <h4>Плюсы</h4>
-                <ul class="pros">
-                    {#each result.pros as pro}<li>{pro}</li>{/each}
-                </ul>
-            </div>
-            <div>
-                <h4>Минусы</h4>
-                <ul class="cons">
-                    {#each result.cons as con}<li>{con}</li>{/each}
-                </ul>
-            </div>
-        </div>
-
-        {#if result.warning}
-            <div class="warning">
-                <strong>Внимание:</strong>
-                {result.warning}
-            </div>
-        {/if}
-    {:else}
-        <h2>Не удалось найти подходящий вариант.</h2>
-        <p>
-            Скорее всего, один или несколько выбранных вами вариантов невозможны
-            друг с другом.
-        </p>
-    {/if}
-
-    <button onclick={reset} class="reset">Начать заново</button>
-</div>
-
-<style>
-    .result-card {
-        background: #f8fafc;
-        padding: 1.5rem;
-        border-radius: 12px;
-        color: #1e293b;
-    }
-
-    h2 {
-        color: #0f172a;
-        margin-bottom: 1rem;
-    }
-
-    h4 {
-        color: #334155;
-        margin-top: 1.5rem;
-        margin-bottom: 0.75rem;
-    }
-
-    p {
-        color: #475569;
-        line-height: 1.6;
-    }
-
-    .section {
-        margin: 1.5rem 0;
-        color: #334155;
-    }
-
-    .section ul {
-        list-style: none;
-        padding: 0;
-    }
-
-    .section li {
-        padding: 0.5rem 0;
-        color: #475569;
-    }
-
-    .section strong {
-        color: #1e293b;
-    }
-
-    .section em {
-        color: #64748b;
-    }
-
-    .pros-cons {
-        display: grid;
-        grid-template-columns: 1fr 1fr;
-        gap: 1rem;
-        margin: 1.5rem 0;
-    }
-
-    @media (max-width: 600px) {
-        .pros-cons {
-            grid-template-columns: 1fr;
-        }
-    }
-
-    .pros,
-    .cons {
-        list-style: none;
-        padding: 0;
-    }
-
-    .pros li {
-        padding: 0.5rem 0;
-        color: #15803d;
-    }
-
-    .pros li::before {
-        content: "✓ ";
-        color: #16a34a;
-        font-weight: bold;
-        margin-right: 0.5rem;
-    }
-
-    .cons li {
-        padding: 0.5rem 0;
-        color: #b91c1c;
-    }
-
-    .cons li::before {
-        content: "✗ ";
-        color: #dc2626;
-        font-weight: bold;
-        margin-right: 0.5rem;
-    }
-
-    .warning {
-        background: #fef3c7;
-        padding: 1rem;
-        border-radius: 8px;
-        margin: 1.5rem 0;
-        border-left: 4px solid #f59e0b;
-        color: #92400e;
-    }
-
-    .warning strong {
-        color: #78350f;
-    }
-
-    .reset {
-        margin-top: 1.5rem;
-        width: 100%;
-        background: #2563eb;
-        color: white;
-        border: none;
-        padding: 0.75rem 1.5rem;
-        border-radius: 8px;
-        font-weight: 600;
-        cursor: pointer;
-        transition: background 0.2s;
-    }
-
-    .reset:hover {
-        background: #1d4ed8;
-    }
-</style>
+<script>
+    let { result, reset } = $props();
+</script>
+
+<div class="result-card">
+    {#if result}
+        <h2>Рекомендуем: <strong>{result.recommendation}</strong></h2>
+        <p>{result.description}</p>
+
+        <div class="section">
+            <h4>Налоговый режим:</h4>
+            <ul>
+                {#each result.taxes as tax}
+                    <li>
+                        <strong>{tax.name}</strong>: {tax.rate} →
+                        <em>{tax.note}</em>
+                    </li>
+                {/each}
+            </ul>
+        </div>
+
+        <div class="pros-cons">
+            <div>
+                <h4>Плюсы</h4>
+                <ul class="pros">
+                    {#each result.pros as pro}<li>{pro}</li>{/each}
+                </ul>
+            </div>
+            <div>
+                <h4>Минусы</h4>
+                <ul class="cons">
+                    {#each result.cons as con}<li>{con}</li>{/each}
+                </ul>
+            </div>
+        </div>
+
+        {#if result.warning}
+            <div class="warning">
+                <strong>Внимание:</strong>
+                {result.warning}
+            </div>
+        {/if}
+    {:else}
+        <h2>Не удалось найти подходящий вариант.</h2>
+        <p>
+            Скорее всего, один или несколько выбранных вами вариантов невозможны
+            друг с другом.
+        </p>
+    {/if}
+
+    <button onclick={reset} class="reset">Начать заново</button>
+</div>
+
+<style>
+    .result-card {
+        background: #f8fafc;
+        padding: 1.5rem;
+        border-radius: 12px;
+        color: #1e293b;
+    }
+
+    h2 {
+        color: #0f172a;
+        margin-bottom: 1rem;
+    }
+
+    h4 {
+        color: #334155;
+        margin-top: 1.5rem;
+        margin-bottom: 0.75rem;
+    }
+
+    p {
+        color: #475569;
+        line-height: 1.6;
+    }
+
+    .section {
+        margin: 1.5rem 0;
+        color: #334155;
+    }
+
+    .section ul {
+        list-style: none;
+        padding: 0;
+    }
+
+    .section li {
+        padding: 0.5rem 0;
+        color: #475569;
+    }
+
+    .section strong {
+        color: #1e293b;
+    }
+
+    .section em {
+        color: #64748b;
+    }
+
+    .pros-cons {
+        display: grid;
+        grid-template-columns: 1fr 1fr;
+        gap: 1rem;
+        margin: 1.5rem 0;
+    }
+
+    @media (max-width: 600px) {
+        .pros-cons {
+            grid-template-columns: 1fr;
+        }
+    }
+
+    .pros,
+    .cons {
+        list-style: none;
+        padding: 0;
+    }
+
+    .pros li {
+        padding: 0.5rem 0;
+        color: #15803d;
+    }
+
+    .pros li::before {
+        content: "✓ ";
+        color: #16a34a;
+        font-weight: bold;
+        margin-right: 0.5rem;
+    }
+
+    .cons li {
+        padding: 0.5rem 0;
+        color: #b91c1c;
+    }
+
+    .cons li::before {
+        content: "✗ ";
+        color: #dc2626;
+        font-weight: bold;
+        margin-right: 0.5rem;
+    }
+
+    .warning {
+        background: #fef3c7;
+        padding: 1rem;
+        border-radius: 8px;
+        margin: 1.5rem 0;
+        border-left: 4px solid #f59e0b;
+        color: #92400e;
+    }
+
+    .warning strong {
+        color: #78350f;
+    }
+
+    .reset {
+        margin-top: 1.5rem;
+        width: 100%;
+        background: #2563eb;
+        color: white;
+        border: none;
+        padding: 0.75rem 1.5rem;
+        border-radius: 8px;
+        font-weight: 600;
+        cursor: pointer;
+        transition: background 0.2s;
+    }
+
+    .reset:hover {
+        background: #1d4ed8;
+    }
+</style>

+ 107 - 107
src/lib/components/Step1_Founders.svelte

@@ -1,108 +1,108 @@
-<script>
-    let { value = $bindable(), next = $bindable() } = $props();
-</script>
-
-<div class="step">
-    <h3>1. Кто запускает бизнес?</h3>
-    <p class="hint">Количество учредителей влияет на выбор формы</p>
-    
-    <div class="options">
-        <label class="option-card" class:selected={value === 1}>
-            <input type="radio" bind:group={value} value={1} />
-            <div class="content">
-                <strong>1 человек</strong>
-            </div>
-        </label>
-        
-        <label class="option-card" class:selected={value === 2}>
-            <input type="radio" bind:group={value} value={2} />
-            <div class="content">
-                <strong>2–5 человек</strong>
-            </div>
-        </label>
-        
-        <label class="option-card" class:selected={value === 10}>
-            <input type="radio" bind:group={value} value={10} />
-            <div class="content">
-                <strong>6–50 человек</strong>
-            </div>
-        </label>
-        
-        <label class="option-card" class:selected={value === 51}>
-            <input type="radio" bind:group={value} value={51} />
-            <div class="content">
-                <strong>Больше 50 человек</strong>
-            </div>
-        </label>
-    </div>
-    
-    <button onclick={next} disabled={!value} class="primary">Далее →</button>
-</div>
-
-<style>
-    .hint {
-        color: #666;
-        font-size: 0.9rem;
-        margin-bottom: 1rem;
-    }
-    .options {
-        display: flex;
-        flex-direction: column;
-        gap: 1rem;
-        margin: 1.5rem 0;
-    }
-    .option-card {
-        display: flex;
-        align-items: center;
-        gap: 1rem;
-        padding: 1rem;
-        border: 2px solid #e2e8f0;
-        border-radius: 12px;
-        cursor: pointer;
-        transition: all 0.2s;
-        background: white;
-    }
-    .option-card:hover {
-        border-color: #2563eb;
-        transform: translateY(-2px);
-    }
-    .option-card.selected {
-        border-color: #2563eb;
-        background: #ebf3ff;
-    }
-    .option-card input {
-        margin: 0;
-    }
-    .content {
-        flex: 1;
-    }
-    .content strong {
-        display: block;
-        margin-bottom: 0.25rem;
-        font-size: 1.1rem;
-        color: #1e293b;
-    }
-    .content small {
-        color: #64748b;
-        font-size: 0.85rem;
-    }
-    button {
-        width: 100%;
-        margin-top: 1rem;
-        padding: 0.75rem 1.5rem;
-        background: #2563eb;
-        color: white;
-        border: none;
-        border-radius: 8px;
-        font-weight: 600;
-        cursor: pointer;
-        transition: background 0.2s;
-    }
-    button:hover:not(:disabled) {
-        background: #1d4ed8;
-    }
-    button:disabled {
-        background: #cbd5e1;
-        cursor: not-allowed;
-    }
+<script>
+    let { value = $bindable(), next = $bindable() } = $props();
+</script>
+
+<div class="step">
+    <h3>1. Кто запускает бизнес?</h3>
+    <p class="hint">Количество учредителей влияет на выбор формы</p>
+    
+    <div class="options">
+        <label class="option-card" class:selected={value === 1}>
+            <input type="radio" bind:group={value} value={1} />
+            <div class="content">
+                <strong>1 человек</strong>
+            </div>
+        </label>
+        
+        <label class="option-card" class:selected={value === 2}>
+            <input type="radio" bind:group={value} value={2} />
+            <div class="content">
+                <strong>2–5 человек</strong>
+            </div>
+        </label>
+        
+        <label class="option-card" class:selected={value === 10}>
+            <input type="radio" bind:group={value} value={10} />
+            <div class="content">
+                <strong>6–50 человек</strong>
+            </div>
+        </label>
+        
+        <label class="option-card" class:selected={value === 51}>
+            <input type="radio" bind:group={value} value={51} />
+            <div class="content">
+                <strong>Больше 50 человек</strong>
+            </div>
+        </label>
+    </div>
+    
+    <button onclick={next} disabled={!value} class="primary">Далее →</button>
+</div>
+
+<style>
+    .hint {
+        color: #666;
+        font-size: 0.9rem;
+        margin-bottom: 1rem;
+    }
+    .options {
+        display: flex;
+        flex-direction: column;
+        gap: 1rem;
+        margin: 1.5rem 0;
+    }
+    .option-card {
+        display: flex;
+        align-items: center;
+        gap: 1rem;
+        padding: 1rem;
+        border: 2px solid #e2e8f0;
+        border-radius: 12px;
+        cursor: pointer;
+        transition: all 0.2s;
+        background: white;
+    }
+    .option-card:hover {
+        border-color: #2563eb;
+        transform: translateY(-2px);
+    }
+    .option-card.selected {
+        border-color: #2563eb;
+        background: #ebf3ff;
+    }
+    .option-card input {
+        margin: 0;
+    }
+    .content {
+        flex: 1;
+    }
+    .content strong {
+        display: block;
+        margin-bottom: 0.25rem;
+        font-size: 1.1rem;
+        color: #1e293b;
+    }
+    .content small {
+        color: #64748b;
+        font-size: 0.85rem;
+    }
+    button {
+        width: 100%;
+        margin-top: 1rem;
+        padding: 0.75rem 1.5rem;
+        background: #2563eb;
+        color: white;
+        border: none;
+        border-radius: 8px;
+        font-weight: 600;
+        cursor: pointer;
+        transition: background 0.2s;
+    }
+    button:hover:not(:disabled) {
+        background: #1d4ed8;
+    }
+    button:disabled {
+        background: #cbd5e1;
+        cursor: not-allowed;
+    }
 </style>

+ 124 - 124
src/lib/components/Step2_Scale.svelte

@@ -1,125 +1,125 @@
-<script>
-    let {
-        value = $bindable(),
-        next = $bindable(),
-        prev = $bindable(),
-    } = $props();
-
-    const scales = [
-        {
-            id: "малый",
-            title: "Малый",
-            desc: "До 15 млн ₽/год, до 100 сотрудников",
-        },
-        { id: "средний", title: "Средний", desc: "15–800 млн ₽/год" },
-        { id: "крупный", title: "Крупный", desc: "Более 800 млн ₽/год" },
-    ];
-</script>
-
-<div class="step">
-    <h3>2. Какой масштаб планируете?</h3>
-    <p class="hint">Выберите ближайший по обороту и штату</p>
-
-    <div class="options">
-        {#each scales as scale}
-            <label class="card" class:selected={value === scale.id}>
-                <input type="radio" bind:group={value} value={scale.id} />
-                <div class="content">
-                    <strong>{scale.title}</strong>
-                    <small>{scale.desc}</small>
-                </div>
-            </label>
-        {/each}
-    </div>
-
-    <div class="actions">
-        <button onclick={prev} class="secondary">Назад</button>
-        <button onclick={next} disabled={!value} class="primary">Далее</button>
-    </div>
-</div>
-
-<style>
-    .step {
-        color: #ffffff;
-    }
-    
-    h3 {
-        color: #ffffff;
-        margin-bottom: 0.5rem;
-    }
-    
-    .hint {
-        color: #64748b;
-        font-size: 0.9rem;
-        margin-bottom: 1rem;
-    }
-    .options {
-        display: flex;
-        flex-direction: column;
-        gap: 1rem;
-        margin: 1.5rem 0;
-    }
-    .card {
-        display: flex;
-        align-items: center;
-        gap: 1rem;
-        padding: 1rem;
-        border: 2px solid #e2e8f0;
-        border-radius: 12px;
-        cursor: pointer;
-        transition: all 0.2s;
-        background: white;
-    }
-    .card:hover {
-        border-color: #2563eb;
-        box-shadow: 0 2px 4px rgba(37, 99, 235, 0.1);
-    }
-    .card.selected {
-        border-color: #2563eb;
-        background: #ebf3ff;
-    }
-    .content {
-        flex: 1;
-    }
-    .content strong {
-        color: #1e293b;
-        display: block;
-        margin-bottom: 0.25rem;
-    }
-    small {
-        color: #64748b;
-        display: block;
-        margin-top: 0.25rem;
-    }
-    .actions {
-        display: flex;
-        justify-content: space-between;
-        margin-top: 2rem;
-    }
-    button {
-        padding: 0.75rem 1.5rem;
-        border-radius: 8px;
-        border: none;
-        font-weight: 600;
-        cursor: pointer;
-        transition: all 0.2s;
-    }
-    .secondary {
-        background: #f1f5f9;
-        color: #475569;
-    }
-    .secondary:hover {
-        background: #e2e8f0;
-    }
-    .primary {
-        background: #2563eb;
-        color: white;
-    }
-    .primary:hover:not(:disabled) {
-        background: #1d4ed8;
-    }
-    .primary:disabled {
-        background: #cbd5e1;
-        cursor: not-allowed;
-    }
+<script>
+    let {
+        value = $bindable(),
+        next = $bindable(),
+        prev = $bindable(),
+    } = $props();
+
+    const scales = [
+        {
+            id: "малый",
+            title: "Малый",
+            desc: "До 15 млн ₽/год, до 100 сотрудников",
+        },
+        { id: "средний", title: "Средний", desc: "15–800 млн ₽/год" },
+        { id: "крупный", title: "Крупный", desc: "Более 800 млн ₽/год" },
+    ];
+</script>
+
+<div class="step">
+    <h3>2. Какой масштаб планируете?</h3>
+    <p class="hint">Выберите ближайший по обороту и штату</p>
+
+    <div class="options">
+        {#each scales as scale}
+            <label class="card" class:selected={value === scale.id}>
+                <input type="radio" bind:group={value} value={scale.id} />
+                <div class="content">
+                    <strong>{scale.title}</strong>
+                    <small>{scale.desc}</small>
+                </div>
+            </label>
+        {/each}
+    </div>
+
+    <div class="actions">
+        <button onclick={prev} class="secondary">Назад</button>
+        <button onclick={next} disabled={!value} class="primary">Далее</button>
+    </div>
+</div>
+
+<style>
+    .step {
+        color: #ffffff;
+    }
+    
+    h3 {
+        color: #ffffff;
+        margin-bottom: 0.5rem;
+    }
+    
+    .hint {
+        color: #64748b;
+        font-size: 0.9rem;
+        margin-bottom: 1rem;
+    }
+    .options {
+        display: flex;
+        flex-direction: column;
+        gap: 1rem;
+        margin: 1.5rem 0;
+    }
+    .card {
+        display: flex;
+        align-items: center;
+        gap: 1rem;
+        padding: 1rem;
+        border: 2px solid #e2e8f0;
+        border-radius: 12px;
+        cursor: pointer;
+        transition: all 0.2s;
+        background: white;
+    }
+    .card:hover {
+        border-color: #2563eb;
+        box-shadow: 0 2px 4px rgba(37, 99, 235, 0.1);
+    }
+    .card.selected {
+        border-color: #2563eb;
+        background: #ebf3ff;
+    }
+    .content {
+        flex: 1;
+    }
+    .content strong {
+        color: #1e293b;
+        display: block;
+        margin-bottom: 0.25rem;
+    }
+    small {
+        color: #64748b;
+        display: block;
+        margin-top: 0.25rem;
+    }
+    .actions {
+        display: flex;
+        justify-content: space-between;
+        margin-top: 2rem;
+    }
+    button {
+        padding: 0.75rem 1.5rem;
+        border-radius: 8px;
+        border: none;
+        font-weight: 600;
+        cursor: pointer;
+        transition: all 0.2s;
+    }
+    .secondary {
+        background: #f1f5f9;
+        color: #475569;
+    }
+    .secondary:hover {
+        background: #e2e8f0;
+    }
+    .primary {
+        background: #2563eb;
+        color: white;
+    }
+    .primary:hover:not(:disabled) {
+        background: #1d4ed8;
+    }
+    .primary:disabled {
+        background: #cbd5e1;
+        cursor: not-allowed;
+    }
 </style>

+ 149 - 149
src/lib/components/Step3_Activity.svelte

@@ -1,150 +1,150 @@
-<script>
-    let {
-        value = $bindable(),
-        next = $bindable(),
-        prev = $bindable(),
-    } = $props();
-
-    const activities = [
-        {
-            id: "услуги",
-            title: "Услуги",
-            examples: "Консультации, ремонт, обучение",
-            icon: "💼"
-        },
-        {
-            id: "торговля",
-            title: "Торговля",
-            examples: "Магазин, маркетплейс, опт",
-            icon: "🛒"
-        },
-        {
-            id: "производство",
-            title: "Производство",
-            examples: "Еда, мебель, оборудование",
-            icon: "🏭"
-        },
-        { 
-            id: "IT", 
-            title: "IT / Стартап", 
-            examples: "ПО, приложения, SaaS",
-            icon: "💻"
-        },
-        {
-            id: "сельское хозяйство",
-            title: "Сельское хозяйство",
-            examples: "Ферма, растениеводство, животноводство",
-            icon: "🌾"
-        }
-    ];
-</script>
-
-<div class="step">
-    <h3>3. Чем будете заниматься?</h3>
-    <p class="hint">Выберите основной вид деятельности</p>
-
-    <div class="grid">
-        {#each activities as act}
-            <label class="tile" class:selected={value === act.id}>
-                <input type="radio" bind:group={value} value={act.id} />
-                <div class="icon">{act.icon}</div>
-                <strong>{act.title}</strong>
-                <small>{act.examples}</small>
-            </label>
-        {/each}
-    </div>
-
-    <div class="actions">
-        <button onclick={prev} class="secondary">Назад</button>
-        <button onclick={next} disabled={!value} class="primary">Далее</button>
-    </div>
-</div>
-
-<style>
-    .hint {
-        color: #666;
-        margin-bottom: 1rem;
-    }
-    .grid {
-        display: grid;
-        grid-template-columns: repeat(2, 1fr);
-        gap: 1rem;
-        margin: 1.5rem 0;
-    }
-    @media (max-width: 600px) {
-        .grid {
-            grid-template-columns: 1fr;
-        }
-    }
-    .tile {
-        text-align: center;
-        padding: 1.5rem 1rem;
-        border: 2px solid #e2e8f0;
-        border-radius: 16px;
-        cursor: pointer;
-        transition: all 0.2s;
-        background: white;
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        color: #1e293b;
-    }
-    .tile input {
-        position: absolute;
-        opacity: 0;
-    }
-    .tile:hover {
-        border-color: #2563eb;
-        transform: translateY(-2px);
-        box-shadow: 0 4px 6px rgba(37, 99, 235, 0.1);
-    }
-    .tile.selected {
-        border-color: #2563eb;
-        background: #ebf3ff;
-    }
-    .icon {
-        font-size: 2.5rem;
-        margin-bottom: 0.75rem;
-    }
-    strong {
-        display: block;
-        margin-bottom: 0.25rem;
-    }
-    small {
-        color: #64748b;
-        font-size: 0.85rem;
-        display: block;
-        margin-top: 0.5rem;
-    }
-    .actions {
-        display: flex;
-        justify-content: space-between;
-        margin-top: 2rem;
-    }
-    button {
-        padding: 0.75rem 1.5rem;
-        border-radius: 8px;
-        border: none;
-        font-weight: 600;
-        cursor: pointer;
-        transition: all 0.2s;
-    }
-    .secondary {
-        background: #f8fafc;
-        color: #334155;
-    }
-    .secondary:hover {
-        background: #e2e8f0;
-    }
-    .primary {
-        background: #2563eb;
-        color: white;
-    }
-    .primary:hover:not(:disabled) {
-        background: #1d4ed8;
-    }
-    .primary:disabled {
-        background: #cbd5e1;
-        cursor: not-allowed;
-    }
+<script>
+    let {
+        value = $bindable(),
+        next = $bindable(),
+        prev = $bindable(),
+    } = $props();
+
+    const activities = [
+        {
+            id: "услуги",
+            title: "Услуги",
+            examples: "Консультации, ремонт, обучение",
+            icon: "💼"
+        },
+        {
+            id: "торговля",
+            title: "Торговля",
+            examples: "Магазин, маркетплейс, опт",
+            icon: "🛒"
+        },
+        {
+            id: "производство",
+            title: "Производство",
+            examples: "Еда, мебель, оборудование",
+            icon: "🏭"
+        },
+        { 
+            id: "IT", 
+            title: "IT / Стартап", 
+            examples: "ПО, приложения, SaaS",
+            icon: "💻"
+        },
+        {
+            id: "сельское хозяйство",
+            title: "Сельское хозяйство",
+            examples: "Ферма, растениеводство, животноводство",
+            icon: "🌾"
+        }
+    ];
+</script>
+
+<div class="step">
+    <h3>3. Чем будете заниматься?</h3>
+    <p class="hint">Выберите основной вид деятельности</p>
+
+    <div class="grid">
+        {#each activities as act}
+            <label class="tile" class:selected={value === act.id}>
+                <input type="radio" bind:group={value} value={act.id} />
+                <div class="icon">{act.icon}</div>
+                <strong>{act.title}</strong>
+                <small>{act.examples}</small>
+            </label>
+        {/each}
+    </div>
+
+    <div class="actions">
+        <button onclick={prev} class="secondary">Назад</button>
+        <button onclick={next} disabled={!value} class="primary">Далее</button>
+    </div>
+</div>
+
+<style>
+    .hint {
+        color: #666;
+        margin-bottom: 1rem;
+    }
+    .grid {
+        display: grid;
+        grid-template-columns: repeat(2, 1fr);
+        gap: 1rem;
+        margin: 1.5rem 0;
+    }
+    @media (max-width: 600px) {
+        .grid {
+            grid-template-columns: 1fr;
+        }
+    }
+    .tile {
+        text-align: center;
+        padding: 1.5rem 1rem;
+        border: 2px solid #e2e8f0;
+        border-radius: 16px;
+        cursor: pointer;
+        transition: all 0.2s;
+        background: white;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        color: #1e293b;
+    }
+    .tile input {
+        position: absolute;
+        opacity: 0;
+    }
+    .tile:hover {
+        border-color: #2563eb;
+        transform: translateY(-2px);
+        box-shadow: 0 4px 6px rgba(37, 99, 235, 0.1);
+    }
+    .tile.selected {
+        border-color: #2563eb;
+        background: #ebf3ff;
+    }
+    .icon {
+        font-size: 2.5rem;
+        margin-bottom: 0.75rem;
+    }
+    strong {
+        display: block;
+        margin-bottom: 0.25rem;
+    }
+    small {
+        color: #64748b;
+        font-size: 0.85rem;
+        display: block;
+        margin-top: 0.5rem;
+    }
+    .actions {
+        display: flex;
+        justify-content: space-between;
+        margin-top: 2rem;
+    }
+    button {
+        padding: 0.75rem 1.5rem;
+        border-radius: 8px;
+        border: none;
+        font-weight: 600;
+        cursor: pointer;
+        transition: all 0.2s;
+    }
+    .secondary {
+        background: #f8fafc;
+        color: #334155;
+    }
+    .secondary:hover {
+        background: #e2e8f0;
+    }
+    .primary {
+        background: #2563eb;
+        color: white;
+    }
+    .primary:hover:not(:disabled) {
+        background: #1d4ed8;
+    }
+    .primary:disabled {
+        background: #cbd5e1;
+        cursor: not-allowed;
+    }
 </style>

+ 139 - 139
src/lib/components/Step4_Finance.svelte

@@ -1,140 +1,140 @@
-<script>
-    let {
-        form = $bindable(),
-        next = $bindable(),
-        prev = $bindable(),
-    } = $props();
-
-    let isValid = $derived(
-        () => form.investments !== undefined && form.risk !== undefined,
-    );
-</script>
-
-<div class="step">
-    <h3>4. Финансы и ответственность</h3>
-    <p class="hint">Честно ответьте — это важно для защиты</p>
-
-    <div class="checkboxes">
-        <label class="checkbox-item">
-            <input type="checkbox" bind:checked={form.investments} />
-            <div class="label-text">
-                <strong>Нужны инвесторы или продажа доли?</strong>
-                <small>Венчур, бизнес-ангелы, партнёрство</small>
-            </div>
-        </label>
-
-        <label class="checkbox-item">
-            <input type="checkbox" bind:checked={form.risk} />
-            <div class="label-text">
-                <strong>Готов рисковать личным имуществом?</strong>
-                <small>Машина, дача, вклады — под угрозой при долгах</small>
-            </div>
-        </label>
-    </div>
-
-    {#if !form.risk}
-        <div class="warning-box">
-            <strong>Внимание:</strong> Вы выбрали "не готов" — будет рекомендована
-            форма с ограниченной ответственностью.
-        </div>
-    {/if}
-
-    <div class="actions">
-        <button onclick={prev} class="secondary">Назад</button>
-        <button onclick={next} disabled={!isValid} class="primary">
-            Получить рекомендацию
-        </button>
-    </div>
-</div>
-
-<style>
-    .step {
-        color: #1e293b;
-    }
-    
-    h3 {
-        color: #ffffff;
-        margin-bottom: 0.5rem;
-    }
-    
-    .hint {
-        color: #64748b;
-        margin-bottom: 1.5rem;
-    }
-    .checkboxes {
-        display: flex;
-        flex-direction: column;
-        gap: 1.5rem;
-        margin: 1.5rem 0;
-    }
-    .checkbox-item {
-        display: flex;
-        align-items: flex-start;
-        gap: 1rem;
-        padding: 1rem;
-        border: 1px solid #e2e8f0;
-        border-radius: 12px;
-        background: #f8fafc;
-        cursor: pointer;
-        transition: all 0.2s;
-    }
-    .checkbox-item:hover {
-        border-color: #cbd5e1;
-        background: white;
-    }
-    .checkbox-item input {
-        margin-top: 0.25rem;
-        cursor: pointer;
-    }
-    .label-text strong {
-        display: block;
-        margin-bottom: 0.25rem;
-        color: #1e293b;
-    }
-    .label-text small {
-        color: #64748b;
-    }
-    .warning-box {
-        background: #fef3c7;
-        color: #92400e;
-        padding: 1rem;
-        border-radius: 8px;
-        margin: 1.5rem 0;
-        font-size: 0.95rem;
-        border-left: 4px solid #f59e0b;
-    }
-    .warning-box strong {
-        color: #78350f;
-    }
-    .actions {
-        display: flex;
-        justify-content: space-between;
-        margin-top: 2rem;
-    }
-    button {
-        padding: 0.75rem 1.5rem;
-        border-radius: 8px;
-        border: none;
-        font-weight: 600;
-        cursor: pointer;
-        transition: all 0.2s;
-    }
-    .secondary {
-        background: #e2e8f0;
-        color: #475569;
-    }
-    .secondary:hover {
-        background: #cbd5e1;
-    }
-    .primary {
-        background: #2563eb;
-        color: white;
-    }
-    .primary:hover:not(:disabled) {
-        background: #1d4ed8;
-    }
-    .primary:disabled {
-        background: #cbd5e1;
-        cursor: not-allowed;
-    }
+<script>
+    let {
+        form = $bindable(),
+        next = $bindable(),
+        prev = $bindable(),
+    } = $props();
+
+    let isValid = $derived(
+        () => form.investments !== undefined && form.risk !== undefined,
+    );
+</script>
+
+<div class="step">
+    <h3>4. Финансы и ответственность</h3>
+    <p class="hint">Честно ответьте — это важно для защиты</p>
+
+    <div class="checkboxes">
+        <label class="checkbox-item">
+            <input type="checkbox" bind:checked={form.investments} />
+            <div class="label-text">
+                <strong>Нужны инвесторы или продажа доли?</strong>
+                <small>Венчур, бизнес-ангелы, партнёрство</small>
+            </div>
+        </label>
+
+        <label class="checkbox-item">
+            <input type="checkbox" bind:checked={form.risk} />
+            <div class="label-text">
+                <strong>Готов рисковать личным имуществом?</strong>
+                <small>Машина, дача, вклады — под угрозой при долгах</small>
+            </div>
+        </label>
+    </div>
+
+    {#if !form.risk}
+        <div class="warning-box">
+            <strong>Внимание:</strong> Вы выбрали "не готов" — будет рекомендована
+            форма с ограниченной ответственностью.
+        </div>
+    {/if}
+
+    <div class="actions">
+        <button onclick={prev} class="secondary">Назад</button>
+        <button onclick={next} disabled={!isValid} class="primary">
+            Получить рекомендацию
+        </button>
+    </div>
+</div>
+
+<style>
+    .step {
+        color: #1e293b;
+    }
+    
+    h3 {
+        color: #ffffff;
+        margin-bottom: 0.5rem;
+    }
+    
+    .hint {
+        color: #64748b;
+        margin-bottom: 1.5rem;
+    }
+    .checkboxes {
+        display: flex;
+        flex-direction: column;
+        gap: 1.5rem;
+        margin: 1.5rem 0;
+    }
+    .checkbox-item {
+        display: flex;
+        align-items: flex-start;
+        gap: 1rem;
+        padding: 1rem;
+        border: 1px solid #e2e8f0;
+        border-radius: 12px;
+        background: #f8fafc;
+        cursor: pointer;
+        transition: all 0.2s;
+    }
+    .checkbox-item:hover {
+        border-color: #cbd5e1;
+        background: white;
+    }
+    .checkbox-item input {
+        margin-top: 0.25rem;
+        cursor: pointer;
+    }
+    .label-text strong {
+        display: block;
+        margin-bottom: 0.25rem;
+        color: #1e293b;
+    }
+    .label-text small {
+        color: #64748b;
+    }
+    .warning-box {
+        background: #fef3c7;
+        color: #92400e;
+        padding: 1rem;
+        border-radius: 8px;
+        margin: 1.5rem 0;
+        font-size: 0.95rem;
+        border-left: 4px solid #f59e0b;
+    }
+    .warning-box strong {
+        color: #78350f;
+    }
+    .actions {
+        display: flex;
+        justify-content: space-between;
+        margin-top: 2rem;
+    }
+    button {
+        padding: 0.75rem 1.5rem;
+        border-radius: 8px;
+        border: none;
+        font-weight: 600;
+        cursor: pointer;
+        transition: all 0.2s;
+    }
+    .secondary {
+        background: #e2e8f0;
+        color: #475569;
+    }
+    .secondary:hover {
+        background: #cbd5e1;
+    }
+    .primary {
+        background: #2563eb;
+        color: white;
+    }
+    .primary:hover:not(:disabled) {
+        background: #1d4ed8;
+    }
+    .primary:disabled {
+        background: #cbd5e1;
+        cursor: not-allowed;
+    }
 </style>

+ 116 - 116
src/lib/components/Wizard.svelte

@@ -1,116 +1,116 @@
-<!-- Wizard.svelte -->
-<script>
-    import { slide } from "svelte/transition";
-    import ProgressBar from "./ProgressBar.svelte";
-    import Step1_Founders from "./Step1_Founders.svelte";
-    import Step2_Scale from "./Step2_Scale.svelte";
-    import Step3_Activity from "./Step3_Activity.svelte";
-    import Step4_Finance from "./Step4_Finance.svelte";
-    import ResultCard from "./ResultCard.svelte";
-    import { findRecommendation } from "../utils/matcher";
-    import rules from "../data/rules.json";
-
-    let step = $state(1);
-    let form = $state({
-        founders: 1,
-        scale: "малый",
-        activity: "услуги",
-        investments: false,
-        risk: true,
-    });
-    let result = $state(null);
-    $inspect(result);
-
-    $effect(() => {
-        if (step === 5) {
-            result = findRecommendation(form, rules);
-        }
-    });
-
-    function next() {
-        if (step < 5) step++;
-    }
-
-    function prev() {
-        if (step > 1) step--;
-    }
-
-    function reset() {
-        step = 1;
-        result = null;
-        form = {
-            founders: 1,
-            scale: "малый",
-            activity: "услуги",
-            investments: false,
-            risk: true,
-        };
-    }
-
-    const steps = [
-        { num: 1, title: "Кто запускает?" },
-        { num: 2, title: "Масштаб" },
-        { num: 3, title: "Деятельность" },
-        { num: 4, title: "Финансы и риски" },
-        { num: 5, title: "Результат" },
-    ];
-</script>
-
-<div class="wizard container">
-    <h1 class="title">Выбор ОПФ для бизнеса</h1>
-    <ProgressBar {step} total={5} />
-
-    {#if step === 1}
-        <div transition:slide>
-            <Step1_Founders bind:value={form.founders} {next} />
-        </div>
-    {:else if step === 2}
-        <div transition:slide>
-            <Step2_Scale bind:value={form.scale} {next} {prev} />
-        </div>
-    {:else if step === 3}
-        <div transition:slide>
-            <Step3_Activity bind:value={form.activity} {next} {prev} />
-        </div>
-    {:else if step === 4}
-        <div transition:slide>
-            <Step4_Finance bind:form {next} {prev} />
-        </div>
-    {:else if step === 5}
-        <div transition:slide>
-            <ResultCard {result} {reset} />
-        </div>
-    {/if}
-</div>
-
-<style>
-    .wizard {
-        max-width: 600px;
-        margin: 2rem auto;
-        padding: 2rem;
-        background-color: #ffffff;
-        color: #1e293b;
-        border-radius: 16px;
-        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
-        height: min-content;
-    }
-
-    .title {
-        text-align: center;
-        margin-bottom: 1rem;
-        color: #0f172a;
-    }
-
-    /* Тёмная тема */
-    @media (prefers-color-scheme: dark) {
-        .wizard {
-            background-color: #1e293b;
-            color: #e2e8f0;
-            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
-        }
-
-        .title {
-            color: #f1f5f9;
-        }
-    }
-</style>
+<!-- Wizard.svelte -->
+<script>
+    import { slide } from "svelte/transition";
+    import ProgressBar from "./ProgressBar.svelte";
+    import Step1_Founders from "./Step1_Founders.svelte";
+    import Step2_Scale from "./Step2_Scale.svelte";
+    import Step3_Activity from "./Step3_Activity.svelte";
+    import Step4_Finance from "./Step4_Finance.svelte";
+    import ResultCard from "./ResultCard.svelte";
+    import { findRecommendation } from "../utils/matcher";
+    import rules from "../data/rules.json";
+
+    let step = $state(1);
+    let form = $state({
+        founders: 1,
+        scale: "малый",
+        activity: "услуги",
+        investments: false,
+        risk: true,
+    });
+    let result = $state(null);
+    $inspect(result);
+
+    $effect(() => {
+        if (step === 5) {
+            result = findRecommendation(form, rules);
+        }
+    });
+
+    function next() {
+        if (step < 5) step++;
+    }
+
+    function prev() {
+        if (step > 1) step--;
+    }
+
+    function reset() {
+        step = 1;
+        result = null;
+        form = {
+            founders: 1,
+            scale: "малый",
+            activity: "услуги",
+            investments: false,
+            risk: true,
+        };
+    }
+
+    const steps = [
+        { num: 1, title: "Кто запускает?" },
+        { num: 2, title: "Масштаб" },
+        { num: 3, title: "Деятельность" },
+        { num: 4, title: "Финансы и риски" },
+        { num: 5, title: "Результат" },
+    ];
+</script>
+
+<div class="wizard container">
+    <h1 class="title">Выбор ОПФ для бизнеса</h1>
+    <ProgressBar {step} total={5} />
+
+    {#if step === 1}
+        <div transition:slide>
+            <Step1_Founders bind:value={form.founders} {next} />
+        </div>
+    {:else if step === 2}
+        <div transition:slide>
+            <Step2_Scale bind:value={form.scale} {next} {prev} />
+        </div>
+    {:else if step === 3}
+        <div transition:slide>
+            <Step3_Activity bind:value={form.activity} {next} {prev} />
+        </div>
+    {:else if step === 4}
+        <div transition:slide>
+            <Step4_Finance bind:form {next} {prev} />
+        </div>
+    {:else if step === 5}
+        <div transition:slide>
+            <ResultCard {result} {reset} />
+        </div>
+    {/if}
+</div>
+
+<style>
+    .wizard {
+        max-width: 600px;
+        margin: 2rem auto;
+        padding: 2rem;
+        background-color: #ffffff;
+        color: #1e293b;
+        border-radius: 16px;
+        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+        height: min-content;
+    }
+
+    .title {
+        text-align: center;
+        margin-bottom: 1rem;
+        color: #0f172a;
+    }
+
+    /* Тёмная тема */
+    @media (prefers-color-scheme: dark) {
+        .wizard {
+            background-color: #1e293b;
+            color: #e2e8f0;
+            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
+        }
+
+        .title {
+            color: #f1f5f9;
+        }
+    }
+</style>

+ 330 - 330
src/lib/data/rules.json

@@ -1,331 +1,331 @@
-[
-    {
-        "id": 1,
-        "conditions": {
-            "founders": 1,
-            "scale": "малый",
-            "activity": ["услуги", "торговля", "IT"],
-            "investments": false,
-            "risk": true
-        },
-        "recommendation": "ИП",
-        "description": "Простейшая форма для одного человека. Минимум бюрократии, низкие налоги.",
-        "taxes": [
-            {
-                "name": "УСН «Доходы»",
-                "rate": "6%",
-                "note": "Можно вычесть страховые взносы (до 100%)"
-            },
-            {
-                "name": "Патент",
-                "rate": "Фикс. стоимость",
-                "note": "Только для 63 видов деятельности"
-            },
-            {
-                "name": "НПД (самозанятый)",
-                "rate": "4–6%",
-                "note": "До 2.4 млн ₽/год, без взносов"
-            }
-        ],
-        "pros": [
-            "Регистрация за 3 дня",
-            "Нет уставного капитала",
-            "Минимум отчётности",
-            "Можно применять УСН, патент, НПД"
-        ],
-        "cons": [
-            "Полная ответственность (всё имущество, кроме жилья)",
-            "Нельзя привлечь инвесторов",
-            "Нельзя продать бизнес"
-        ],
-        "warning": "При долгах — рискуете квартирой, машиной, дачей. Жильё защищено только если оно единственное."
-    },
-    {
-        "id": 10,
-        "conditions": {
-            "activity": "сельское хозяйство",
-            "scale": "малый",
-            "founders": {"min": 1, "max": 5},
-            "risk": true,
-            "investments": false
-        },
-        "recommendation": "КФХ (Крестьянское фермерское хозяйство)",
-        "description": "Специальная форма для сельскохозяйственной деятельности. Подходит для фермеров и семейного сельхозбизнеса.",
-        "taxes": [
-            {
-                "name": "ЕСХН",
-                "rate": "6% от прибыли",
-                "note": "Специальный сельхоз режим"
-            },
-            {
-                "name": "УСН",
-                "rate": "6% или 15%",
-                "note": "Альтернативный вариант"
-            }
-        ],
-        "pros": [
-            "Льготные налоговые режимы (ЕСХН)",
-            "Государственная поддержка и субсидии",
-            "Проще регистрация чем у юрлиц",
-            "Семейный бизнес с особым статусом",
-            "Не нужен уставной капитал"
-        ],
-        "cons": [
-            "Только для сельхоздеятельности",
-            "Ограничения по видам деятельности",
-            "Сезонность бизнеса",
-            "Зависимость от природных условий"
-        ],
-        "warning": "Минимум 70% дохода должно поступать от сельскохозяйственной деятельности. Все члены КФХ несут солидарную ответственность."
-    },
-    {
-        "id": 9,
-        "conditions": {
-            "founders": {"min": 2, "max": 50},
-            "activity": ["производство", "торговля", "услуги"],
-            "scale": ["малый", "средний"],
-            "investments": false,
-            "risk": true
-        },
-        "recommendation": "Полное товарищество",
-        "description": "Объединение предпринимателей для совместной деятельности. Подходит для профессиональных партнерств (адвокаты, консультанты).",
-        "taxes": [
-            {
-                "name": "УСН",
-                "rate": "6% или 15%",
-                "note": "Каждый участник платит налоги со своей доли"
-            }
-        ],
-        "pros": [
-            "Объединение ресурсов и компетенций",
-            "Гибкое распределение прибыли",
-            "Проще управление чем в ООО",
-            "Минимальные формальности при создании",
-            "Не нужен уставной капитал"
-        ],
-        "cons": [
-            "Солидарная ответственность по долгам",
-            "Нельзя привлечь инвесторов",
-            "Ограниченные возможности роста",
-            "Сложности при выходе участников",
-            "Все участники отвечают всем имуществом"
-        ],
-        "warning": "ОПАСНО: Все участники несут солидарную ответственность — при долгах товарищества отвечаете всем личным имуществом, даже если долг сделал партнер!"
-    },
-    {
-        "id": 2,
-        "conditions": {
-            "founders": 1,
-            "scale": "малый",
-            "activity": ["услуги", "торговля", "IT"],
-            "investments": false,
-            "risk": false
-        },
-        "recommendation": "ООО",
-        "description": "Для одного учредителя, но с защитой имущества. Подходит, если боитесь рисков.",
-        "taxes": [
-            {
-                "name": "УСН «Доходы»",
-                "rate": "6%",
-                "note": "Взносы за сотрудников"
-            },
-            {
-                "name": "УСН «Доходы − Расходы»",
-                "rate": "15%",
-                "note": "Выгодно при высоких расходах"
-            }
-        ],
-        "pros": [
-            "Ограниченная ответственность (только в пределах уставного капитала)",
-            "Можно продать долю",
-            "Гибкость в управлении"
-        ],
-        "cons": [
-            "Уставной капитал ≥ 10 000 ₽",
-            "Больше отчётности (ежеквартально)",
-            "Регистрация 5–7 дней"
-        ],
-        "warning": "Если вы — единственный учредитель и директор, суд может «проколоть корпоративную завесу» при умышленном банкротстве."
-    },
-    {
-        "id": 3,
-        "conditions": {
-            "founders": {"min": 2, "max": 50},
-            "investments": false,
-            "risk": false,
-            "scale": ["малый", "средний"]
-        },
-        "recommendation": "ООО",
-        "description": "Классика для партнёрства. Чёткое распределение долей, защита имущества.",
-        "taxes": [
-            {
-                "name": "УСН «Доходы»",
-                "rate": "6%",
-                "note": "Простой учёт"
-            },
-            {
-                "name": "УСН «Доходы − Расходы»",
-                "rate": "15%",
-                "note": "При расходах >60%"
-            }
-        ],
-        "pros": [
-            "Ограниченная ответственность",
-            "Можно продать/передать долю",
-            "Гибкое распределение прибыли"
-        ],
-        "cons": [
-            "Нужен устав, договор",
-            "Сложнее выход учредителя",
-            "Налоги на дивиденды (13%)"
-        ],
-        "warning": "Конфликты между учредителями — главная причина закрытия ООО."
-    },
-    {
-        "id": 4,
-        "conditions": {
-            "investments": true
-        },
-        "recommendation": "ООО",
-        "description": "Лучший выбор для привлечения инвестиций. Можно продать долю, выдать опционы.",
-        "taxes": [
-            {
-                "name": "УСН",
-                "rate": "6% или 15%",
-                "note": "До 219.2 млн ₽/год"
-            },
-            {
-                "name": "ОСНО",
-                "rate": "20% + НДС 20%",
-                "note": "Если инвесторы требуют НДС"
-            }
-        ],
-        "pros": [
-            "Легко привлечь инвесторов",
-            "Можно выдать опционы сотрудникам",
-            "Защита имущества"
-        ],
-        "cons": [
-            "Сложнее структура",
-            "Налоги на дивиденды",
-            "Больше контроля со стороны инвесторов"
-        ],
-        "warning": "Инвесторы потребуют долю и место в совете директоров."
-    },
-    {
-        "id": 5,
-        "conditions": {
-            "founders": {"min": 51},
-            "scale": "крупный",
-            "activity": ["производство", "торговля"]
-        },
-        "recommendation": "АО (НАО или ПАО)",
-        "description": "Для крупного бизнеса с акциями. Можно выйти на биржу.",
-        "taxes": [
-            {
-                "name": "ОСНО",
-                "rate": "20% + НДС 20%",
-                "note": "Обязательно"
-            }
-        ],
-        "pros": [
-            "Привлечение через акции",
-            "Выход на IPO",
-            "Ограниченная ответственность"
-        ],
-        "cons": [
-            "Уставной капитал ≥ 100 000 ₽ (НАО) / 1 000 000 ₽ (ПАО)",
-            "Сложная отчётность",
-            "Регулирование ЦБ РФ"
-        ],
-        "warning": "ПАО — публичная отчётность, дорого и сложно."
-    },
-    {
-        "id": 6,
-        "conditions": {
-            "activity": "IT",
-            "investments": true,
-            "scale": ["малый", "средний"]
-        },
-        "recommendation": "ООО + опционы",
-        "description": "Стандарт для IT-стартапов. Можно мотивировать команду опционами.",
-        "taxes": [
-            {
-                "name": "УСН",
-                "rate": "6% или 15%",
-                "note": "Льготы для IT (страховые взносы 7.6%)"
-            }
-        ],
-        "pros": [
-            "Льготы для аккредитованных IT-компаний",
-            "Опционы для сотрудников",
-            "Инвесторы любят ООО"
-        ],
-        "cons": [
-            "Нужно получить аккредитацию Минцифры",
-            "Дивиденды облагаются 13%"
-        ],
-        "warning": "Без аккредитации — нет льгот."
-    },
-    {
-        "id": 7,
-        "conditions": {
-            "activity": "производство",
-            "scale": "средний"
-        },
-        "recommendation": "ООО",
-        "description": "Для среднего производства с оборудованием и кредитами.",
-        "taxes": [
-            {
-                "name": "УСН «Доходы − Расходы»",
-                "rate": "15%",
-                "note": "Выгодно при высоких затратах"
-            },
-            {
-                "name": "ОСНО",
-                "rate": "20% + НДС",
-                "note": "Если работаете с крупными заказчиками"
-            }
-        ],
-        "pros": [
-            "Можно взять кредит под оборудование",
-            "Ограниченная ответственность",
-            "Зачёт НДС"
-        ],
-        "cons": [
-            "Сложный учёт",
-            "Больше проверок"
-        ],
-        "warning": "ОСНО — если клиенты требуют НДС."
-    },
-    {
-        "id": 8,
-        "conditions": {
-            "founders": 1,
-            "scale": "малый",
-            "activity": "услуги",
-            "investments": false,
-            "risk": true
-        },
-        "recommendation": "Самозанятый (НПД)",
-        "description": "Самая простая форма. Без отчётов, без взносов.",
-        "taxes": [
-            {
-                "name": "НПД",
-                "rate": "4% (физлица) / 6% (юрлица)",
-                "note": "До 2.4 млн ₽/год"
-            }
-        ],
-        "pros": [
-            "Налоги через приложение",
-            "Нет страховых взносов",
-            "Можно совмещать с работой"
-        ],
-        "cons": [
-            "До 2.4 млн ₽/год",
-            "Нельзя нанимать сотрудников",
-            "Нет вычета НДС"
-        ],
-        "warning": "При превышении лимита — автоматом ИП или закрытие."
-    }
+[
+    {
+        "id": 1,
+        "conditions": {
+            "founders": 1,
+            "scale": "малый",
+            "activity": ["услуги", "торговля", "IT"],
+            "investments": false,
+            "risk": true
+        },
+        "recommendation": "ИП",
+        "description": "Простейшая форма для одного человека. Минимум бюрократии, низкие налоги.",
+        "taxes": [
+            {
+                "name": "УСН «Доходы»",
+                "rate": "6%",
+                "note": "Можно вычесть страховые взносы (до 100%)"
+            },
+            {
+                "name": "Патент",
+                "rate": "Фикс. стоимость",
+                "note": "Только для 63 видов деятельности"
+            },
+            {
+                "name": "НПД (самозанятый)",
+                "rate": "4–6%",
+                "note": "До 2.4 млн ₽/год, без взносов"
+            }
+        ],
+        "pros": [
+            "Регистрация за 3 дня",
+            "Нет уставного капитала",
+            "Минимум отчётности",
+            "Можно применять УСН, патент, НПД"
+        ],
+        "cons": [
+            "Полная ответственность (всё имущество, кроме жилья)",
+            "Нельзя привлечь инвесторов",
+            "Нельзя продать бизнес"
+        ],
+        "warning": "При долгах — рискуете квартирой, машиной, дачей. Жильё защищено только если оно единственное."
+    },
+    {
+        "id": 10,
+        "conditions": {
+            "activity": "сельское хозяйство",
+            "scale": "малый",
+            "founders": {"min": 1, "max": 5},
+            "risk": true,
+            "investments": false
+        },
+        "recommendation": "КФХ (Крестьянское фермерское хозяйство)",
+        "description": "Специальная форма для сельскохозяйственной деятельности. Подходит для фермеров и семейного сельхозбизнеса.",
+        "taxes": [
+            {
+                "name": "ЕСХН",
+                "rate": "6% от прибыли",
+                "note": "Специальный сельхоз режим"
+            },
+            {
+                "name": "УСН",
+                "rate": "6% или 15%",
+                "note": "Альтернативный вариант"
+            }
+        ],
+        "pros": [
+            "Льготные налоговые режимы (ЕСХН)",
+            "Государственная поддержка и субсидии",
+            "Проще регистрация чем у юрлиц",
+            "Семейный бизнес с особым статусом",
+            "Не нужен уставной капитал"
+        ],
+        "cons": [
+            "Только для сельхоздеятельности",
+            "Ограничения по видам деятельности",
+            "Сезонность бизнеса",
+            "Зависимость от природных условий"
+        ],
+        "warning": "Минимум 70% дохода должно поступать от сельскохозяйственной деятельности. Все члены КФХ несут солидарную ответственность."
+    },
+    {
+        "id": 9,
+        "conditions": {
+            "founders": {"min": 2, "max": 50},
+            "activity": ["производство", "торговля", "услуги"],
+            "scale": ["малый", "средний"],
+            "investments": false,
+            "risk": true
+        },
+        "recommendation": "Полное товарищество",
+        "description": "Объединение предпринимателей для совместной деятельности. Подходит для профессиональных партнерств (адвокаты, консультанты).",
+        "taxes": [
+            {
+                "name": "УСН",
+                "rate": "6% или 15%",
+                "note": "Каждый участник платит налоги со своей доли"
+            }
+        ],
+        "pros": [
+            "Объединение ресурсов и компетенций",
+            "Гибкое распределение прибыли",
+            "Проще управление чем в ООО",
+            "Минимальные формальности при создании",
+            "Не нужен уставной капитал"
+        ],
+        "cons": [
+            "Солидарная ответственность по долгам",
+            "Нельзя привлечь инвесторов",
+            "Ограниченные возможности роста",
+            "Сложности при выходе участников",
+            "Все участники отвечают всем имуществом"
+        ],
+        "warning": "ОПАСНО: Все участники несут солидарную ответственность — при долгах товарищества отвечаете всем личным имуществом, даже если долг сделал партнер!"
+    },
+    {
+        "id": 2,
+        "conditions": {
+            "founders": 1,
+            "scale": "малый",
+            "activity": ["услуги", "торговля", "IT"],
+            "investments": false,
+            "risk": false
+        },
+        "recommendation": "ООО",
+        "description": "Для одного учредителя, но с защитой имущества. Подходит, если боитесь рисков.",
+        "taxes": [
+            {
+                "name": "УСН «Доходы»",
+                "rate": "6%",
+                "note": "Взносы за сотрудников"
+            },
+            {
+                "name": "УСН «Доходы − Расходы»",
+                "rate": "15%",
+                "note": "Выгодно при высоких расходах"
+            }
+        ],
+        "pros": [
+            "Ограниченная ответственность (только в пределах уставного капитала)",
+            "Можно продать долю",
+            "Гибкость в управлении"
+        ],
+        "cons": [
+            "Уставной капитал ≥ 10 000 ₽",
+            "Больше отчётности (ежеквартально)",
+            "Регистрация 5–7 дней"
+        ],
+        "warning": "Если вы — единственный учредитель и директор, суд может «проколоть корпоративную завесу» при умышленном банкротстве."
+    },
+    {
+        "id": 3,
+        "conditions": {
+            "founders": {"min": 2, "max": 50},
+            "investments": false,
+            "risk": false,
+            "scale": ["малый", "средний"]
+        },
+        "recommendation": "ООО",
+        "description": "Классика для партнёрства. Чёткое распределение долей, защита имущества.",
+        "taxes": [
+            {
+                "name": "УСН «Доходы»",
+                "rate": "6%",
+                "note": "Простой учёт"
+            },
+            {
+                "name": "УСН «Доходы − Расходы»",
+                "rate": "15%",
+                "note": "При расходах >60%"
+            }
+        ],
+        "pros": [
+            "Ограниченная ответственность",
+            "Можно продать/передать долю",
+            "Гибкое распределение прибыли"
+        ],
+        "cons": [
+            "Нужен устав, договор",
+            "Сложнее выход учредителя",
+            "Налоги на дивиденды (13%)"
+        ],
+        "warning": "Конфликты между учредителями — главная причина закрытия ООО."
+    },
+    {
+        "id": 4,
+        "conditions": {
+            "investments": true
+        },
+        "recommendation": "ООО",
+        "description": "Лучший выбор для привлечения инвестиций. Можно продать долю, выдать опционы.",
+        "taxes": [
+            {
+                "name": "УСН",
+                "rate": "6% или 15%",
+                "note": "До 219.2 млн ₽/год"
+            },
+            {
+                "name": "ОСНО",
+                "rate": "20% + НДС 20%",
+                "note": "Если инвесторы требуют НДС"
+            }
+        ],
+        "pros": [
+            "Легко привлечь инвесторов",
+            "Можно выдать опционы сотрудникам",
+            "Защита имущества"
+        ],
+        "cons": [
+            "Сложнее структура",
+            "Налоги на дивиденды",
+            "Больше контроля со стороны инвесторов"
+        ],
+        "warning": "Инвесторы потребуют долю и место в совете директоров."
+    },
+    {
+        "id": 5,
+        "conditions": {
+            "founders": {"min": 51},
+            "scale": "крупный",
+            "activity": ["производство", "торговля"]
+        },
+        "recommendation": "АО (НАО или ПАО)",
+        "description": "Для крупного бизнеса с акциями. Можно выйти на биржу.",
+        "taxes": [
+            {
+                "name": "ОСНО",
+                "rate": "20% + НДС 20%",
+                "note": "Обязательно"
+            }
+        ],
+        "pros": [
+            "Привлечение через акции",
+            "Выход на IPO",
+            "Ограниченная ответственность"
+        ],
+        "cons": [
+            "Уставной капитал ≥ 100 000 ₽ (НАО) / 1 000 000 ₽ (ПАО)",
+            "Сложная отчётность",
+            "Регулирование ЦБ РФ"
+        ],
+        "warning": "ПАО — публичная отчётность, дорого и сложно."
+    },
+    {
+        "id": 6,
+        "conditions": {
+            "activity": "IT",
+            "investments": true,
+            "scale": ["малый", "средний"]
+        },
+        "recommendation": "ООО + опционы",
+        "description": "Стандарт для IT-стартапов. Можно мотивировать команду опционами.",
+        "taxes": [
+            {
+                "name": "УСН",
+                "rate": "6% или 15%",
+                "note": "Льготы для IT (страховые взносы 7.6%)"
+            }
+        ],
+        "pros": [
+            "Льготы для аккредитованных IT-компаний",
+            "Опционы для сотрудников",
+            "Инвесторы любят ООО"
+        ],
+        "cons": [
+            "Нужно получить аккредитацию Минцифры",
+            "Дивиденды облагаются 13%"
+        ],
+        "warning": "Без аккредитации — нет льгот."
+    },
+    {
+        "id": 7,
+        "conditions": {
+            "activity": "производство",
+            "scale": "средний"
+        },
+        "recommendation": "ООО",
+        "description": "Для среднего производства с оборудованием и кредитами.",
+        "taxes": [
+            {
+                "name": "УСН «Доходы − Расходы»",
+                "rate": "15%",
+                "note": "Выгодно при высоких затратах"
+            },
+            {
+                "name": "ОСНО",
+                "rate": "20% + НДС",
+                "note": "Если работаете с крупными заказчиками"
+            }
+        ],
+        "pros": [
+            "Можно взять кредит под оборудование",
+            "Ограниченная ответственность",
+            "Зачёт НДС"
+        ],
+        "cons": [
+            "Сложный учёт",
+            "Больше проверок"
+        ],
+        "warning": "ОСНО — если клиенты требуют НДС."
+    },
+    {
+        "id": 8,
+        "conditions": {
+            "founders": 1,
+            "scale": "малый",
+            "activity": "услуги",
+            "investments": false,
+            "risk": true
+        },
+        "recommendation": "Самозанятый (НПД)",
+        "description": "Самая простая форма. Без отчётов, без взносов.",
+        "taxes": [
+            {
+                "name": "НПД",
+                "rate": "4% (физлица) / 6% (юрлица)",
+                "note": "До 2.4 млн ₽/год"
+            }
+        ],
+        "pros": [
+            "Налоги через приложение",
+            "Нет страховых взносов",
+            "Можно совмещать с работой"
+        ],
+        "cons": [
+            "До 2.4 млн ₽/год",
+            "Нельзя нанимать сотрудников",
+            "Нет вычета НДС"
+        ],
+        "warning": "При превышении лимита — автоматом ИП или закрытие."
+    }
 ]

+ 33 - 33
src/lib/utils/matcher.js

@@ -1,34 +1,34 @@
-export function findRecommendation(input, rules) {
-    return rules.find(rule => matches(rule.conditions, input));
-}
-
-function matches(conditions, input) {
-    return (
-        checkNumber(conditions.founders, input.founders) &&
-        checkArrayOrString(conditions.scale, input.scale) &&
-        checkArrayOrString(conditions.activity, input.activity) &&
-        checkBool(conditions.investments, input.investments) &&
-        checkBool(conditions.risk, input.risk)
-    );
-}
-
-function checkNumber(cond, val) {
-    if (cond === undefined) return true;
-    if (typeof cond === 'object') {
-        const min = cond.min || 0;
-        const max = cond.max || Infinity;
-        return val >= min && val <= max;
-    }
-    return cond === val;
-}
-
-function checkArrayOrString(cond, val) {
-    if (!cond) return true;
-    if (Array.isArray(cond)) return cond.includes(val);
-    return cond === val;
-}
-
-function checkBool(cond, val) {
-    if (cond === undefined || cond === null) return true;
-    return cond === val;
+export function findRecommendation(input, rules) {
+    return rules.find(rule => matches(rule.conditions, input));
+}
+
+function matches(conditions, input) {
+    return (
+        checkNumber(conditions.founders, input.founders) &&
+        checkArrayOrString(conditions.scale, input.scale) &&
+        checkArrayOrString(conditions.activity, input.activity) &&
+        checkBool(conditions.investments, input.investments) &&
+        checkBool(conditions.risk, input.risk)
+    );
+}
+
+function checkNumber(cond, val) {
+    if (cond === undefined) return true;
+    if (typeof cond === 'object') {
+        const min = cond.min || 0;
+        const max = cond.max || Infinity;
+        return val >= min && val <= max;
+    }
+    return cond === val;
+}
+
+function checkArrayOrString(cond, val) {
+    if (!cond) return true;
+    if (Array.isArray(cond)) return cond.includes(val);
+    return cond === val;
+}
+
+function checkBool(cond, val) {
+    if (cond === undefined || cond === null) return true;
+    return cond === val;
 }

+ 9 - 9
src/main.js

@@ -1,9 +1,9 @@
-import { mount } from 'svelte'
-import './app.css'
-import App from './App.svelte'
-
-const app = mount(App, {
-  target: document.getElementById('app'),
-})
-
-export default app
+import { mount } from 'svelte'
+import './app.css'
+import App from './App.svelte'
+
+const app = mount(App, {
+  target: document.getElementById('app'),
+})
+
+export default app

+ 8 - 8
svelte.config.js

@@ -1,8 +1,8 @@
-import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
-
-/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */
-export default {
-  // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
-  // for more information about preprocessors
-  preprocess: vitePreprocess(),
-}
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
+
+/** @type {import("@sveltejs/vite-plugin-svelte").SvelteConfig} */
+export default {
+  // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
+  // for more information about preprocessors
+  preprocess: vitePreprocess(),
+}

+ 7 - 7
vite.config.js

@@ -1,7 +1,7 @@
-import { defineConfig } from 'vite'
-import { svelte } from '@sveltejs/vite-plugin-svelte'
-
-// https://vite.dev/config/
-export default defineConfig({
-  plugins: [svelte()],
-})
+import { defineConfig } from 'vite'
+import { svelte } from '@sveltejs/vite-plugin-svelte'
+
+// https://vite.dev/config/
+export default defineConfig({
+  plugins: [svelte()],
+})