diff --git a/eslint.config.js b/eslint.config.js
index 0014edd..4816f0a 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -22,7 +22,8 @@ export default defineConfig(
rules: {
// typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects.
// see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors
- 'no-undef': 'off'
+ 'no-undef': 'off',
+ 'svelte/no-navigation-without-resolve': 'off'
}
},
{
diff --git a/package.json b/package.json
index cef5236..2773e9e 100644
--- a/package.json
+++ b/package.json
@@ -34,5 +34,9 @@
"typescript": "^6.0.2",
"typescript-eslint": "^8.58.1",
"vite": "^8.0.7"
+ },
+ "dependencies": {
+ "clsx": "^2.1.1",
+ "tailwind-merge": "^3.6.0"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6e31fc5..ccd7d4d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7,6 +7,13 @@ settings:
importers:
.:
+ dependencies:
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ tailwind-merge:
+ specifier: ^3.6.0
+ version: 3.6.0
devDependencies:
'@eslint/compat':
specifier: ^2.0.4
@@ -1254,6 +1261,9 @@ packages:
resolution: {integrity: sha512-fTjjT8cHLDwigcu2j3pv7Jq04LklXevPB8uBgyHNiTXv+RMNvVnrjS4UEYrLMkhuq1vpCodHjiW+z/95SDs/fg==}
engines: {node: '>=18'}
+ tailwind-merge@3.6.0:
+ resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==}
+
tailwindcss@4.3.0:
resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==}
@@ -2409,6 +2419,8 @@ snapshots:
transitivePeerDependencies:
- '@typescript-eslint/types'
+ tailwind-merge@3.6.0: {}
+
tailwindcss@4.3.0: {}
tapable@2.3.3: {}
diff --git a/src/lib/components/DashboardMockup.svelte b/src/lib/components/DashboardMockup.svelte
new file mode 100644
index 0000000..125095a
--- /dev/null
+++ b/src/lib/components/DashboardMockup.svelte
@@ -0,0 +1,138 @@
+
+
+
diff --git a/src/lib/components/DashboardStatus.svelte b/src/lib/components/DashboardStatus.svelte
new file mode 100644
index 0000000..b402a35
--- /dev/null
+++ b/src/lib/components/DashboardStatus.svelte
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+ FLAMY TRADE · СИГНАЛЫ
+
+
+
+
+ LIVE
+
+
+
+
+ ИНСТРУМЕНТ
+ КОНФИД.
+ ПРОГНОЗ
+
+
+ {#each signals as signal, i (signal.sym)}
+
+
+ {signal.sym}
+
+
+
+
+
+ {dirArrow[signal.dir]}
+ {dirLabel[signal.dir]}
+
+
+ {/each}
+
+
+
+
diff --git a/src/lib/components/layout/Footer.svelte b/src/lib/components/layout/Footer.svelte
new file mode 100644
index 0000000..f1c32ad
--- /dev/null
+++ b/src/lib/components/layout/Footer.svelte
@@ -0,0 +1,77 @@
+
+
+
diff --git a/src/lib/components/layout/Header.svelte b/src/lib/components/layout/Header.svelte
new file mode 100644
index 0000000..d2a8960
--- /dev/null
+++ b/src/lib/components/layout/Header.svelte
@@ -0,0 +1,32 @@
+
+
+
diff --git a/src/lib/components/ui/Button.svelte b/src/lib/components/ui/Button.svelte
new file mode 100644
index 0000000..3b9f982
--- /dev/null
+++ b/src/lib/components/ui/Button.svelte
@@ -0,0 +1,31 @@
+
+
+
+ {@render children()}
+
+ {#if variant === 'primary'}
+
+ {/if}
+
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
new file mode 100644
index 0000000..7637fb9
--- /dev/null
+++ b/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte
new file mode 100644
index 0000000..e72a629
--- /dev/null
+++ b/src/routes/+error.svelte
@@ -0,0 +1,12 @@
+
+
+
+
+ Страница не найдена
+ Возможно стр
+
+
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 0d8eb03..11a3483 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -1,9 +1,22 @@
-
+
+
+
+
+
+
+
+
+
{@render children()}
+
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index cc88df0..edf246e 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,2 +1,21 @@
-Welcome to SvelteKit
-Visit svelte.dev/docs/kit to read the documentation
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/routes/_sections/About.svelte b/src/routes/_sections/About.svelte
new file mode 100644
index 0000000..ca3e0ab
--- /dev/null
+++ b/src/routes/_sections/About.svelte
@@ -0,0 +1,35 @@
+
+
+
+
+
+
Дашборд
+
+ Все инструменты одним взглядом. Интерактивные графики, уровни входа и выхода, статистика
+ winrate — доступно без регистрации.
+
+
+ -
+
+ Интерактивные свечные графики с прогнозом
+
+ -
+
+ Уровни Entry · TP · SL на каждом графике
+
+ -
+
+ Поиск и фильтрация по направлению
+
+
+
+
+
+
+
+
+
+
diff --git a/src/routes/_sections/BlogPreview.svelte b/src/routes/_sections/BlogPreview.svelte
new file mode 100644
index 0000000..0300821
--- /dev/null
+++ b/src/routes/_sections/BlogPreview.svelte
@@ -0,0 +1,71 @@
+
+
+{#if posts.length > 0}
+
+{/if}
diff --git a/src/routes/_sections/Cta.svelte b/src/routes/_sections/Cta.svelte
new file mode 100644
index 0000000..7151e3a
--- /dev/null
+++ b/src/routes/_sections/Cta.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
НАЧАТЬ
+
+ ОТКРОЙТЕ
ДАШБОРД
+
+
+
+ Материалы носят исследовательский характер. Не являются инвестиционными рекомендациями.
+
+
+
diff --git a/src/routes/_sections/Features.svelte b/src/routes/_sections/Features.svelte
new file mode 100644
index 0000000..fde68c4
--- /dev/null
+++ b/src/routes/_sections/Features.svelte
@@ -0,0 +1,67 @@
+
+
+
+
+ ВОЗМОЖНОСТИ
+
+
+ {#each features as f}
+
+
+ {f.num}
+
+
+ {f.title}
+
+
+ {f.desc}
+
+
+ {/each}
+
+
+
diff --git a/src/routes/_sections/Hero.svelte b/src/routes/_sections/Hero.svelte
new file mode 100644
index 0000000..81173d8
--- /dev/null
+++ b/src/routes/_sections/Hero.svelte
@@ -0,0 +1,33 @@
+
+
+
+
+
+ Рыночный
+ прогноз
+ от ML-модели
+
+
+
+ Исторические свечи, прогнозная зона, уровни входа и выхода — всё на одном интерактивном
+ графике. Горизонт 19 свечей, таймфрейм 5M.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/routes/_sections/Stats.svelte b/src/routes/_sections/Stats.svelte
new file mode 100644
index 0000000..d0292ec
--- /dev/null
+++ b/src/routes/_sections/Stats.svelte
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ {#each stats as stat, i}
+
+
+
+
+
+ {stat.num}
+
+ {#if stat.suffix}
+
+ {stat.suffix}
+
+ {/if}
+
+
+
+ {stat.label}
+
+ {stat.sub}
+
+
+
+ {/each}
+
+
+
diff --git a/src/routes/_sections/Ticker.svelte b/src/routes/_sections/Ticker.svelte
new file mode 100644
index 0000000..0b1b02b
--- /dev/null
+++ b/src/routes/_sections/Ticker.svelte
@@ -0,0 +1,24 @@
+
+
+
+
+ {#each [0, 1] as _}
+ {#each items as item}
+ {item}
+ ·
+ {/each}
+ {/each}
+
+
diff --git a/src/routes/layout.css b/src/routes/layout.css
index d4b5078..15b0830 100644
--- a/src/routes/layout.css
+++ b/src/routes/layout.css
@@ -1 +1,80 @@
@import 'tailwindcss';
+
+@theme {
+ --font-display: 'Unbounded', sans-serif;
+ --font-sans: 'DM Sans', sans-serif;
+ --font-mono: 'JetBrains Mono', monospace;
+
+ --color-primary: #fe4b07;
+ --color-primary-h: #c83e06; /* hover */
+ --color-bg: #09080a;
+ --color-bg-e: #0f0e10; /* elevated */
+ --color-bg-c: #141318; /* card */
+ --color-bg-h: #1a191e; /* hover */
+ --color-title: #f0ede6;
+ --color-desc: #8a887f;
+}
+
+@layer base {
+ *,
+ *::before,
+ *::after {
+ box-sizing: border-box;
+ }
+ main {
+ overflow: hidden;
+ }
+ html {
+ background: #09080a;
+ color: #f0ede6;
+ font-family: var(--font-sans), sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ scroll-behavior: smooth;
+ }
+ ::selection {
+ background: rgba(255, 69, 0, 0.5);
+ color: #f0ede6;
+ }
+ :focus-visible {
+ outline: 1px solid #ff4500;
+ outline-offset: 3px;
+ }
+
+ section {
+ @apply relative mx-auto max-w-400 min-h-175 max-h-300;
+ }
+}
+
+@layer utilities {
+}
+
+@keyframes ticker {
+ to {
+ transform: translateX(-50%);
+ }
+}
+
+@layer components {
+ .nav-btn {
+ @apply rounded-xl bg-primary px-5 py-3 font-display text-base font-normal hover:bg-primary-h;
+ }
+ .nav-link {
+ @apply font-display text-base font-normal hover:text-desc;
+ }
+
+ .noise {
+ pointer-events: none;
+ position: absolute;
+ inset: 0;
+ z-index: 10;
+ background-image: url('/images/noise.png');
+ background-repeat: repeat;
+ opacity: 0.14;
+ mix-blend-mode: screen;
+ }
+
+ .ticker-track {
+ animation: ticker 22s linear infinite;
+ }
+}
diff --git a/static/images/icons/arrow-right.svg b/static/images/icons/arrow-right.svg
new file mode 100644
index 0000000..97ffd3e
--- /dev/null
+++ b/static/images/icons/arrow-right.svg
@@ -0,0 +1,4 @@
+
diff --git a/static/images/noise.png b/static/images/noise.png
new file mode 100644
index 0000000..e7fda5b
Binary files /dev/null and b/static/images/noise.png differ