commit ee65d915bcafddb47ef91a0a6daf07f3ee9d5a84 Author: kudindmitriy Date: Sun Apr 19 16:47:30 2026 +0300 Initial commit diff --git a/.env b/.env new file mode 100644 index 0000000..933542e --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ + + VITE_API_URL=https://dev.api.webild.io + VITE_PROJECT_ID=072acb1a-1bd1-496c-9bc4-018eee053fd6 + \ No newline at end of file diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..a5ace31 --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,46 @@ +name: Code Check + +on: + workflow_dispatch: + +jobs: + check: + runs-on: ubuntu-latest + + steps: + - name: Checkout + run: git clone --depth 1 --branch ${{ gitea.ref_name }} ${{ gitea.server_url }}/${{ gitea.repository }}.git . || exit 1 + + - name: Install dependencies + run: | + if [ -f "vite.config.ts" ]; then + if [ -d "/var/node_modules_cache_v4/node_modules" ]; then + ln -s /var/node_modules_cache_v4/node_modules ./node_modules + elif [ -f "pnpm-lock.yaml" ]; then + npm install -g pnpm --silent + pnpm install --frozen-lockfile + else + npm ci --prefer-offline --no-audit + fi + elif [ -d "/var/node_modules_cache/node_modules" ]; then + ln -s /var/node_modules_cache/node_modules ./node_modules + else + npm ci --prefer-offline --no-audit + fi + timeout-minutes: 5 + + - name: TypeScript check + run: npm run typecheck 2>&1 | tee build.log + timeout-minutes: 3 + + - name: ESLint check + run: npm run lint 2>&1 | tee -a build.log + timeout-minutes: 3 + + - name: Upload build log on failure + if: failure() + uses: actions/upload-artifact@v3 + with: + name: build-log + path: build.log + retention-days: 1 diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..bcf6fac --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,453 @@ +import AboutTestimonial from '@/components/sections/about/AboutTestimonial'; +import ContactSplitEmail from '@/components/sections/contact/ContactSplitEmail'; +import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia'; +import FeaturesBento from '@/components/sections/features/FeaturesBento'; +import FooterSimpleReveal from '@/components/sections/footer/FooterSimpleReveal'; +import HeroSplitTestimonial from '@/components/sections/hero/HeroSplitTestimonial'; +import MetricsMinimalCards from '@/components/sections/metrics/MetricsMinimalCards'; +import NavbarCentered from '@/components/ui/NavbarCentered'; +import PricingSplitCards from '@/components/sections/pricing/PricingSplitCards'; +import ProductRatingCards from '@/components/sections/product/ProductRatingCards'; +import TestimonialAvatarCard from '@/components/sections/testimonial/TestimonialAvatarCard'; +import { Sparkles, Star, User, Zap } from "lucide-react"; + +export default function App() { + return ( + <> + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + + ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..560a6a0 --- /dev/null +++ b/src/index.css @@ -0,0 +1,176 @@ +@import url('https://fonts.googleapis.com/css2?family=${figtree.variable}:wght@400;500;600;700&display=swap'); +@import "tailwindcss"; +@import "./styles/masks.css"; +@import "./styles/animations.css"; + +:root { + /* @colorThemes/lightTheme/grayBlueAccent */ + --background: #000000; + --card: #481f1f; + --foreground: #ffffff; + --primary-cta: #ffffff; + --primary-cta-text: #280101; + --secondary-cta: #361311; + --secondary-cta-text: #f6d4d4; + --accent: #51000b; + --background-accent: #ff2231; + + /* @layout/border-radius/rounded */ + --radius: 0.5rem; + + /* @layout/content-width/medium */ + --width-content-width: clamp(40rem, 80vw, 100rem); + + /* @utilities/masks */ + --vw-1_5: 1.5vw; + --width-x-padding-mask-fade: 5vw; + + /* @layout/carousel */ + --width-carousel-padding: calc((100vw - var(--width-content-width)) / 2 + 1px - var(--vw-1_5)); + --width-carousel-padding-controls: calc((100vw - var(--width-content-width)) / 2 + 1px); + --width-carousel-item-2: calc(var(--width-content-width) / 2 - var(--vw-1_5) / 2); + --width-carousel-item-3: calc(var(--width-content-width) / 3 - var(--vw-1_5) / 3 * 2); + --width-carousel-item-4: calc(var(--width-content-width) / 4 - var(--vw-1_5) / 4 * 3); + + /* @typography/text-sizing/medium */ + --text-2xs: clamp(0.465rem, 0.62vw, 0.62rem); + --text-xs: clamp(0.54rem, 0.72vw, 0.72rem); + --text-sm: clamp(0.615rem, 0.82vw, 0.82rem); + --text-base: clamp(0.69rem, 0.92vw, 0.92rem); + --text-lg: clamp(0.75rem, 1vw, 1rem); + --text-xl: clamp(0.825rem, 1.1vw, 1.1rem); + --text-2xl: clamp(0.975rem, 1.3vw, 1.3rem); + --text-3xl: clamp(1.2rem, 1.6vw, 1.6rem); + --text-4xl: clamp(1.5rem, 2vw, 2rem); + --text-5xl: clamp(2.025rem, 2.75vw, 2.75rem); + --text-6xl: clamp(2.475rem, 3.3vw, 3.3rem); + --text-7xl: clamp(3rem, 4vw, 4rem); + --text-8xl: clamp(3.5rem, 4.5vw, 4.5rem); + --text-9xl: clamp(5.25rem, 7vw, 7rem); +} + +/* @typography/text-sizing/medium (mobile) */ +@media (max-width: 768px) { + :root { + --text-2xs: 2.5vw; + --text-xs: 2.75vw; + --text-sm: 3vw; + --text-base: 3.25vw; + --text-lg: 3.5vw; + --text-xl: 4.25vw; + --text-2xl: 5vw; + --text-3xl: 6vw; + --text-4xl: 7vw; + --text-5xl: 7.5vw; + --text-6xl: 8.5vw; + --text-7xl: 10vw; + --text-8xl: 12vw; + --text-9xl: 14vw; + --width-content-width: 80vw; + --width-carousel-padding: calc((100vw - var(--width-content-width)) / 2 + 1px - var(--vw-1_5)); + --width-carousel-padding-controls: calc((100vw - var(--width-content-width)) / 2 + 1px); + --width-carousel-item-2: var(--width-content-width); + --width-carousel-item-3: var(--width-content-width); + --width-carousel-item-4: var(--width-content-width); + } +} + +@theme inline { + /* Colors */ + --color-background: var(--background); + --color-card: var(--card); + --color-foreground: var(--foreground); + --color-primary-cta: var(--primary-cta); + --color-primary-cta-text: var(--primary-cta-text); + --color-secondary-cta: var(--secondary-cta); + --color-secondary-cta-text: var(--secondary-cta-text); + --color-accent: var(--accent); + --color-background-accent: var(--background-accent); + + /* Fonts */ + --font-sans: '${figtree.variable}', sans-serif; + --font-mono: monospace; + + /* Border Radius */ + --radius: var(--radius); + --radius-lg: var(--radius); + --radius-md: calc(var(--radius) - 2px); + --radius-sm: calc(var(--radius) - 4px); + + /* Width */ + --width-content-width: var(--width-content-width); + --width-carousel-padding: var(--width-carousel-padding); + --width-carousel-padding-controls: var(--width-carousel-padding-controls); + --width-carousel-item-2: var(--width-carousel-item-2); + --width-carousel-item-3: var(--width-carousel-item-3); + --width-carousel-item-4: var(--width-carousel-item-4); + + /* Typography */ + --text-2xs: var(--text-2xs); + --text-xs: var(--text-xs); + --text-sm: var(--text-sm); + --text-base: var(--text-base); + --text-lg: var(--text-lg); + --text-xl: var(--text-xl); + --text-2xl: var(--text-2xl); + --text-3xl: var(--text-3xl); + --text-4xl: var(--text-4xl); + --text-5xl: var(--text-5xl); + --text-6xl: var(--text-6xl); + --text-7xl: var(--text-7xl); + --text-8xl: var(--text-8xl); + --text-9xl: var(--text-9xl); +} + +* { + scrollbar-width: thin; + scrollbar-color: rgba(255, 255, 255, 1) rgba(255, 255, 255, 0); +} + +html { + overscroll-behavior: none; + overscroll-behavior-y: none; +} + +body { + margin: 0; + background-color: var(--background); + color: var(--foreground); + font-family: '${figtree.variable}', sans-serif; + position: relative; + min-height: 100vh; + overscroll-behavior: none; + overscroll-behavior-y: none; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: '${figtree.variable}', sans-serif; +} + +/* WEBILD_CARD_STYLE */ +/* @cards/solid */ +.card { + background: var(--color-card); +} + +/* WEBILD_PRIMARY_BUTTON */ +/* @primaryButtons/depth-layers */ +.primary-button { + background: var(--color-primary-cta); + box-shadow: 0 1px 2px color-mix(in srgb, var(--color-primary-cta) 20%, transparent), 0 2px 4px color-mix(in srgb, var(--color-primary-cta) 20%, transparent), 0 4px 8px color-mix(in srgb, var(--color-primary-cta) 15%, transparent), 0 8px 16px color-mix(in srgb, var(--color-primary-cta) 10%, transparent), 0 16px 32px color-mix(in srgb, var(--color-primary-cta) 5%, transparent); +} + +/* WEBILD_SECONDARY_BUTTON */ +/* @secondaryButtons/radial-glow */ +.secondary-button { + background: + radial-gradient(circle at 0% 0%, color-mix(in srgb, var(--color-accent) 15%, transparent) 0%, transparent 40%), + radial-gradient(circle at 100% 100%, color-mix(in srgb, var(--color-accent) 15%, transparent) 0%, transparent 40%), + var(--color-secondary-cta); + box-shadow: 2.10837px 3.16256px 9.48767px color-mix(in srgb, var(--color-accent) 10%, transparent); +} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..3b38cdf --- /dev/null +++ b/vercel.json @@ -0,0 +1,10 @@ +{ + "buildCommand": "npm run build", + "outputDirectory": "dist", + "rewrites": [ + { + "source": "/(.*)", + "destination": "/index.html" + } + ] +} \ No newline at end of file