Create a stunning, creative single-page web app titled “Big Daddy’s Dream Studio”. The site should have a beautiful, modern design with soft gradients, rounded cards, and smooth transitions. Include four interactive tools: Handwriting Canvas – a whiteboard-like area where users can draw or write using the mouse or finger, with pen color and thickness options. Image Effects Panel – let users upload an image and apply effects like grayscale, blur, brightness adjustment, and a floral border overlay. Text Styler – allow users to type a message and apply artistic fonts, gradient fills, shadows, and animated typewriter text effects. Mini Video Editor – enable video upload with UI sliders to trim start and end points. Also include the ability to merge background music (UI only, no backend). Organize everything in tabs or collapsible cards. Add a dreamy background, smooth entrance animations, and soft background music with a toggle. Include a header that says “Welcome to Big Daddy’s Dream Studio” and a footer that says “Made with Love by Big Daddy”. Use HTML, CSS, and JavaScript only. - Initial Deployment
Browse files- README.md +7 -5
- index.html +849 -19
README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
| 1 |
---
|
| 2 |
+
title: big-daddy-studio
|
| 3 |
+
emoji: 🐳
|
| 4 |
+
colorFrom: green
|
| 5 |
+
colorTo: gray
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite
|
| 10 |
---
|
| 11 |
|
| 12 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
index.html
CHANGED
|
@@ -1,19 +1,849 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Big Daddy's Dream Studio</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
| 9 |
+
<style>
|
| 10 |
+
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap');
|
| 11 |
+
|
| 12 |
+
body {
|
| 13 |
+
font-family: 'Poppins', sans-serif;
|
| 14 |
+
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
| 15 |
+
min-height: 100vh;
|
| 16 |
+
overflow-x: hidden;
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
.dreamy-bg {
|
| 20 |
+
background: radial-gradient(circle at 10% 20%, rgba(255, 255, 255, 0.8) 0%, rgba(255, 255, 255, 0.5) 90%);
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
.tool-card {
|
| 24 |
+
background: rgba(255, 255, 255, 0.85);
|
| 25 |
+
backdrop-filter: blur(10px);
|
| 26 |
+
transition: all 0.3s ease;
|
| 27 |
+
box-shadow: 0 8px 32px rgba(31, 38, 135, 0.1);
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
.tool-card:hover {
|
| 31 |
+
transform: translateY(-5px);
|
| 32 |
+
box-shadow: 0 12px 40px rgba(31, 38, 135, 0.15);
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
.nav-tab {
|
| 36 |
+
transition: all 0.3s ease;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
.nav-tab:hover {
|
| 40 |
+
transform: scale(1.05);
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
.nav-tab.active {
|
| 44 |
+
background: rgba(255, 255, 255, 0.7);
|
| 45 |
+
font-weight: 600;
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
#canvas {
|
| 49 |
+
touch-action: none;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
.typewriter {
|
| 53 |
+
overflow: hidden;
|
| 54 |
+
border-right: 3px solid #6366f1;
|
| 55 |
+
white-space: nowrap;
|
| 56 |
+
margin: 0 auto;
|
| 57 |
+
letter-spacing: 2px;
|
| 58 |
+
animation: typing 3.5s steps(40, end), blink-caret 0.75s step-end infinite;
|
| 59 |
+
}
|
| 60 |
+
|
| 61 |
+
@keyframes typing {
|
| 62 |
+
from { width: 0 }
|
| 63 |
+
to { width: 100% }
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
@keyframes blink-caret {
|
| 67 |
+
from, to { border-color: transparent }
|
| 68 |
+
50% { border-color: #6366f1; }
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
.fade-in {
|
| 72 |
+
animation: fadeIn 1s ease-in;
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
@keyframes fadeIn {
|
| 76 |
+
from { opacity: 0; transform: translateY(20px); }
|
| 77 |
+
to { opacity: 1; transform: translateY(0); }
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
.floral-border {
|
| 81 |
+
position: relative;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
.floral-border::after {
|
| 85 |
+
content: "";
|
| 86 |
+
position: absolute;
|
| 87 |
+
top: -10px;
|
| 88 |
+
left: -10px;
|
| 89 |
+
right: -10px;
|
| 90 |
+
bottom: -10px;
|
| 91 |
+
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path fill="none" stroke="%23c084fc" stroke-width="2" d="M20,20 Q30,10 40,20 T60,20 T80,20 T100,20" transform="rotate(45 50 50)"/><path fill="none" stroke="%23c084fc" stroke-width="2" d="M20,20 Q30,10 40,20 T60,20 T80,20 T100,20" transform="rotate(135 50 50)"/><path fill="none" stroke="%23c084fc" stroke-width="2" d="M20,20 Q30,10 40,20 T60,20 T80,20 T100,20" transform="rotate(225 50 50)"/><path fill="none" stroke="%23c084fc" stroke-width="2" d="M20,20 Q30,10 40,20 T60,20 T80,20 T100,20" transform="rotate(315 50 50)"/></svg>');
|
| 92 |
+
background-size: 100px 100px;
|
| 93 |
+
z-index: -1;
|
| 94 |
+
border-radius: 15px;
|
| 95 |
+
pointer-events: none;
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.gradient-text {
|
| 99 |
+
background: linear-gradient(45deg, #6366f1, #a855f7, #ec4899);
|
| 100 |
+
-webkit-background-clip: text;
|
| 101 |
+
background-clip: text;
|
| 102 |
+
color: transparent;
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
.audio-toggle {
|
| 106 |
+
transition: all 0.3s ease;
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
.audio-toggle:hover {
|
| 110 |
+
transform: scale(1.1);
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
.slider-thumb::-webkit-slider-thumb {
|
| 114 |
+
-webkit-appearance: none;
|
| 115 |
+
appearance: none;
|
| 116 |
+
width: 20px;
|
| 117 |
+
height: 20px;
|
| 118 |
+
border-radius: 50%;
|
| 119 |
+
background: #6366f1;
|
| 120 |
+
cursor: pointer;
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
.slider-thumb::-moz-range-thumb {
|
| 124 |
+
width: 20px;
|
| 125 |
+
height: 20px;
|
| 126 |
+
border-radius: 50%;
|
| 127 |
+
background: #6366f1;
|
| 128 |
+
cursor: pointer;
|
| 129 |
+
}
|
| 130 |
+
</style>
|
| 131 |
+
</head>
|
| 132 |
+
<body class="dreamy-bg">
|
| 133 |
+
<!-- Audio Element -->
|
| 134 |
+
<audio id="bgMusic" loop>
|
| 135 |
+
<source src="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" type="audio/mpeg">
|
| 136 |
+
</audio>
|
| 137 |
+
|
| 138 |
+
<!-- Header -->
|
| 139 |
+
<header class="text-center py-8 fade-in">
|
| 140 |
+
<h1 class="text-4xl md:text-5xl font-bold mb-2 gradient-text">Welcome to Big Daddy's Dream Studio</h1>
|
| 141 |
+
<p class="text-lg text-indigo-600">Create, design, and bring your dreams to life</p>
|
| 142 |
+
|
| 143 |
+
<div class="flex justify-center mt-4">
|
| 144 |
+
<button id="audioToggle" class="audio-toggle bg-white p-3 rounded-full shadow-lg text-indigo-600">
|
| 145 |
+
<i class="fas fa-music"></i>
|
| 146 |
+
</button>
|
| 147 |
+
</div>
|
| 148 |
+
</header>
|
| 149 |
+
|
| 150 |
+
<!-- Main Content -->
|
| 151 |
+
<main class="container mx-auto px-4 pb-12">
|
| 152 |
+
<!-- Navigation Tabs -->
|
| 153 |
+
<div class="flex flex-wrap justify-center gap-2 mb-8">
|
| 154 |
+
<button onclick="showTool('handwriting')" class="nav-tab active px-6 py-2 rounded-full bg-indigo-100 text-indigo-700">
|
| 155 |
+
<i class="fas fa-pen-fancy mr-2"></i>Handwriting
|
| 156 |
+
</button>
|
| 157 |
+
<button onclick="showTool('image-effects')" class="nav-tab px-6 py-2 rounded-full bg-pink-100 text-pink-700">
|
| 158 |
+
<i class="fas fa-image mr-2"></i>Image Effects
|
| 159 |
+
</button>
|
| 160 |
+
<button onclick="showTool('text-styler')" class="nav-tab px-6 py-2 rounded-full bg-purple-100 text-purple-700">
|
| 161 |
+
<i class="fas fa-font mr-2"></i>Text Styler
|
| 162 |
+
</button>
|
| 163 |
+
<button onclick="showTool('video-editor')" class="nav-tab px-6 py-2 rounded-full bg-blue-100 text-blue-700">
|
| 164 |
+
<i class="fas fa-video mr-2"></i>Video Editor
|
| 165 |
+
</button>
|
| 166 |
+
</div>
|
| 167 |
+
|
| 168 |
+
<!-- Tools Container -->
|
| 169 |
+
<div class="grid grid-cols-1 gap-8">
|
| 170 |
+
<!-- Handwriting Canvas Tool -->
|
| 171 |
+
<div id="handwriting-tool" class="tool-card rounded-2xl p-6 fade-in">
|
| 172 |
+
<h2 class="text-2xl font-bold mb-4 text-indigo-700 flex items-center">
|
| 173 |
+
<i class="fas fa-pen-fancy mr-3"></i> Handwriting Canvas
|
| 174 |
+
</h2>
|
| 175 |
+
|
| 176 |
+
<div class="flex flex-wrap gap-4 mb-4">
|
| 177 |
+
<div>
|
| 178 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Pen Color</label>
|
| 179 |
+
<input type="color" id="penColor" value="#000000" class="w-12 h-10 cursor-pointer">
|
| 180 |
+
</div>
|
| 181 |
+
|
| 182 |
+
<div>
|
| 183 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Pen Size</label>
|
| 184 |
+
<input type="range" id="penSize" min="1" max="20" value="5" class="w-32 slider-thumb">
|
| 185 |
+
<span id="penSizeValue" class="text-sm ml-2">5px</span>
|
| 186 |
+
</div>
|
| 187 |
+
|
| 188 |
+
<button onclick="clearCanvas()" class="bg-indigo-600 text-white px-4 py-2 rounded-lg hover:bg-indigo-700 transition">
|
| 189 |
+
<i class="fas fa-trash-alt mr-2"></i>Clear
|
| 190 |
+
</button>
|
| 191 |
+
|
| 192 |
+
<button onclick="saveCanvas()" class="bg-green-600 text-white px-4 py-2 rounded-lg hover:bg-green-700 transition">
|
| 193 |
+
<i class="fas fa-download mr-2"></i>Save
|
| 194 |
+
</button>
|
| 195 |
+
</div>
|
| 196 |
+
|
| 197 |
+
<div class="border-2 border-dashed border-gray-300 rounded-xl overflow-hidden">
|
| 198 |
+
<canvas id="canvas" width="800" height="500" class="w-full bg-white touch-none"></canvas>
|
| 199 |
+
</div>
|
| 200 |
+
</div>
|
| 201 |
+
|
| 202 |
+
<!-- Image Effects Tool -->
|
| 203 |
+
<div id="image-effects-tool" class="tool-card rounded-2xl p-6 hidden">
|
| 204 |
+
<h2 class="text-2xl font-bold mb-4 text-pink-700 flex items-center">
|
| 205 |
+
<i class="fas fa-image mr-3"></i> Image Effects
|
| 206 |
+
</h2>
|
| 207 |
+
|
| 208 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
| 209 |
+
<div>
|
| 210 |
+
<div class="mb-4">
|
| 211 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Upload Image</label>
|
| 212 |
+
<input type="file" id="imageUpload" accept="image/*" class="block w-full text-sm text-gray-500
|
| 213 |
+
file:mr-4 file:py-2 file:px-4
|
| 214 |
+
file:rounded-lg file:border-0
|
| 215 |
+
file:text-sm file:font-semibold
|
| 216 |
+
file:bg-pink-50 file:text-pink-700
|
| 217 |
+
hover:file:bg-pink-100">
|
| 218 |
+
</div>
|
| 219 |
+
|
| 220 |
+
<div class="space-y-4">
|
| 221 |
+
<div>
|
| 222 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Brightness: <span id="brightnessValue">100</span>%</label>
|
| 223 |
+
<input type="range" id="brightness" min="0" max="200" value="100" class="w-full slider-thumb">
|
| 224 |
+
</div>
|
| 225 |
+
|
| 226 |
+
<div>
|
| 227 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Contrast: <span id="contrastValue">100</span>%</label>
|
| 228 |
+
<input type="range" id="contrast" min="0" max="200" value="100" class="w-full slider-thumb">
|
| 229 |
+
</div>
|
| 230 |
+
|
| 231 |
+
<div>
|
| 232 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Blur: <span id="blurValue">0</span>px</label>
|
| 233 |
+
<input type="range" id="blur" min="0" max="10" value="0" class="w-full slider-thumb">
|
| 234 |
+
</div>
|
| 235 |
+
|
| 236 |
+
<div class="flex items-center space-x-4">
|
| 237 |
+
<button onclick="applyGrayscale()" class="bg-pink-600 text-white px-4 py-2 rounded-lg hover:bg-pink-700 transition">
|
| 238 |
+
Grayscale
|
| 239 |
+
</button>
|
| 240 |
+
|
| 241 |
+
<button onclick="applySepia()" class="bg-pink-600 text-white px-4 py-2 rounded-lg hover:bg-pink-700 transition">
|
| 242 |
+
Sepia
|
| 243 |
+
</button>
|
| 244 |
+
|
| 245 |
+
<button onclick="toggleFloralBorder()" class="bg-pink-600 text-white px-4 py-2 rounded-lg hover:bg-pink-700 transition">
|
| 246 |
+
Floral Border
|
| 247 |
+
</button>
|
| 248 |
+
</div>
|
| 249 |
+
|
| 250 |
+
<button onclick="resetImage()" class="bg-gray-600 text-white px-4 py-2 rounded-lg hover:bg-gray-700 transition">
|
| 251 |
+
Reset Image
|
| 252 |
+
</button>
|
| 253 |
+
|
| 254 |
+
<button onclick="downloadImage()" class="bg-green-600 text-white px-4 py-2 rounded-lg hover:bg-green-700 transition">
|
| 255 |
+
<i class="fas fa-download mr-2"></i>Download
|
| 256 |
+
</button>
|
| 257 |
+
</div>
|
| 258 |
+
</div>
|
| 259 |
+
|
| 260 |
+
<div class="flex justify-center items-center">
|
| 261 |
+
<div class="border-2 border-dashed border-gray-300 rounded-xl overflow-hidden w-full">
|
| 262 |
+
<img id="imagePreview" src="" alt="Preview" class="w-full max-h-96 object-contain bg-gray-100 hidden">
|
| 263 |
+
<div id="imagePlaceholder" class="p-8 text-center text-gray-500">
|
| 264 |
+
<i class="fas fa-image fa-3x mb-4"></i>
|
| 265 |
+
<p>Upload an image to apply effects</p>
|
| 266 |
+
</div>
|
| 267 |
+
</div>
|
| 268 |
+
</div>
|
| 269 |
+
</div>
|
| 270 |
+
</div>
|
| 271 |
+
|
| 272 |
+
<!-- Text Styler Tool -->
|
| 273 |
+
<div id="text-styler-tool" class="tool-card rounded-2xl p-6 hidden">
|
| 274 |
+
<h2 class="text-2xl font-bold mb-4 text-purple-700 flex items-center">
|
| 275 |
+
<i class="fas fa-font mr-3"></i> Text Styler
|
| 276 |
+
</h2>
|
| 277 |
+
|
| 278 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
| 279 |
+
<div>
|
| 280 |
+
<div class="mb-4">
|
| 281 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Enter Your Text</label>
|
| 282 |
+
<textarea id="textInput" rows="3" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-purple-500" placeholder="Type your message here..."></textarea>
|
| 283 |
+
</div>
|
| 284 |
+
|
| 285 |
+
<div class="space-y-4">
|
| 286 |
+
<div>
|
| 287 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Font Family</label>
|
| 288 |
+
<select id="fontFamily" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-purple-500">
|
| 289 |
+
<option value="Arial, sans-serif">Arial</option>
|
| 290 |
+
<option value="'Times New Roman', serif">Times New Roman</option>
|
| 291 |
+
<option value="'Courier New', monospace">Courier New</option>
|
| 292 |
+
<option value="'Brush Script MT', cursive">Brush Script</option>
|
| 293 |
+
<option value="'Comic Sans MS', cursive">Comic Sans</option>
|
| 294 |
+
</select>
|
| 295 |
+
</div>
|
| 296 |
+
|
| 297 |
+
<div>
|
| 298 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Font Size: <span id="fontSizeValue">24</span>px</label>
|
| 299 |
+
<input type="range" id="fontSize" min="10" max="72" value="24" class="w-full slider-thumb">
|
| 300 |
+
</div>
|
| 301 |
+
|
| 302 |
+
<div>
|
| 303 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Text Color</label>
|
| 304 |
+
<input type="color" id="textColor" value="#000000" class="w-12 h-10 cursor-pointer">
|
| 305 |
+
</div>
|
| 306 |
+
|
| 307 |
+
<div class="flex items-center space-x-4">
|
| 308 |
+
<button onclick="applyGradient()" class="bg-purple-600 text-white px-4 py-2 rounded-lg hover:bg-purple-700 transition">
|
| 309 |
+
Gradient Text
|
| 310 |
+
</button>
|
| 311 |
+
|
| 312 |
+
<button onclick="applyShadow()" class="bg-purple-600 text-white px-4 py-2 rounded-lg hover:bg-purple-700 transition">
|
| 313 |
+
Add Shadow
|
| 314 |
+
</button>
|
| 315 |
+
|
| 316 |
+
<button onclick="applyTypewriter()" class="bg-purple-600 text-white px-4 py-2 rounded-lg hover:bg-purple-700 transition">
|
| 317 |
+
Typewriter Effect
|
| 318 |
+
</button>
|
| 319 |
+
</div>
|
| 320 |
+
|
| 321 |
+
<button onclick="resetText()" class="bg-gray-600 text-white px-4 py-2 rounded-lg hover:bg-gray-700 transition">
|
| 322 |
+
Reset Text
|
| 323 |
+
</button>
|
| 324 |
+
|
| 325 |
+
<button onclick="downloadText()" class="bg-green-600 text-white px-4 py-2 rounded-lg hover:bg-green-700 transition">
|
| 326 |
+
<i class="fas fa-download mr-2"></i>Download as Image
|
| 327 |
+
</button>
|
| 328 |
+
</div>
|
| 329 |
+
</div>
|
| 330 |
+
|
| 331 |
+
<div class="flex justify-center items-center">
|
| 332 |
+
<div class="border-2 border-dashed border-gray-300 rounded-xl p-6 w-full min-h-48 flex items-center justify-center bg-white">
|
| 333 |
+
<div id="textPreview" class="text-center max-w-full break-words">
|
| 334 |
+
<p class="text-gray-400">Your styled text will appear here</p>
|
| 335 |
+
</div>
|
| 336 |
+
</div>
|
| 337 |
+
</div>
|
| 338 |
+
</div>
|
| 339 |
+
</div>
|
| 340 |
+
|
| 341 |
+
<!-- Mini Video Editor Tool -->
|
| 342 |
+
<div id="video-editor-tool" class="tool-card rounded-2xl p-6 hidden">
|
| 343 |
+
<h2 class="text-2xl font-bold mb-4 text-blue-700 flex items-center">
|
| 344 |
+
<i class="fas fa-video mr-3"></i> Mini Video Editor
|
| 345 |
+
</h2>
|
| 346 |
+
|
| 347 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
| 348 |
+
<div>
|
| 349 |
+
<div class="mb-4">
|
| 350 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Upload Video</label>
|
| 351 |
+
<input type="file" id="videoUpload" accept="video/*" class="block w-full text-sm text-gray-500
|
| 352 |
+
file:mr-4 file:py-2 file:px-4
|
| 353 |
+
file:rounded-lg file:border-0
|
| 354 |
+
file:text-sm file:font-semibold
|
| 355 |
+
file:bg-blue-50 file:text-blue-700
|
| 356 |
+
hover:file:bg-blue-100">
|
| 357 |
+
</div>
|
| 358 |
+
|
| 359 |
+
<div class="space-y-4">
|
| 360 |
+
<div>
|
| 361 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Start Time: <span id="startTimeValue">0</span>s</label>
|
| 362 |
+
<input type="range" id="startTime" min="0" max="100" value="0" class="w-full slider-thumb">
|
| 363 |
+
</div>
|
| 364 |
+
|
| 365 |
+
<div>
|
| 366 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">End Time: <span id="endTimeValue">100</span>s</label>
|
| 367 |
+
<input type="range" id="endTime" min="0" max="100" value="100" class="w-full slider-thumb">
|
| 368 |
+
</div>
|
| 369 |
+
|
| 370 |
+
<div>
|
| 371 |
+
<label class="block text-sm font-medium text-gray-700 mb-2">Add Background Music</label>
|
| 372 |
+
<input type="file" id="bgMusicUpload" accept="audio/*" class="block w-full text-sm text-gray-500
|
| 373 |
+
file:mr-4 file:py-2 file:px-4
|
| 374 |
+
file:rounded-lg file:border-0
|
| 375 |
+
file:text-sm file:font-semibold
|
| 376 |
+
file:bg-blue-50 file:text-blue-700
|
| 377 |
+
hover:file:bg-blue-100">
|
| 378 |
+
</div>
|
| 379 |
+
|
| 380 |
+
<div class="flex items-center space-x-4">
|
| 381 |
+
<button onclick="simulateExport()" class="bg-blue-600 text-white px-4 py-2 rounded-lg hover:bg-blue-700 transition">
|
| 382 |
+
<i class="fas fa-file-export mr-2"></i>Export Video
|
| 383 |
+
</button>
|
| 384 |
+
</div>
|
| 385 |
+
</div>
|
| 386 |
+
</div>
|
| 387 |
+
|
| 388 |
+
<div class="flex justify-center items-center">
|
| 389 |
+
<div class="border-2 border-dashed border-gray-300 rounded-xl overflow-hidden w-full">
|
| 390 |
+
<video id="videoPreview" controls class="w-full max-h-96 bg-black hidden"></video>
|
| 391 |
+
<div id="videoPlaceholder" class="p-8 text-center text-gray-500">
|
| 392 |
+
<i class="fas fa-video fa-3x mb-4"></i>
|
| 393 |
+
<p>Upload a video to edit</p>
|
| 394 |
+
</div>
|
| 395 |
+
</div>
|
| 396 |
+
</div>
|
| 397 |
+
</div>
|
| 398 |
+
</div>
|
| 399 |
+
</div>
|
| 400 |
+
</main>
|
| 401 |
+
|
| 402 |
+
<!-- Footer -->
|
| 403 |
+
<footer class="text-center py-6 text-gray-600">
|
| 404 |
+
<p class="text-lg">Made with <i class="fas fa-heart text-red-500"></i> by Big Daddy</p>
|
| 405 |
+
<p class="text-sm mt-1">© 2023 Big Daddy's Dream Studio. All dreams reserved.</p>
|
| 406 |
+
</footer>
|
| 407 |
+
|
| 408 |
+
<script>
|
| 409 |
+
// Show initial tool
|
| 410 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 411 |
+
showTool('handwriting');
|
| 412 |
+
initCanvas();
|
| 413 |
+
setupEventListeners();
|
| 414 |
+
|
| 415 |
+
// Typewriter effect for welcome text
|
| 416 |
+
setTimeout(() => {
|
| 417 |
+
document.querySelector('.typewriter').style.animation = 'none';
|
| 418 |
+
setTimeout(() => {
|
| 419 |
+
document.querySelector('.typewriter').style.animation = '';
|
| 420 |
+
}, 10);
|
| 421 |
+
}, 3500);
|
| 422 |
+
});
|
| 423 |
+
|
| 424 |
+
// Tool navigation
|
| 425 |
+
function showTool(toolId) {
|
| 426 |
+
// Hide all tools
|
| 427 |
+
document.querySelectorAll('[id$="-tool"]').forEach(tool => {
|
| 428 |
+
tool.classList.add('hidden');
|
| 429 |
+
});
|
| 430 |
+
|
| 431 |
+
// Show selected tool
|
| 432 |
+
document.getElementById(`${toolId}-tool`).classList.remove('hidden');
|
| 433 |
+
|
| 434 |
+
// Update active tab
|
| 435 |
+
document.querySelectorAll('.nav-tab').forEach(tab => {
|
| 436 |
+
tab.classList.remove('active');
|
| 437 |
+
tab.classList.remove('bg-indigo-100', 'text-indigo-700');
|
| 438 |
+
tab.classList.remove('bg-pink-100', 'text-pink-700');
|
| 439 |
+
tab.classList.remove('bg-purple-100', 'text-purple-700');
|
| 440 |
+
tab.classList.remove('bg-blue-100', 'text-blue-700');
|
| 441 |
+
});
|
| 442 |
+
|
| 443 |
+
const activeTab = document.querySelector(`[onclick="showTool('${toolId}')"]`);
|
| 444 |
+
activeTab.classList.add('active');
|
| 445 |
+
|
| 446 |
+
// Set color based on tool
|
| 447 |
+
if (toolId === 'handwriting') {
|
| 448 |
+
activeTab.classList.add('bg-indigo-100', 'text-indigo-700');
|
| 449 |
+
} else if (toolId === 'image-effects') {
|
| 450 |
+
activeTab.classList.add('bg-pink-100', 'text-pink-700');
|
| 451 |
+
} else if (toolId === 'text-styler') {
|
| 452 |
+
activeTab.classList.add('bg-purple-100', 'text-purple-700');
|
| 453 |
+
} else if (toolId === 'video-editor') {
|
| 454 |
+
activeTab.classList.add('bg-blue-100', 'text-blue-700');
|
| 455 |
+
}
|
| 456 |
+
}
|
| 457 |
+
|
| 458 |
+
// Background music toggle
|
| 459 |
+
const audioToggle = document.getElementById('audioToggle');
|
| 460 |
+
const bgMusic = document.getElementById('bgMusic');
|
| 461 |
+
|
| 462 |
+
audioToggle.addEventListener('click', function() {
|
| 463 |
+
if (bgMusic.paused) {
|
| 464 |
+
bgMusic.play();
|
| 465 |
+
audioToggle.innerHTML = '<i class="fas fa-volume-up"></i>';
|
| 466 |
+
} else {
|
| 467 |
+
bgMusic.pause();
|
| 468 |
+
audioToggle.innerHTML = '<i class="fas fa-volume-mute"></i>';
|
| 469 |
+
}
|
| 470 |
+
});
|
| 471 |
+
|
| 472 |
+
// Canvas Drawing Functionality
|
| 473 |
+
function initCanvas() {
|
| 474 |
+
const canvas = document.getElementById('canvas');
|
| 475 |
+
const ctx = canvas.getContext('2d');
|
| 476 |
+
let isDrawing = false;
|
| 477 |
+
|
| 478 |
+
// Adjust canvas size for high DPI displays
|
| 479 |
+
function resizeCanvas() {
|
| 480 |
+
const ratio = window.devicePixelRatio || 1;
|
| 481 |
+
canvas.width = canvas.offsetWidth * ratio;
|
| 482 |
+
canvas.height = canvas.offsetHeight * ratio;
|
| 483 |
+
ctx.scale(ratio, ratio);
|
| 484 |
+
}
|
| 485 |
+
|
| 486 |
+
resizeCanvas();
|
| 487 |
+
window.addEventListener('resize', resizeCanvas);
|
| 488 |
+
|
| 489 |
+
// Drawing functions
|
| 490 |
+
function startDrawing(e) {
|
| 491 |
+
isDrawing = true;
|
| 492 |
+
draw(e);
|
| 493 |
+
}
|
| 494 |
+
|
| 495 |
+
function stopDrawing() {
|
| 496 |
+
isDrawing = false;
|
| 497 |
+
ctx.beginPath();
|
| 498 |
+
}
|
| 499 |
+
|
| 500 |
+
function draw(e) {
|
| 501 |
+
if (!isDrawing) return;
|
| 502 |
+
|
| 503 |
+
ctx.lineWidth = document.getElementById('penSize').value;
|
| 504 |
+
ctx.lineCap = 'round';
|
| 505 |
+
ctx.strokeStyle = document.getElementById('penColor').value;
|
| 506 |
+
|
| 507 |
+
// Get position (mouse or touch)
|
| 508 |
+
let x, y;
|
| 509 |
+
if (e.type.includes('touch')) {
|
| 510 |
+
const rect = canvas.getBoundingClientRect();
|
| 511 |
+
x = e.touches[0].clientX - rect.left;
|
| 512 |
+
y = e.touches[0].clientY - rect.top;
|
| 513 |
+
} else {
|
| 514 |
+
x = e.offsetX;
|
| 515 |
+
y = e.offsetY;
|
| 516 |
+
}
|
| 517 |
+
|
| 518 |
+
ctx.lineTo(x, y);
|
| 519 |
+
ctx.stroke();
|
| 520 |
+
ctx.beginPath();
|
| 521 |
+
ctx.moveTo(x, y);
|
| 522 |
+
}
|
| 523 |
+
|
| 524 |
+
// Event listeners
|
| 525 |
+
canvas.addEventListener('mousedown', startDrawing);
|
| 526 |
+
canvas.addEventListener('mousemove', draw);
|
| 527 |
+
canvas.addEventListener('mouseup', stopDrawing);
|
| 528 |
+
canvas.addEventListener('mouseout', stopDrawing);
|
| 529 |
+
|
| 530 |
+
// Touch support
|
| 531 |
+
canvas.addEventListener('touchstart', function(e) {
|
| 532 |
+
e.preventDefault();
|
| 533 |
+
startDrawing(e);
|
| 534 |
+
});
|
| 535 |
+
|
| 536 |
+
canvas.addEventListener('touchmove', function(e) {
|
| 537 |
+
e.preventDefault();
|
| 538 |
+
draw(e);
|
| 539 |
+
});
|
| 540 |
+
|
| 541 |
+
canvas.addEventListener('touchend', stopDrawing);
|
| 542 |
+
}
|
| 543 |
+
|
| 544 |
+
function clearCanvas() {
|
| 545 |
+
const canvas = document.getElementById('canvas');
|
| 546 |
+
const ctx = canvas.getContext('2d');
|
| 547 |
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
| 548 |
+
}
|
| 549 |
+
|
| 550 |
+
function saveCanvas() {
|
| 551 |
+
const canvas = document.getElementById('canvas');
|
| 552 |
+
const link = document.createElement('a');
|
| 553 |
+
link.download = 'big-daddy-drawing.png';
|
| 554 |
+
link.href = canvas.toDataURL('image/png');
|
| 555 |
+
link.click();
|
| 556 |
+
}
|
| 557 |
+
|
| 558 |
+
// Image Effects Functionality
|
| 559 |
+
function setupEventListeners() {
|
| 560 |
+
// Pen size value display
|
| 561 |
+
document.getElementById('penSize').addEventListener('input', function() {
|
| 562 |
+
document.getElementById('penSizeValue').textContent = this.value + 'px';
|
| 563 |
+
});
|
| 564 |
+
|
| 565 |
+
// Image upload and effects
|
| 566 |
+
document.getElementById('imageUpload').addEventListener('change', function(e) {
|
| 567 |
+
const file = e.target.files[0];
|
| 568 |
+
if (file) {
|
| 569 |
+
const reader = new FileReader();
|
| 570 |
+
reader.onload = function(event) {
|
| 571 |
+
const img = document.getElementById('imagePreview');
|
| 572 |
+
img.src = event.target.result;
|
| 573 |
+
img.classList.remove('hidden');
|
| 574 |
+
document.getElementById('imagePlaceholder').classList.add('hidden');
|
| 575 |
+
|
| 576 |
+
// Store original image
|
| 577 |
+
img.dataset.original = event.target.result;
|
| 578 |
+
|
| 579 |
+
// Reset all effects
|
| 580 |
+
resetImage();
|
| 581 |
+
};
|
| 582 |
+
reader.readAsDataURL(file);
|
| 583 |
+
}
|
| 584 |
+
});
|
| 585 |
+
|
| 586 |
+
// Image effect sliders
|
| 587 |
+
document.getElementById('brightness').addEventListener('input', function() {
|
| 588 |
+
document.getElementById('brightnessValue').textContent = this.value;
|
| 589 |
+
applyImageEffects();
|
| 590 |
+
});
|
| 591 |
+
|
| 592 |
+
document.getElementById('contrast').addEventListener('input', function() {
|
| 593 |
+
document.getElementById('contrastValue').textContent = this.value;
|
| 594 |
+
applyImageEffects();
|
| 595 |
+
});
|
| 596 |
+
|
| 597 |
+
document.getElementById('blur').addEventListener('input', function() {
|
| 598 |
+
document.getElementById('blurValue').textContent = this.value;
|
| 599 |
+
applyImageEffects();
|
| 600 |
+
});
|
| 601 |
+
|
| 602 |
+
// Text styler
|
| 603 |
+
document.getElementById('textInput').addEventListener('input', updateTextPreview);
|
| 604 |
+
document.getElementById('fontFamily').addEventListener('change', updateTextPreview);
|
| 605 |
+
document.getElementById('fontSize').addEventListener('input', function() {
|
| 606 |
+
document.getElementById('fontSizeValue').textContent = this.value;
|
| 607 |
+
updateTextPreview();
|
| 608 |
+
});
|
| 609 |
+
document.getElementById('textColor').addEventListener('input', updateTextPreview);
|
| 610 |
+
|
| 611 |
+
// Video editor
|
| 612 |
+
document.getElementById('videoUpload').addEventListener('change', function(e) {
|
| 613 |
+
const file = e.target.files[0];
|
| 614 |
+
if (file) {
|
| 615 |
+
const video = document.getElementById('videoPreview');
|
| 616 |
+
video.src = URL.createObjectURL(file);
|
| 617 |
+
video.classList.remove('hidden');
|
| 618 |
+
document.getElementById('videoPlaceholder').classList.add('hidden');
|
| 619 |
+
|
| 620 |
+
// Set max duration when metadata is loaded
|
| 621 |
+
video.onloadedmetadata = function() {
|
| 622 |
+
const duration = Math.floor(video.duration);
|
| 623 |
+
document.getElementById('startTime').max = duration;
|
| 624 |
+
document.getElementById('endTime').max = duration;
|
| 625 |
+
document.getElementById('endTime').value = duration;
|
| 626 |
+
document.getElementById('endTimeValue').textContent = duration;
|
| 627 |
+
};
|
| 628 |
+
}
|
| 629 |
+
});
|
| 630 |
+
|
| 631 |
+
document.getElementById('startTime').addEventListener('input', function() {
|
| 632 |
+
document.getElementById('startTimeValue').textContent = this.value;
|
| 633 |
+
updateVideoPreview();
|
| 634 |
+
});
|
| 635 |
+
|
| 636 |
+
document.getElementById('endTime').addEventListener('input', function() {
|
| 637 |
+
document.getElementById('endTimeValue').textContent = this.value;
|
| 638 |
+
updateVideoPreview();
|
| 639 |
+
});
|
| 640 |
+
}
|
| 641 |
+
|
| 642 |
+
function applyImageEffects() {
|
| 643 |
+
const img = document.getElementById('imagePreview');
|
| 644 |
+
if (!img.src) return;
|
| 645 |
+
|
| 646 |
+
const brightness = document.getElementById('brightness').value;
|
| 647 |
+
const contrast = document.getElementById('contrast').value;
|
| 648 |
+
const blur = document.getElementById('blur').value;
|
| 649 |
+
|
| 650 |
+
img.style.filter = `brightness(${brightness}%) contrast(${contrast}%) blur(${blur}px)`;
|
| 651 |
+
}
|
| 652 |
+
|
| 653 |
+
function applyGrayscale() {
|
| 654 |
+
const img = document.getElementById('imagePreview');
|
| 655 |
+
if (!img.src) return;
|
| 656 |
+
|
| 657 |
+
if (img.style.filter.includes('grayscale')) {
|
| 658 |
+
img.style.filter = img.style.filter.replace(' grayscale(1)', '');
|
| 659 |
+
} else {
|
| 660 |
+
img.style.filter += ' grayscale(1)';
|
| 661 |
+
}
|
| 662 |
+
}
|
| 663 |
+
|
| 664 |
+
function applySepia() {
|
| 665 |
+
const img = document.getElementById('imagePreview');
|
| 666 |
+
if (!img.src) return;
|
| 667 |
+
|
| 668 |
+
if (img.style.filter.includes('sepia')) {
|
| 669 |
+
img.style.filter = img.style.filter.replace(' sepia(1)', '');
|
| 670 |
+
} else {
|
| 671 |
+
img.style.filter += ' sepia(1)';
|
| 672 |
+
}
|
| 673 |
+
}
|
| 674 |
+
|
| 675 |
+
function toggleFloralBorder() {
|
| 676 |
+
const imgContainer = document.getElementById('imagePreview').parentElement;
|
| 677 |
+
imgContainer.classList.toggle('floral-border');
|
| 678 |
+
}
|
| 679 |
+
|
| 680 |
+
function resetImage() {
|
| 681 |
+
const img = document.getElementById('imagePreview');
|
| 682 |
+
if (img.dataset.original) {
|
| 683 |
+
img.src = img.dataset.original;
|
| 684 |
+
}
|
| 685 |
+
img.style.filter = '';
|
| 686 |
+
document.getElementById('brightness').value = 100;
|
| 687 |
+
document.getElementById('brightnessValue').textContent = '100';
|
| 688 |
+
document.getElementById('contrast').value = 100;
|
| 689 |
+
document.getElementById('contrastValue').textContent = '100';
|
| 690 |
+
document.getElementById('blur').value = 0;
|
| 691 |
+
document.getElementById('blurValue').textContent = '0';
|
| 692 |
+
img.parentElement.classList.remove('floral-border');
|
| 693 |
+
}
|
| 694 |
+
|
| 695 |
+
function downloadImage() {
|
| 696 |
+
const img = document.getElementById('imagePreview');
|
| 697 |
+
if (!img.src) {
|
| 698 |
+
alert('Please upload an image first');
|
| 699 |
+
return;
|
| 700 |
+
}
|
| 701 |
+
|
| 702 |
+
// Create a canvas to apply all effects (including CSS filters)
|
| 703 |
+
const canvas = document.createElement('canvas');
|
| 704 |
+
const ctx = canvas.getContext('2d');
|
| 705 |
+
canvas.width = img.naturalWidth;
|
| 706 |
+
canvas.height = img.naturalHeight;
|
| 707 |
+
|
| 708 |
+
// Apply CSS filters to canvas
|
| 709 |
+
ctx.filter = window.getComputedStyle(img).filter;
|
| 710 |
+
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
| 711 |
+
|
| 712 |
+
// For floral border (would need more complex implementation for actual border)
|
| 713 |
+
|
| 714 |
+
const link = document.createElement('a');
|
| 715 |
+
link.download = 'big-daddy-image.png';
|
| 716 |
+
link.href = canvas.toDataURL('image/png');
|
| 717 |
+
link.click();
|
| 718 |
+
}
|
| 719 |
+
|
| 720 |
+
// Text Styler Functionality
|
| 721 |
+
function updateTextPreview() {
|
| 722 |
+
const text = document.getElementById('textInput').value;
|
| 723 |
+
const preview = document.getElementById('textPreview');
|
| 724 |
+
|
| 725 |
+
if (!text.trim()) {
|
| 726 |
+
preview.innerHTML = '<p class="text-gray-400">Your styled text will appear here</p>';
|
| 727 |
+
return;
|
| 728 |
+
}
|
| 729 |
+
|
| 730 |
+
const fontFamily = document.getElementById('fontFamily').value;
|
| 731 |
+
const fontSize = document.getElementById('fontSize').value + 'px';
|
| 732 |
+
const color = document.getElementById('textColor').value;
|
| 733 |
+
|
| 734 |
+
preview.innerHTML = text;
|
| 735 |
+
preview.style.fontFamily = fontFamily;
|
| 736 |
+
preview.style.fontSize = fontSize;
|
| 737 |
+
preview.style.color = color;
|
| 738 |
+
|
| 739 |
+
// Remove previous effects
|
| 740 |
+
preview.classList.remove('gradient-text');
|
| 741 |
+
preview.style.textShadow = '';
|
| 742 |
+
preview.classList.remove('typewriter');
|
| 743 |
+
}
|
| 744 |
+
|
| 745 |
+
function applyGradient() {
|
| 746 |
+
const preview = document.getElementById('textPreview');
|
| 747 |
+
preview.classList.add('gradient-text');
|
| 748 |
+
}
|
| 749 |
+
|
| 750 |
+
function applyShadow() {
|
| 751 |
+
const preview = document.getElementById('textPreview');
|
| 752 |
+
preview.style.textShadow = '2px 2px 4px rgba(0,0,0,0.3)';
|
| 753 |
+
}
|
| 754 |
+
|
| 755 |
+
function applyTypewriter() {
|
| 756 |
+
const preview = document.getElementById('textPreview');
|
| 757 |
+
preview.classList.add('typewriter');
|
| 758 |
+
}
|
| 759 |
+
|
| 760 |
+
function resetText() {
|
| 761 |
+
document.getElementById('textInput').value = '';
|
| 762 |
+
document.getElementById('fontFamily').value = 'Arial, sans-serif';
|
| 763 |
+
document.getElementById('fontSize').value = 24;
|
| 764 |
+
document.getElementById('fontSizeValue').textContent = '24';
|
| 765 |
+
document.getElementById('textColor').value = '#000000';
|
| 766 |
+
updateTextPreview();
|
| 767 |
+
}
|
| 768 |
+
|
| 769 |
+
function downloadText() {
|
| 770 |
+
const preview = document.getElementById('textPreview');
|
| 771 |
+
if (preview.textContent === 'Your styled text will appear here') {
|
| 772 |
+
alert('Please enter some text first');
|
| 773 |
+
return;
|
| 774 |
+
}
|
| 775 |
+
|
| 776 |
+
// Create a canvas to render the text
|
| 777 |
+
const canvas = document.createElement('canvas');
|
| 778 |
+
const ctx = canvas.getContext('2d');
|
| 779 |
+
|
| 780 |
+
// Set canvas size based on text dimensions
|
| 781 |
+
const styles = window.getComputedStyle(preview);
|
| 782 |
+
ctx.font = `${styles.fontSize} ${styles.fontFamily}`;
|
| 783 |
+
const textWidth = ctx.measureText(preview.textContent).width;
|
| 784 |
+
|
| 785 |
+
canvas.width = textWidth + 40; // Add padding
|
| 786 |
+
canvas.height = parseInt(styles.fontSize) * 2; // Approximate height
|
| 787 |
+
|
| 788 |
+
// Fill background
|
| 789 |
+
ctx.fillStyle = 'white';
|
| 790 |
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
| 791 |
+
|
| 792 |
+
// Apply text styles
|
| 793 |
+
ctx.font = `${styles.fontSize} ${styles.fontFamily}`;
|
| 794 |
+
|
| 795 |
+
// Check for gradient text
|
| 796 |
+
if (preview.classList.contains('gradient-text')) {
|
| 797 |
+
const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
|
| 798 |
+
gradient.addColorStop(0, '#6366f1');
|
| 799 |
+
gradient.addColorStop(0.5, '#a855f7');
|
| 800 |
+
gradient.addColorStop(1, '#ec4899');
|
| 801 |
+
ctx.fillStyle = gradient;
|
| 802 |
+
} else {
|
| 803 |
+
ctx.fillStyle = styles.color;
|
| 804 |
+
}
|
| 805 |
+
|
| 806 |
+
// Apply shadow if exists
|
| 807 |
+
if (preview.style.textShadow) {
|
| 808 |
+
const shadow = preview.style.textShadow.split(' ');
|
| 809 |
+
ctx.shadowColor = shadow[3].replace(/[rgba()]/g, '');
|
| 810 |
+
ctx.shadowOffsetX = parseInt(shadow[0]);
|
| 811 |
+
ctx.shadowOffsetY = parseInt(shadow[1]);
|
| 812 |
+
ctx.shadowBlur = parseInt(shadow[2]);
|
| 813 |
+
}
|
| 814 |
+
|
| 815 |
+
// Draw text
|
| 816 |
+
ctx.textAlign = 'center';
|
| 817 |
+
ctx.textBaseline = 'middle';
|
| 818 |
+
ctx.fillText(preview.textContent, canvas.width / 2, canvas.height / 2);
|
| 819 |
+
|
| 820 |
+
const link = document.createElement('a');
|
| 821 |
+
link.download = 'big-daddy-text.png';
|
| 822 |
+
link.href = canvas.toDataURL('image/png');
|
| 823 |
+
link.click();
|
| 824 |
+
}
|
| 825 |
+
|
| 826 |
+
// Video Editor Functionality
|
| 827 |
+
function updateVideoPreview() {
|
| 828 |
+
const video = document.getElementById('videoPreview');
|
| 829 |
+
if (!video.src) return;
|
| 830 |
+
|
| 831 |
+
const startTime = document.getElementById('startTime').value;
|
| 832 |
+
const endTime = document.getElementById('endTime').value;
|
| 833 |
+
|
| 834 |
+
// In a real app, we would trim the video here
|
| 835 |
+
// This is just a UI demo
|
| 836 |
+
}
|
| 837 |
+
|
| 838 |
+
function simulateExport() {
|
| 839 |
+
const video = document.getElementById('videoPreview');
|
| 840 |
+
if (!video.src) {
|
| 841 |
+
alert('Please upload a video first');
|
| 842 |
+
return;
|
| 843 |
+
}
|
| 844 |
+
|
| 845 |
+
alert('Video export started! In a real application, this would process the video with the selected trim points and background music.');
|
| 846 |
+
}
|
| 847 |
+
</script>
|
| 848 |
+
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=jasvir-singh1021/big-daddy-studio" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
|
| 849 |
+
</html>
|