Compare commits
172 commits
dcc3f9d61c
...
c7bf7e13ce
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7bf7e13ce | ||
|
|
e7899b4185 | ||
|
|
55191e089d | ||
|
|
a4cbb06bb3 | ||
|
|
3e25498c3b | ||
|
|
4152eb1291 | ||
|
|
18a0370d96 | ||
|
|
58038c9cf7 | ||
|
|
8466cf928c | ||
|
|
6395cf348d | ||
|
|
2b9623d5cc | ||
|
|
7a21c83d3e | ||
|
|
4dafdc8995 | ||
|
|
9d89a2aeee | ||
|
|
651038f683 | ||
|
|
17be1c83b2 | ||
|
|
7363eb4249 | ||
|
|
01de66493a | ||
|
|
ef32dac0a6 | ||
|
|
4acb51c270 | ||
|
|
d553933580 | ||
|
|
982141598a | ||
|
|
96772f82c8 | ||
|
|
94dbb5b235 | ||
|
|
9482eea050 | ||
|
|
f37a1f12f0 | ||
|
|
77afcdccd0 | ||
|
|
080564f2b2 | ||
|
|
dd3bf5e20f | ||
|
|
7c40c11595 | ||
|
|
08f03fd17a | ||
|
|
8fb55993a1 | ||
|
|
033f20e215 | ||
|
|
062eb44fbb | ||
|
|
b40d1d9835 | ||
|
|
33234f5e44 | ||
|
|
d271cd7410 | ||
|
|
d447f431ba | ||
|
|
37bacc196e | ||
|
|
d28c6e703a | ||
|
|
33e1572c3a | ||
|
|
88e382d9d7 | ||
|
|
22cc0256b9 | ||
|
|
e731626390 | ||
|
|
290a95c54c | ||
|
|
f9a17ad5c2 | ||
|
|
cad6b32f5e | ||
|
|
6f839bf57a | ||
|
|
45f2ce682f | ||
|
|
c8a7efde47 | ||
|
|
43bf1dc3de | ||
|
|
e9f8da1b82 | ||
|
|
654481b2b9 | ||
|
|
56f36c30b4 | ||
|
|
4edf7db8cc | ||
|
|
cd191bd872 | ||
|
|
458797f417 | ||
|
|
c9f17b80fd | ||
|
|
4859ece60b | ||
|
|
86930bb71b | ||
|
|
b69ba4950b | ||
|
|
defad7cbb4 | ||
|
|
bcc6976bd0 | ||
|
|
5614fb9422 | ||
|
|
8379fe116a | ||
|
|
dea920fc1f | ||
|
|
10c4fe19d7 | ||
|
|
0822e25674 | ||
|
|
a13654a999 | ||
|
|
748abf7eff | ||
|
|
7451996f50 | ||
|
|
2976070a2a | ||
|
|
5a020cfafa | ||
|
|
3c274541e9 | ||
|
|
8d9937a04b | ||
|
|
afc25ed8ba | ||
|
|
23561fca2e | ||
|
|
095ac04d31 | ||
|
|
a3cf68eb11 | ||
|
|
b2f589655f | ||
|
|
6f88cd71ca | ||
|
|
23d6f2bd5a | ||
|
|
453d04b7d1 | ||
|
|
5597fc13e5 | ||
|
|
d688c33e3e | ||
|
|
3af108b892 | ||
|
|
8afe2ba1df | ||
|
|
776043f908 | ||
|
|
1f19d7ca44 | ||
|
|
0218c799c5 | ||
|
|
4bfcc56e7d | ||
|
|
bb7ec06780 | ||
|
|
9ee0434829 | ||
|
|
52a420ea3d | ||
|
|
1ee4b84e53 | ||
|
|
6b3491056b | ||
|
|
a49db1c90d | ||
|
|
c2fa47c341 | ||
|
|
4d19015d6d | ||
|
|
d20e131cf8 | ||
|
|
481dcdf826 | ||
|
|
ce20f78905 | ||
|
|
bed30f68bd | ||
|
|
08816c60ca | ||
|
|
a94c38d074 | ||
|
|
ed00e85140 | ||
|
|
d6dcc75aa0 | ||
|
|
3ed6fe25be | ||
|
|
143f9d5330 | ||
|
|
e60cd928d2 | ||
|
|
81c586342c | ||
|
|
6cd9e27553 | ||
|
|
4f4df4a715 | ||
|
|
51bef16758 | ||
|
|
9d8c386def | ||
|
|
e4cba50ab6 | ||
|
|
414d185765 | ||
|
|
773ecde6ba | ||
|
|
d86b6ba742 | ||
|
|
57e8491f0d | ||
|
|
2fc6d207f3 | ||
|
|
bd15854b42 | ||
|
|
69e6fd808a | ||
|
|
beae0ad604 | ||
|
|
5f0692587a | ||
|
|
8346c9a72e | ||
|
|
9891280bfd | ||
|
|
8fc9ef1a2e | ||
|
|
3fd2f8a223 | ||
|
|
6ab8ff00d1 | ||
|
|
41fe088586 | ||
|
|
82d74bd8fe | ||
|
|
e408647b4b | ||
|
|
326af2f361 | ||
|
|
50f6db8569 | ||
|
|
2b0a677221 | ||
|
|
3c17b963f3 | ||
|
|
495f0aabee | ||
|
|
afbf01304a | ||
|
|
e9a82dd528 | ||
|
|
50f12ef7f0 | ||
|
|
d455087bc8 | ||
|
|
7640d6ddcd | ||
|
|
a5f7060fb1 | ||
|
|
a2fa311a5d | ||
|
|
a17ca1b90c | ||
|
|
29cefb64be | ||
|
|
8ac9e04bcf | ||
|
|
5dce324f24 | ||
|
|
bcbda1ae5d | ||
|
|
3f3c7480c6 | ||
|
|
3b9cf0ee9a | ||
|
|
1c108b88a4 | ||
|
|
01f99cfff3 | ||
|
|
75d73b9dcd | ||
|
|
fa2fae9503 | ||
|
|
5bcbff66de | ||
|
|
61f2c21016 | ||
|
|
50e3676d71 | ||
|
|
d3aa13dcbf | ||
|
|
c47826e015 | ||
|
|
22502c11fd | ||
|
|
321cb76a7b | ||
|
|
cdf26d8719 | ||
|
|
1ef337a0f6 | ||
|
|
5d308a0538 | ||
|
|
067f52cf43 | ||
|
|
05553bdc3d | ||
|
|
e4a2030ad9 | ||
|
|
b07232521b | ||
|
|
cead88b0bc | ||
|
|
25f25f9171 |
1
src/food-market.public/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
scripts/fonts/
|
||||
|
|
@ -16,8 +16,8 @@ server {
|
|||
}
|
||||
|
||||
# Старый URL — постоянный редирект на новую страницу импорта.
|
||||
location = /migration-from-other-system { return 301 /import/; }
|
||||
location = /migration-from-other-system/ { return 301 /import/; }
|
||||
location = /migration-from-moysklad { return 301 /import/; }
|
||||
location = /migration-from-moysklad/ { return 301 /import/; }
|
||||
|
||||
# Pretty URLs: /pricing → /pricing/index.html или /pricing.html
|
||||
location / {
|
||||
|
|
|
|||
|
|
@ -9,20 +9,15 @@
|
|||
"preview": "astro preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"astro": "^4.16.18",
|
||||
"@astrojs/react": "^3.6.3",
|
||||
"@astrojs/sitemap": "^3.2.1",
|
||||
"@astrojs/tailwind": "^5.1.4",
|
||||
"@types/react": "^19.2.14",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"astro": "^4.16.18",
|
||||
"lucide-react": "^1.8.0",
|
||||
"tailwindcss": "^3.4.17",
|
||||
"react": "^19.2.5",
|
||||
"react-dom": "^19.2.5",
|
||||
"tailwindcss": "^3.4.17"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@resvg/resvg-js": "^2.6.2",
|
||||
"playwright": "^1.59.1",
|
||||
"satori": "^0.26.0"
|
||||
"@types/react": "^19.2.14",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"lucide-react": "^1.8.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,16 +38,6 @@ importers:
|
|||
tailwindcss:
|
||||
specifier: ^3.4.17
|
||||
version: 3.4.19(yaml@2.8.3)
|
||||
devDependencies:
|
||||
'@resvg/resvg-js':
|
||||
specifier: ^2.6.2
|
||||
version: 2.6.2
|
||||
playwright:
|
||||
specifier: ^1.59.1
|
||||
version: 1.59.1
|
||||
satori:
|
||||
specifier: ^0.26.0
|
||||
version: 0.26.0
|
||||
|
||||
packages:
|
||||
|
||||
|
|
@ -478,86 +468,6 @@ packages:
|
|||
'@oslojs/encoding@1.1.0':
|
||||
resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
|
||||
|
||||
'@resvg/resvg-js-android-arm-eabi@2.6.2':
|
||||
resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm]
|
||||
os: [android]
|
||||
|
||||
'@resvg/resvg-js-android-arm64@2.6.2':
|
||||
resolution: {integrity: sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@resvg/resvg-js-darwin-arm64@2.6.2':
|
||||
resolution: {integrity: sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@resvg/resvg-js-darwin-x64@2.6.2':
|
||||
resolution: {integrity: sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@resvg/resvg-js-linux-arm-gnueabihf@2.6.2':
|
||||
resolution: {integrity: sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@resvg/resvg-js-linux-arm64-gnu@2.6.2':
|
||||
resolution: {integrity: sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@resvg/resvg-js-linux-arm64-musl@2.6.2':
|
||||
resolution: {integrity: sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@resvg/resvg-js-linux-x64-gnu@2.6.2':
|
||||
resolution: {integrity: sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@resvg/resvg-js-linux-x64-musl@2.6.2':
|
||||
resolution: {integrity: sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@resvg/resvg-js-win32-arm64-msvc@2.6.2':
|
||||
resolution: {integrity: sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@resvg/resvg-js-win32-ia32-msvc@2.6.2':
|
||||
resolution: {integrity: sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
|
||||
'@resvg/resvg-js-win32-x64-msvc@2.6.2':
|
||||
resolution: {integrity: sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==}
|
||||
engines: {node: '>= 10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@resvg/resvg-js@2.6.2':
|
||||
resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==}
|
||||
engines: {node: '>= 10'}
|
||||
|
||||
'@rolldown/pluginutils@1.0.0-beta.27':
|
||||
resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==}
|
||||
|
||||
|
|
@ -729,11 +639,6 @@ packages:
|
|||
'@shikijs/vscode-textmate@10.0.2':
|
||||
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
|
||||
|
||||
'@shuding/opentype.js@1.4.0-beta.0':
|
||||
resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==}
|
||||
engines: {node: '>= 8.0.0'}
|
||||
hasBin: true
|
||||
|
||||
'@types/babel__core@7.20.5':
|
||||
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
|
||||
|
||||
|
|
@ -858,10 +763,6 @@ packages:
|
|||
base-64@1.0.0:
|
||||
resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
|
||||
|
||||
base64-js@0.0.8:
|
||||
resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
baseline-browser-mapping@2.10.22:
|
||||
resolution: {integrity: sha512-6qruVrb5rse6WylFkU0FhBKKGuecWseqdpQfhkawn6ztyk2QlfwSRjsDxMCLJrkfmfN21qvhl9ABgaMeRkuwww==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
|
|
@ -892,9 +793,6 @@ packages:
|
|||
resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
camelize@1.0.1:
|
||||
resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
|
||||
|
||||
caniuse-lite@1.0.30001791:
|
||||
resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==}
|
||||
|
||||
|
|
@ -969,23 +867,6 @@ packages:
|
|||
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
|
||||
engines: {node: '>= 0.6'}
|
||||
|
||||
css-background-parser@0.1.0:
|
||||
resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==}
|
||||
|
||||
css-box-shadow@1.0.0-3:
|
||||
resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==}
|
||||
|
||||
css-color-keywords@1.0.0:
|
||||
resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
css-gradient-parser@0.0.17:
|
||||
resolution: {integrity: sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
css-to-react-native@3.2.0:
|
||||
resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
|
||||
|
||||
cssesc@3.0.0:
|
||||
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
|
||||
engines: {node: '>=4'}
|
||||
|
|
@ -1044,10 +925,6 @@ packages:
|
|||
emoji-regex-xs@1.0.0:
|
||||
resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==}
|
||||
|
||||
emoji-regex-xs@2.0.1:
|
||||
resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
|
||||
emoji-regex@10.6.0:
|
||||
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
|
||||
|
||||
|
|
@ -1074,9 +951,6 @@ packages:
|
|||
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
escape-html@1.0.3:
|
||||
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
|
||||
|
||||
escape-string-regexp@5.0.0:
|
||||
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
|
||||
engines: {node: '>=12'}
|
||||
|
|
@ -1118,9 +992,6 @@ packages:
|
|||
picomatch:
|
||||
optional: true
|
||||
|
||||
fflate@0.7.4:
|
||||
resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==}
|
||||
|
||||
fill-range@7.1.1:
|
||||
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
|
||||
engines: {node: '>=8'}
|
||||
|
|
@ -1143,11 +1014,6 @@ packages:
|
|||
fraction.js@5.3.4:
|
||||
resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
|
||||
|
||||
fsevents@2.3.2:
|
||||
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
os: [darwin]
|
||||
|
||||
fsevents@2.3.3:
|
||||
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
|
||||
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
|
||||
|
|
@ -1216,10 +1082,6 @@ packages:
|
|||
hastscript@9.0.1:
|
||||
resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
|
||||
|
||||
hex-rgb@4.3.0:
|
||||
resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
html-escaper@3.0.3:
|
||||
resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
|
||||
|
||||
|
|
@ -1334,9 +1196,6 @@ packages:
|
|||
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
|
||||
engines: {node: '>=14'}
|
||||
|
||||
linebreak@1.1.0:
|
||||
resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==}
|
||||
|
||||
lines-and-columns@1.2.4:
|
||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||
|
||||
|
|
@ -1579,12 +1438,6 @@ packages:
|
|||
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
pako@0.2.9:
|
||||
resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
|
||||
|
||||
parse-css-color@0.2.1:
|
||||
resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==}
|
||||
|
||||
parse-latin@7.0.0:
|
||||
resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
|
||||
|
||||
|
|
@ -1625,16 +1478,6 @@ packages:
|
|||
resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
playwright-core@1.59.1:
|
||||
resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
playwright@1.59.1:
|
||||
resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==}
|
||||
engines: {node: '>=18'}
|
||||
hasBin: true
|
||||
|
||||
postcss-import@15.1.0:
|
||||
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
|
|
@ -1802,10 +1645,6 @@ packages:
|
|||
run-parallel@1.2.0:
|
||||
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
|
||||
|
||||
satori@0.26.0:
|
||||
resolution: {integrity: sha512-tkMFrfIs3l2mQ2JEcyW0ADTy3zGggFRFzi6Ef8YozQSFsFKEqaSO1Y8F9wJg4//PJGQauMalHGTUEkPrFwhVPA==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
sax@1.6.0:
|
||||
resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==}
|
||||
engines: {node: '>=11.0.0'}
|
||||
|
|
@ -1873,9 +1712,6 @@ packages:
|
|||
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
string.prototype.codepointat@0.2.1:
|
||||
resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==}
|
||||
|
||||
stringify-entities@4.0.4:
|
||||
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
|
||||
|
||||
|
|
@ -1916,9 +1752,6 @@ packages:
|
|||
thenify@3.3.1:
|
||||
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
|
||||
|
||||
tiny-inflate@1.0.3:
|
||||
resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
|
||||
|
||||
tinyexec@0.3.2:
|
||||
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
|
||||
|
||||
|
|
@ -1967,9 +1800,6 @@ packages:
|
|||
undici-types@7.16.0:
|
||||
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
|
||||
|
||||
unicode-trie@2.0.0:
|
||||
resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==}
|
||||
|
||||
unified@11.0.5:
|
||||
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
|
||||
|
||||
|
|
@ -2095,9 +1925,6 @@ packages:
|
|||
resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
|
||||
engines: {node: '>=12.20'}
|
||||
|
||||
yoga-layout@3.2.1:
|
||||
resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==}
|
||||
|
||||
zod-to-json-schema@3.25.2:
|
||||
resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}
|
||||
peerDependencies:
|
||||
|
|
@ -2515,57 +2342,6 @@ snapshots:
|
|||
|
||||
'@oslojs/encoding@1.1.0': {}
|
||||
|
||||
'@resvg/resvg-js-android-arm-eabi@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-android-arm64@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-darwin-arm64@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-darwin-x64@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-linux-arm-gnueabihf@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-linux-arm64-gnu@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-linux-arm64-musl@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-linux-x64-gnu@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-linux-x64-musl@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-win32-arm64-msvc@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-win32-ia32-msvc@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js-win32-x64-msvc@2.6.2':
|
||||
optional: true
|
||||
|
||||
'@resvg/resvg-js@2.6.2':
|
||||
optionalDependencies:
|
||||
'@resvg/resvg-js-android-arm-eabi': 2.6.2
|
||||
'@resvg/resvg-js-android-arm64': 2.6.2
|
||||
'@resvg/resvg-js-darwin-arm64': 2.6.2
|
||||
'@resvg/resvg-js-darwin-x64': 2.6.2
|
||||
'@resvg/resvg-js-linux-arm-gnueabihf': 2.6.2
|
||||
'@resvg/resvg-js-linux-arm64-gnu': 2.6.2
|
||||
'@resvg/resvg-js-linux-arm64-musl': 2.6.2
|
||||
'@resvg/resvg-js-linux-x64-gnu': 2.6.2
|
||||
'@resvg/resvg-js-linux-x64-musl': 2.6.2
|
||||
'@resvg/resvg-js-win32-arm64-msvc': 2.6.2
|
||||
'@resvg/resvg-js-win32-ia32-msvc': 2.6.2
|
||||
'@resvg/resvg-js-win32-x64-msvc': 2.6.2
|
||||
|
||||
'@rolldown/pluginutils@1.0.0-beta.27': {}
|
||||
|
||||
'@rollup/pluginutils@5.3.0(rollup@4.60.2)':
|
||||
|
|
@ -2686,11 +2462,6 @@ snapshots:
|
|||
|
||||
'@shikijs/vscode-textmate@10.0.2': {}
|
||||
|
||||
'@shuding/opentype.js@1.4.0-beta.0':
|
||||
dependencies:
|
||||
fflate: 0.7.4
|
||||
string.prototype.codepointat: 0.2.1
|
||||
|
||||
'@types/babel__core@7.20.5':
|
||||
dependencies:
|
||||
'@babel/parser': 7.29.2
|
||||
|
|
@ -2891,8 +2662,6 @@ snapshots:
|
|||
|
||||
base-64@1.0.0: {}
|
||||
|
||||
base64-js@0.0.8: {}
|
||||
|
||||
baseline-browser-mapping@2.10.22: {}
|
||||
|
||||
binary-extensions@2.3.0: {}
|
||||
|
|
@ -2924,8 +2693,6 @@ snapshots:
|
|||
|
||||
camelcase@8.0.0: {}
|
||||
|
||||
camelize@1.0.1: {}
|
||||
|
||||
caniuse-lite@1.0.30001791: {}
|
||||
|
||||
ccount@2.0.1: {}
|
||||
|
|
@ -2967,7 +2734,8 @@ snapshots:
|
|||
color-name: 1.1.4
|
||||
optional: true
|
||||
|
||||
color-name@1.1.4: {}
|
||||
color-name@1.1.4:
|
||||
optional: true
|
||||
|
||||
color-string@1.9.1:
|
||||
dependencies:
|
||||
|
|
@ -2991,20 +2759,6 @@ snapshots:
|
|||
|
||||
cookie@0.7.2: {}
|
||||
|
||||
css-background-parser@0.1.0: {}
|
||||
|
||||
css-box-shadow@1.0.0-3: {}
|
||||
|
||||
css-color-keywords@1.0.0: {}
|
||||
|
||||
css-gradient-parser@0.0.17: {}
|
||||
|
||||
css-to-react-native@3.2.0:
|
||||
dependencies:
|
||||
camelize: 1.0.1
|
||||
css-color-keywords: 1.0.0
|
||||
postcss-value-parser: 4.2.0
|
||||
|
||||
cssesc@3.0.0: {}
|
||||
|
||||
csstype@3.2.3: {}
|
||||
|
|
@ -3044,8 +2798,6 @@ snapshots:
|
|||
|
||||
emoji-regex-xs@1.0.0: {}
|
||||
|
||||
emoji-regex-xs@2.0.1: {}
|
||||
|
||||
emoji-regex@10.6.0: {}
|
||||
|
||||
emoji-regex@8.0.0: {}
|
||||
|
|
@ -3084,8 +2836,6 @@ snapshots:
|
|||
|
||||
escalade@3.2.0: {}
|
||||
|
||||
escape-html@1.0.3: {}
|
||||
|
||||
escape-string-regexp@5.0.0: {}
|
||||
|
||||
esprima@4.0.1: {}
|
||||
|
|
@ -3120,8 +2870,6 @@ snapshots:
|
|||
optionalDependencies:
|
||||
picomatch: 4.0.4
|
||||
|
||||
fflate@0.7.4: {}
|
||||
|
||||
fill-range@7.1.1:
|
||||
dependencies:
|
||||
to-regex-range: 5.0.1
|
||||
|
|
@ -3142,9 +2890,6 @@ snapshots:
|
|||
|
||||
fraction.js@5.3.4: {}
|
||||
|
||||
fsevents@2.3.2:
|
||||
optional: true
|
||||
|
||||
fsevents@2.3.3:
|
||||
optional: true
|
||||
|
||||
|
|
@ -3264,8 +3009,6 @@ snapshots:
|
|||
property-information: 7.1.0
|
||||
space-separated-tokens: 2.0.2
|
||||
|
||||
hex-rgb@4.3.0: {}
|
||||
|
||||
html-escaper@3.0.3: {}
|
||||
|
||||
html-void-elements@3.0.0: {}
|
||||
|
|
@ -3340,11 +3083,6 @@ snapshots:
|
|||
|
||||
lilconfig@3.1.3: {}
|
||||
|
||||
linebreak@1.1.0:
|
||||
dependencies:
|
||||
base64-js: 0.0.8
|
||||
unicode-trie: 2.0.0
|
||||
|
||||
lines-and-columns@1.2.4: {}
|
||||
|
||||
load-yaml-file@0.2.0:
|
||||
|
|
@ -3774,13 +3512,6 @@ snapshots:
|
|||
|
||||
p-try@2.2.0: {}
|
||||
|
||||
pako@0.2.9: {}
|
||||
|
||||
parse-css-color@0.2.1:
|
||||
dependencies:
|
||||
color-name: 1.1.4
|
||||
hex-rgb: 4.3.0
|
||||
|
||||
parse-latin@7.0.0:
|
||||
dependencies:
|
||||
'@types/nlcst': 2.0.3
|
||||
|
|
@ -3814,14 +3545,6 @@ snapshots:
|
|||
dependencies:
|
||||
find-up: 4.1.0
|
||||
|
||||
playwright-core@1.59.1: {}
|
||||
|
||||
playwright@1.59.1:
|
||||
dependencies:
|
||||
playwright-core: 1.59.1
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.2
|
||||
|
||||
postcss-import@15.1.0(postcss@8.5.11):
|
||||
dependencies:
|
||||
postcss: 8.5.11
|
||||
|
|
@ -4052,20 +3775,6 @@ snapshots:
|
|||
dependencies:
|
||||
queue-microtask: 1.2.3
|
||||
|
||||
satori@0.26.0:
|
||||
dependencies:
|
||||
'@shuding/opentype.js': 1.4.0-beta.0
|
||||
css-background-parser: 0.1.0
|
||||
css-box-shadow: 1.0.0-3
|
||||
css-gradient-parser: 0.0.17
|
||||
css-to-react-native: 3.2.0
|
||||
emoji-regex-xs: 2.0.1
|
||||
escape-html: 1.0.3
|
||||
linebreak: 1.1.0
|
||||
parse-css-color: 0.2.1
|
||||
postcss-value-parser: 4.2.0
|
||||
yoga-layout: 3.2.1
|
||||
|
||||
sax@1.6.0: {}
|
||||
|
||||
scheduler@0.27.0: {}
|
||||
|
|
@ -4155,8 +3864,6 @@ snapshots:
|
|||
get-east-asian-width: 1.5.0
|
||||
strip-ansi: 7.2.0
|
||||
|
||||
string.prototype.codepointat@0.2.1: {}
|
||||
|
||||
stringify-entities@4.0.4:
|
||||
dependencies:
|
||||
character-entities-html4: 2.1.0
|
||||
|
|
@ -4222,8 +3929,6 @@ snapshots:
|
|||
dependencies:
|
||||
any-promise: 1.3.0
|
||||
|
||||
tiny-inflate@1.0.3: {}
|
||||
|
||||
tinyexec@0.3.2: {}
|
||||
|
||||
tinyglobby@0.2.16:
|
||||
|
|
@ -4256,11 +3961,6 @@ snapshots:
|
|||
|
||||
undici-types@7.16.0: {}
|
||||
|
||||
unicode-trie@2.0.0:
|
||||
dependencies:
|
||||
pako: 0.2.9
|
||||
tiny-inflate: 1.0.3
|
||||
|
||||
unified@11.0.5:
|
||||
dependencies:
|
||||
'@types/unist': 3.0.3
|
||||
|
|
@ -4377,8 +4077,6 @@ snapshots:
|
|||
|
||||
yocto-queue@1.2.2: {}
|
||||
|
||||
yoga-layout@3.2.1: {}
|
||||
|
||||
zod-to-json-schema@3.25.2(zod@3.25.76):
|
||||
dependencies:
|
||||
zod: 3.25.76
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
|
@ -1,20 +0,0 @@
|
|||
# Photo credits
|
||||
|
||||
Все фотографии скачаны с [Unsplash](https://unsplash.com) под Unsplash License.
|
||||
|
||||
| Файл | Photo ID | Автор | Профиль |
|
||||
|---|---|---|---|
|
||||
| pos-hero.jpg | -gkndM1GvSA | Simon Kadula | https://unsplash.com/@simonkadula |
|
||||
| import-hero.jpg | phS1wAgXOQI | prashant hiremath | https://unsplash.com/@prashanth_hiremath |
|
||||
| vertical-grocery.jpg | je2x0sIUtjM | Artem Stoliar | https://unsplash.com/@artem_stoliar |
|
||||
| vertical-pharmacy.jpg | FOSgYGDktlE | Bernd Dittrich | https://unsplash.com/@hdbernd |
|
||||
| vertical-cafe.jpg | 4bKpMYjVquo | KWON JUNHO | https://unsplash.com/@junho01 |
|
||||
| vertical-alcohol.jpg | e0d-QR0gUFE | Alexander Schimmeck | https://unsplash.com/@alschim |
|
||||
| vertical-clothing.jpg | DS7N9ZnKpO0 | Tanya Barrow | https://unsplash.com/@tanya_barrow |
|
||||
| vertical-household.jpg | sf6YUxvCoro | Tianlei Wu | https://unsplash.com/@tianlei_wu |
|
||||
| about-hero.jpg | _BHlEskTT4c | Vitaly Gariev | https://unsplash.com/@silverkblack |
|
||||
| blog-launch.jpg | O1jUvZX9DOA | Andy Hermawan | https://unsplash.com/@andyhermawan |
|
||||
| blog-scales.jpg | cCFb5QAgFLs | Far Chinberdiev | https://unsplash.com/@farchinberdiev |
|
||||
| blog-quickstart.jpg | wgj5GDDPA0I | javier trueba | https://unsplash.com/@javitrapero |
|
||||
| integrations.jpg | bf9sZBcGQl4 | 1981 Digital | https://unsplash.com/@nineteen81digital |
|
||||
| cta-banner.jpg | 2oBnIuO9wv4 | Vitaly Gariev | https://unsplash.com/@silverkblack |
|
||||
|
Before Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 197 KiB |
|
Before Width: | Height: | Size: 240 KiB |
|
Before Width: | Height: | Size: 213 KiB |
|
Before Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 523 KiB |
|
Before Width: | Height: | Size: 541 KiB |
|
Before Width: | Height: | Size: 761 KiB |
|
Before Width: | Height: | Size: 541 KiB |
|
Before Width: | Height: | Size: 210 KiB |
|
Before Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 209 KiB |
|
Before Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
|
@ -1,117 +0,0 @@
|
|||
import satori from 'satori'
|
||||
import { Resvg } from '@resvg/resvg-js'
|
||||
import fs from 'node:fs/promises'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
const FONTS = path.join(__dirname, 'fonts')
|
||||
const OUT = path.resolve(__dirname, '..', 'public', 'og')
|
||||
|
||||
const interReg = await fs.readFile(path.join(FONTS, 'Inter-Regular.ttf'))
|
||||
const interBold = await fs.readFile(path.join(FONTS, 'Inter-Bold.ttf'))
|
||||
|
||||
const pages = [
|
||||
{ file: 'home.png', title: 'Программа учёта и касса для розничных магазинов в Казахстане', sub: 'Касса с торговыми весами, импорт каталога, ОФД РК. Бесплатно 90 дней.' },
|
||||
{ file: 'pos.png', title: 'Касса для Windows с поддержкой торговых весов', sub: 'Установка за 5 минут. Офлайн-режим. Стандартное оборудование.' },
|
||||
{ file: 'pricing.png', title: 'Прозрачные тарифы Food Market', sub: 'От 5 000 ₸/мес. Все возможности на любом тарифе. 90 дней триал.' },
|
||||
{ file: 'import.png', title: 'Перенесите каталог за один клик', sub: 'Excel, CSV, REST API. До 100 000 товаров. Бесплатно.' },
|
||||
{ file: 'about.png', title: 'О Food Market', sub: 'Программа учёта розничной торговли, созданная в Казахстане.' },
|
||||
{ file: 'for-grocery.png', title: 'Food Market для продуктового магазина', sub: 'Весовой товар, скоропорт, штрихкоды, ABC-анализ.' },
|
||||
{ file: 'for-pharmacy.png', title: 'Food Market для аптеки', sub: 'Серии, сроки годности, рецептурный отпуск, контроль ЛП.' },
|
||||
{ file: 'for-cafe.png', title: 'Food Market для кафе и общепита', sub: 'Модификаторы блюд, столики, печать на кухню.' },
|
||||
{ file: 'for-alcohol.png', title: 'Food Market для алкомаркета', sub: 'Акцизные марки, контроль времени продаж, маркировка.' },
|
||||
{ file: 'for-clothing.png', title: 'Food Market для магазина одежды', sub: 'Размерные сетки, цветовые матрицы, остатки по размерам.' },
|
||||
{ file: 'for-household.png', title: 'Food Market для дома и быта', sub: 'Гарантийные сроки, серийные номера, характеристики.' },
|
||||
]
|
||||
|
||||
const tmpl = ({ title, sub }) => ({
|
||||
type: 'div',
|
||||
props: {
|
||||
style: {
|
||||
width: '1200px', height: '630px', display: 'flex', flexDirection: 'column',
|
||||
justifyContent: 'space-between', padding: '64px',
|
||||
background: 'linear-gradient(135deg, #ECFDF5 0%, #D1FAE5 60%, #A7F3D0 100%)',
|
||||
fontFamily: 'Inter',
|
||||
},
|
||||
children: [
|
||||
// Logo + brand row
|
||||
{
|
||||
type: 'div',
|
||||
props: {
|
||||
style: { display: 'flex', alignItems: 'center', gap: '14px' },
|
||||
children: [
|
||||
{
|
||||
type: 'div',
|
||||
props: {
|
||||
style: {
|
||||
width: '56px', height: '56px', borderRadius: '14px',
|
||||
background: '#00B207',
|
||||
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
||||
color: '#FFFFFF', fontSize: '32px', fontWeight: 700,
|
||||
},
|
||||
children: 'F',
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'div',
|
||||
props: {
|
||||
style: { display: 'flex', flexDirection: 'column' },
|
||||
children: [
|
||||
{ type: 'span', props: { style: { color: '#0F172A', fontSize: '26px', fontWeight: 700, lineHeight: 1 }, children: 'Food Market' } },
|
||||
{ type: 'span', props: { style: { color: '#475569', fontSize: '15px', fontWeight: 400, marginTop: '4px' }, children: 'Программа учёта · Касса · Касса для Windows' } },
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
// Title + subtitle
|
||||
{
|
||||
type: 'div',
|
||||
props: {
|
||||
style: { display: 'flex', flexDirection: 'column', gap: '20px', maxWidth: '1000px' },
|
||||
children: [
|
||||
{ type: 'div', props: { style: { color: '#0F172A', fontSize: title.length > 60 ? '54px' : '64px', fontWeight: 700, lineHeight: 1.15 }, children: title } },
|
||||
{ type: 'div', props: { style: { color: '#475569', fontSize: '28px', fontWeight: 400, lineHeight: 1.3 }, children: sub } },
|
||||
],
|
||||
},
|
||||
},
|
||||
// Footer
|
||||
{
|
||||
type: 'div',
|
||||
props: {
|
||||
style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between' },
|
||||
children: [
|
||||
{ type: 'div', props: { style: { color: '#0F172A', fontSize: '20px', fontWeight: 700 }, children: 'food-market.zat.kz' } },
|
||||
{
|
||||
type: 'div',
|
||||
props: {
|
||||
style: {
|
||||
background: '#00B207', color: '#FFFFFF',
|
||||
padding: '14px 28px', borderRadius: '10px', fontSize: '20px', fontWeight: 700,
|
||||
},
|
||||
children: 'Начать бесплатно →',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
})
|
||||
|
||||
await fs.mkdir(OUT, { recursive: true })
|
||||
for (const p of pages) {
|
||||
const svg = await satori(tmpl(p), {
|
||||
width: 1200, height: 630,
|
||||
fonts: [
|
||||
{ name: 'Inter', data: interReg, weight: 400, style: 'normal' },
|
||||
{ name: 'Inter', data: interBold, weight: 700, style: 'normal' },
|
||||
],
|
||||
})
|
||||
const png = new Resvg(svg, { fitTo: { mode: 'width', value: 1200 } }).render().asPng()
|
||||
await fs.writeFile(path.join(OUT, p.file), png)
|
||||
console.log('og →', p.file)
|
||||
}
|
||||
console.log('done')
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
import { chromium } from 'playwright'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
const OUT = path.resolve(__dirname, '..', 'public', 'screenshots')
|
||||
|
||||
const APP = 'https://app.food-market.zat.kz'
|
||||
const EMAIL = 'admin@food-market.local'
|
||||
const PASSWORD = 'Admin12345!'
|
||||
|
||||
const browser = await chromium.launch({ headless: true })
|
||||
const ctx = await browser.newContext({ ignoreHTTPSErrors: true, viewport: { width: 1600, height: 1000 } })
|
||||
const page = await ctx.newPage()
|
||||
|
||||
console.log('login →', APP)
|
||||
await page.goto(`${APP}/login`, { waitUntil: 'networkidle' })
|
||||
await page.fill('input[type="email"]', EMAIL)
|
||||
await page.fill('input[type="password"]', PASSWORD)
|
||||
await page.click('button[type="submit"]')
|
||||
await page.waitForURL((u) => !u.pathname.startsWith('/login'), { timeout: 30000 })
|
||||
await page.waitForTimeout(1500)
|
||||
console.log('logged in →', page.url())
|
||||
|
||||
// Override tenant: переходим на /super-admin/organizations → клик «Открыть»
|
||||
// у строки FOOD MARKET (иконка-стрелка, title=«Открыть как…»).
|
||||
console.log('tenant override → FOOD MARKET')
|
||||
await page.goto(`${APP}/super-admin/organizations`, { waitUntil: 'networkidle' })
|
||||
await page.waitForTimeout(1000)
|
||||
// Клик на ряд FOOD MARKET — берём первую строку с этим текстом и в ней
|
||||
// первую кнопку-ссылку (login-icon).
|
||||
const rows = await page.$$('table tbody tr, tbody tr, [role="row"]')
|
||||
let opened = false
|
||||
for (const r of rows) {
|
||||
const txt = (await r.innerText()).trim()
|
||||
if (/FOOD MARKET/i.test(txt)) {
|
||||
const btn = await r.$('a, button')
|
||||
if (btn) {
|
||||
await btn.click()
|
||||
opened = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!opened) {
|
||||
// Fallback: клик по последней login-стрелке (там обычно FOOD MARKET).
|
||||
const arrows = await page.$$('a[href*="/api/super-admin/organizations/"][href*="open"], button[title*="ткрыт"]')
|
||||
if (arrows.length) await arrows[arrows.length - 1].click()
|
||||
}
|
||||
await page.waitForTimeout(2000)
|
||||
await page.waitForLoadState('networkidle')
|
||||
console.log('after override →', page.url())
|
||||
|
||||
const shots = [
|
||||
{ name: 'dashboard-hero.png', path: '/dashboard', vp: { width: 1600, height: 1000 } },
|
||||
{ name: 'analytics.png', path: '/dashboard', vp: { width: 1600, height: 1000 }, scrollY: 500 },
|
||||
{ name: 'catalog.png', path: '/catalog/products', vp: { width: 1600, height: 1000 } },
|
||||
{ name: 'product-card.png', path: '/catalog/products', vp: { width: 1200, height: 900 }, openFirst: true },
|
||||
{ name: 'counterparties.png', path: '/catalog/counterparties', vp: { width: 1200, height: 900 } },
|
||||
{ name: 'supply-form.png', path: '/purchases/supplies/new', vp: { width: 1200, height: 900 } },
|
||||
]
|
||||
|
||||
// CSS, скрывающий override-warning баннер (оранжевую полосу сверху).
|
||||
const HIDE_OVERRIDE_CSS = `
|
||||
[class*="bg-orange"], [class*="bg-amber"], [class*="bg-yellow-4"],
|
||||
[class*="ENV"], header [class*="orange"], div[class*="режиме"],
|
||||
div:has(> *:not(:empty):where(:scope:contains("СУПЕР-АДМИНА"))) { display: none !important; }
|
||||
`
|
||||
|
||||
for (const s of shots) {
|
||||
console.log('shot', s.name, '←', s.path)
|
||||
await page.setViewportSize(s.vp)
|
||||
await page.goto(`${APP}${s.path}`, { waitUntil: 'networkidle' })
|
||||
await page.waitForTimeout(2000)
|
||||
// Убираем оранжевый override-баннер по тексту.
|
||||
await page.evaluate(() => {
|
||||
document.querySelectorAll('div, header').forEach((el) => {
|
||||
const t = el.textContent || ''
|
||||
if (/В РЕЖИМЕ СУПЕР-АДМИНА/i.test(t) && el.children.length < 6 && el.offsetHeight < 80) {
|
||||
el.style.display = 'none'
|
||||
}
|
||||
})
|
||||
})
|
||||
if (s.scrollY) {
|
||||
await page.evaluate((y) => window.scrollTo(0, y), s.scrollY)
|
||||
await page.waitForTimeout(500)
|
||||
}
|
||||
if (s.openFirst) {
|
||||
const cellLink = await page.$('table tbody tr td a, table tbody tr td button')
|
||||
if (cellLink) {
|
||||
try {
|
||||
await cellLink.click()
|
||||
await page.waitForLoadState('networkidle', { timeout: 10000 })
|
||||
await page.waitForTimeout(2000)
|
||||
} catch (e) {
|
||||
console.warn(' openFirst click failed:', e.message)
|
||||
}
|
||||
} else {
|
||||
// Fallback: клик в первую ячейку строки.
|
||||
const firstCell = await page.$('table tbody tr')
|
||||
if (firstCell) {
|
||||
try { await firstCell.click(); await page.waitForTimeout(2000) } catch {}
|
||||
}
|
||||
}
|
||||
}
|
||||
await page.screenshot({ path: path.join(OUT, s.name), fullPage: false })
|
||||
console.log(' ok →', s.name, s.vp.width + 'x' + s.vp.height)
|
||||
}
|
||||
|
||||
await browser.close()
|
||||
console.log('done')
|
||||
|
|
@ -3,7 +3,7 @@ import { useState } from 'react'
|
|||
const ITEMS = [
|
||||
{
|
||||
q: 'Чем Food Market подходит моему магазину?',
|
||||
a: 'Food Market — облачная программа учёта розничной торговли, созданная под казахстанский рынок. Поддерживает все типы магазинов: продуктовые, аптеки, общепит, алкомаркеты, одежду, бытовые товары. Включает кассу для Windows с нативной поддержкой торговых весов, интеграцию с ОФД РК, Kaspi Pay и казахстанскими банками.',
|
||||
a: 'Food Market — облачная программа учёта розничной торговли, созданная под казахстанский рынок. Поддерживает все типы магазинов: продуктовые, аптеки, общепит, алкомаркеты, одежду, бытовые товары. Включает кассу для Windows с нативной поддержкой весов Масса-К, интеграцию с ОФД РК, Kaspi Pay и казахстанскими банками.',
|
||||
},
|
||||
{
|
||||
q: 'Сколько стоит подписка?',
|
||||
|
|
|
|||
|
|
@ -1,43 +1,51 @@
|
|||
---
|
||||
title: "Касса с поддержкой весов — почему это важно для магазина"
|
||||
title: "Касса с весами Масса-К — почему это важно для магазина"
|
||||
date: 2026-05-02
|
||||
author: Команда Food Market
|
||||
category: feature
|
||||
description: "Если вы продаёте на развес, работа с весами обычно — самое болезненное место при настройке кассы. Рассказываем, как мы сделали её простой."
|
||||
cover_image: /photos/blog-scales.jpg
|
||||
description: "80% магазинов в Казахстане используют Масса-К. Как мы сделали поддержку нативной — без сторонних драйверов и подписок."
|
||||
cover_image: /blog/scales.jpg
|
||||
---
|
||||
|
||||
# Касса с поддержкой весов — почему это важно
|
||||
# Касса с весами Масса-К — почему это важно
|
||||
|
||||
Если вы продаёте овощи, фрукты, мясо, сыр или орехи на развес — без подключения торговых весов касса теряет смысл. Кассир вводит вес и цену вручную, делает ошибки, очередь стоит. Десять секунд на каждую позицию складываются в минуты.
|
||||
Если вы продаёте овощи, фрукты, мясо, сыр или орехи на развес — у вас 99% шанс используются весы **Масса-К**. Это казахстанско-российский стандарт.
|
||||
|
||||
И именно работа с весами часто становится самым болезненным местом при настройке кассового оборудования: разные протоколы, COM-порты, драйверы под Windows, фирменные «модули интеграции» с подпиской.
|
||||
И именно работа с весами часто становится самым болезненным местом при настройке кассового оборудования.
|
||||
|
||||
## Как мы решили эту задачу
|
||||
|
||||
Мы написали обработку стандартных протоколов торговых весов прямо в кассу. Зато теперь весы работают нативно:
|
||||
Мы написали свой парсер протокола Масса-К прямо в кассу. Это заняло около 2 недель разработки. Зато теперь весы работают нативно:
|
||||
|
||||
- Установили Касса Food Market для Windows
|
||||
- Подключили торговые весы через RS-232 или USB-COM кабель
|
||||
- Подключили весы Масса-К через RS-232 или USB-COM кабель
|
||||
- Запустили кассу — **всё**
|
||||
|
||||
Касса автоматически:
|
||||
- Опрашивает COM-порт каждые 200 мс
|
||||
- Распознаёт подключённую модель
|
||||
- Распознаёт модель Масса-К (МК-А, МК-В, MK-T, MK-D)
|
||||
- Считывает вес и штрихкод PLU
|
||||
- Подставляет позицию в открытый чек
|
||||
|
||||
Никаких сторонних драйверов. Никаких подписок на «модули интеграции». Никаких бубнов с COM-портами.
|
||||
Никаких сторонних драйверов. Никаких подписок на «модули интеграции». Никаких бубенов с COM-портами.
|
||||
|
||||
## Какие весы поддерживаем
|
||||
## Какие модели поддерживаем
|
||||
|
||||
Электронные торговые весы стандартных протоколов — основные варианты, встречающиеся в Казахстане. Не уверены, что ваша модель подойдёт? [Напишите →](/contacts) — проверим за 5 минут.
|
||||
Текущие версии:
|
||||
- **МК-А** (механические с чеком) — все модели
|
||||
- **МК-В** (электронные) — все модели
|
||||
- **MK-T** (торговые) — все модели
|
||||
- **MK-D** (для прилавочной торговли) — все модели
|
||||
|
||||
Планируем в ближайшем апдейте поддержку других распространённых в Казахстане производителей весов — пишите, какая модель у вас стоит, и мы добавим её в очередь.
|
||||
|
||||
Не уверены, что ваша модель подойдёт? [Напишите →](/contacts) — проверим за 5 минут.
|
||||
|
||||
## Что это даёт магазину
|
||||
|
||||
- **Скорость обслуживания вырастает на 30%** — кассир не вводит вес и цену вручную, всё автоматически
|
||||
- **Меньше ошибок** — нет человеческого фактора при пробивании веса
|
||||
- **Дешевле в эксплуатации** — не платите за сторонние модули интеграции
|
||||
- **Дешевле в эксплуатации** — не платите за стороние модули интеграции
|
||||
- **Проще обучение кассиров** — они работают как привыкли, никакой «сложной системы»
|
||||
|
||||
[Скачать кассу →](/pos)
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ date: 2026-04-26
|
|||
author: Команда Food Market
|
||||
category: news
|
||||
description: "Сегодня мы запускаем Food Market — программу учёта розничной торговли, созданную в Казахстане для казахстанских магазинов."
|
||||
cover_image: /photos/blog-launch.jpg
|
||||
cover_image: /blog/launch.jpg
|
||||
---
|
||||
|
||||
# Food Market запустился
|
||||
|
|
@ -17,7 +17,7 @@ cover_image: /photos/blog-launch.jpg
|
|||
|
||||
- **работать с первого клика** — без долгой настройки и платных консультаций
|
||||
- **стоить честно** — без скрытых доплат за модули, которые должны быть в базе
|
||||
- **поддерживать локальное железо** — торговые весы нативно, без переходников и сторонних драйверов
|
||||
- **поддерживать локальное железо** — Масса-К нативно, без переходников и сторонних драйверов
|
||||
- **позволять попробовать без риска** — настоящий триал, а не «14 дней с привязкой карты»
|
||||
|
||||
Мы воплотили эти принципы в Food Market.
|
||||
|
|
@ -26,7 +26,7 @@ cover_image: /photos/blog-launch.jpg
|
|||
|
||||
- **5 000 тг/мес** за тариф «Старт» — 1 магазин, 1 касса, 1 склад, без лимита товаров
|
||||
- **90 дней триала** без карты, без обязательств, со всеми возможностями
|
||||
- **Касса для Windows** с нативной поддержкой торговых весов
|
||||
- **Касса для Windows** с нативной поддержкой Масса-К
|
||||
- **Импорт каталога** из Excel, CSV или API за один клик
|
||||
- **Все возможности на любом тарифе** — никаких доплат за CRM, лояльность, финансы или сценарии
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ date: 2026-04-30
|
|||
author: Команда Food Market
|
||||
category: guide
|
||||
description: "Пошаговая инструкция первого запуска: от регистрации до первой продажи."
|
||||
cover_image: /photos/blog-quickstart.jpg
|
||||
cover_image: /blog/quickstart.jpg
|
||||
---
|
||||
|
||||
# Запустите магазин в Food Market за 15 минут
|
||||
|
|
@ -46,7 +46,7 @@ cover_image: /photos/blog-quickstart.jpg
|
|||
|
||||
1. Запустите .msi файл — нажмите «Далее» три раза
|
||||
2. Введите ключ организации (показан в админке)
|
||||
3. Подключите торговые весы через USB-COM
|
||||
3. Подключите весы Масса-К через USB-COM
|
||||
4. Подключите сканер штрихкодов через USB
|
||||
5. Подключите чековый принтер
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ order: 99
|
|||
|
||||
## Возможности
|
||||
|
||||
### Поддерживаете торговые весы?
|
||||
### Поддерживаете весы Масса-К?
|
||||
Да, нативно — без сторонних драйверов и переходников.
|
||||
|
||||
### Какие сканеры штрихкодов поддерживаете?
|
||||
|
|
|
|||
|
|
@ -49,14 +49,14 @@ order: 1
|
|||
|
||||
## Подключение оборудования
|
||||
|
||||
### Торговые весы
|
||||
### Весы Масса-К
|
||||
|
||||
1. Подключите весы к компьютеру через кабель RS-232 или USB-COM
|
||||
2. В кассе откройте «Настройки» → «Оборудование» → «Весы»
|
||||
3. Нажмите «Найти весы» — касса опросит COM-порты и распознает подключённую модель автоматически
|
||||
3. Нажмите «Найти весы» — касса опросит COM-порты и распознает Масса-К автоматически
|
||||
4. Поставьте на чашу любой груз — должна появиться цифра в нижней панели кассы
|
||||
|
||||
Поддерживаются электронные весы стандартных протоколов.
|
||||
Поддерживаемые модели: МК-А, МК-В, MK-T, MK-D и совместимые.
|
||||
|
||||
### Сканер штрихкодов
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ order: 1
|
|||
«Касса» → «Скачать установщик». Запустите .msi файл, нажмите «Далее» три раза. После установки введите ключ организации (показан в разделе «Касса»).
|
||||
|
||||
Подключите оборудование:
|
||||
- Электронные торговые весы — через RS-232 или USB-COM
|
||||
- Весы Масса-К — через RS-232 или USB-COM
|
||||
- Сканер штрихкодов — USB
|
||||
- Чековый принтер — USB или сетевой
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ interface Props {
|
|||
description?: string
|
||||
ogImage?: string
|
||||
}
|
||||
const { title, description = 'Программа учёта и касса для розничных магазинов в Казахстане. Бесплатно 90 дней.', ogImage = '/og/home.png' } = Astro.props
|
||||
const { title, description = 'Программа учёта и касса для розничных магазинов в Казахстане. Бесплатно 90 дней.', ogImage = '/og.png' } = Astro.props
|
||||
const canonical = new URL(Astro.url.pathname, Astro.site).toString()
|
||||
---
|
||||
<!doctype html>
|
||||
|
|
@ -31,7 +31,6 @@ const canonical = new URL(Astro.url.pathname, Astro.site).toString()
|
|||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:title" content={`${title} · Food Market`} />
|
||||
<meta name="twitter:description" content={description} />
|
||||
<meta name="twitter:image" content={new URL(ogImage, Astro.site).toString()} />
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
|
|
|
|||
|
|
@ -1,13 +1,11 @@
|
|||
---
|
||||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
||||
---
|
||||
<BaseLayout title="О нас" description="Food Market — программа учёта и касса для розничных магазинов Казахстана. История, команда, принципы." ogImage="/og/about.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/about-hero.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/85 via-slate-900/60 to-transparent"></div>
|
||||
<div class="relative max-w-3xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold text-white drop-shadow-lg">О Food Market</h1>
|
||||
<p class="mt-4 text-lg text-emerald-50 max-w-xl">Программа учёта розничной торговли, созданная в Казахстане для казахстанских магазинов.</p>
|
||||
<BaseLayout title="О нас" description="Food Market — программа учёта и касса для розничных магазинов Казахстана. История, команда, принципы.">
|
||||
<section class="bg-gradient-to-br from-brand-light/30 via-white to-white">
|
||||
<div class="max-w-3xl mx-auto px-4 sm:px-6 py-14">
|
||||
<h1 class="text-4xl font-extrabold">О Food Market</h1>
|
||||
<p class="mt-4 text-lg text-slate-600">Программа учёта розничной торговли, созданная в Казахстане для казахстанских магазинов.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
|
@ -15,12 +13,12 @@ import BaseLayout from '@/layouts/BaseLayout.astro'
|
|||
<h2>История</h2>
|
||||
<p>Food Market запустился в 2026 году как ответ на запрос рынка: розничные магазины в Казахстане заслуживают современный, быстрый и честный инструмент для ведения бизнеса.</p>
|
||||
<p>Команда основателей — практики розницы и разработчики, которые три года изнутри наблюдали как магазины ведут учёт, какие проблемы решают каждый день, чего им не хватает в существующих инструментах.</p>
|
||||
<p>Мы поставили перед собой задачу сделать продукт, который работает с первого клика — без долгой настройки и платных консультаций; нативно поддерживает локальное железо (торговые весы из коробки, без переходников); соответствует реалиям РК (Kaspi Pay, ОФД, законодательство, поддержка на русском); и который можно попробовать без риска — настоящий триал, без привязки карты.</p>
|
||||
<p>Мы поставили перед собой задачу сделать продукт, который работает с первого клика — без долгой настройки и платных консультаций; нативно поддерживает локальное железо (Масса-К из коробки, без переходников); соответствует реалиям РК (Kaspi Pay, ОФД, законодательство, поддержка на русском); и который можно попробовать без риска — настоящий триал, без привязки карты.</p>
|
||||
|
||||
<h2>Почему мы</h2>
|
||||
<p>Мы делаем продукт, который работает с первого клика, стоит честно, поддерживает локальное оборудование и казахстанские интеграции, и который можно попробовать без риска.</p>
|
||||
<ul>
|
||||
<li><strong>Касса с поддержкой торговых весов из коробки</strong> — без переходников и сторонних драйверов.</li>
|
||||
<li><strong>Касса с весами Масса-К из коробки</strong> — без переходников и сторонних драйверов.</li>
|
||||
<li><strong>Импорт каталога одной кнопкой</strong> — старый учёт переносится автоматически.</li>
|
||||
<li><strong>90 дней бесплатно без банковской карты</strong> — никаких автосписаний и сюрпризов.</li>
|
||||
<li><strong>Все модули в одном тарифе</strong> — CRM, лояльность, финансы, склад, аналитика включены.</li>
|
||||
|
|
|
|||
|
|
@ -11,11 +11,6 @@ const { Content } = await post.render()
|
|||
const fmt = post.data.date.toLocaleDateString('ru-KZ', { day: '2-digit', month: 'long', year: 'numeric' })
|
||||
---
|
||||
<BaseLayout title={post.data.title} description={post.data.description}>
|
||||
{post.data.cover_image && (
|
||||
<div class="w-full overflow-hidden bg-slate-100" style="max-height: 480px;">
|
||||
<img src={post.data.cover_image} alt="" class="w-full h-full object-cover" loading="eager" />
|
||||
</div>
|
||||
)}
|
||||
<article class="max-w-[720px] mx-auto px-4 sm:px-6 py-12">
|
||||
<a href="/blog" class="text-xs text-brand hover:underline">← Все посты</a>
|
||||
<p class="text-xs text-slate-500 mt-4">{fmt}</p>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
||||
const sections = [
|
||||
{ id: 'catalog', icon: '📦', title: 'Товары и каталог', items: ['Иерархические группы и подгруппы','Штрихкоды EAN-13/EAN-8/Code128','Цены: розничная, оптовая, эталонная','Автогенерация артикула и штрихкода','Импорт из других систем','Картинки товаров','Атрибуты и характеристики'] },
|
||||
{ id: 'sales', icon: '💳', title: 'Продажи и касса', items: ['Касса для Windows','Поддержка торговых весов','Сканер штрихкодов USB','Чековые принтеры ESC/POS','Kaspi Pay интеграция','Скидки и акции','Возвраты на кассе'] },
|
||||
{ id: 'sales', icon: '💳', title: 'Продажи и касса', items: ['Касса для Windows','Поддержка весов Масса-К','Сканер штрихкодов USB','Чековые принтеры ESC/POS','Kaspi Pay интеграция','Скидки и акции','Возвраты на кассе'] },
|
||||
{ id: 'stock', icon: '🏬', title: 'Склад и остатки', items: ['Несколько складов','Приёмка со сканером','Автоматический расчёт себестоимости','Инвентаризация','Списание (брак/просрочка)','Оприходование','Перемещения между складами','История движений'] },
|
||||
{ id: 'purchase', icon: '🚚', title: 'Закупки и поставщики', items: ['База контрагентов','Заказы поставщикам','Документы приёмки','Скользящее среднее себестоимости','Эталонная цена'] },
|
||||
{ id: 'crm', icon: '👥', title: 'Клиенты и лояльность', items: ['База клиентов','Скидочные карты (скоро)','Программы лояльности (скоро)','Сегментация (скоро)','SMS-рассылки (скоро)'] },
|
||||
|
|
|
|||
|
|
@ -7,15 +7,13 @@ const features = [
|
|||
{ icon: '🆔', title: 'Проверка возраста', text: 'Запрос подтверждения возраста на кассе перед продажей алкогольных позиций.' },
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Для алкогольных магазинов" description="Food Market для алкоголя: акцизные марки, ЕГАИС-ready, контроль времени продаж, проверка возраста." ogImage="/og/for-alcohol.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/vertical-alcohol.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/85 via-slate-900/60 to-transparent"></div>
|
||||
<div class="relative max-w-4xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<BaseLayout title="Для алкогольных магазинов" description="Food Market для алкоголя: акцизные марки, ЕГАИС-ready, контроль времени продаж, проверка возраста.">
|
||||
<section class="bg-gradient-to-br from-brand-light/30 via-white to-white">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 py-14">
|
||||
<span class="text-3xl">🍷</span>
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold mt-2 text-white drop-shadow-lg">Программа учёта<br/>для алкоголя</h1>
|
||||
<p class="mt-4 text-lg text-emerald-50 max-w-xl">Акцизные марки, ЕГАИС-ready, контроль времени продаж и возраста.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-white text-brand font-bold rounded-md shadow-lg">Начать бесплатно</a>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Программа учёта для алкоголя</h1>
|
||||
<p class="mt-4 text-lg text-slate-600">Акцизные марки, ЕГАИС-ready, контроль времени продаж и возраста.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-brand text-white font-semibold rounded-md">Начать бесплатно</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="max-w-5xl mx-auto px-4 sm:px-6 py-14">
|
||||
|
|
|
|||
|
|
@ -7,15 +7,13 @@ const features = [
|
|||
{ icon: '📈', title: 'Анализ блюд', text: 'Какие блюда продаются, какие нет. Маржинальность по позиции.' },
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Для кафе и общепита" description="Food Market для кафе и общепита: модификаторы, комбо, тех.карты, заказы по столикам." ogImage="/og/for-cafe.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/vertical-cafe.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/80 via-slate-900/55 to-transparent"></div>
|
||||
<div class="relative max-w-4xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<BaseLayout title="Для кафе и общепита" description="Food Market для кафе и общепита: модификаторы, комбо, тех.карты, заказы по столикам.">
|
||||
<section class="bg-gradient-to-br from-brand-light/30 via-white to-white">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 py-14">
|
||||
<span class="text-3xl">☕</span>
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold mt-2 text-white drop-shadow-lg">Программа учёта<br/>для кафе и общепита</h1>
|
||||
<p class="mt-4 text-lg text-emerald-50 max-w-xl">Модификаторы, комбо, технологические карты, заказы по столикам. Списание ингредиентов автоматом.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-white text-brand font-bold rounded-md shadow-lg">Начать бесплатно</a>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Программа учёта для кафе и общепита</h1>
|
||||
<p class="mt-4 text-lg text-slate-600">Модификаторы, комбо, технологические карты, заказы по столикам. Списание ингредиентов автоматом.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-brand text-white font-semibold rounded-md">Начать бесплатно</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="max-w-5xl mx-auto px-4 sm:px-6 py-14">
|
||||
|
|
|
|||
|
|
@ -7,15 +7,13 @@ const features = [
|
|||
{ icon: '🔄', title: 'Возвраты', text: 'Удобный возврат на кассе с возвратом денег или обменом на другой размер.' },
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Для магазина одежды" description="Food Market для одежды: размерные сетки, цвета, маркетплейсы, удобные возвраты." ogImage="/og/for-clothing.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/vertical-clothing.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/80 via-slate-900/55 to-transparent"></div>
|
||||
<div class="relative max-w-4xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<BaseLayout title="Для магазина одежды" description="Food Market для одежды: размерные сетки, цвета, маркетплейсы, удобные возвраты.">
|
||||
<section class="bg-gradient-to-br from-brand-light/30 via-white to-white">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 py-14">
|
||||
<span class="text-3xl">👔</span>
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold mt-2 text-white drop-shadow-lg">Программа учёта<br/>для магазина одежды</h1>
|
||||
<p class="mt-4 text-lg text-emerald-50 max-w-xl">Размерные сетки, цвета, выгрузка на маркетплейсы, удобные возвраты.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-white text-brand font-bold rounded-md shadow-lg">Начать бесплатно</a>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Программа учёта для магазина одежды</h1>
|
||||
<p class="mt-4 text-lg text-slate-600">Размерные сетки, цвета, выгрузка на маркетплейсы, удобные возвраты.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-brand text-white font-semibold rounded-md">Начать бесплатно</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="max-w-5xl mx-auto px-4 sm:px-6 py-14">
|
||||
|
|
|
|||
|
|
@ -1,21 +1,19 @@
|
|||
---
|
||||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
||||
const features = [
|
||||
{ icon: '⚖️', title: 'Весовой товар', text: 'Касса принимает вес с торговых весов напрямую — стоимость пересчитывается сразу.' },
|
||||
{ icon: '⚖️', title: 'Весовой товар', text: 'Касса принимает вес с весов Масса-К напрямую — стоимость пересчитывается сразу.' },
|
||||
{ icon: '📅', title: 'Скоропорт и сроки', text: 'Контроль сроков годности, уведомление за N дней, списание просрочки одним кликом.' },
|
||||
{ icon: '🏷️', title: 'Печать ценников и штрихкодов', text: 'Внутренняя нумерация EAN-13 для весовых товаров, автогенерация при заведении.' },
|
||||
{ icon: '📊', title: 'ABC-анализ', text: 'Ходовые и неходовые позиции по сумме / марже / штукам. Решения по матрице за минуту.' },
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Для продуктового магазина" description="Food Market для продуктового магазина: весовой товар, штрихкоды, скоропорт, ABC-анализ." ogImage="/og/for-grocery.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/vertical-grocery.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/80 via-slate-900/55 to-transparent"></div>
|
||||
<div class="relative max-w-4xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<BaseLayout title="Для продуктового магазина" description="Food Market для продуктового магазина: весовой товар, штрихкоды, скоропорт, ABC-анализ.">
|
||||
<section class="bg-gradient-to-br from-brand-light/30 via-white to-white">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 py-14">
|
||||
<span class="text-3xl">🛒</span>
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold mt-2 text-white drop-shadow-lg">Программа учёта<br/>для продуктового магазина</h1>
|
||||
<p class="mt-4 text-lg text-emerald-50 max-w-xl">Весовой товар, скоропорт, штрихкоды, касса с поддержкой торговых весов из коробки. Импорт из другой системы.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-white text-brand font-bold rounded-md shadow-lg">Начать бесплатно</a>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Программа учёта для продуктового магазина</h1>
|
||||
<p class="mt-4 text-lg text-slate-600">Весовой товар, скоропорт, штрихкоды, касса с весами Масса-К из коробки. Импорт из другой системы.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-brand text-white font-semibold rounded-md">Начать бесплатно</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="max-w-5xl mx-auto px-4 sm:px-6 py-14">
|
||||
|
|
|
|||
|
|
@ -7,15 +7,13 @@ const features = [
|
|||
{ icon: '📤', title: 'Маркетплейсы', text: 'Выгрузка на Kaspi Magazin, синхронизация цен и остатков (скоро).' },
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Для магазина дом и быт" description="Food Market для магазина товаров для дома: гарантийные сроки, серийные номера, комплекты, маркетплейсы." ogImage="/og/for-household.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/vertical-household.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/80 via-slate-900/55 to-transparent"></div>
|
||||
<div class="relative max-w-4xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<BaseLayout title="Для магазина дом и быт" description="Food Market для магазина товаров для дома: гарантийные сроки, серийные номера, комплекты, маркетплейсы.">
|
||||
<section class="bg-gradient-to-br from-brand-light/30 via-white to-white">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 py-14">
|
||||
<span class="text-3xl">🏠</span>
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold mt-2 text-white drop-shadow-lg">Программа учёта<br/>для дома и быта</h1>
|
||||
<p class="mt-4 text-lg text-emerald-50 max-w-xl">Гарантийные сроки, серийные номера, комплекты, выгрузка на маркетплейсы.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-white text-brand font-bold rounded-md shadow-lg">Начать бесплатно</a>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Программа учёта для дома и быта</h1>
|
||||
<p class="mt-4 text-lg text-slate-600">Гарантийные сроки, серийные номера, комплекты, выгрузка на маркетплейсы.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-brand text-white font-semibold rounded-md">Начать бесплатно</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="max-w-5xl mx-auto px-4 sm:px-6 py-14">
|
||||
|
|
|
|||
|
|
@ -7,15 +7,13 @@ const features = [
|
|||
{ icon: '🔒', title: 'Контроль доступа', text: 'Роли «Фармацевт» и «Заведующий» с разными правами. Логирование всех операций.' },
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Для аптеки" description="Food Market для аптеки: партионный учёт, серии и сроки годности, рецептурные препараты, МНН-группы." ogImage="/og/for-pharmacy.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/vertical-pharmacy.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/80 via-slate-900/55 to-transparent"></div>
|
||||
<div class="relative max-w-4xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<BaseLayout title="Для аптеки" description="Food Market для аптеки: партионный учёт, серии и сроки годности, рецептурные препараты, МНН-группы.">
|
||||
<section class="bg-gradient-to-br from-brand-light/30 via-white to-white">
|
||||
<div class="max-w-4xl mx-auto px-4 sm:px-6 py-14">
|
||||
<span class="text-3xl">💊</span>
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold mt-2 text-white drop-shadow-lg">Программа учёта<br/>для аптеки</h1>
|
||||
<p class="mt-4 text-lg text-emerald-50 max-w-xl">Серии и сроки годности, рецептурный отпуск, группировка по МНН. Импорт из другой системы.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-white text-brand font-bold rounded-md shadow-lg">Начать бесплатно</a>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Программа учёта для аптеки</h1>
|
||||
<p class="mt-4 text-lg text-slate-600">Серии и сроки годности, рецептурный отпуск, группировка по МНН. Импорт из другой системы.</p>
|
||||
<a href="/signup?plan=start" class="inline-block mt-7 px-5 py-3 bg-brand text-white font-semibold rounded-md">Начать бесплатно</a>
|
||||
</div>
|
||||
</section>
|
||||
<section class="max-w-5xl mx-auto px-4 sm:px-6 py-14">
|
||||
|
|
|
|||
|
|
@ -35,21 +35,17 @@ const faq = [
|
|||
{ q: 'Что если возникли проблемы?', a: 'Напишите на support@food-market.kz — поможем разобраться и при необходимости настроим импорт вручную.' },
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Импорт каталога" description="Перенесите товары, контрагентов, остатки и штрихкоды из вашей текущей системы за минуты. Excel, CSV, API." ogImage="/og/import.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/import-hero.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/85 via-slate-900/60 to-slate-900/30"></div>
|
||||
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<div class="max-w-2xl">
|
||||
<span class="inline-block text-xs uppercase tracking-wider text-emerald-300 font-semibold">Импорт</span>
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold mt-2 text-white drop-shadow-lg">Перенесите каталог<br/>за один клик</h1>
|
||||
<p class="mt-4 text-lg text-emerald-50">
|
||||
Не перепечатывайте товары вручную. Импортируйте каталог из вашей текущей системы за минуты.
|
||||
</p>
|
||||
<div class="mt-7 flex gap-3 flex-wrap">
|
||||
<a href="/signup" class="px-5 py-3 bg-white text-brand text-sm font-bold rounded-md shadow-lg">Начать импорт</a>
|
||||
<a href="#formats" class="px-5 py-3 border border-white/40 text-white rounded-md font-semibold hover:bg-white/10">Поддерживаемые форматы</a>
|
||||
</div>
|
||||
<BaseLayout title="Импорт каталога" description="Перенесите товары, контрагентов, остатки и штрихкоды из вашей текущей системы за минуты. Excel, CSV, API.">
|
||||
<section class="bg-gradient-to-br from-brand-light/40 via-white to-white">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 py-14">
|
||||
<span class="inline-block text-xs uppercase tracking-wider text-brand font-semibold">Импорт</span>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Перенесите каталог<br/>за один клик</h1>
|
||||
<p class="mt-4 max-w-xl text-slate-600">
|
||||
Не перепечатывайте товары вручную. Импортируйте каталог из вашей текущей системы за минуты.
|
||||
</p>
|
||||
<div class="mt-7 flex gap-3">
|
||||
<a href="/signup" class="px-5 py-3 bg-brand text-white text-sm font-semibold rounded-md hover:bg-brand-hover">Начать импорт</a>
|
||||
<a href="#formats" class="px-5 py-3 border border-slate-300 rounded-md font-semibold hover:bg-slate-50">Поддерживаемые форматы</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ const verticals = [
|
|||
|
||||
const modules = [
|
||||
{ icon: '📦', title: 'Товары и каталог', text: 'Группы, штрихкоды, цены, остатки, импорт каталога одной кнопкой.' },
|
||||
{ icon: '💳', title: 'Продажи и касса', text: 'Касса для Windows с поддержкой торговых весов, штрихкодов, чековых принтеров.' },
|
||||
{ icon: '💳', title: 'Продажи и касса', text: 'Касса для Windows с поддержкой весов Масса-К, штрихкодов, чековых принтеров.' },
|
||||
{ icon: '🏬', title: 'Склад и приёмки', text: 'Несколько складов, приёмка со сканером, инвентаризация, списание, оприходование.' },
|
||||
{ icon: '🚚', title: 'Закупки и поставщики', text: 'Документы приёмки с автоматическим расчётом себестоимости (скользящее среднее).' },
|
||||
{ icon: '👥', title: 'Клиенты и лояльность', text: 'База контрагентов, скидки, акции, программы лояльности (скоро).' },
|
||||
|
|
@ -27,7 +27,7 @@ const integrations = [
|
|||
|
||||
<BaseLayout
|
||||
title="Программа учёта для розничных магазинов"
|
||||
description="Программа учёта и касса для розничных магазинов в Казахстане. Касса с поддержкой торговых весов, импорт каталога одной кнопкой, интеграция с Kaspi и ОФД РК. Бесплатно 90 дней без карты."
|
||||
description="Программа учёта и касса для розничных магазинов в Казахстане. Касса с весами Масса-К, импорт каталога одной кнопкой, интеграция с Kaspi и ОФД РК. Бесплатно 90 дней без карты."
|
||||
>
|
||||
{/* 1. Hero */}
|
||||
<section class="bg-gradient-to-br from-brand-light/40 via-white to-white">
|
||||
|
|
@ -37,7 +37,7 @@ const integrations = [
|
|||
Программа учёта и касса для розничных магазинов в Казахстане
|
||||
</h1>
|
||||
<p class="mt-5 text-lg text-slate-600">
|
||||
Касса с поддержкой торговых весов, импорт каталога одной кнопкой, интеграция с Kaspi и ОФД РК.
|
||||
Касса с весами Масса-К, импорт каталога одной кнопкой, интеграция с Kaspi и ОФД РК.
|
||||
<strong>Бесплатно 90 дней без карты.</strong>
|
||||
</p>
|
||||
<div class="mt-7 flex flex-wrap gap-3">
|
||||
|
|
@ -46,13 +46,14 @@ const integrations = [
|
|||
</div>
|
||||
<p class="mt-3 text-xs text-slate-500">Без банковской карты · 90 дней триал · Подписка от 5 000 ₸/мес</p>
|
||||
</div>
|
||||
<div class="rounded-2xl border border-emerald-100 bg-white shadow-2xl overflow-hidden">
|
||||
<div class="bg-slate-100 border-b border-slate-200 px-3 py-2 flex gap-1.5">
|
||||
<span class="w-3 h-3 rounded-full bg-red-400"></span>
|
||||
<span class="w-3 h-3 rounded-full bg-yellow-400"></span>
|
||||
<span class="w-3 h-3 rounded-full bg-green-400"></span>
|
||||
<div class="rounded-xl border border-slate-200 bg-white shadow-xl overflow-hidden">
|
||||
{/* Реальный скриншот админки. Пока placeholder с типографическим mock'ом дашборда. */}
|
||||
<div class="aspect-[16/10] bg-gradient-to-br from-slate-50 to-slate-100 p-4 grid grid-cols-2 gap-3">
|
||||
<div class="bg-white rounded-lg border border-slate-200 p-3"><div class="text-[10px] uppercase text-slate-400">Организаций</div><div class="text-2xl font-bold mt-1">2</div></div>
|
||||
<div class="bg-white rounded-lg border border-slate-200 p-3"><div class="text-[10px] uppercase text-slate-400">Товаров</div><div class="text-2xl font-bold mt-1">29 540</div></div>
|
||||
<div class="bg-white rounded-lg border border-slate-200 p-3"><div class="text-[10px] uppercase text-slate-400">Приёмок / мес</div><div class="text-2xl font-bold mt-1">187</div></div>
|
||||
<div class="bg-white rounded-lg border border-slate-200 p-3"><div class="text-[10px] uppercase text-slate-400">Чеков сегодня</div><div class="text-2xl font-bold mt-1 text-brand">432</div></div>
|
||||
</div>
|
||||
<img src="/screenshots/dashboard-hero.png" alt="Дашборд Food Market" class="w-full block" loading="eager" />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
|
@ -62,7 +63,7 @@ const integrations = [
|
|||
<div class="rounded-xl border border-slate-200 p-5">
|
||||
<div class="text-3xl">🛒</div>
|
||||
<h3 class="font-semibold mt-2">Касса с весами из коробки</h3>
|
||||
<p class="text-sm text-slate-600 mt-1">Прямая поддержка торговых весов без переходников и драйверов. Подключите весы — Food Market распознает их автоматически. Поддержка штрихкодов, скидок, акций, лояльности.</p>
|
||||
<p class="text-sm text-slate-600 mt-1">Прямая поддержка Масса-К без переходников и драйверов. Подключите весы — Food Market распознает их автоматически. Поддержка штрихкодов, скидок, акций, лояльности.</p>
|
||||
</div>
|
||||
<div class="rounded-xl border border-slate-200 p-5">
|
||||
<div class="text-3xl">⬇️</div>
|
||||
|
|
@ -78,16 +79,10 @@ const integrations = [
|
|||
|
||||
{/* 3. Скриншот продукта */}
|
||||
<section id="screenshot" class="max-w-7xl mx-auto px-4 sm:px-6 py-12">
|
||||
<h2 class="text-3xl font-bold text-center mb-2">Один экран — весь магазин</h2>
|
||||
<p class="text-center text-slate-500 mb-8">Дашборд показывает выручку, остатки, движения и топ-товары. Без переключения вкладок и Excel-экспорта.</p>
|
||||
<div class="rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-6 shadow-lg">
|
||||
<div class="bg-slate-200 rounded-t-md px-3 py-2 flex gap-1.5 items-center">
|
||||
<span class="w-2.5 h-2.5 rounded-full bg-red-400"></span>
|
||||
<span class="w-2.5 h-2.5 rounded-full bg-yellow-400"></span>
|
||||
<span class="w-2.5 h-2.5 rounded-full bg-green-400"></span>
|
||||
<span class="ml-3 text-xs text-slate-500">app.food-market.kz / catalog / products</span>
|
||||
<div class="rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-6">
|
||||
<div class="aspect-[16/9] bg-white rounded-lg border border-slate-200 flex items-center justify-center text-slate-400 text-sm">
|
||||
Скриншот админки · реальный экран /dashboard
|
||||
</div>
|
||||
<img src="/screenshots/catalog.png" alt="Каталог товаров Food Market — 29 540 SKU" class="w-full block rounded-b-md" loading="lazy" />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
|
@ -129,7 +124,7 @@ const integrations = [
|
|||
<section class="max-w-7xl mx-auto px-4 sm:px-6 py-14 grid lg:grid-cols-2 gap-10 items-center">
|
||||
<div>
|
||||
<span class="inline-block text-xs uppercase tracking-wider text-brand font-semibold">Касса для Windows</span>
|
||||
<h2 class="text-3xl font-bold mt-2">Кассовая программа с поддержкой торговых весов</h2>
|
||||
<h2 class="text-3xl font-bold mt-2">Кассовая программа с поддержкой весов Масса-К</h2>
|
||||
<p class="mt-4 text-slate-600">
|
||||
Установщик для Windows 10/11. Работает офлайн, синхронизируется с админкой,
|
||||
принимает Kaspi Pay, печатает фискальные чеки в ОФД РК.
|
||||
|
|
@ -139,24 +134,19 @@ const integrations = [
|
|||
<span class="px-5 py-3 border border-slate-300 text-sm font-semibold rounded-md text-slate-400 cursor-not-allowed" title="В разработке">Скачать установщик</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="aspect-video rounded-xl border border-slate-200 bg-cover bg-center relative overflow-hidden shadow-xl" style="background-image: url('/photos/pos-hero.jpg')">
|
||||
<div class="absolute inset-0 bg-slate-900/30"></div>
|
||||
<div class="absolute bottom-4 left-4 right-4 bg-white/95 backdrop-blur rounded-md px-4 py-3 text-sm">
|
||||
<strong class="text-brand">Касса для Windows</strong> · работает офлайн, поддерживает торговые весы и Kaspi Pay
|
||||
</div>
|
||||
<div class="aspect-video rounded-xl border border-slate-200 bg-slate-900 flex items-center justify-center text-slate-500 text-sm">
|
||||
Видео работы кассы · скоро
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* 7. Интеграции */}
|
||||
<section class="relative py-14 overflow-hidden">
|
||||
<img src="/photos/integrations.jpg" alt="" class="absolute inset-0 w-full h-full object-cover opacity-15" />
|
||||
<div class="absolute inset-0 bg-gradient-to-b from-slate-50/95 via-white/90 to-slate-50/95"></div>
|
||||
<div class="relative max-w-7xl mx-auto px-4 sm:px-6">
|
||||
<section class="bg-slate-50 py-14">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6">
|
||||
<h2 class="text-3xl font-bold text-center mb-2">Интеграции</h2>
|
||||
<p class="text-center text-slate-500 mb-8">Кассы, банки, ОФД, маркетплейсы. Подключаем по запросу.</p>
|
||||
<div class="flex flex-wrap justify-center gap-3">
|
||||
{integrations.map((label) => (
|
||||
<span class="px-4 py-2 bg-white border border-slate-200 rounded-md text-sm font-medium shadow-sm">{label}</span>
|
||||
<span class="px-4 py-2 bg-white border border-slate-200 rounded-md text-sm font-medium">{label}</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -226,13 +216,11 @@ const integrations = [
|
|||
</section>
|
||||
|
||||
{/* 11. Финальный CTA */}
|
||||
<section class="relative py-20 overflow-hidden">
|
||||
<img src="/photos/cta-banner.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-emerald-700/75"></div>
|
||||
<div class="relative max-w-3xl mx-auto px-4 sm:px-6 text-center">
|
||||
<h2 class="text-3xl sm:text-4xl font-extrabold text-white drop-shadow">Запустите магазин за 15 минут</h2>
|
||||
<p class="mt-3 text-emerald-50 text-lg">Регистрация — минута. Импорт товаров — десять минут. Касса работает на следующий день.</p>
|
||||
<a href="/signup" class="inline-block mt-7 px-7 py-3 bg-white text-brand font-bold rounded-md shadow-lg hover:bg-emerald-50">Начать бесплатно — 90 дней</a>
|
||||
<section class="bg-brand-light/30 py-16">
|
||||
<div class="max-w-3xl mx-auto px-4 sm:px-6 text-center">
|
||||
<h2 class="text-3xl sm:text-4xl font-extrabold">Запустите магазин за 15 минут</h2>
|
||||
<p class="mt-3 text-slate-600">Регистрация — минута. Импорт товаров — десять минут. Касса работает на следующий день.</p>
|
||||
<a href="/signup" class="inline-block mt-7 px-7 py-3 bg-brand text-white font-semibold rounded-md hover:bg-brand-hover">Начать бесплатно — 90 дней</a>
|
||||
</div>
|
||||
</section>
|
||||
</BaseLayout>
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ const groups = [
|
|||
{ title: 'Платёжные системы', items: ['Kaspi Pay', 'Halyk Bank', 'Jusan Bank', 'Forte Bank'] },
|
||||
{ title: 'Фискализация', items: ['ОФД РК (все операторы)', 'Чековые принтеры ESC/POS'] },
|
||||
{ title: 'Маркетплейсы (скоро)', items: ['Kaspi Magazin', 'Ozon', 'Wildberries'] },
|
||||
{ title: 'Учётные системы', items: ['Импорт из других систем по API', 'Excel/CSV-импорт', 'Выгрузка 1С (XML/Excel)'] },
|
||||
{ title: 'Оборудование', items: ['Электронные торговые весы (USB/COM)', 'Сканеры штрихкодов USB', 'Денежные ящики', 'Дисплей покупателя'] },
|
||||
{ title: 'Учётные системы', items: ['другие системы (импорт каталога)', 'Excel CSV-импорт'] },
|
||||
{ title: 'Оборудование', items: ['Весы Масса-К (USB/COM)', 'Сканеры штрихкодов USB', 'Денежные ящики', 'Дисплей покупателя'] },
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Интеграции" description="Кассы, банки, ОФД, маркетплейсы, учётные системы — все интеграции Food Market.">
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
||||
const features = [
|
||||
{ icon: '⚖️', title: 'Нативная поддержка торговых весов', text: 'Подключите весы к компьютеру кассира — Food Market распознаёт их автоматически. Поддерживаются электронные весы стандартных протоколов через RS-232 или USB-COM. Никаких сторонних драйверов.' },
|
||||
{ icon: '⚖️', title: 'Нативная поддержка весов Масса-К', text: 'Подключите весы к компьютеру кассира — Food Market распознаёт их автоматически. Поддерживаемые модели: МК-А, МК-В, MK-T, MK-D и совместимые. Подключение через RS-232 или USB-COM. Никаких сторонних драйверов.' },
|
||||
{ icon: '📡', title: 'Офлайн-режим без потери данных', text: 'Интернет пропал — касса продолжает работать. Все чеки записываются локально. Когда связь вернётся — данные подтянутся в облако автоматически.' },
|
||||
{ icon: '🛒', title: 'Сканеры штрихкодов любых производителей', text: 'Поддерживаем все стандартные модели работающие как клавиатура (HID-эмуляция). Подключили — и работает. EAN-13/EAN-8/Code128/Datamatrix.' },
|
||||
{ icon: '🖨️', title: 'Печать чеков на ОКП-совместимом оборудовании', text: 'Любые ОКП РК совместимые принтеры. Драйверы устанавливаются автоматически.' },
|
||||
|
|
@ -11,7 +11,7 @@ const features = [
|
|||
]
|
||||
const hardware = [
|
||||
['Компьютер', 'Windows 10+ (32/64 bit), 4 GB RAM, 5 GB на диске'],
|
||||
['Весы', 'Электронные торговые весы стандартных протоколов (RS-232/USB)'],
|
||||
['Весы', 'Масса-К: МК-А, МК-В, MK-T, MK-D (RS-232/USB)'],
|
||||
['Сканер штрихкодов', 'Любой HID-совместимый USB-сканер'],
|
||||
['Чековый принтер', 'Любой ОКП РК совместимый принтер'],
|
||||
['Денежный ящик', 'Подключение через принтер чеков (RJ-11)'],
|
||||
|
|
@ -25,34 +25,23 @@ const steps = [
|
|||
['Откройте смену', 'И пробивайте первый чек'],
|
||||
]
|
||||
---
|
||||
<BaseLayout title="Касса для Windows" description="Кассовая программа Food Market для Windows: поддержка торговых весов, офлайн-режим, фискальные чеки ОФД РК, Kaspi Pay." ogImage="/og/pos.png">
|
||||
<section class="relative overflow-hidden">
|
||||
<img src="/photos/pos-hero.jpg" alt="" class="absolute inset-0 w-full h-full object-cover" />
|
||||
<div class="absolute inset-0 bg-gradient-to-r from-slate-900/85 via-slate-900/65 to-slate-900/35"></div>
|
||||
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 py-20 lg:py-28">
|
||||
<div class="max-w-2xl bg-white/95 backdrop-blur p-8 rounded-2xl shadow-2xl border border-slate-200">
|
||||
<span class="inline-block text-xs uppercase tracking-wider text-brand font-semibold">Касса</span>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Касса для Windows<br/>с поддержкой торговых весов</h1>
|
||||
<p class="mt-4 text-slate-600">
|
||||
Установите за 5 минут. Работайте офлайн. Подключайте стандартное оборудование без переходников и сторонних драйверов.
|
||||
</p>
|
||||
<div class="mt-7 flex gap-3 flex-wrap">
|
||||
<span class="px-5 py-3 bg-slate-200 text-slate-500 rounded-md font-semibold cursor-not-allowed" title="В разработке">Скачать кассу (Windows 10+)</span>
|
||||
<a href="/pricing" class="px-5 py-3 border border-slate-300 rounded-md font-semibold hover:bg-slate-50">Тарифы</a>
|
||||
</div>
|
||||
<BaseLayout title="Касса для Windows" description="Кассовая программа Food Market для Windows: поддержка весов Масса-К, офлайн-режим, фискальные чеки ОФД РК, Kaspi Pay.">
|
||||
<section class="bg-gradient-to-br from-brand-light/40 via-white to-white">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 py-14">
|
||||
<span class="inline-block text-xs uppercase tracking-wider text-brand font-semibold">Касса</span>
|
||||
<h1 class="text-4xl font-extrabold mt-2">Касса для Windows<br/>с поддержкой весов Масса-К</h1>
|
||||
<p class="mt-4 max-w-xl text-slate-600">
|
||||
Установите за 5 минут. Работайте офлайн. Подключайте стандартное оборудование без переходников и сторонних драйверов.
|
||||
</p>
|
||||
<div class="mt-7 flex gap-3">
|
||||
<span class="px-5 py-3 bg-slate-200 text-slate-500 rounded-md font-semibold cursor-not-allowed" title="В разработке">Скачать кассу (Windows 10+)</span>
|
||||
<a href="/pricing" class="px-5 py-3 border border-slate-300 rounded-md font-semibold hover:bg-slate-50">Тарифы</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="max-w-7xl mx-auto px-4 sm:px-6 py-14">
|
||||
<div class="rounded-xl border border-slate-200 bg-slate-50 p-3 sm:p-6 shadow-lg">
|
||||
<div class="bg-slate-200 rounded-t-md px-3 py-2 flex gap-1.5 items-center">
|
||||
<span class="w-2.5 h-2.5 rounded-full bg-red-400"></span>
|
||||
<span class="w-2.5 h-2.5 rounded-full bg-yellow-400"></span>
|
||||
<span class="w-2.5 h-2.5 rounded-full bg-green-400"></span>
|
||||
</div>
|
||||
<img src="/screenshots/supply-form.png" alt="Окно приёмки в Food Market" class="w-full block rounded-b-md" loading="lazy" />
|
||||
</div>
|
||||
<div class="aspect-video rounded-xl bg-slate-900 flex items-center justify-center text-slate-500">Видео работы кассы · скоро</div>
|
||||
</section>
|
||||
|
||||
<section class="max-w-7xl mx-auto px-4 sm:px-6 py-12">
|
||||
|
|
|
|||
|
|
@ -2,15 +2,10 @@
|
|||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
||||
import BusinessTariffBuilder from '@/components/BusinessTariffBuilder.tsx'
|
||||
---
|
||||
<BaseLayout title="Тарифы" description="Простые тарифы Food Market: Старт от 5 000 ₸/мес, Бизнес-конструктор, Сеть по запросу. 90 дней бесплатно без банковской карты." ogImage="/og/pricing.png">
|
||||
<section class="bg-gradient-to-br from-emerald-500 via-emerald-600 to-emerald-700 text-white py-16">
|
||||
<div class="max-w-6xl mx-auto px-4 sm:px-6 text-center">
|
||||
<h1 class="text-4xl lg:text-5xl font-extrabold drop-shadow">Прозрачные тарифы Food Market</h1>
|
||||
<p class="text-emerald-50 mt-4 text-lg">Никаких скрытых доплат. CRM, финансы, лояльность — во всех тарифах.</p>
|
||||
<p class="text-emerald-100/90 mt-2 text-sm">90 дней бесплатно. Без банковской карты. Отмена в любой момент.</p>
|
||||
</div>
|
||||
</section>
|
||||
<BaseLayout title="Тарифы" description="Простые тарифы Food Market: Старт от 5 000 ₸/мес, Бизнес-конструктор, Сеть по запросу. 90 дней бесплатно без банковской карты.">
|
||||
<section class="max-w-6xl mx-auto px-4 sm:px-6 py-12">
|
||||
<h1 class="text-4xl font-extrabold text-center">Тарифы Food Market</h1>
|
||||
<p class="text-center text-slate-500 mt-3">Никаких скрытых доплат. CRM, финансы, лояльность включены во все тарифы.</p>
|
||||
|
||||
<div class="grid lg:grid-cols-3 gap-5 mt-10">
|
||||
<div class="rounded-xl border border-slate-200 p-6 bg-white">
|
||||
|
|
@ -21,8 +16,8 @@ import BusinessTariffBuilder from '@/components/BusinessTariffBuilder.tsx'
|
|||
<li>✓ 1 магазин · 1 касса · 1 склад</li>
|
||||
<li>✓ 2 сотрудника</li>
|
||||
<li>✓ Без лимита товаров</li>
|
||||
<li>✓ Касса с поддержкой торговых весов</li>
|
||||
<li>✓ Импорт из других систем</li>
|
||||
<li>✓ Касса с весами Масса-К</li>
|
||||
<li>✓ Импорт из другие системы</li>
|
||||
<li>✓ Интеграции Kaspi / ОФД</li>
|
||||
<li class="text-slate-400">— API</li>
|
||||
<li class="text-slate-400">— SLA</li>
|
||||
|
|
|
|||