From 8e395aa8bb255f51bc68449e034b8a3b8e8e5770 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Sun, 30 Aug 2026 11:27:13 +0200 Subject: [PATCH] chore: some more dev stuff --- package-lock.json | 36 +- package.json | 6 +- src/App.css | 44 +- src/App.tsx | 114 ++-- src/components/DeveloperOnboardingModal.css | 113 ++++ src/components/DeveloperOnboardingModal.tsx | 564 ++++++++++++------ src/components/PluginCard.tsx | 56 +- src/components/RecoveryCodesModal.tsx | 70 +-- src/components/SecuritySetupCards.tsx | 2 +- src/locales/de.json | 38 +- src/locales/en.json | 38 +- src/locales/es.json | 38 +- src/locales/fr.json | 38 +- src/locales/it.json | 40 +- src/locales/ja.json | 38 +- src/locales/ko.json | 38 +- src/locales/nl.json | 40 +- src/locales/pl.json | 40 +- src/locales/pt.json | 38 +- src/locales/ru.json | 40 +- src/locales/tr.json | 38 +- src/locales/zh.json | 40 +- src/main.tsx | 17 +- src/pages/AuthorProfilePage.tsx | 116 +--- src/pages/PluginDetail.tsx | 3 +- src/pages/ProfilePage.tsx | 79 ++- src/pages/dashboard/Dashboard.css | 147 +++++ src/pages/dashboard/DashboardPlugins.tsx | 209 +++++-- src/pages/dashboard/plugin/AddPlugin.tsx | 39 +- src/pages/dashboard/plugin/ManagePlugin.css | 104 ++++ src/pages/dashboard/plugin/ManagePlugin.tsx | 108 +++- .../plugin/PublishReadinessModal.css | 277 +++++++++ .../plugin/PublishReadinessModal.tsx | 294 +++++++++ 33 files changed, 2239 insertions(+), 663 deletions(-) create mode 100644 src/pages/dashboard/plugin/PublishReadinessModal.css create mode 100644 src/pages/dashboard/plugin/PublishReadinessModal.tsx diff --git a/package-lock.json b/package-lock.json index 475eca6..09259c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,8 @@ "name": "client", "version": "0.0.0", "dependencies": { - "@fontsource/dm-sans": "^5.3.0", - "@fontsource/inter": "^5.3.0", - "@fontsource/jetbrains-mono": "^5.3.0", - "@fontsource/nunito": "^5.3.0", + "@fontsource-variable/inter": "^5.3.0", + "@fontsource-variable/jetbrains-mono": "^5.3.0", "@marsidev/react-turnstile": "^1.6.1", "@simplewebauthn/browser": "^13.3.0", "@vnedyalk0v/react19-simple-maps": "^2.0.10", @@ -426,37 +424,19 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@fontsource/dm-sans": { + "node_modules/@fontsource-variable/inter": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource/dm-sans/-/dm-sans-5.3.0.tgz", - "integrity": "sha512-lYJtMXXO28q1z+yz+z8XKd0s4hXaa9QdkETzkyD760sidCv5heI86weYA0sx0Nc4pAMAQTUuyf4gO44cYKKS9g==", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", + "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, - "node_modules/@fontsource/inter": { + "node_modules/@fontsource-variable/jetbrains-mono": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.3.0.tgz", - "integrity": "sha512-RofMylZmjlJEfELXeNHFWBRcSs75rGU/6bV2S2jfnvv/3rPXPGe0LgUJTklcHZ9lM4OZmAVFhcJPnACfb91A3g==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" - } - }, - "node_modules/@fontsource/jetbrains-mono": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.3.0.tgz", - "integrity": "sha512-fqDfB5I9f1p1TV486aUgB9t8zP84P0O1FtQR5Ol9vjwPy+S+EIGlVYm1cvj2W5shcZMTg2nZFdVMoH5wFu8a1A==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" - } - }, - "node_modules/@fontsource/nunito": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@fontsource/nunito/-/nunito-5.3.0.tgz", - "integrity": "sha512-vw9TaTQJ/zpEpKrsODuPmOvaVjXgdda6B+xXA4YqjrdeJ62MLgVoDerdRXFQHyBnSCt2yQ2nHKCHPP/Pv7Xq4Q==", + "resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.3.0.tgz", + "integrity": "sha512-F32xpS2NsGYoQi2ADSkKTgpJj7ozajsGgDJ8woTnqjmIB+dxDIqImjl4pXZVEExu8UFZ2ndhmX18EBS/hdz3Lw==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" diff --git a/package.json b/package.json index e172bd1..b9a25e4 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,8 @@ "preview": "vite preview" }, "dependencies": { - "@fontsource/dm-sans": "^5.3.0", - "@fontsource/inter": "^5.3.0", - "@fontsource/jetbrains-mono": "^5.3.0", - "@fontsource/nunito": "^5.3.0", + "@fontsource-variable/inter": "^5.3.0", + "@fontsource-variable/jetbrains-mono": "^5.3.0", "@marsidev/react-turnstile": "^1.6.1", "@simplewebauthn/browser": "^13.3.0", "@vnedyalk0v/react19-simple-maps": "^2.0.10", diff --git a/src/App.css b/src/App.css index 15636bc..8fc8a48 100644 --- a/src/App.css +++ b/src/App.css @@ -1212,16 +1212,14 @@ h3 { background: #16191f; border: 1px solid rgba(255, 255, 255, 0.07); cursor: pointer; - transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease; - will-change: transform; + transition: box-shadow 0.2s ease, border-color 0.2s ease; height: 100%; display: flex; flex-direction: column; } .plugin-card-v2:hover { - transform: translateY(-3px); - box-shadow: 0 16px 40px rgba(0, 0, 0, 0.45); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35); border-color: rgba(255, 255, 255, 0.14); } @@ -1239,11 +1237,7 @@ h3 { height: 100%; object-fit: cover; display: block; - transition: transform 0.35s ease, opacity 0.3s ease-in-out; -} - -.plugin-card-v2:hover .pcv2-preview-img { - transform: scale(1.04); + transition: opacity 0.3s ease-in-out; } .pcv2-preview-fallback { @@ -1386,16 +1380,6 @@ h3 { opacity: 0.6; } -.pcv2-accent-bar { - position: absolute; bottom: 0; left: 0; right: 0; - height: 2px; opacity: 0; - transition: opacity 0.2s ease; -} - -.plugin-card-v2:hover .pcv2-accent-bar { - opacity: 1; -} - .pcv2-sale-strip { background: linear-gradient(90deg, rgba(255, 107, 107, 0.15), rgba(255, 107, 107, 0.05)); border-top: 1px solid rgba(255, 107, 107, 0.2); @@ -1453,6 +1437,28 @@ h3 { box-shadow: 0 0 8px var(--primary); } +/* Video Showcase on Hover */ +.pcv2-video-container { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + z-index: 1; + background: #000; + overflow: hidden; +} + +.pcv2-video-iframe { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 100%; + transform: translate(-50%, -50%) scale(1.02); + border: none; + pointer-events: none; +} + @media (max-width: 768px) { .pcv2-preview-fallback { font-size: 2rem; diff --git a/src/App.tsx b/src/App.tsx index 485db1c..2d87830 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,34 +1,41 @@ -import React, { createContext, useContext, useState, useEffect } from 'react'; +import React, { createContext, useContext, useState, useEffect, Suspense } from 'react'; import { BrowserRouter as Router, Routes, Route, Link, NavLink, Outlet, Navigate, useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Store } from 'lucide-react'; -import Home from './pages/Home'; -import PluginDetail from './pages/PluginDetail'; -import LoginPage from './pages/auth/LoginPage'; -import RegisterPage from './pages/auth/RegisterPage'; -import ForgotPasswordPage from './pages/auth/ForgotPasswordPage'; -import ResetPasswordPage from './pages/auth/ResetPasswordPage'; -import VerifyEmailPage from './pages/auth/VerifyEmailPage'; -import ConfirmEmailChangePage from './pages/auth/ConfirmEmailChangePage'; -import CheckEmailPage from './pages/auth/CheckEmailPage'; -import ProfilePage from './pages/ProfilePage'; -import AuthorProfilePage from './pages/AuthorProfilePage'; -import SearchResultsPage from './pages/SearchResultsPage'; -import DashboardAudience from './pages/dashboard/DashboardAudience'; -import DashboardPlugins from './pages/dashboard/DashboardPlugins'; -import ManagePlugin from './pages/dashboard/plugin/ManagePlugin'; -import AddPlugin from './pages/dashboard/plugin/AddPlugin'; -import TermsOfServicePage from './pages/legal/TermsOfServicePage'; -import PrivacyPolicyPage from './pages/legal/PrivacyPolicyPage'; -import GuidelinesPage from './pages/legal/GuidelinesPage'; -import DeveloperTermsPage from './pages/legal/DeveloperTermsPage'; -import LegalNoticePage from './pages/legal/LegalNoticePage'; -import AdminPanel from './pages/admin/AdminPanel'; import { CookieBanner } from './components/CookieBanner'; import { openCookiePreferencesModal } from './utils/consent'; import { NavSearch } from './components/NavSearch'; import './App.css'; +// --- Lazy Loaded Pages --- +const Home = React.lazy(() => import('./pages/Home')); +const PluginDetail = React.lazy(() => import('./pages/PluginDetail')); +const LoginPage = React.lazy(() => import('./pages/auth/LoginPage')); +const RegisterPage = React.lazy(() => import('./pages/auth/RegisterPage')); +const ForgotPasswordPage = React.lazy(() => import('./pages/auth/ForgotPasswordPage')); +const ResetPasswordPage = React.lazy(() => import('./pages/auth/ResetPasswordPage')); +const VerifyEmailPage = React.lazy(() => import('./pages/auth/VerifyEmailPage')); +const ConfirmEmailChangePage = React.lazy(() => import('./pages/auth/ConfirmEmailChangePage')); +const CheckEmailPage = React.lazy(() => import('./pages/auth/CheckEmailPage')); +const ProfilePage = React.lazy(() => import('./pages/ProfilePage')); +const AuthorProfilePage = React.lazy(() => import('./pages/AuthorProfilePage')); +const SearchResultsPage = React.lazy(() => import('./pages/SearchResultsPage')); +const DashboardAudience = React.lazy(() => import('./pages/dashboard/DashboardAudience')); +const DashboardPlugins = React.lazy(() => import('./pages/dashboard/DashboardPlugins')); +const ManagePlugin = React.lazy(() => import('./pages/dashboard/plugin/ManagePlugin')); +const TermsOfServicePage = React.lazy(() => import('./pages/legal/TermsOfServicePage')); +const PrivacyPolicyPage = React.lazy(() => import('./pages/legal/PrivacyPolicyPage')); +const GuidelinesPage = React.lazy(() => import('./pages/legal/GuidelinesPage')); +const DeveloperTermsPage = React.lazy(() => import('./pages/legal/DeveloperTermsPage')); +const LegalNoticePage = React.lazy(() => import('./pages/legal/LegalNoticePage')); +const AdminPanel = React.lazy(() => import('./pages/admin/AdminPanel')); + +const PageLoader = () => ( +
+ Loading... +
+); + import api from './api'; // --- Scroll To Top Helper --- @@ -182,7 +189,7 @@ const App = () => ( } /> } /> } /> - } /> + } /> } /> @@ -195,7 +202,11 @@ const MainLayout = () => { return ( <> -
+
+ }> + + +