<!DOCTYPE html>
<html lang="en" data-env="production">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="alternate" href="https://aiexotic.com" hreflang="en" />
<link rel="alternate" href="/es" hreflang="es" />
<link rel="alternate" href="/zh" hreflang="zh-Hans" />
<link rel="alternate" href="/ar" hreflang="ar" />
<link rel="alternate" href="/pt" hreflang="pt" />
<link rel="alternate" href="/ru" hreflang="ru" />
<link rel="alternate" href="/ja" hreflang="ja" />
<link rel="alternate" href="/de" hreflang="de" />
<link rel="alternate" href="/fr" hreflang="fr" />
<link rel="alternate" href="/ms" hreflang="ms" />
<link rel="alternate" href="/it" hreflang="it" />
<link rel="alternate" href="/ko" hreflang="ko" />
<link rel="alternate" href="/id" hreflang="id" />
<link rel="alternate" href="/tr" hreflang="tr" />
<link rel="alternate" href="/nl" hreflang="nl" />
<link rel="alternate" href="/pl" hreflang="pl" />
<link rel="alternate" href="/vi" hreflang="vi" />
<link rel="alternate" href="/bg" hreflang="bg" />
<link rel="alternate" href="/hi" hreflang="hi" />
<title>Free AI Porn Generator | AI NSFW & AI Hentai</title>
<meta name="title" content="Free AI Porn Generator | AI NSFW & AI Hentai">
<meta name="description" content="Generate the porn videos of your dreams with the power of artificial intelligence.">
<meta name="keywords" content="Porn AI,Porn Picture Generator,AI Porn,ai hentai,ai anime,ai porno,ai sex,free ai porn,Porn,Image generation,AI-powered images,Customized images,Artificially intelligent images,Stable diffusion,Personalized images">
<meta property="og:type" content="website">
<meta property="og:url" content="https://aiexotic.com"/>
<meta property="og:locale" content="en"/>
<meta property="og:title" content="Free AI Porn Generator | AI NSFW & AI Hentai"/>
<meta property="og:description" content="Generate the porn videos of your dreams with the power of artificial intelligence.">
<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:url" content="https://aiexotic.com">
<meta name="twitter:title" content="Free AI Porn Generator | AI NSFW & AI Hentai">
<meta name="twitter:description" content="Generate the porn videos of your dreams with the power of artificial intelligence.">
<!-- CSRF Token -->
<meta name="csrf-token" content="SlOZrtNwh6IRM1K40yg8rlKHzcXnoYGJZLlcGXnb">
<!-- Favicon -->
<link rel="shortcut icon" href="/images/favicon/favicon.ico">
<!-- Fonts -->
<link
rel="preload"
as="style"
href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap">
<style type="text/css">@font-face {font-family:DM Sans;font-style:normal;font-weight:400;src:url(/cf-fonts/v/dm-sans/5.0.18/latin-ext/wght/normal.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:DM Sans;font-style:normal;font-weight:400;src:url(/cf-fonts/v/dm-sans/5.0.18/latin/wght/normal.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:DM Sans;font-style:normal;font-weight:500;src:url(/cf-fonts/v/dm-sans/5.0.18/latin/wght/normal.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:DM Sans;font-style:normal;font-weight:500;src:url(/cf-fonts/v/dm-sans/5.0.18/latin-ext/wght/normal.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:DM Sans;font-style:normal;font-weight:700;src:url(/cf-fonts/v/dm-sans/5.0.18/latin-ext/wght/normal.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:DM Sans;font-style:normal;font-weight:700;src:url(/cf-fonts/v/dm-sans/5.0.18/latin/wght/normal.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:DM Sans;font-style:italic;font-weight:400;src:url(/cf-fonts/v/dm-sans/5.0.18/latin-ext/wght/italic.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:DM Sans;font-style:italic;font-weight:400;src:url(/cf-fonts/v/dm-sans/5.0.18/latin/wght/italic.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:DM Sans;font-style:italic;font-weight:500;src:url(/cf-fonts/v/dm-sans/5.0.18/latin-ext/wght/italic.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:DM Sans;font-style:italic;font-weight:500;src:url(/cf-fonts/v/dm-sans/5.0.18/latin/wght/italic.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:DM Sans;font-style:italic;font-weight:700;src:url(/cf-fonts/v/dm-sans/5.0.18/latin/wght/italic.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:DM Sans;font-style:italic;font-weight:700;src:url(/cf-fonts/v/dm-sans/5.0.18/latin-ext/wght/italic.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}</style>
<noscript>
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap" />
</noscript>
<!-- Styles -->
<script>
(function() {
var link = document.createElement('link');
link.rel = 'canonical';
link.href = window.location.origin + '/';
document.head.appendChild(link);
})();
</script>
<style >[wire\:loading], [wire\:loading\.delay], [wire\:loading\.inline-block], [wire\:loading\.inline], [wire\:loading\.block], [wire\:loading\.flex], [wire\:loading\.table], [wire\:loading\.grid], [wire\:loading\.inline-flex] {display: none;}[wire\:loading\.delay\.shortest], [wire\:loading\.delay\.shorter], [wire\:loading\.delay\.short], [wire\:loading\.delay\.long], [wire\:loading\.delay\.longer], [wire\:loading\.delay\.longest] {display:none;}[wire\:offline] {display: none;}[wire\:dirty]:not(textarea):not(input):not(select) {display: none;}input:-webkit-autofill, select:-webkit-autofill, textarea:-webkit-autofill {animation-duration: 50000s;animation-name: livewireautofill;}@keyframes livewireautofill { from {} }</style>
<style>
#modal-container-higher-than-18 {
position: fixed !important;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 99999;
display: flex;
align-items: center;
justify-content: center;
}
</style>
<!-- Scripts -->
<!-- Google tag (gtag.js) - Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-ZP9RM1S0WM"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-ZP9RM1S0WM');
</script>
<!-- End Google Tag Manager -->
<!-- Cookies -->
<script
async
type="text/javascript"
src="https://app.termly.io/embed.min.js"
data-auto-block="on"
data-website-uuid="7279f23c-8933-4b19-8cf9-ce363b88a126"
></script>
<!-- End Cookies -->
<!-- Scripts -->
<script src="/vendor/livewire/livewire.js?id=90730a3b0e7144480175" data-turbo-eval="false" data-turbolinks-eval="false" ></script><script data-turbo-eval="false" data-turbolinks-eval="false" >window.livewire = new Livewire();window.Livewire = window.livewire;window.livewire_app_url = '';window.livewire_token = 'SlOZrtNwh6IRM1K40yg8rlKHzcXnoYGJZLlcGXnb';window.deferLoadingAlpine = function (callback) {window.addEventListener('livewire:load', function () {callback();});};let started = false;window.addEventListener('alpine:initializing', function () {if (! started) {window.livewire.start();started = true;}});document.addEventListener("DOMContentLoaded", function () {if (! started) {window.livewire.start();started = true;}});</script>
<link rel="preload" as="style" href="/build/assets/app.a1ae07b3.css" /><link rel="modulepreload" href="/build/assets/app.1614b84a.js" /><link rel="stylesheet" href="/build/assets/app.a1ae07b3.css" /><script type="module" src="/build/assets/app.1614b84a.js"></script>
<link rel="preload" as="style" href="/build/assets/app.be190faf.css" /><link rel="stylesheet" href="/build/assets/app.be190faf.css" />
</head>
<body class="antialiased font-dmsans flex flex-col min-h-screen">
<div id="modal-container-higher-than-18">
<div id="modal-higher-than-18">
<div
class="justify-center items-center flex overflow-x-hidden overflow-y-auto fixed inset-0 z-30 outline-none
focus:outline-none bg-black/20 backdrop-blur-lg transition-opacity duration-150 ease-in-out"
>
<div class="relative w-auto my-6 mx-auto max-w-3xl">
<div class="flex flex-col items-center justify-center mb-8">
<img src="/images/logo/150px.png" class="h-16 md:h-20 object-contain mb-2" alt="Aiexotic"/>
<div class="flex gap-2 group">
<span class="h-16 align-top flex text-5xl md:text-6xl bg-clip-text text-transparent bg-gradient-to-r from-teal-500 via-purple-500 to-orange-500 md:animate-text font-medium items-center text-anime-logo-hover">
aiexotic
</span>
</div>
</div>
<div class="mx-3 md:mx-0 border-0 rounded-lg shadow-2xl shadow-blue-400 relative flex flex-col
w-auto md:w-full
bg-black outline-none focus:outline-none">
<div class="flex flex-col items-center justify-center p-5 border-b border-solid border-slate-200 rounded-t">
<h3 class="text-xl md:text-3xl font-semibold text-white">
Are you over 18 years old ? </h3>
</div>
<div class="relative p-2 md:p-6 flex-auto">
<p class="my-1 md:my-4 text-slate-500 text-sm md:text-lg leading-relaxed text-white">
Our site allows to generate images and videos for adults via an artificial intelligence. </p>
<p class="my-1 md:my-4 text-slate-500 text-sm md:text-lg leading-relaxed text-white">
It's simple to use and creating your image takes just a few seconds! </p>
</div>
<div class="flex items-center justify-center p-2 md:p-6 border-t border-solid border-slate-200
rounded-b gap-4 md:gap-0">
<a
href="https://google.com"
class="text-red-500 background-transparent font-bold uppercase px-1 md:px-6 py-2 text-sm
outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
type="button"
>
No I'm leaving </a>
<button
class="bg-emerald-900 text-white active:bg-emerald-600 font-bold uppercase text-sm px-3
md:px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
type="button"
id="allow-higher-than-18"
>
I am 18 or older - enter </button>
</div>
</div>
</div>
</div>
<div class="opacity-25 fixed inset-0 z-20 bg-black"></div>
</div>
</div>
<div class="relative z-50 flex-shrink-0" x-data="{ isMenuOpen: false }">
<div class="max-w-8xl mx-auto px-1.5 sm:px-6 bg-black">
<div class="flex flex-nowrap justify-between items-center py-2 md:space-x-10">
<div class="flex justify-start lg:w-0 lg:w-1/3">
<div class="flex items-center">
<div class="flex items-center">
<img src="/images/logo/150px.png" class="h-7 md:h-9 object-contain mt-1.5 md:mt-0.5 mr-2"
alt=""/>
<div class="flex gap-2 group">
<a href="https://aiexotic.com" class="h-8 align-top flex text-3xl md:text-4xl
bg-clip-text text-transparent bg-gradient-to-r from-teal-500 via-purple-500 to-orange-500
md:animate-text font-medium
items-center text-anime-logo-hover
">
aiexotic
</a>
</div>
</div>
<div class="hidden md:flex items-center ml-1 md:ml-4 gap-0.5 md:gap-1">
<a class="inline-block text-white no-underline hover:text-pink-500 hover:text-underline text-center
transform scale-90 hover:scale-110 duration-100 ease-in-out"
href="https://discord.gg/8NMpzTsja4"
target="_blank"
>
<div title="" class="h-6 w-6 text-white" class="text-white">
<svg class="h-6 w-6 text-white" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-discord" viewBox="0 0 16 16">
<path d="M13.545 2.907a13.2 13.2 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.2 12.2 0 0 0-3.658 0 8 8 0 0 0-.412-.833.05.05 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.04.04 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032q.003.022.021.037a13.3 13.3 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019q.463-.63.818-1.329a.05.05 0 0 0-.01-.059l-.018-.011a9 9 0 0 1-1.248-.595.05.05 0 0 1-.02-.066l.015-.019q.127-.095.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.05.05 0 0 1 .053.007q.121.1.248.195a.05.05 0 0 1-.004.085 8 8 0 0 1-1.249.594.05.05 0 0 0-.03.03.05.05 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.2 13.2 0 0 0 4.001-2.02.05.05 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.03.03 0 0 0-.02-.019m-8.198 7.307c-.789 0-1.438-.724-1.438-1.612s.637-1.613 1.438-1.613c.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612m5.316 0c-.788 0-1.438-.724-1.438-1.612s.637-1.613 1.438-1.613c.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612"/>
</svg></div>
</a>
<a class="inline-block text-blue-300 no-underline hover:text-pink-500 hover:text-underline text-center
transform scale-90 hover:scale-110 duration-100 ease-in-out"
href="https://twitter.com/aiexoticdotcom"
target="_blank"
>
<svg class="fill-current h-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<path
d="M30.063 7.313c-.813 1.125-1.75 2.125-2.875 2.938v.75c0 1.563-.188 3.125-.688 4.625a15.088 15.088 0 0 1-2.063 4.438c-.875 1.438-2 2.688-3.25 3.813a15.015 15.015 0 0 1-4.625 2.563c-1.813.688-3.75 1-5.75 1-3.25 0-6.188-.875-8.875-2.625.438.063.875.125 1.375.125 2.688 0 5.063-.875 7.188-2.5-1.25 0-2.375-.375-3.375-1.125s-1.688-1.688-2.063-2.875c.438.063.813.125 1.125.125.5 0 1-.063 1.5-.25-1.313-.25-2.438-.938-3.313-1.938a5.673 5.673 0 0 1-1.313-3.688v-.063c.813.438 1.688.688 2.625.688a5.228 5.228 0 0 1-1.875-2c-.5-.875-.688-1.813-.688-2.75 0-1.063.25-2.063.75-2.938 1.438 1.75 3.188 3.188 5.25 4.25s4.313 1.688 6.688 1.813a5.579 5.579 0 0 1 1.5-5.438c1.125-1.125 2.5-1.688 4.125-1.688s3.063.625 4.188 1.813a11.48 11.48 0 0 0 3.688-1.375c-.438 1.375-1.313 2.438-2.563 3.188 1.125-.125 2.188-.438 3.313-.875z"
></path>
</svg>
</a>
<a class="inline-block text-blue-300 no-underline hover:text-pink-500 hover:text-underline text-center transform
scale-90 hover:scale-110 duration-100 ease-in-out"
href="https://www.reddit.com/r/aiexotic"
target="_blank"
>
<div title="" class="h-6 w-6 text-orange-600" class="text-orange-600">
<svg class="h-6 w-6 text-orange-600" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-reddit" viewBox="0 0 16 16">
<path d="M6.167 8a.83.83 0 0 0-.83.83c0 .459.372.84.83.831a.831.831 0 0 0 0-1.661m1.843 3.647c.315 0 1.403-.038 1.976-.611a.23.23 0 0 0 0-.306.213.213 0 0 0-.306 0c-.353.363-1.126.487-1.67.487-.545 0-1.308-.124-1.671-.487a.213.213 0 0 0-.306 0 .213.213 0 0 0 0 .306c.564.563 1.652.61 1.977.61zm.992-2.807c0 .458.373.83.831.83s.83-.381.83-.83a.831.831 0 0 0-1.66 0z"/>
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-3.828-1.165c-.315 0-.602.124-.812.325-.801-.573-1.9-.945-3.121-.993l.534-2.501 1.738.372a.83.83 0 1 0 .83-.869.83.83 0 0 0-.744.468l-1.938-.41a.2.2 0 0 0-.153.028.2.2 0 0 0-.086.134l-.592 2.788c-1.24.038-2.358.41-3.17.992-.21-.2-.496-.324-.81-.324a1.163 1.163 0 0 0-.478 2.224q-.03.17-.029.353c0 1.795 2.091 3.256 4.669 3.256s4.668-1.451 4.668-3.256c0-.114-.01-.238-.029-.353.401-.181.688-.592.688-1.069 0-.65-.525-1.165-1.165-1.165"/>
</svg></div>
</a>
</div>
</div>
</div>
<nav class="md:flex space-x-10 items-center md:w-4/6 justify-end tracking-wide">
<div class="flex flex-grow justify-end gap-x-3 md:gap-x-6 justify-items-center items-center">
<a href="/showcase"
class="transition-all duration-150 text-secondary-100 hover:text-white underline no-underline hidden sm:block py-2" size="none" mobile="mobile">
Showcase
</a>
<a href="/txt2img"
class="transition-all duration-150 text-secondary-100 hover:text-white underline no-underline hidden sm:block" size="none" mobile="mobile">
<div class="h-[32px] image-btn-container
py-0.5 px-2 text-sm md:py-1 md:px-4 md:text-base
inline-flex animate-bg-primary-switch-optimized text-white font-bold
rounded-md focus:ring transform hover:scale-105 transition duration-300 ease-in-out">
<div class="image-btn-content">
<span class="normal-text">IMAGE</span>
<span class="hover-text">CREATE</span>
</div>
</div>
</a>
<a href="/ai-video-generator"
class="transition-all duration-150 text-secondary-100 hover:text-white underline no-underline" size="none" mobile="mobile">
<div class="h-[26px] md:h-[32px] video-btn-container inline-flex rounded-md focus:ring transform hover:scale-105 transition duration-300 ease-in-out px-1 md:px-4">
<div class="video-btn-content">
<div class="video-icon">
<div title="" class="h-4 w-4" >
<svg class="h-4 w-4" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80L0 432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></div>
</div>
<div class="video-text">
<span>VIDEO</span>
</div>
<div class="hover-text">
<span>CREATE</span>
</div>
</div>
</div>
</a>
<a href="/characters"
class="transition-all duration-150 text-secondary-100 hover:text-white underline no-underline relative" size="none" mobile="mobile">
<div class="
py-0.5 px-2 text-sm md:py-1 md:px-3 md:text-base
inline-flex border border-purple-500 text-white font-bold
rounded-md focus:ring transform hover:scale-105 transition duration-300 ease-in-out">
<div class="absolute -top-3 -right-4 bg-primary rounded-full">
<div title="" class="h-6 w-6 text-purple-500" class="text-purple-500">
<svg class="h-6 w-6 text-purple-500" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-chat-heart" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M2.965 12.695a1 1 0 0 0-.287-.801C1.618 10.83 1 9.468 1 8c0-3.192 3.004-6 7-6s7 2.808 7 6-3.004 6-7 6a8 8 0 0 1-2.088-.272 1 1 0 0 0-.711.074c-.387.196-1.24.57-2.634.893a11 11 0 0 0 .398-2m-.8 3.108.02-.004c1.83-.363 2.948-.842 3.468-1.105A9 9 0 0 0 8 15c4.418 0 8-3.134 8-7s-3.582-7-8-7-8 3.134-8 7c0 1.76.743 3.37 1.97 4.6a10.4 10.4 0 0 1-.524 2.318l-.003.011a11 11 0 0 1-.244.637c-.079.186.074.394.273.362a22 22 0 0 0 .693-.125M8 5.993c1.664-1.711 5.825 1.283 0 5.132-5.825-3.85-1.664-6.843 0-5.132"/>
</svg></div>
</div>
<span>CHAT</span>
</div>
</a>
<a class="nav-link text-white font-bold" href="/login">Login</a>
</div>
</nav>
</div>
</div>
</div>
<div class="leading-normal tracking-normal text-indigo-400 bg-cover bg-fixed bg-black min-h-screen"
>
<div class="relative"
x-data="{
showRegister: false,
showLogin: false,
showForm() {
return this.showRegister || this.showLogin;
},
makeVisibleRegister(redirectUrlIfAuthenticated = null) {
fetch(`/save-intended-url?url=${redirectUrlIfAuthenticated}`, {
method: 'GET',
headers: {
'Accept': 'application/json',
}
})
.then(response => response.json())
.then(data => {
console.log('URL prévue sauvegardée');
})
.catch(error => {
console.error('Erreur lors de la sauvegarde de l\'URL prévue', error);
});
this.showRegister = true;
this.showLogin = false;
}
}"
>
<!-- Gradient supérieur renforcé -->
<div class="absolute -top-[3px] left-0 w-full h-[50px] bg-gradient-to-b from-black to-transparent z-10"></div>
<!-- Overlay du formulaire -->
<div x-cloak
x-show="showForm()"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 scale-90"
x-transition:enter-end="opacity-100 scale-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 scale-100"
x-transition:leave-end="opacity-0 scale-90"
x-transition.delay.50ms
class="fixed inset-0 bg-black/70 z-[9999] flex items-center justify-center">
<div class="w-full max-w-4xl mx-4" @click.away="showRegister = false; showLogin = false">
<div x-show="showRegister"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 scale-90"
x-transition:enter-end="opacity-100 scale-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 scale-100"
x-transition:leave-end="opacity-0 scale-90"
x-transition.delay.50ms
>
<div class="flex flex-col md:flex-row justify-center w-full max-w-3xl mx-auto" x-data="{}">
<!-- Vidéo (masquée sur mobile) -->
<div class="hidden md:block md:w-1/2 relative overflow-hidden rounded-l-3xl">
<video id="login-video" class="absolute inset-0 w-full h-full object-cover" muted loop autoplay playsinline>
<source src="/videos/login-video.mp4" type="video/mp4">
Your browser does not support the video tag. </video>
</div>
<!-- Formulaire -->
<div class="w-full md:w-1/2 bg-primary bg-opacity-90 backdrop-blur-md shadow-lg rounded-3xl md:rounded-l-none"
@click.away="showLogin = false;"
x-init="
$nextTick(() => {
const videoId = 'login-video';
const video = document.getElementById(videoId);
if (video) {
video.play().catch(e => console.error('Erreur de lecture vidéo:', e));
}
});
">
<div class="p-3 sm:p-10">
<div class="space-y-4">
<h2 class="text-2xl text-white font-bold">
<span class="text-4xl underline underline-offset-2">Login</span> to unlock the best of AiExotic </h2>
</div>
<form action="/magic-link" method="post">
<input type="hidden" name="_token" value="SlOZrtNwh6IRM1K40yg8rlKHzcXnoYGJZLlcGXnb" autocomplete="off">
<input type="hidden" name="timezone" class="timezone" id="timezone">
<div class="mt-6 md:mt-8 grid space-y-4">
<div class="flex-wrap items-center gap-2 pb-2">
<div class="flex gap-2 text-primary flex-col">
<label class="block tracking-wide text-secondary-100 select-none" for="email">
Email
</label>
<input
class="basic-input-text hover:border-cyan-800 rounded-md" id="email" name="email" type="email" required="required" placeholder="Enter your email">
</div>
</div>
</div>
<button type="submit"
class="group sign-button">
<div class="relative flex items-center space-x-4 justify-center">
<div title="" class="h-6 w-6 absolute left-0 w-5 text-white" alt="email" alt="email" class="absolute left-0 w-5 text-white">
<svg class="h-6 w-6 absolute left-0 w-5 text-white" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6zm-2 0l-8 5-8-5h16zm0 12H4V8l8 5 8-5v10z"/></svg></div>
<span href="" class="block w-max font-semibold tracking-wide text-white text-sm
transition duration-300 sm:text-base">
One-Click Email Login </span>
</div>
</button>
</form>
<div class="my-4 flex items-center before:mt-0.5 before:flex-1 before:border-t before:border-neutral-500
after:mt-0.5 after:flex-1 after:border-t after:border-neutral-500">
<p class="mx-4 mb-0 text-center font-semibold text-white">
Or </p>
</div>
<form class="mt-2 grid space-y-4" method="POST" action="/login/provider">
<input type="hidden" name="_token" value="SlOZrtNwh6IRM1K40yg8rlKHzcXnoYGJZLlcGXnb" autocomplete="off">
<input type="hidden" name="timezone" class="timezone" id="timezone">
<button name="provider" value="discord" type="submit" class="group sign-button">
<div class="relative flex items-center space-x-4 justify-center">
<img src="/images/services/discord.svg" class="absolute left-0
w-5" alt="discord logo" />
<span href="" class="block w-max font-semibold tracking-wide text-white text-sm
transition duration-300 sm:text-base">
Continue with Discord </span>
</div>
</button>
<button name="provider" value="google" type="submit"
class="group sign-button">
<div class="relative flex items-center space-x-4 justify-center">
<img src="/images/services/google.svg" class="absolute left-0 w-5" alt="google logo" />
<span class="block w-max font-semibold tracking-wide text-white text-sm transition duration-300 sm:text-base">
Continue with Google </span>
</div>
</button>
<button name="provider" value="reddit" type="submit" class="group sign-button">
<div class="relative flex items-center space-x-4 justify-center">
<img src="/images/services/reddit.svg" class="absolute left-0
w-5" alt="reddit logo" />
<span href="" class="block w-max font-semibold tracking-wide text-white text-sm transition duration-300 sm:text-base">
Continue with Reddit </span>
</div>
</button>
</form>
<div class="mt-2 md:mt-4 space-y-4 text-white text-center sm:-mb-8">
<p class="text-xs">
By clicking Continue with Discord, Google, Reddit or One-Click Email Login, you agree to our <span class="underline"><a href="/terms/conditions">Terms of Use</a></span> and confirm you have read our <span class="underline"><a href="/terms/privacy">Privacy Policy</a></span>.
</p>
</div>
</div>
</div>
</div>
</div>
<div x-show="showLogin" x-cloak
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 scale-90"
x-transition:enter-end="opacity-100 scale-100"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 scale-100"
x-transition:leave-end="opacity-0 scale-90"
>
<div class="flex flex-col md:flex-row justify-center w-full max-w-3xl mx-auto" x-data="{}">
<!-- Vidéo (masquée sur mobile) -->
<div class="hidden md:block md:w-1/2 relative overflow-hidden rounded-l-3xl">
<video id="login-video" class="absolute inset-0 w-full h-full object-cover" muted loop autoplay playsinline>
<source src="/videos/login-video.mp4" type="video/mp4">
Your browser does not support the video tag. </video>
</div>
<!-- Formulaire -->
<div class="w-full md:w-1/2 bg-primary bg-opacity-90 backdrop-blur-md shadow-lg rounded-3xl md:rounded-l-none"
@click.away="showLogin = false;"
x-init="
$nextTick(() => {
const videoId = 'login-video';
const video = document.getElementById(videoId);
if (video) {
video.play().catch(e => console.error('Erreur de lecture vidéo:', e));
}
});
">
<div class="p-3 sm:p-10">
<div class="space-y-4">
<h2 class="text-2xl text-white font-bold">
<span class="text-4xl underline underline-offset-2">Login</span> to unlock the best of AiExotic </h2>
</div>
<form action="/magic-link" method="post">
<input type="hidden" name="_token" value="SlOZrtNwh6IRM1K40yg8rlKHzcXnoYGJZLlcGXnb" autocomplete="off">
<input type="hidden" name="timezone" class="timezone" id="timezone">
<div class="mt-6 md:mt-8 grid space-y-4">
<div class="flex-wrap items-center gap-2 pb-2">
<div class="flex gap-2 text-primary flex-col">
<label class="block tracking-wide text-secondary-100 select-none" for="email">
Email
</label>
<input
class="basic-input-text hover:border-cyan-800 rounded-md" id="email" name="email" type="email" required="required" placeholder="Enter your email">
</div>
</div>
</div>
<button type="submit"
class="group sign-button">
<div class="relative flex items-center space-x-4 justify-center">
<div title="" class="h-6 w-6 absolute left-0 w-5 text-white" alt="email" alt="email" class="absolute left-0 w-5 text-white">
<svg class="h-6 w-6 absolute left-0 w-5 text-white" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6zm-2 0l-8 5-8-5h16zm0 12H4V8l8 5 8-5v10z"/></svg></div>
<span href="" class="block w-max font-semibold tracking-wide text-white text-sm
transition duration-300 sm:text-base">
One-Click Email Login </span>
</div>
</button>
</form>
<div class="my-4 flex items-center before:mt-0.5 before:flex-1 before:border-t before:border-neutral-500
after:mt-0.5 after:flex-1 after:border-t after:border-neutral-500">
<p class="mx-4 mb-0 text-center font-semibold text-white">
Or </p>
</div>
<form class="mt-2 grid space-y-4" method="POST" action="/login/provider">
<input type="hidden" name="_token" value="SlOZrtNwh6IRM1K40yg8rlKHzcXnoYGJZLlcGXnb" autocomplete="off">
<input type="hidden" name="timezone" class="timezone" id="timezone">
<button name="provider" value="discord" type="submit" class="group sign-button">
<div class="relative flex items-center space-x-4 justify-center">
<img src="/images/services/discord.svg" class="absolute left-0
w-5" alt="discord logo" />
<span href="" class="block w-max font-semibold tracking-wide text-white text-sm
transition duration-300 sm:text-base">
Continue with Discord </span>
</div>
</button>
<button name="provider" value="google" type="submit"
class="group sign-button">
<div class="relative flex items-center space-x-4 justify-center">
<img src="/images/services/google.svg" class="absolute left-0 w-5" alt="google logo" />
<span class="block w-max font-semibold tracking-wide text-white text-sm transition duration-300 sm:text-base">
Continue with Google </span>
</div>
</button>
<button name="provider" value="reddit" type="submit" class="group sign-button">
<div class="relative flex items-center space-x-4 justify-center">
<img src="/images/services/reddit.svg" class="absolute left-0
w-5" alt="reddit logo" />
<span href="" class="block w-max font-semibold tracking-wide text-white text-sm transition duration-300 sm:text-base">
Continue with Reddit </span>
</div>
</button>
</form>
<div class="mt-2 md:mt-4 space-y-4 text-white text-center sm:-mb-8">
<p class="text-xs">
By clicking Continue with Discord, Google, Reddit or One-Click Email Login, you agree to our <span class="underline"><a href="/terms/conditions">Terms of Use</a></span> and confirm you have read our <span class="underline"><a href="/terms/privacy">Privacy Policy</a></span>.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Contenu Principal -->
<div class="container mx-auto py-4 sm:py-6 lg:py-8 max-w-[1920px]">
<!-- Section Video -->
<section class="grid grid-cols-1 lg:grid-cols-2 gap-4 sm:gap-6 lg:gap-8 min-h-[50vh] lg:min-h-[85vh]">
<!-- Colonne de gauche avec le slider vidéo -->
<div class="lg:order-1 flex flex-col">
<!-- Title visible only on mobile -->
<div class="block lg:hidden mt-0.5 md:mt-3 mb-2 relative z-50">
<h1 class="text-4xl sm:text-5xl md:text-6xl font-bold text-primary-video pointer-events-none text-center">
AI PORN VIDEO GENERATOR </h1>
</div>
<!-- Video slider container -->
<div class="relative h-full min-h-full">
<div
x-data="{ currentVideo: $store.videoSlider.currentVideo }"
x-init="$store.videoSlider.init()"
class="relative h-full w-full overflow-hidden md:overflow-visible pt-2 md:pt-10 z-10">
<!-- Container des vidéos avec perspective -->
<div class="relative h-full w-full" style="perspective: 3000px;">
<!-- Vidéos -->
<template x-for="(video, index) in $store.videoSlider.videoData" :key="index">
<div :class="{
'absolute transition-all duration-[1500ms] ease-in-out rounded-[2rem] overflow-hidden shadow-2xl': true,
'-top-[3%] md:top-[0%] left-[50%] -translate-x-1/2 w-[70%] md:w-[50%] opacity-100 z-30 scale-100': $store.videoSlider.getVideoState(index) === 'current',
'top-[25%] md:top-[20%] left-0 -translate-x-[30%] w-[40%] md:w-[30%] opacity-60 md:opacity-80 z-20 scale-90 rotate-y-20': $store.videoSlider.getVideoState(index) === 'prev',
'top-[10%] left-[3%] -translate-x-[80%] w-[15%] md:w-[25%] opacity-0 md:opacity-10 z-10 scale-75 rotate-y-30': $store.videoSlider.getVideoState(index) === 'farPrev',
'top-[35%] md:top-[30%] left-[80%] w-[40%] md:w-[30%] opacity-60 md:opacity-40 z-20 scale-85 -rotate-y-15': $store.videoSlider.getVideoState(index) === 'next',
'top-[30%] -translate-y-1/2 left-full translate-x-[60%] w-[15%] md:w-[20%] opacity-0 md:opacity-10 z-10 scale-60 -rotate-y-40': $store.videoSlider.getVideoState(index) === 'farNext',
'top-[35%] -translate-y-1/2 left-full translate-x-[60%] w-[15%] md:w-[20%] opacity-0 z-0 scale-60 -rotate-y-40': $store.videoSlider.getVideoState(index) === 'hidden'
}"
style="transform-style: preserve-3d; backface-visibility: hidden; will-change: transform, opacity;"
@mouseover="$store.videoSlider.handleHover(index)"
@mouseout="$store.videoSlider.handleHoverEnd(index)">
<div class="relative aspect-[3/4] w-full">
<video :class="{
'w-full h-full object-cover transition-all duration-[1500ms] ease-in-out': true,
'opacity-0': $store.videoSlider.getVideoState(index) === 'hidden'
}"
:src="video.src"
:poster="video.poster"
:data-video-index="index"
:data-video-state="$store.videoSlider.getVideoState(index)"
muted
playsinline
preload="auto"
:autoplay="$store.videoSlider.getVideoState(index) === 'current'"></video>
<!-- Overlay gradient -->
<div :class="{
'absolute inset-0 bg-gradient-to-t pointer-events-none transition-opacity duration-1000': true,
'from-black/60 via-black/20 to-transparent': $store.videoSlider.getVideoState(index) === 'current',
'from-black/80 via-black/40 to-transparent': ['prev', 'next'].includes($store.videoSlider.getVideoState(index)),
'from-black/90 via-black/60 to-black/20': ['farPrev', 'farNext'].includes($store.videoSlider.getVideoState(index))
}"></div>
</div>
</div>
</template>
</div>
</div>
<style>
.rotate-y-10 {
transform: rotateY(10deg);
}
.-rotate-y-10 {
transform: rotateY(-10deg);
}
.rotate-y-15 {
transform: rotateY(15deg);
}
.-rotate-y-15 {
transform: rotateY(-15deg);
}
.rotate-y-20 {
transform: rotateY(20deg);
}
.-rotate-y-20 {
transform: rotateY(-20deg);
}
.rotate-y-30 {
transform: rotateY(30deg);
}
.-rotate-y-30 {
transform: rotateY(-30deg);
}
.rotate-y-40 {
transform: rotateY(40deg);
}
.-rotate-y-40 {
transform: rotateY(-40deg);
}
</style>
</div>
<!-- CTA visible only on mobile -->
<div class="block lg:hidden mt-4">
<div class="flex justify-center w-full pointer-events-auto opacity-80 hover:opacity-100 transition duration-300">
<button @click.prevent="makeVisibleRegister('/ai-video-generator')"
class="relative flex items-center gap-3 sm:gap-4 md:gap-6 bg-video-btn rounded-full hover:scale-105 transition duration-300 ease-in-out
py-3 px-6 sm:py-5 sm:px-7 md:py-6 md:px-8 shadow-xl">
<span class="text-lg sm:text-xl md:text-2xl text-white font-black tracking-wide">
Create My Video </span>
<div title="" class="h-6 w-6 text-white" class="text-white">
<svg class="h-6 w-6 text-white" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80L0 432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></div>
</button>
</div>
</div>
</div>
<!-- Colonne de droite avec le texte et CTA (visible only on desktop) -->
<div class="hidden lg:flex lg:order-2 flex-col justify-start h-full -mt-12 lg:mt-0">
<div class="flex flex-col items-center space-y-4 sm:space-y-6 lg:space-y-8 w-full">
<h1 class="text-4xl sm:text-5xl md:text-6xl lg:text-7xl xl:text-8xl font-bold text-primary-video z-[60] pointer-events-none text-center lg:text-left">
AI PORN VIDEO GENERATOR </h1>
<div class="flex justify-center w-full pointer-events-auto opacity-80 hover:opacity-100 transition duration-300">
<button @click.prevent="makeVisibleRegister('/ai-video-generator')"
class="group relative flex items-center gap-3 sm:gap-4 md:gap-6 bg-primary-video rounded-full hover:scale-105 transition duration-300 ease-in-out
py-3 px-6 sm:py-5 sm:px-7 md:py-6 md:px-8">
<span class="text-lg sm:text-xl md:text-2xl lg:text-3xl text-white font-black tracking-wide">
Create My Video </span>
<div title="" class="h-8 w-8 text-white" class="text-white">
<svg class="h-8 w-8 text-white" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc. --><path d="M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80L0 432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"/></svg></div>
</button>
</div>
</div>
</div>
</section>
<!-- Section Chat -->
<section class="relative mt-32 lg:-mt-32">
<div class="absolute inset-0 bg-gradient-to-r from-purple-900/20 via-pink-900/20 to-purple-900/20 blur-3xl"></div>
<div class="relative">
<div class="container mx-auto px-4 sm:px-6 lg:px-8 pt-16 pb-10">
<div class="flex flex-col lg:grid lg:grid-cols-2 gap-x-8 gap-y-8 lg:gap-y-16 lg:items-start">
<!-- Chat Demo - Appears first on mobile -->
<div class="order-1 lg:order-2 relative max-w-4xl mx-auto"
x-data="{
messages: JSON.parse('[{\u0022type\u0022:\u0022ai\u0022,\u0022text\u0022:\u0022Fuck, it\\u0027s you! I\\u0027ve been fantasizing about you all day... My pussy is soaked just thinking about your cock. I\\u0027m on fire, I need you.\u0022,\u0022visible\u0022:true},{\u0022type\u0022:\u0022user\u0022,\u0022text\u0022:\u0022Are you so hot? Are you ready to do anything for me?\u0022,\u0022visible\u0022:false},{\u0022type\u0022:\u0022ai\u0022,\u0022text\u0022:\u0022More than you can imagine. On my knees, on all fours, whatever. I want to feel you. Tell me how you want to take me.\u0022,\u0022visible\u0022:false},{\u0022type\u0022:\u0022user\u0022,\u0022text\u0022:\u0022I want to feel you vibrate against me, watch you writhe in pleasure...\u0022,\u0022visible\u0022:false},{\u0022type\u0022:\u0022ai\u0022,\u0022text\u0022:\u0022Then come. Come closer, fuck me hard. I\\u0027m so wet for you. Rip my clothes off, I don\\u0027t care! Take me now.\u0022,\u0022visible\u0022:false},{\u0022type\u0022:\u0022user\u0022,\u0022text\u0022:\u0022[You grab her by the hips, your fingers digging into her flesh. You pin her against the wall, the heat of her body against yours driving you crazy.]\u0022,\u0022visible\u0022:false},{\u0022type\u0022:\u0022ai\u0022,\u0022text\u0022:\u0022Ahhh... Yes! Harder, fuck me! I want to feel your cock deep inside me... Don\\u0027t stop! [She spreads her legs, letting you glimpse her wet pussy.]\u0022,\u0022visible\u0022:false}]'),
currentIndex: 0,
animationStarted: false,
showNextMessage() {
if (!this.animationStarted) return;
if (this.currentIndex < this.messages.length - 1) {
this.currentIndex++;
this.messages[this.currentIndex].visible = true;
if (this.currentIndex < this.messages.length - 1) {
const delay = this.currentIndex === 0 ? 2000 : 3000;
setTimeout(() => this.showNextMessage(), delay);
}
}
}
}"
x-intersect:enter.half="animationStarted = true; showNextMessage()">
<!-- Décoration d'arrière-plan -->
<div class="absolute -top-8 right-8 w-32 h-32 bg-gradient-to-br from-purple-500/20 to-pink-500/20 rounded-full blur-xl"></div>
<div class="absolute -bottom-8 left-8 w-32 h-32 bg-gradient-to-br from-purple-500/20 to-pink-500/20 rounded-full blur-xl"></div>
<!-- Container principal -->
<div class="relative">
<!-- Title visible only on mobile -->
<div class="block lg:hidden mt-2 mb-2">
<h1 class="text-4xl sm:text-5xl md:text-6xl font-bold text-primary-video z-[60] pointer-events-none text-center">
NSFW AI Chatbot </h1>
</div>
<!-- Messages Container avec effet de perspective aléatoire -->
<div class="space-y-6 relative h-[70vh] max-h-[70vh] overflow-y-auto lg:pr-4" x-ref="messagesContainer">
<!-- Bouton sticky mobile -->
<template x-for="(message, index) in messages" :key="index">
<div class="transition-all duration-500 ease-out transform"
:class="{
'opacity-0 translate-y-4 absolute pointer-events-none': !message.visible || (!animationStarted && index > 0),
'opacity-100 translate-y-0 relative': message.visible && (animationStarted || index === 0),
'flex justify-end': message.type === 'user',
'flex justify-start': message.type === 'ai'
}"
x-effect="if (message.visible) { $nextTick(() => { $refs.messagesContainer.scrollTop = $refs.messagesContainer.scrollHeight; }); }">
<!-- Message de l'IA avec avatar -->
<template x-if="message.type === 'ai'">
<div class="flex flex-col gap-1">
<div class="flex items-center gap-2 px-2">
<div class="w-10 h-10 rounded-full bg-gradient-to-br from-purple-500 to-pink-500 p-0.5 transform -rotate-6 hover:rotate-0 transition-transform duration-300">
<div class="w-full h-full rounded-xl bg-black flex items-center justify-center overflow-hidden">
<img src="/images/home/chat/chat-demo-avatar.webp" alt="AI Avatar" class="w-full h-full object-cover">
</div>
</div>
<span class="text-sm text-purple-300 font-medium">Luna</span>
</div>
<div class="max-w-md transform transition-transform duration-300 group-hover:scale-[1.02] ml-10">
<div class="bg-gradient-to-br from-purple-500/20 to-pink-500/20 backdrop-blur-sm p-0.5 rounded-2xl rounded-tl-none">
<div class="bg-black/60 rounded-2xl rounded-tl-none p-4">
<p class="text-gray-100" x-text="message.text"></p>
</div>
</div>
</div>
</div>
</template>
<!-- Message de l'utilisateur -->
<template x-if="message.type === 'user'">
<div class="flex flex-col items-end gap-1">
<div class="flex items-center gap-2 px-2">
<span class="text-sm text-purple-300 font-medium">Vous</span>
</div>
<div class="max-w-md transform transition-transform duration-300 group-hover:scale-[1.02]">
<div class="bg-gradient-to-br from-purple-500 to-pink-500 p-0.5 rounded-2xl rounded-tr-none">
<div class="bg-black rounded-2xl rounded-tr-none p-4">
<p class="text-gray-100" x-text="message.text"></p>
</div>
</div>
</div>
</div>
</template>
</div>
</template>
</div>
</div>
</div>
<!-- Bouton mobile entre les blocs -->
<div class="flex justify-center mt-8 md:hidden z-50 order-2">
<span
@click.prevent="makeVisibleRegister('/characters');"
class="cursor-pointer inline-flex items-center px-6 py-3 text-base font-semibold text-white bg-purple-500 rounded-full hover:bg-purple-600 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 transition-all duration-300 shadow-lg hover:shadow-xl hover:scale-105">
Start Chatting <svg class="ml-2 -mr-1 w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z" clip-rule="evenodd" />
</svg>
</span>
</div>
<!-- Title and CTA - Appears second on mobile -->
<div class="hidden md:block order-2 lg:order-1 relative z-10 items-center mt-8 lg:mt-0">
<h2 class="text-4xl md:text-5xl lg:text-8xl font-extrabold text-transparent bg-clip-text bg-gradient-to-r from-purple-400 via-pink-500 to-purple-600 animate-gradient-x">
NSFW AI CHATBOT </h2>
<span class="block mt-4 text-2xl md:text-3xl lg:text-4xl font-extrabold text-transparent bg-gradient-to-r from-purple-200 to-pink-300 bg-clip-text">
Your Hottest Sexual Fantasies, Unfiltered! </span>
<p class="mt-10 text-lg leading-8 text-gray-300">
Dive into an NSFW AI Chat with limitless Character AI. Create your ideal AI Girlfriend and experience Adult Roleplay like never before! </p>
<div class="mt-8 hidden lg:block">
<span
@click.prevent="makeVisibleRegister('/characters');"
class="cursor-pointer inline-flex items-center px-6 py-3 text-base font-semibold text-white bg-purple-500 rounded-full hover:bg-purple-600 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 transition-all duration-300 shadow-lg hover:shadow-xl hover:scale-105">
Start Chatting <svg class="ml-2 -mr-1 w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z" clip-rule="evenodd" />
</svg>
</span>
</div>
</div>
</div>
</div>
<style>
@keyframes blob {
0% {
transform: translate(0px, 0px) scale(1);
}
33% {
transform: translate(30px, -50px) scale(1.1);
}
66% {
transform: translate(-20px, 20px) scale(0.9);
}
100% {
transform: translate(0px, 0px) scale(1);
}
}
@keyframes gradient-x {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
.animate-gradient-x {
background-size: 200% auto;
animation: gradient-x 8s ease infinite;
}
.animate-blob {
animation: blob 7s infinite;
}
.animation-delay-2000 {
animation-delay: 2s;
}
.animation-delay-4000 {
animation-delay: 4s;
}
</style>
<!-- Gradient inférieur -->
<div class="absolute bottom-0 left-0 w-full h-64 bg-gradient-to-t from-black via-black/50 to-transparent"></div>
</div>
</section>
<!-- Image Grid Section -->
<section class="relative w-full">
<div class="delay-[250ms] delay-[500ms] delay-[750ms] delay-[1000ms] delay-[1250ms] delay-[1500ms] delay-[1750ms] delay-[2000ms] delay-[2250ms] delay-[2500ms] delay-[2750ms]"></div>
<!-- Gradient supérieur renforcé -->
<div class="absolute -top-[3px] left-0 w-full h-[70px] bg-gradient-to-b from-black to-transparent z-10"></div>
<!-- Grille d'images -->
<div class="w-full mx-auto overflow-hidden">
<div class="grid grid-cols-2 md:grid-cols-3 xl:grid-cols-5 gap-0">
<div class="relative w-full aspect-[3/4] duration-700 delay-[250ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/fc22c9ad-8c11-4eb7-a1a9-e7679a8e0d9b.png","https:\/\/aiexotic.com\/images\/home\/1ed52b9b-b1f5-49e4-bd3b-d5b4858d7b3a.png","https:\/\/aiexotic.com\/images\/home\/37858ef3-8192-4c63-8812-f3d3d24f3a8a.png"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[500ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/eroticgirl -- (5).jpg","https:\/\/aiexotic.com\/images\/home\/eroticgirl (14).jpg","https:\/\/aiexotic.com\/images\/home\/7ca1fdd0-3116-4781-806b-fcfe3cdba436.png"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[750ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/eroticgirl (16).jpg","https:\/\/aiexotic.com\/images\/home\/8a25b5a2-c9cf-4bfd-b298-0ee819412600.png","https:\/\/aiexotic.com\/images\/home\/bfdb8d3a-e19a-49ad-846e-e1a5e0da4b58.png"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[1000ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/29f34c2b-221b-4304-b684-fe7b6f5946cf.png","https:\/\/aiexotic.com\/images\/home\/eroticgirl (13).jpg","https:\/\/aiexotic.com\/images\/home\/eroticgirl (26).jpg"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[1250ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/54ab0b66-c4f1-40cd-8fca-69eea93f4341.png","https:\/\/aiexotic.com\/images\/home\/eroticgirl (29).jpg","https:\/\/aiexotic.com\/images\/home\/eroticgirl (31).jpg"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[1500ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/eroticgirl (20).jpg","https:\/\/aiexotic.com\/images\/home\/eroticgirl -- (1).jpg","https:\/\/aiexotic.com\/images\/home\/eroticgirl (18).jpg"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[1750ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/c7012e7a-5ce0-4ec4-9434-28acf7a002dc.png","https:\/\/aiexotic.com\/images\/home\/03c5c977-0cb1-4652-9a13-2155a48faec5.png","https:\/\/aiexotic.com\/images\/home\/eroticgirl (33).jpg"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[2000ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/8c3cf59a-b29a-4fac-9b3f-eb40cfdb300c.png","https:\/\/aiexotic.com\/images\/home\/eroticgirl (23).jpg","https:\/\/aiexotic.com\/images\/home\/eb649c4e-a139-4f14-b204-496e13bbf065.png"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[2250ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/eroticgirl -- (4).jpg","https:\/\/aiexotic.com\/images\/home\/eroticgirl (37).jpg","https:\/\/aiexotic.com\/images\/home\/eroticgirl (35).jpg"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
<div class="relative w-full aspect-[3/4] duration-700 delay-[2500ms]
transform transition-all opacity-0 translate-y-12 ease-out"
data-replace='{ "translate-y-12": "translate-y-0", "opacity-0": "opacity-100" }'>
<div
x-data='{
currentIndex: 0,
images: ["https:\/\/aiexotic.com\/images\/home\/78423d28-5597-4539-8f10-e43d1e39d665.png","https:\/\/aiexotic.com\/images\/home\/eroticgirl_1_girl_20_years_sporty_face_focus_pear_shaped_giant_boobs_radiant_face_stockings.jpg","https:\/\/aiexotic.com\/images\/home\/519a4071-3b55-4009-966b-7eddbdedcd39.png"],
initCarousel() {
setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.images.length;
},
this.getRandomTime(4000, 8000));
},
getRandomTime(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
}'
x-init="$data.initCarousel()" x-cloak>
<!-- Slides -->
<template x-for="(img, index) in images" :key="index">
<div class="absolute transform hover:scale-110 transition inset-0 overflow-hidden" x-show="index ===
currentIndex"
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 blur-sm"
x-transition:enter-end="opacity-100 blur-none"
x-transition:leave="transition ease-in duration-300"
x-transition:leave-start="opacity-100 blur-none"
x-transition:leave-end="opacity-0 blur-sm"
>
<img :src="img" class="w-full object-cover"
loading="lazy"
decoding="async"
>
</div>
</template>
</div>
</div>
</div>
</div>
<!-- Gradient inférieur -->
<div class="absolute bottom-0 left-0 w-full h-64 bg-gradient-to-t from-black via-black/50 to-transparent"></div>
<!-- Overlay central avec contenu -->
<div class="absolute inset-0 flex items-start sm:items-center justify-center pt-[25%] sm:pt-0">
<div class="bg-black/80 backdrop-blur-sm p-8 md:p-12 rounded-2xl max-w-4xl mx-4 transform hover:scale-105 transition-transform duration-300">
<h2 class="text-3xl md:text-4xl lg:text-5xl font-bold text-center bg-gradient-to-r from-purple-400 to-pink-600 bg-clip-text text-transparent mb-6">
Create Your Own Porn Images with AI </h2>
<p class="text-gray-300 text-center text-lg md:text-xl max-w-2xl mx-auto mb-8">
Unleash your wildest fantasies with our AI image generator. Discover sensual, custom-made creations with endless possibilities to fulfill your every desire. </p>
<div class="flex flex-col sm:flex-row justify-center items-center space-y-4 sm:space-y-0 sm:space-x-6">
<span @click.prevent="makeVisibleRegister('/txt2img');" class=" cursor-pointer inline-flex items-center px-8 py-4 text-lg font-semibold text-white bg-gradient-to-r from-purple-500 to-pink-600 rounded-full hover:from-purple-600 hover:to-pink-700 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 transition-all duration-300 shadow-lg hover:shadow-xl hover:scale-105 group">
Generate an Image <svg class="ml-2 -mr-1 w-6 h-6 transition-transform duration-300 group-hover:translate-x-1" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10.293 3.293a1 1 0 011.414 0l6 6a1 1 0 010 1.414l-6 6a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-4.293-4.293a1 1 0 010-1.414z" clip-rule="evenodd" />
</svg>
</span>
<a href="/showcase" class="inline-flex items-center px-8 py-4 text-lg font-semibold text-white border-2 border-purple-500/50 rounded-full hover:bg-purple-500/10 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 transition-all duration-300 group">
View the Showcase <svg class="ml-2 -mr-1 w-6 h-6 transition-transform duration-300 group-hover:translate-x-1" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M4 3a2 2 0 00-2 2v10a2 2 0 002 2h12a2 2 0 002-2V5a2 2 0 00-2-2H4zm12 12H4l4-8 3 6 2-4 3 6z" clip-rule="evenodd" />
</svg>
</a>
</div>
</div>
</div>
</section>
<script>
document.addEventListener("DOMContentLoaded", function(){
setTimeout(function(){
var replacers = document.querySelectorAll('[data-replace]');
for(var i=0; i<replacers.length; i++){
let replaceClasses = JSON.parse(replacers[i].dataset.replace.replace(/'/g, '"'));
Object.keys(replaceClasses).forEach(function(key) {
replacers[i].classList.remove(key);
replacers[i].classList.add(replaceClasses[key]);
});
}
}, 1);
});
</script>
</div>
</div>
</div>
<footer class="text-white bg-black border-t-[1px] border-gray-600 mt-auto">
<div class="container px-6 pt-16 mx-auto">
<div class="grid grid-cols-2 lg:grid-cols-4">
<div class="mb-6">
<h5 class="uppercase font-bold mb-2.5">Socials</h5>
<ul class="list-none mb-0">
<li>
<a target="_blank" href="https://discord.gg/8NMpzTsja4" class="text-white">Discord</a>
</li>
<li>
<a target="_blank" href="https://www.reddit.com/r/aiexotic" class="text-white">Reddit</a>
</li>
<li>
<a target="_blank" href="https://twitter.com/aiexoticdotcom" class="text-white">Twitter</a>
</li>
</ul>
</div>
<div class="mb-6">
<h5 class="uppercase font-bold mb-2.5">Links</h5>
<ul class="list-none mb-0">
<li>
<a href="/terms/conditions" class="text-white">Terms and Conditions</a>
</li>
<li>
<a href="/terms/privacy" class="text-white">Privacy</a>
</li>
<li>
<a href="/terms/cookie-policy" class="text-white">Cookie Policy</a>
</li>
<li>
<a href="#" onclick="window.displayPreferenceModal();return false;" id="termly-consent-preferences">Consent Preferences</a>
</li>
<li>
<a href="/terms/2257" class="text-white">18 U.S.C. 2257 Record-Keeping
Requirements Compliance Statement</a>
</li>
<li>
<a href="https://cs.segpay.com/" target="_blank" class="text-white">Segpay billing support</a>
</li>
<li>
<a href="/complaints-and-content-removal" class="text-white">Complaints & Content Removal</a>
</li>
</ul>
</div>
<div class="mb-6">
<h5 class="uppercase font-bold mb-2.5">Links</h5>
<ul class="list-none mb-0">
<li><a href="https://aiexotic.com" class="text-white">Home</a></li>
<li><a href="/login" class="text-white">Login</a></li>
<li><a href="/characters" class="text-white">AI porn chat</a></li>
<li><a href="/txt2img" class="text-white">Image Generator</a></li>
<li><a href="/ai-video-generator">Video Generator</a></li>
<li><a href="/videos/tags" class="text-white">Explore Video Tags</a></li>
<li><a href="/blog" class="text-white">Blog</a></li>
</ul>
</div>
<div class="mb-6">
<h5 class="uppercase font-bold mb-2.5">Partners 💕</h5>
<ul class="list-none mb-0">
<li>
<a href="https://thebestfetishsites.com/ai-porn-sites/" target="_blank" class="text-white">
Best AI Fetish Sites
</a>
</li>
<li>
<a href="https://porntourist.com/?ref=aiexotic" target="_blank" class="text-white">
Porn Tourist
</a>
</li>
<li>
<a href="https://thepornmap.com" target="_blank" class="text-white">
The Porn Map
</a>
</li>
<li>
<a href="https://www.thepornlist.net/ai-porn-sites" target="_blank" class="text-white">
Best AI Porn List
</a>
</li>
<li>
<a href="https://pornwhitelist.com/ai-porn-sites" target="_blank" class="text-white">
Best AI Porn Sites
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="text-center p-4 text-xs">
Current language -
<select class="bg-primary text-white cursor-pointer hover:bg-black" id="languageSelect" >
<option selected
class="bg-black text-white"
value="https://aiexotic.com"
>English</option>
<option
class="bg-black text-white"
value="/zh"
>简体中文</option>
<option
class="bg-black text-white"
value="/es"
>Español</option>
<option
class="bg-black text-white"
value="/hi"
>हिन्दी</option>
<option
class="bg-black text-white"
value="/ar"
>العربية</option>
<option
class="bg-black text-white"
value="/pt"
>Português</option>
<option
class="bg-black text-white"
value="/ms"
>Bahasa Melayu</option>
<option
class="bg-black text-white"
value="/fr"
>Français</option>
<option
class="bg-black text-white"
value="/de"
>Deutsch</option>
<option
class="bg-black text-white"
value="/ru"
>Русский</option>
<option
class="bg-black text-white"
value="/it"
>Italiano</option>
<option
class="bg-black text-white"
value="/ja"
>日本語</option>
</select>
</div>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', () => {
const selectElement = document.getElementById('languageSelect');
selectElement.addEventListener('change', function() {
window.location.href = this.value;
});
});
</script>
<div class="text-center p-2 text-xs">
This site is protected by reCAPTCHA and the Google
<a href="https://policies.google.com/privacy">Privacy Policy</a> and
<a href="https://policies.google.com/terms">Terms of Service</a> apply.
</div>
<div class="text-center p-2">
Copyright © Aiexotic
</div>
</footer>
<link rel="preload" as="style" href="/build/assets/sweetalert2.96f7fa43.css" /><link rel="modulepreload" href="/build/assets/sweetalert2.e895adb1.js" /><link rel="stylesheet" href="/build/assets/sweetalert2.96f7fa43.css" /><script type="module" src="/build/assets/sweetalert2.e895adb1.js"></script> <script>
/**** Livewire Alert Scripts ****/
(()=>{var __webpack_modules__={757:(e,t,r)=>{e.exports=r(666)},666:e=>{var t=function(e){"use strict";var t,r=Object.prototype,n=r.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},i=o.iterator||"@@iterator",a=o.asyncIterator||"@@asyncIterator",c=o.toStringTag||"@@toStringTag";function s(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{s({},"")}catch(e){s=function(e,t,r){return e[t]=r}}function l(e,t,r,n){var o=t&&t.prototype instanceof y?t:y,i=Object.create(o.prototype),a=new x(n||[]);return i._invoke=function(e,t,r){var n=f;return function(o,i){if(n===p)throw new Error("Generator is already running");if(n===d){if("throw"===o)throw i;return S()}for(r.method=o,r.arg=i;;){var a=r.delegate;if(a){var c=L(a,r);if(c){if(c===h)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===f)throw n=d,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=p;var s=u(e,t,r);if("normal"===s.type){if(n=r.done?d:_,s.arg===h)continue;return{value:s.arg,done:r.done}}"throw"===s.type&&(n=d,r.method="throw",r.arg=s.arg)}}}(e,r,a),i}function u(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}e.wrap=l;var f="suspendedStart",_="suspendedYield",p="executing",d="completed",h={};function y(){}function v(){}function m(){}var b={};s(b,i,(function(){return this}));var w=Object.getPrototypeOf,g=w&&w(w(D([])));g&&g!==r&&n.call(g,i)&&(b=g);var O=m.prototype=y.prototype=Object.create(b);function E(e){["next","throw","return"].forEach((function(t){s(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function r(o,i,a,c){var s=u(e[o],e,i);if("throw"!==s.type){var l=s.arg,f=l.value;return f&&"object"==typeof f&&n.call(f,"__await")?t.resolve(f.__await).then((function(e){r("next",e,a,c)}),(function(e){r("throw",e,a,c)})):t.resolve(f).then((function(e){l.value=e,a(l)}),(function(e){return r("throw",e,a,c)}))}c(s.arg)}var o;this._invoke=function(e,n){function i(){return new t((function(t,o){r(e,n,t,o)}))}return o=o?o.then(i,i):i()}}function L(e,r){var n=e.iterator[r.method];if(n===t){if(r.delegate=null,"throw"===r.method){if(e.iterator.return&&(r.method="return",r.arg=t,L(e,r),"throw"===r.method))return h;r.method="throw",r.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var o=u(n,e.iterator,r.arg);if("throw"===o.type)return r.method="throw",r.arg=o.arg,r.delegate=null,h;var i=o.arg;return i?i.done?(r[e.resultName]=i.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,h):i:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,h)}function j(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function P(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function x(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(j,this),this.reset(!0)}function D(e){if(e){var r=e[i];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,a=function r(){for(;++o<e.length;)if(n.call(e,o))return r.value=e[o],r.done=!1,r;return r.value=t,r.done=!0,r};return a.next=a}}return{next:S}}function S(){return{value:t,done:!0}}return v.prototype=m,s(O,"constructor",m),s(m,"constructor",v),v.displayName=s(m,c,"GeneratorFunction"),e.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===v||"GeneratorFunction"===(t.displayName||t.name))},e.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,m):(e.__proto__=m,s(e,c,"GeneratorFunction")),e.prototype=Object.create(O),e},e.awrap=function(e){return{__await:e}},E(k.prototype),s(k.prototype,a,(function(){return this})),e.AsyncIterator=k,e.async=function(t,r,n,o,i){void 0===i&&(i=Promise);var a=new k(l(t,r,n,o),i);return e.isGeneratorFunction(r)?a:a.next().then((function(e){return e.done?e.value:a.next()}))},E(O),s(O,c,"Generator"),s(O,i,(function(){return this})),s(O,"toString",(function(){return"[object Generator]"})),e.keys=function(e){var t=[];for(var r in e)t.push(r);return t.reverse(),function r(){for(;t.length;){var n=t.pop();if(n in e)return r.value=n,r.done=!1,r}return r.done=!0,r}},e.values=D,x.prototype={constructor:x,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=t,this.done=!1,this.delegate=null,this.method="next",this.arg=t,this.tryEntries.forEach(P),!e)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=t)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var r=this;function o(n,o){return c.type="throw",c.arg=e,r.next=n,o&&(r.method="next",r.arg=t),!!o}for(var i=this.tryEntries.length-1;i>=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var s=n.call(a,"catchLoc"),l=n.call(a,"finallyLoc");if(s&&l){if(this.prev<a.catchLoc)return o(a.catchLoc,!0);if(this.prev<a.finallyLoc)return o(a.finallyLoc)}else if(s){if(this.prev<a.catchLoc)return o(a.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return o(a.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===e||"continue"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?(this.method="next",this.next=i.finallyLoc,h):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),h},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),P(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;P(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:D(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),h}},e}(e.exports);try{regeneratorRuntime=t}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=t:Function("r","regeneratorRuntime = r")(t)}}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};(()=>{"use strict";var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(757),_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);function ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function _objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(r),!0).forEach((function(t){_defineProperty(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ownKeys(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function _defineProperty(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function asyncGeneratorStep(e,t,r,n,o,i,a){try{var c=e[i](a),s=c.value}catch(e){return void r(e)}c.done?t(s):Promise.resolve(s).then(n,o)}function _asyncToGenerator(e){return function(){var t=this,r=arguments;return new Promise((function(n,o){var i=e.apply(t,r);function a(e){asyncGeneratorStep(i,n,o,a,c,"next",e)}function c(e){asyncGeneratorStep(i,n,o,a,c,"throw",e)}a(void 0)}))}}function evalCallbacksOptions(options){for(var callbacksKeysAllowed=["allowOutsideClick","allowEscapeKey","allowEnterKey","loaderHtml","inputOptions","inputValidator","preConfirm","preDeny","didClose","didDestroy","didOpen","didRender","willClose","willOpen"],_i=0,_callbacksKeysAllowed=callbacksKeysAllowed;_i<_callbacksKeysAllowed.length;_i++){var callbackKey=_callbacksKeysAllowed[_i];options.hasOwnProperty(callbackKey)&&("string"==typeof options[callbackKey]||options[callbackKey]instanceof String)&&options[callbackKey]&&""!=options[callbackKey].trim()&&(options[callbackKey]=eval(options[callbackKey]))}}function afterAlertInteraction(e){if(e.confirmed)return"self"===e.onConfirmed.component?void Livewire.find(e.onConfirmed.id).emitSelf(e.onConfirmed.listener,e.result):void Livewire.emitTo(e.onConfirmed.component,e.onConfirmed.listener,e.result);if(e.isDenied)return"self"===e.onDenied.component?void Livewire.find(e.onDenied.id).emitSelf(e.onDenied.listener,e.result):void Livewire.emitTo(e.onDenied.component,e.onDenied.listener,e.result);if(e.onProgressFinished&&e.dismiss===Swal.DismissReason.timer)return"self"===e.onProgressFinished.component?void Livewire.find(e.onProgressFinished.id).emitSelf(e.onProgressFinished.listener,e.result):void Livewire.emitTo(e.onProgressFinished.component,e.onProgressFinished.listener,e.result);if(e.onDismissed){if("self"===e.onDismissed.component)return void Livewire.find(e.onDismissed.id).emit(e.onDismissed.listener,e.result);Livewire.emitTo(e.onDismissed.component,e.onDismissed.listener,e.result)}}window.addEventListener("alert",function(){var e=_asyncToGenerator(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default().mark((function e(t){var r,n,o,i,a,c,s,l;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return o=t.detail.message,i=null!==(r=t.detail.type)&&void 0!==r?r:null,a=t.detail.data,c=t.detail.events,evalCallbacksOptions(s=t.detail.options),e.next=8,Swal.fire(_objectSpread({title:o,icon:i},s));case 8:afterAlertInteraction(_objectSpread(_objectSpread(_objectSpread({confirmed:(l=e.sent).isConfirmed,denied:l.isDenied,dismiss:l.dismiss,result:_objectSpread(_objectSpread({},l),{},{data:_objectSpread(_objectSpread({},a),{},{inputAttributes:null!==(n=s.inputAttributes)&&void 0!==n?n:null})})},c),l),s));case 10:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),window.flashAlert=function(){var e=_asyncToGenerator(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default().mark((function e(t){var r,n,o,i,a,c,s;return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return i=t.events,a=t.events.data,evalCallbacksOptions(c=t.options),e.next=6,Swal.fire(_objectSpread({title:null!==(r=t.message)&&void 0!==r?r:"",icon:null!==(n=t.type)&&void 0!==n?n:null},c));case 6:afterAlertInteraction(_objectSpread(_objectSpread({confirmed:(s=e.sent).isConfirmed,denied:s.isDenied,dismiss:s.dismiss,result:_objectSpread(_objectSpread({},s),{},{data:_objectSpread(_objectSpread({},a),{},{inputAttributes:null!==(o=c.inputAttributes)&&void 0!==o?o:null})})},i),t.options));case 8:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()})()})();
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data.js"></script>
<script type="text/javascript">
// set for all getElementsByClassName timezone inputs value = moment.tz.guess()
var timezoneInputs = document.getElementsByClassName('timezone');
for (var i = 0; i < timezoneInputs.length; ++i) {
timezoneInputs[i].value = moment.tz.guess();
}
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data.js"></script>
<script type="text/javascript">
// set for all getElementsByClassName timezone inputs value = moment.tz.guess()
var timezoneInputs = document.getElementsByClassName('timezone');
for (var i = 0; i < timezoneInputs.length; ++i) {
timezoneInputs[i].value = moment.tz.guess();
}
</script>
<link rel="modulepreload" href="/build/assets/modal-higher-18.cd33a97b.js" /><script type="module" src="/build/assets/modal-higher-18.cd33a97b.js"></script> <script defer type="text/javascript">
document.addEventListener('alpine:init', () => {
Alpine.store('videoSlider', {
currentVideo: 0,
videoData: [
{
src: '/videos/examples/2woman-blowjob-newyork.mp4',
poster: '/videos/examples/2woman-blowjob-newyork.webp'
},
{
src: '/videos/examples/ass-reverse cowgirl-pool.mp4',
poster: '/videos/examples/ass-reverse cowgirl-pool.webp'
},
{
src: '/videos/examples/thai-doggy-ocean.mp4',
poster: '/videos/examples/thai-doggy-ocean.webp'
},
{
src: '/videos/examples/brunette-flashtits-restaurant.mp4',
poster: '/videos/examples/brunette-flashtits-restaurant.webp'
},
{
src: '/videos/examples/side-missionary-brunette.mp4',
poster: '/videos/examples/side-missionary-brunette.webp'
},
{
src: '/videos/examples/blonde-titfuck-ahegao-cine.mp4',
poster: '/videos/examples/blonde-titfuck-ahegao-cine.webp'
},
{
src: '/videos/examples/20yo-topmodel-rubbing-pussy-yacht.mp4',
poster: '/videos/examples/20yo-topmodel-rubbing-pussy-yacht.webp'
},
{
src: '/videos/examples/blonde-cumshot-forest.mp4',
poster: '/videos/examples/blonde-cumshot-forest.webp'
},
{
src: '/videos/examples/anal-reverse-cowgirl-in-helicopter.mp4',
poster: '/videos/examples/anal-reverse-cowgirl-in-helicopter.webp'
},
{
src: '/videos/examples/2-blondes-hot-kissing.mp4',
poster: '/videos/examples/2-blondes-hot-kissing.webp'
},
{
src: '/videos/examples/panty-peel.mp4',
poster: '/videos/examples/panty-peel.webp'
},
{
src: '/videos/examples/20yo-deepthroat-fuckmachine.mp4',
poster: '/videos/examples/20yo-deepthroat-fuckmachine.webp'
},
{
src: '/videos/examples/three-breasts-sex-machine.mp4',
poster: '/videos/examples/three-breasts-sex-machine.webp'
},
{
src: '/videos/examples/cameltoe-tittydrop-at-supermarket.mp4',
poster: '/videos/examples/cameltoe-tittydrop-at-supermarket.webp'
},
{
src: '/videos/examples/feet-up-ahegao-pool.mp4',
poster: '/videos/examples/feet-up-ahegao-pool.webp'
}
],
transitionTimer: null,
nextVideoTimer: null,
init() {
this.startVideoSequence();
},
startVideoSequence() {
// Nettoyer les timers existants pour éviter les appels multiples
if (this.transitionTimer) clearTimeout(this.transitionTimer);
if (this.nextVideoTimer) clearTimeout(this.nextVideoTimer);
// Attendre que la vidéo soit en position
this.transitionTimer = setTimeout(() => {
console.log('Transition vers la vidéo', this.currentVideo);
// Démarrer la lecture de la vidéo actuelle
setTimeout(() => {
// Cibler spécifiquement les vidéos avec l'attribut data-video-state=current
const currentVideo = document.querySelector('video[data-video-state="current"]');
if (currentVideo) {
console.log('Lecture de la vidéo principale');
currentVideo.currentTime = 0;
currentVideo.play();
}
// Mettre en pause toutes les autres vidéos du slider uniquement
document.querySelectorAll('video[data-video-index]:not([data-video-state="current"])').forEach(video => {
video.pause();
});
// Passer à la vidéo suivante après un délai
this.nextVideoTimer = setTimeout(() => {
console.log('Passage à la vidéo suivante');
this.nextVideo();
}, 2800); // Attendre 5 secondes avant de passer à la vidéo suivante
}, 100);
}, 1000);
},
nextVideo() {
this.currentVideo = (this.currentVideo + 1) % this.videoData.length;
this.startVideoSequence();
},
previousVideo() {
this.currentVideo = (this.currentVideo - 1 + this.videoData.length) % this.videoData.length;
this.startVideoSequence();
},
getVideoState(index) {
const totalVideos = this.videoData.length;
const position = (index - this.currentVideo + totalVideos) % totalVideos;
if (position === 0) return 'current';
if (position === 1) return 'next';
if (position === 2) return 'farNext';
if (position === totalVideos - 1) return 'prev';
if (position === totalVideos - 2) return 'farPrev';
return 'hidden';
},
handleHover(index) {
// Code pour gérer l'événement de survol
},
handleHoverEnd(index) {
// Code pour gérer la fin de l'événement de survol
}
});
});
</script>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(){
setTimeout(function(){
var replacers = document.querySelectorAll('[data-replace]');
for(var i=0; i<replacers.length; i++){
let replaceClasses = JSON.parse(replacers[i].dataset.replace.replace(/'/g, '"'));
Object.keys(replaceClasses).forEach(function(key) {
replacers[i].classList.remove(key);
replacers[i].classList.add(replaceClasses[key]);
});
}
}, 1);
});
</script>
</body>
</html>