CommandPrompt commited on
Commit
67f6005
·
verified ·
1 Parent(s): 8ab6d9b

Make it work. It work be extremely advanced

Browse files
Files changed (8) hide show
  1. components/footer.js +1 -3
  2. components/help-modal.js +159 -0
  3. components/navbar.js +2 -5
  4. features.html +125 -0
  5. index.html +117 -47
  6. script.js +429 -50
  7. style.css +177 -1
  8. templates.html +125 -0
components/footer.js CHANGED
@@ -86,7 +86,6 @@ class CustomFooter extends HTMLElement {
86
  <a href="#" class="social-link"><i data-feather="linkedin"></i></a>
87
  </div>
88
  </div>
89
-
90
  <div class="footer-section">
91
  <h3>Quick Links</h3>
92
  <div class="footer-links">
@@ -96,8 +95,7 @@ class CustomFooter extends HTMLElement {
96
  <a href="/templates" class="footer-link">Templates</a>
97
  </div>
98
  </div>
99
-
100
- <div class="footer-section">
101
  <h3>Resources</h3>
102
  <div class="footer-links">
103
  <a href="/blog" class="footer-link">Blog</a>
 
86
  <a href="#" class="social-link"><i data-feather="linkedin"></i></a>
87
  </div>
88
  </div>
 
89
  <div class="footer-section">
90
  <h3>Quick Links</h3>
91
  <div class="footer-links">
 
95
  <a href="/templates" class="footer-link">Templates</a>
96
  </div>
97
  </div>
98
+ <div class="footer-section">
 
99
  <h3>Resources</h3>
100
  <div class="footer-links">
101
  <a href="/blog" class="footer-link">Blog</a>
components/help-modal.js ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class HelpModal extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ .modal {
7
+ position: fixed;
8
+ top: 0;
9
+ left: 0;
10
+ width: 100%;
11
+ height: 100%;
12
+ background: rgba(0, 0, 0, 0.7);
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ z-index: 1000;
17
+ opacity: 0;
18
+ visibility: hidden;
19
+ transition: all 0.3s ease;
20
+ }
21
+
22
+ .modal.active {
23
+ opacity: 1;
24
+ visibility: visible;
25
+ }
26
+
27
+ .modal-content {
28
+ background: #1F2937;
29
+ border-radius: 10px;
30
+ width: 90%;
31
+ max-width: 600px;
32
+ max-height: 90vh;
33
+ overflow-y: auto;
34
+ transform: translateY(-20px);
35
+ transition: transform 0.3s ease;
36
+ }
37
+
38
+ .modal.active .modal-content {
39
+ transform: translateY(0);
40
+ }
41
+
42
+ .modal-header {
43
+ padding: 1rem 1.5rem;
44
+ border-bottom: 1px solid #374151;
45
+ display: flex;
46
+ justify-content: space-between;
47
+ align-items: center;
48
+ }
49
+
50
+ .modal-body {
51
+ padding: 1.5rem;
52
+ }
53
+
54
+ .modal-footer {
55
+ padding: 1rem 1.5rem;
56
+ border-top: 1px solid #374151;
57
+ display: flex;
58
+ justify-content: flex-end;
59
+ }
60
+
61
+ .close-btn {
62
+ background: none;
63
+ border: none;
64
+ color: white;
65
+ font-size: 1.5rem;
66
+ cursor: pointer;
67
+ }
68
+
69
+ h2 {
70
+ margin-top: 0;
71
+ color: white;
72
+ }
73
+
74
+ h3 {
75
+ color: #9CA3AF;
76
+ margin-top: 1.5rem;
77
+ }
78
+
79
+ ul {
80
+ padding-left: 1.5rem;
81
+ }
82
+
83
+ li {
84
+ margin-bottom: 0.5rem;
85
+ color: #D1D5DB;
86
+ }
87
+
88
+ kbd {
89
+ background: #374151;
90
+ padding: 0.2rem 0.4rem;
91
+ border-radius: 0.25rem;
92
+ font-family: monospace;
93
+ }
94
+ </style>
95
+
96
+ <div class="modal" id="help-modal">
97
+ <div class="modal-content">
98
+ <div class="modal-header">
99
+ <h2>Teleprompter Help</h2>
100
+ <button class="close-btn">&times;</button>
101
+ </div>
102
+ <div class="modal-body">
103
+ <h3>Getting Started</h3>
104
+ <p>Enter your script in the text area on the left. Adjust settings like scroll speed, text size, and theme using the controls.</p>
105
+
106
+ <h3>Controls</h3>
107
+ <ul>
108
+ <li><strong>Start Scrolling:</strong> Begin the teleprompter scroll</li>
109
+ <li><strong>Pause:</strong> Temporarily stop the scroll</li>
110
+ <li><strong>Speed Slider:</strong> Adjust scrolling speed (0.1x - 5x)</li>
111
+ </ul>
112
+
113
+ <h3>Keyboard Shortcuts</h3>
114
+ <ul>
115
+ <li><kbd>Space</kbd> - Toggle scrolling</li>
116
+ <li><kbd>Ctrl</kbd>+<kbd>S</kbd> - Save script</li>
117
+ <li><kbd>Ctrl</kbd>+<kbd>O</kbd> - Load script</li>
118
+ <li><kbd>Ctrl</kbd>+<kbd>E</kbd> - Export script</li>
119
+ <li><kbd>↑</kbd> - Increase speed</li>
120
+ <li><kbd>↓</kbd> - Decrease speed</li>
121
+ </ul>
122
+
123
+ <h3>Advanced Features</h3>
124
+ <ul>
125
+ <li><strong>Themes:</strong> Choose from 6 color themes</li>
126
+ <li><strong>Text Formatting:</strong> Bold, italic, underline options</li>
127
+ <li><strong>Mirror View:</strong> Flip text for teleprompter reflection</li>
128
+ <li><strong>Preview Mode:</strong> Toggle between dark/light backgrounds</li>
129
+ </ul>
130
+ </div>
131
+ <div class="modal-footer">
132
+ <button id="close-help" class="px-4 py-2 bg-gray-600 hover:bg-gray-500 rounded">Close</button>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ `;
137
+
138
+ // Add event listeners
139
+ this.shadowRoot.querySelector('.close-btn').addEventListener('click', () => this.close());
140
+ this.shadowRoot.querySelector('#close-help').addEventListener('click', () => this.close());
141
+
142
+ // Close modal when clicking outside
143
+ this.shadowRoot.querySelector('.modal').addEventListener('click', (e) => {
144
+ if (e.target.classList.contains('modal')) {
145
+ this.close();
146
+ }
147
+ });
148
+ }
149
+
150
+ open() {
151
+ this.shadowRoot.querySelector('.modal').classList.add('active');
152
+ }
153
+
154
+ close() {
155
+ this.shadowRoot.querySelector('.modal').classList.remove('active');
156
+ }
157
+ }
158
+
159
+ customElements.define('help-modal', HelpModal);
components/navbar.js CHANGED
@@ -26,13 +26,11 @@ class CustomNavbar extends HTMLElement {
26
  align-items: center;
27
  gap: 0.5rem;
28
  }
29
-
30
  .nav-links {
31
  display: flex;
32
  gap: 1.5rem;
33
  }
34
-
35
- .nav-link {
36
  color: rgba(255, 255, 255, 0.8);
37
  text-decoration: none;
38
  transition: color 0.2s;
@@ -63,7 +61,6 @@ class CustomNavbar extends HTMLElement {
63
  <i data-feather="tv"></i>
64
  Teleprompter Factory
65
  </a>
66
-
67
  <div class="nav-links">
68
  <a href="/" class="nav-link">Home</a>
69
  <a href="/templates" class="nav-link">Templates</a>
@@ -71,7 +68,7 @@ class CustomNavbar extends HTMLElement {
71
  <a href="/pricing" class="nav-link">Pricing</a>
72
  <a href="/contact" class="nav-link">Contact</a>
73
  </div>
74
- </div>
75
  </nav>
76
  `;
77
  }
 
26
  align-items: center;
27
  gap: 0.5rem;
28
  }
 
29
  .nav-links {
30
  display: flex;
31
  gap: 1.5rem;
32
  }
33
+ .nav-link {
 
34
  color: rgba(255, 255, 255, 0.8);
35
  text-decoration: none;
36
  transition: color 0.2s;
 
61
  <i data-feather="tv"></i>
62
  Teleprompter Factory
63
  </a>
 
64
  <div class="nav-links">
65
  <a href="/" class="nav-link">Home</a>
66
  <a href="/templates" class="nav-link">Templates</a>
 
68
  <a href="/pricing" class="nav-link">Pricing</a>
69
  <a href="/contact" class="nav-link">Contact</a>
70
  </div>
71
+ </div>
72
  </nav>
73
  `;
74
  }
features.html ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ```html
2
+ <!DOCTYPE html>
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Features | Teleprompter Factory</title>
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://unpkg.com/feather-icons"></script>
11
+ <script>
12
+ tailwind.config = {
13
+ theme: {
14
+ extend: {
15
+ colors: {
16
+ primary: {
17
+ 500: '#3B82F6',
18
+ },
19
+ secondary: {
20
+ 500: '#10B981',
21
+ }
22
+ }
23
+ }
24
+ }
25
+ }
26
+ </script>
27
+ </head>
28
+ <body class="bg-gray-900 text-gray-100 min-h-screen">
29
+ <custom-navbar></custom-navbar>
30
+
31
+ <main class="container mx-auto px-4 py-8">
32
+ <div class="max-w-4xl mx-auto">
33
+ <h1 class="text-3xl font-bold mb-2">Powerful Features</h1>
34
+ <p class="text-gray-400 mb-12">Everything you need for professional teleprompting</p>
35
+
36
+ <div class="space-y-12">
37
+ <!-- Feature 1 -->
38
+ <div class="flex flex-col md:flex-row gap-8 items-center">
39
+ <div class="md:w-1/3">
40
+ <div class="bg-gray-800 rounded-xl p-6 h-48 flex items-center justify-center">
41
+ <i data-feather="sliders" class="w-16 h-16 text-primary-500"></i>
42
+ </div>
43
+ </div>
44
+ <div class="md:w-2/3">
45
+ <h3 class="text-2xl font-semibold mb-2">Precise Speed Control</h3>
46
+ <p class="text-gray-400 mb-4">Adjust scrolling speed from 0.1x to 5x with precision controls. Perfect for matching your speaking pace exactly.</p>
47
+ <ul class="text-gray-400 space-y-2">
48
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Real-time speed adjustment</li>
49
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Keyboard shortcuts for quick changes</li>
50
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Precision increments of 0.1x</li>
51
+ </ul>
52
+ </div>
53
+ </div>
54
+
55
+ <!-- Feature 2 -->
56
+ <div class="flex flex-col md:flex-row gap-8 items-center">
57
+ <div class="md:w-2/3 order-2 md:order-1">
58
+ <h3 class="text-2xl font-semibold mb-2">Multiple Themes & Customization</h3>
59
+ <p class="text-gray-400 mb-4">Choose from 6 professionally designed themes or customize every aspect of your teleprompter interface.</p>
60
+ <ul class="text-gray-400 space-y-2">
61
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>6 pre-designed color themes</li>
62
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Text size and alignment options</li>
63
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Font style selection</li>
64
+ </ul>
65
+ </div>
66
+ <div class="md:w-1/3 order-1 md:order-2">
67
+ <div class="bg-gray-800 rounded-xl p-6 h-48 flex items-center justify-center">
68
+ <i data-feather="droplet" class="w-16 h-16 text-secondary-500"></i>
69
+ </div>
70
+ </div>
71
+ </div>
72
+
73
+ <!-- Feature 3 -->
74
+ <div class="flex flex-col md:flex-row gap-8 items-center">
75
+ <div class="md:w-1/3">
76
+ <div class="bg-gray-800 rounded-xl p-6 h-48 flex items-center justify-center">
77
+ <i data-feather="layers" class="w-16 h-16 text-primary-500"></i>
78
+ </div>
79
+ </div>
80
+ <div class="md:w-2/3">
81
+ <h3 class="text-2xl font-semibold mb-2">Advanced Text Formatting</h3>
82
+ <p class="text-gray-400 mb-4">Apply formatting to emphasize key points or make your script easier to follow during presentation.</p>
83
+ <ul class="text-gray-400 space-y-2">
84
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Bold, italic, underline options</li>
85
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Text alignment controls</li>
86
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Live preview of formatting</li>
87
+ </ul>
88
+ </div>
89
+ </div>
90
+
91
+ <!-- Feature 4 -->
92
+ <div class="flex flex-col md:flex-row gap-8 items-center">
93
+ <div class="md:w-2/3 order-2 md:order-1">
94
+ <h3 class="text-2xl font-semibold mb-2">Script Management</h3>
95
+ <p class="text-gray-400 mb-4">Save, load, import, and export scripts with our comprehensive script management system.</p>
96
+ <ul class="text-gray-400 space-y-2">
97
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Local storage for quick access</li>
98
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Import from text files</li>
99
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Export to share with team members</li>
100
+ </ul>
101
+ </div>
102
+ <div class="md:w-1/3 order-1 md:order-2">
103
+ <div class="bg-gray-800 rounded-xl p-6 h-48 flex items-center justify-center">
104
+ <i data-feather="database" class="w-16 h-16 text-secondary-500"></i>
105
+ </div>
106
+ </div>
107
+ </div>
108
+
109
+ <!-- Feature 5 -->
110
+ <div class="flex flex-col md:flex-row gap-8 items-center">
111
+ <div class="md:w-1/3">
112
+ <div class="bg-gray-800 rounded-xl p-6 h-48 flex items-center justify-center">
113
+ <i data-feather="eye" class="w-16 h-16 text-primary-500"></i>
114
+ </div>
115
+ </div>
116
+ <div class="md:w-2/3">
117
+ <h3 class="text-2xl font-semibold mb-2">Mirror & Preview Modes</h3>
118
+ <p class="text-gray-400 mb-4">Perfect for teleprompter setups with mirrors or for checking your script before presenting.</p>
119
+ <ul class="text-gray-400 space-y-2">
120
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Mirror flip for reflective surfaces</li>
121
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-500 mr-2"></i>Dark/light preview modes</li>
122
+ <li class="flex items-center"><i data-feather="check-circle" class="w-5 h-5 text-green-50
123
+ ___METADATA_START___
124
+ {"repoId":"CommandPrompt/scrollgenius-3000-pro-max-deluxe","isNew":false,"userName":"CommandPrompt"}
125
+ ___METADATA_END___
index.html CHANGED
@@ -29,44 +29,45 @@
29
  <custom-navbar></custom-navbar>
30
 
31
  <main class="container mx-auto px-4 py-8">
32
- <div class="max-w-4xl mx-auto bg-gray-800 rounded-xl shadow-2xl overflow-hidden border border-gray-700">
33
  <div class="p-6 bg-gradient-to-r from-primary-500 to-secondary-500 relative">
34
  <div class="absolute top-4 right-4 flex gap-2">
35
- <button class="p-2 bg-white/10 rounded-full hover:bg-white/20 transition">
36
  <i data-feather="minimize-2" class="w-4 h-4"></i>
37
  </button>
38
- <button class="p-2 bg-white/10 rounded-full hover:bg-white/20 transition">
39
  <i data-feather="maximize-2" class="w-4 h-4"></i>
40
  </button>
41
- <button class="p-2 bg-red-500 rounded-full hover:bg-red-600 transition">
42
  <i data-feather="x" class="w-4 h-4"></i>
43
  </button>
44
  </div>
45
  <h1 class="text-3xl font-bold">ScrollGenius 3000</h1>
46
  <p class="text-gray-200 mt-2">Professional Teleprompter Widget</p>
47
  </div>
48
- <div class="p-6 grid grid-cols-1 md:grid-cols-2 gap-6 relative">
49
  <div class="absolute top-0 left-0 right-0 h-1 bg-gradient-to-r from-primary-500 to-secondary-500"></div>
50
- <div class="space-y-6">
51
  <div>
52
  <label class="block text-sm font-medium text-gray-300 mb-1 flex items-center justify-between">
53
  <span>Script Title</span>
54
  <span class="text-xs text-gray-400">Ctrl+T</span>
55
  </label>
56
  <div class="relative">
57
- <input type="text" class="w-full bg-gray-700 border border-gray-600 rounded-lg px-4 py-2 focus:ring-2 focus:ring-primary-500 focus:border-primary-500 outline-none transition pr-10">
58
  <button class="absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-white">
59
  <i data-feather="edit-2" class="w-4 h-4"></i>
60
  </button>
61
  </div>
62
  </div>
 
63
  <div>
64
  <label class="block text-sm font-medium text-gray-300 mb-1 flex items-center justify-between">
65
  <span>Scroll Speed</span>
66
  <span class="text-xs text-gray-400" id="speed-value">1.0x</span>
67
  </label>
68
- <input type="range" min="0.5" max="3" step="0.1" value="1" class="w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-primary-500">
69
- <div class="flex justify-between text-xs text-gray-400 mt-1">
70
  <span>Slow</span>
71
  <span>Medium</span>
72
  <span>Fast</span>
@@ -75,77 +76,146 @@
75
 
76
  <div>
77
  <label class="block text-sm font-medium text-gray-300 mb-1">Text Size</label>
78
- <select class="w-full bg-gray-700 border border-gray-600 rounded-lg px-4 py-2 focus:ring-2 focus:ring-primary-500 focus:border-primary-500 outline-none transition">
79
- <option>Small</option>
80
- <option selected>Medium</option>
81
- <option>Large</option>
82
- <option>Extra Large</option>
83
  </select>
84
  </div>
85
 
86
  <div>
87
  <label class="block text-sm font-medium text-gray-300 mb-1">Theme</label>
 
 
 
 
 
 
 
 
 
 
 
 
88
  <div class="grid grid-cols-3 gap-2">
89
- <button class="bg-blue-500 h-10 rounded-lg"></button>
90
- <button class="bg-green-500 h-10 rounded-lg"></button>
91
- <button class="bg-purple-500 h-10 rounded-lg"></button>
92
- <button class="bg-red-500 h-10 rounded-lg"></button>
93
- <button class="bg-yellow-500 h-10 rounded-lg"></button>
94
- <button class="bg-pink-500 h-10 rounded-lg"></button>
 
 
 
 
 
 
 
 
 
 
 
95
  </div>
96
  </div>
97
  </div>
98
- <div class="bg-gray-700 rounded-lg p-4 h-64 overflow-y-auto relative group">
99
- <textarea class="w-full h-full bg-transparent resize-none outline-none text-gray-200 placeholder-gray-500" placeholder="Enter your script here..."></textarea>
100
- <div class="absolute bottom-4 right-4 opacity-0 group-hover:opacity-100 transition flex gap-2">
101
- <button class="p-2 bg-gray-600 rounded-lg hover:bg-gray-500" title="Format Text">
102
- <i data-feather="type" class="w-4 h-4"></i>
103
- </button>
104
- <button class="p-2 bg-gray-600 rounded-lg hover:bg-gray-500" title="Import Script">
105
- <i data-feather="upload" class="w-4 h-4"></i>
106
- </button>
107
- <button class="p-2 bg-gray-600 rounded-lg hover:bg-gray-500" title="Clear All">
108
- <i data-feather="trash-2" class="w-4 h-4"></i>
109
- </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  </div>
111
  </div>
112
- </div>
 
113
  <div class="p-6 bg-gray-700 border-t border-gray-600 flex flex-wrap justify-between gap-4">
114
  <div class="flex gap-2">
115
- <button class="px-4 py-2 bg-gray-600 hover:bg-gray-500 rounded-lg font-medium transition flex items-center gap-2 text-sm">
116
  <i data-feather="save" class="w-4 h-4"></i> Save
117
  </button>
118
- <button class="px-4 py-2 bg-gray-600 hover:bg-gray-500 rounded-lg font-medium transition flex items-center gap-2 text-sm">
119
- <i data-feather="settings" class="w-4 h-4"></i> Settings
 
 
 
120
  </button>
121
  </div>
122
  <div class="flex gap-2">
123
- <button class="px-4 py-2 bg-gray-600 hover:bg-gray-500 rounded-lg font-medium transition flex items-center gap-2 text-sm">
124
  <i data-feather="help-circle" class="w-4 h-4"></i> Help
125
  </button>
126
- <button class="px-6 py-2 bg-primary-500 hover:bg-primary-600 rounded-lg font-medium transition flex items-center gap-2 text-sm glow">
127
- <i data-feather="play" class="w-4 h-4"></i> Start
128
  </button>
129
  </div>
130
  </div>
131
- </div>
132
  </main>
133
 
 
 
134
  <custom-footer></custom-footer>
 
135
  <script src="components/navbar.js"></script>
136
  <script src="components/footer.js"></script>
 
137
  <script src="script.js"></script>
138
  <script>
139
  feather.replace();
140
 
141
- // Update speed value display
142
- const speedSlider = document.querySelector('input[type="range"]');
143
- const speedValue = document.getElementById('speed-value');
144
-
145
- speedSlider.addEventListener('input', function() {
146
- speedValue.textContent = `${this.value}x`;
 
 
147
  });
148
  </script>
149
  <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
150
  </body>
151
- </html>
 
29
  <custom-navbar></custom-navbar>
30
 
31
  <main class="container mx-auto px-4 py-8">
32
+ <div class="max-w-6xl mx-auto bg-gray-800 rounded-xl shadow-2xl overflow-hidden border border-gray-700">
33
  <div class="p-6 bg-gradient-to-r from-primary-500 to-secondary-500 relative">
34
  <div class="absolute top-4 right-4 flex gap-2">
35
+ <button id="minimize-btn" class="p-2 bg-white/10 rounded-full hover:bg-white/20 transition">
36
  <i data-feather="minimize-2" class="w-4 h-4"></i>
37
  </button>
38
+ <button id="maximize-btn" class="p-2 bg-white/10 rounded-full hover:bg-white/20 transition">
39
  <i data-feather="maximize-2" class="w-4 h-4"></i>
40
  </button>
41
+ <button id="close-btn" class="p-2 bg-red-500 rounded-full hover:bg-red-600 transition">
42
  <i data-feather="x" class="w-4 h-4"></i>
43
  </button>
44
  </div>
45
  <h1 class="text-3xl font-bold">ScrollGenius 3000</h1>
46
  <p class="text-gray-200 mt-2">Professional Teleprompter Widget</p>
47
  </div>
48
+ <div class="p-6 grid grid-cols-1 lg:grid-cols-3 gap-6 relative">
49
  <div class="absolute top-0 left-0 right-0 h-1 bg-gradient-to-r from-primary-500 to-secondary-500"></div>
50
+ <div class="lg:col-span-1 space-y-6">
51
  <div>
52
  <label class="block text-sm font-medium text-gray-300 mb-1 flex items-center justify-between">
53
  <span>Script Title</span>
54
  <span class="text-xs text-gray-400">Ctrl+T</span>
55
  </label>
56
  <div class="relative">
57
+ <input type="text" id="script-title" class="w-full bg-gray-700 border border-gray-600 rounded-lg px-4 py-2 focus:ring-2 focus:ring-primary-500 focus:border-primary-500 outline-none transition pr-10" placeholder="My Presentation">
58
  <button class="absolute right-2 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-white">
59
  <i data-feather="edit-2" class="w-4 h-4"></i>
60
  </button>
61
  </div>
62
  </div>
63
+
64
  <div>
65
  <label class="block text-sm font-medium text-gray-300 mb-1 flex items-center justify-between">
66
  <span>Scroll Speed</span>
67
  <span class="text-xs text-gray-400" id="speed-value">1.0x</span>
68
  </label>
69
+ <input type="range" id="speed-slider" min="0.1" max="5" step="0.1" value="1" class="w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-primary-500">
70
+ <div class="flex justify-between text-xs text-gray-400 mt-1">
71
  <span>Slow</span>
72
  <span>Medium</span>
73
  <span>Fast</span>
 
76
 
77
  <div>
78
  <label class="block text-sm font-medium text-gray-300 mb-1">Text Size</label>
79
+ <select id="text-size" class="w-full bg-gray-700 border border-gray-600 rounded-lg px-4 py-2 focus:ring-2 focus:ring-primary-500 focus:border-primary-500 outline-none transition">
80
+ <option value="small">Small</option>
81
+ <option value="medium" selected>Medium</option>
82
+ <option value="large">Large</option>
83
+ <option value="x-large">Extra Large</option>
84
  </select>
85
  </div>
86
 
87
  <div>
88
  <label class="block text-sm font-medium text-gray-300 mb-1">Theme</label>
89
+ <div class="grid grid-cols-3 gap-2 theme-selector">
90
+ <button class="bg-blue-500 h-10 rounded-lg theme-btn active" data-theme="blue"></button>
91
+ <button class="bg-green-500 h-10 rounded-lg theme-btn" data-theme="green"></button>
92
+ <button class="bg-purple-500 h-10 rounded-lg theme-btn" data-theme="purple"></button>
93
+ <button class="bg-red-500 h-10 rounded-lg theme-btn" data-theme="red"></button>
94
+ <button class="bg-yellow-500 h-10 rounded-lg theme-btn" data-theme="yellow"></button>
95
+ <button class="bg-pink-500 h-10 rounded-lg theme-btn" data-theme="pink"></button>
96
+ </div>
97
+ </div>
98
+
99
+ <div>
100
+ <label class="block text-sm font-medium text-gray-300 mb-1">Text Alignment</label>
101
  <div class="grid grid-cols-3 gap-2">
102
+ <button id="align-left" class="p-2 bg-gray-700 rounded-lg hover:bg-gray-600 flex items-center justify-center">
103
+ <i data-feather="align-left" class="w-4 h-4"></i>
104
+ </button>
105
+ <button id="align-center" class="p-2 bg-gray-700 rounded-lg hover:bg-gray-600 flex items-center justify-center active">
106
+ <i data-feather="align-center" class="w-4 h-4"></i>
107
+ </button>
108
+ <button id="align-right" class="p-2 bg-gray-700 rounded-lg hover:bg-gray-600 flex items-center justify-center">
109
+ <i data-feather="align-right" class="w-4 h-4"></i>
110
+ </button>
111
+ </div>
112
+ </div>
113
+
114
+ <div>
115
+ <label class="block text-sm font-medium text-gray-300 mb-1">Font Style</label>
116
+ <div class="grid grid-cols-2 gap-2">
117
+ <button id="font-sans" class="p-2 bg-gray-700 rounded-lg hover:bg-gray-600 active">Sans Serif</button>
118
+ <button id="font-serif" class="p-2 bg-gray-700 rounded-lg hover:bg-gray-600">Serif</button>
119
  </div>
120
  </div>
121
  </div>
122
+
123
+ <div class="lg:col-span-2 flex flex-col gap-4">
124
+ <div class="bg-gray-700 rounded-lg p-4 flex-grow relative group">
125
+ <div class="absolute top-2 right-2 flex gap-1 z-10">
126
+ <button id="format-bold" class="p-1 bg-gray-600 rounded hover:bg-gray-500" title="Bold">
127
+ <i data-feather="bold" class="w-4 h-4"></i>
128
+ </button>
129
+ <button id="format-italic" class="p-1 bg-gray-600 rounded hover:bg-gray-500" title="Italic">
130
+ <i data-feather="italic" class="w-4 h-4"></i>
131
+ </button>
132
+ <button id="format-underline" class="p-1 bg-gray-600 rounded hover:bg-gray-500" title="Underline">
133
+ <i data-feather="underline" class="w-4 h-4"></i>
134
+ </button>
135
+ </div>
136
+ <textarea id="script-textarea" class="w-full h-64 bg-transparent resize-none outline-none text-gray-200 placeholder-gray-500" placeholder="Enter your script here...">Welcome to ScrollGenius 3000!
137
+
138
+ This is a professional teleprompter solution with advanced features:
139
+
140
+ • Real-time scrolling control
141
+ • Multiple themes and customization
142
+ • Text formatting options
143
+ • Keyboard shortcuts for efficiency
144
+ • Script saving and loading
145
+
146
+ Try adjusting the scroll speed to see how it works!</textarea>
147
+ <div class="absolute bottom-4 right-4 opacity-0 group-hover:opacity-100 transition flex gap-2">
148
+ <button id="import-script" class="p-2 bg-gray-600 rounded-lg hover:bg-gray-500" title="Import Script">
149
+ <i data-feather="upload" class="w-4 h-4"></i>
150
+ </button>
151
+ <button id="clear-script" class="p-2 bg-gray-600 rounded-lg hover:bg-gray-500" title="Clear All">
152
+ <i data-feather="trash-2" class="w-4 h-4"></i>
153
+ </button>
154
+ </div>
155
+ </div>
156
+
157
+ <div class="bg-gray-700 rounded-lg p-4">
158
+ <div class="flex justify-between items-center mb-2">
159
+ <h3 class="font-medium">Preview</h3>
160
+ <div class="flex gap-2">
161
+ <button id="toggle-preview" class="px-3 py-1 bg-gray-600 hover:bg-gray-500 rounded text-sm">Toggle View</button>
162
+ <button id="mirror-preview" class="px-3 py-1 bg-gray-600 hover:bg-gray-500 rounded text-sm">Mirror</button>
163
+ </div>
164
+ </div>
165
+ <div id="preview-container" class="bg-black rounded p-4 h-40 overflow-hidden relative">
166
+ <div id="preview-text" class="text-white text-center text-lg leading-relaxed">
167
+ Welcome to ScrollGenius 3000! This is a professional teleprompter solution with advanced features.
168
+ </div>
169
+ </div>
170
  </div>
171
  </div>
172
+ </div>
173
+
174
  <div class="p-6 bg-gray-700 border-t border-gray-600 flex flex-wrap justify-between gap-4">
175
  <div class="flex gap-2">
176
+ <button id="save-script" class="px-4 py-2 bg-gray-600 hover:bg-gray-500 rounded-lg font-medium transition flex items-center gap-2 text-sm">
177
  <i data-feather="save" class="w-4 h-4"></i> Save
178
  </button>
179
+ <button id="load-script" class="px-4 py-2 bg-gray-600 hover:bg-gray-500 rounded-lg font-medium transition flex items-center gap-2 text-sm">
180
+ <i data-feather="folder" class="w-4 h-4"></i> Load
181
+ </button>
182
+ <button id="export-script" class="px-4 py-2 bg-gray-600 hover:bg-gray-500 rounded-lg font-medium transition flex items-center gap-2 text-sm">
183
+ <i data-feather="download" class="w-4 h-4"></i> Export
184
  </button>
185
  </div>
186
  <div class="flex gap-2">
187
+ <button id="help-btn" class="px-4 py-2 bg-gray-600 hover:bg-gray-500 rounded-lg font-medium transition flex items-center gap-2 text-sm">
188
  <i data-feather="help-circle" class="w-4 h-4"></i> Help
189
  </button>
190
+ <button id="start-scroll" class="px-6 py-2 bg-primary-500 hover:bg-primary-600 rounded-lg font-medium transition flex items-center gap-2 text-sm glow">
191
+ <i data-feather="play" class="w-4 h-4"></i> Start Scrolling
192
  </button>
193
  </div>
194
  </div>
195
+ </div>
196
  </main>
197
 
198
+ <!-- Hidden elements for export/import -->
199
+ <input type="file" id="file-input" accept=".txt,.doc,.docx" class="hidden">
200
  <custom-footer></custom-footer>
201
+ <help-modal></help-modal>
202
  <script src="components/navbar.js"></script>
203
  <script src="components/footer.js"></script>
204
+ <script src="components/help-modal.js"></script>
205
  <script src="script.js"></script>
206
  <script>
207
  feather.replace();
208
 
209
+ // Initialize all components when DOM is loaded
210
+ document.addEventListener('DOMContentLoaded', function() {
211
+ initializeComponents();
212
+
213
+ // Add help modal functionality
214
+ document.getElementById('help-btn').addEventListener('click', function() {
215
+ document.querySelector('help-modal').open();
216
+ });
217
  });
218
  </script>
219
  <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
220
  </body>
221
+ </html>
script.js CHANGED
@@ -1,61 +1,440 @@
1
 
2
- document.addEventListener('DOMContentLoaded', function() {
3
- // Enhanced theme selection with local storage
4
- const themeButtons = document.querySelectorAll('.theme-selector button');
5
- themeButtons.forEach(button => {
6
- button.addEventListener('click', function() {
7
- // Remove active class from all buttons
8
- themeButtons.forEach(btn => btn.classList.remove('glow'));
9
-
10
- // Add active class to clicked button
11
- this.classList.add('glow');
12
-
13
- // Change the theme (this would be more complex in a real app)
14
- console.log('Theme changed to: ', this.style.backgroundColor);
15
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  });
17
- // Advanced scroll speed handling
18
- const speedSlider = document.querySelector('input[type="range"]');
19
-
20
- // Load saved speed if available
21
- const savedSpeed = localStorage.getItem('teleprompterSpeed');
22
- if (savedSpeed) {
23
- speedSlider.value = savedSpeed;
24
- document.getElementById('speed-value').textContent = `${savedSpeed}x`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
- speedSlider.addEventListener('input', function() {
28
- const speed = this.value;
29
- document.getElementById('speed-value').textContent = `${speed}x`;
30
- localStorage.setItem('teleprompterSpeed', speed);
31
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
- // Widget functionality
34
- let isDragging = false;
35
- const widget = document.querySelector('.max-w-4xl');
36
-
37
- widget.addEventListener('mousedown', function(e) {
38
- if (e.target.closest('input, textarea, button, select')) return;
39
- isDragging = true;
40
- const offsetX = e.clientX - widget.getBoundingClientRect().left;
41
- const offsetY = e.clientY - widget.getBoundingClientRect().top;
42
-
43
- function moveWidget(e) {
44
- if (!isDragging) return;
45
- widget.style.left = `${e.clientX - offsetX}px`;
46
- widget.style.top = `${e.clientY - offsetY}px`;
47
- widget.style.position = 'fixed';
48
- widget.style.margin = '0';
49
- widget.style.zIndex = '1000';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  }
51
 
52
- function stopDrag() {
53
- isDragging = false;
54
- document.removeEventListener('mousemove', moveWidget);
55
- document.removeEventListener('mouseup', stopDrag);
56
  }
57
 
58
- document.addEventListener('mousemove', moveWidget);
59
- document.addEventListener('mouseup', stopDrag);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  });
61
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
 
2
+ // Global variables
3
+ let isScrolling = false;
4
+ let scrollInterval;
5
+ let currentSpeed = 1;
6
+ let currentTheme = 'blue';
7
+ let currentTextSize = 'medium';
8
+ let currentAlignment = 'center';
9
+ let currentFont = 'sans';
10
+ let mirroredView = false;
11
+
12
+ // DOM Elements
13
+ const elements = {
14
+ speedSlider: document.getElementById('speed-slider'),
15
+ speedValue: document.getElementById('speed-value'),
16
+ scriptTextarea: document.getElementById('script-textarea'),
17
+ previewText: document.getElementById('preview-text'),
18
+ previewContainer: document.getElementById('preview-container'),
19
+ textSizeSelect: document.getElementById('text-size'),
20
+ scriptTitle: document.getElementById('script-title'),
21
+ fileInput: document.getElementById('file-input')
22
+ };
23
+
24
+ // Initialize all components
25
+ function initializeComponents() {
26
+ setupEventListeners();
27
+ loadSettings();
28
+ updatePreview();
29
+ setupKeyboardShortcuts();
30
+ }
31
+
32
+ // Set up event listeners
33
+ function setupEventListeners() {
34
+ // Speed control
35
+ elements.speedSlider.addEventListener('input', handleSpeedChange);
36
+
37
+ // Text area changes
38
+ elements.scriptTextarea.addEventListener('input', updatePreview);
39
+
40
+ // Text size changes
41
+ elements.textSizeSelect.addEventListener('change', handleTextSizeChange);
42
+
43
+ // Theme selection
44
+ document.querySelectorAll('.theme-btn').forEach(button => {
45
+ button.addEventListener('click', () => handleThemeChange(button.dataset.theme));
46
  });
47
+
48
+ // Text alignment
49
+ document.getElementById('align-left').addEventListener('click', () => handleAlignmentChange('left'));
50
+ document.getElementById('align-center').addEventListener('click', () => handleAlignmentChange('center'));
51
+ document.getElementById('align-right').addEventListener('click', () => handleAlignmentChange('right'));
52
+
53
+ // Font style
54
+ document.getElementById('font-sans').addEventListener('click', () => handleFontChange('sans'));
55
+ document.getElementById('font-serif').addEventListener('click', () => handleFontChange('serif'));
56
+
57
+ // Formatting buttons
58
+ document.getElementById('format-bold').addEventListener('click', () => toggleFormatting('bold'));
59
+ document.getElementById('format-italic').addEventListener('click', () => toggleFormatting('italic'));
60
+ document.getElementById('format-underline').addEventListener('click', () => toggleFormatting('underline'));
61
+
62
+ // Control buttons
63
+ document.getElementById('start-scroll').addEventListener('click', toggleScrolling);
64
+ document.getElementById('save-script').addEventListener('click', saveScript);
65
+ document.getElementById('load-script').addEventListener('click', loadScript);
66
+ document.getElementById('export-script').addEventListener('click', exportScript);
67
+ document.getElementById('import-script').addEventListener('click', () => elements.fileInput.click());
68
+ document.getElementById('clear-script').addEventListener('click', clearScript);
69
+ document.getElementById('toggle-preview').addEventListener('click', togglePreviewMode);
70
+ document.getElementById('mirror-preview').addEventListener('click', toggleMirrorView);
71
+
72
+ // File input
73
+ elements.fileInput.addEventListener('change', importScriptFromFile);
74
+
75
+ // Window events
76
+ window.addEventListener('beforeunload', saveSettings);
77
+ }
78
+
79
+ // Handle speed change
80
+ function handleSpeedChange() {
81
+ currentSpeed = parseFloat(elements.speedSlider.value);
82
+ elements.speedValue.textContent = `${currentSpeed.toFixed(1)}x`;
83
+
84
+ if (isScrolling) {
85
+ clearInterval(scrollInterval);
86
+ startScrolling();
87
  }
88
+ }
89
+
90
+ // Handle text size change
91
+ function handleTextSizeChange() {
92
+ currentTextSize = elements.textSizeSelect.value;
93
+ updatePreview();
94
+ }
95
+
96
+ // Handle theme change
97
+ function handleThemeChange(theme) {
98
+ currentTheme = theme;
99
+
100
+ // Update active button
101
+ document.querySelectorAll('.theme-btn').forEach(btn => {
102
+ btn.classList.remove('active');
103
+ });
104
+ document.querySelector(`.theme-btn[data-theme="${theme}"]`).classList.add('active');
105
+
106
+ // Apply theme to preview
107
+ const themeColors = {
108
+ blue: 'from-blue-500 to-blue-700',
109
+ green: 'from-green-500 to-green-700',
110
+ purple: 'from-purple-500 to-purple-700',
111
+ red: 'from-red-500 to-red-700',
112
+ yellow: 'from-yellow-500 to-yellow-700',
113
+ pink: 'from-pink-500 to-pink-700'
114
+ };
115
+
116
+ const gradientClass = themeColors[theme];
117
+ document.querySelector('.bg-gradient-to-r').className = `p-6 bg-gradient-to-r ${gradientClass} relative`;
118
+
119
+ updatePreview();
120
+ }
121
+
122
+ // Handle alignment change
123
+ function handleAlignmentChange(alignment) {
124
+ currentAlignment = alignment;
125
 
126
+ // Update active button
127
+ document.querySelectorAll('#align-left, #align-center, #align-right').forEach(btn => {
128
+ btn.classList.remove('active');
 
129
  });
130
+ document.getElementById(`align-${alignment}`).classList.add('active');
131
+
132
+ updatePreview();
133
+ }
134
+
135
+ // Handle font change
136
+ function handleFontChange(font) {
137
+ currentFont = font;
138
+
139
+ // Update active button
140
+ document.getElementById('font-sans').classList.toggle('active', font === 'sans');
141
+ document.getElementById('font-serif').classList.toggle('active', font === 'serif');
142
+
143
+ updatePreview();
144
+ }
145
+
146
+ // Toggle text formatting
147
+ function toggleFormatting(format) {
148
+ const button = document.getElementById(`format-${format}`);
149
+ button.classList.toggle('active');
150
+
151
+ // In a real implementation, this would apply formatting to selected text
152
+ showToast(`Toggled ${format} formatting`);
153
+ }
154
+
155
+ // Update preview
156
+ function updatePreview() {
157
+ const text = elements.scriptTextarea.value || "Your script will appear here...";
158
+ elements.previewText.textContent = text;
159
+
160
+ // Apply text size
161
+ const sizeClasses = {
162
+ small: 'text-sm',
163
+ medium: 'text-base',
164
+ large: 'text-lg',
165
+ 'x-large': 'text-xl'
166
+ };
167
+
168
+ elements.previewText.className = sizeClasses[currentTextSize] || 'text-base';
169
+
170
+ // Apply alignment
171
+ elements.previewText.classList.remove('text-left', 'text-center', 'text-right');
172
+ elements.previewText.classList.add(`text-${currentAlignment}`);
173
+
174
+ // Apply font
175
+ elements.previewText.classList.toggle('font-serif', currentFont === 'serif');
176
+
177
+ // Apply formatting classes
178
+ elements.previewText.classList.toggle('bold', document.getElementById('format-bold').classList.contains('active'));
179
+ elements.previewText.classList.toggle('italic', document.getElementById('format-italic').classList.contains('active'));
180
+ elements.previewText.classList.toggle('underline', document.getElementById('format-underline').classList.contains('active'));
181
+ }
182
+
183
+ // Toggle scrolling
184
+ function toggleScrolling() {
185
+ const button = document.getElementById('start-scroll');
186
+
187
+ if (isScrolling) {
188
+ stopScrolling();
189
+ button.innerHTML = '<i data-feather="play" class="w-4 h-4"></i> Start Scrolling';
190
+ feather.replace();
191
+ } else {
192
+ startScrolling();
193
+ button.innerHTML = '<i data-feather="pause" class="w-4 h-4"></i> Pause Scrolling';
194
+ feather.replace();
195
+ }
196
+ }
197
+
198
+ // Start scrolling animation
199
+ function startScrolling() {
200
+ isScrolling = true;
201
+
202
+ // Clear any existing interval
203
+ if (scrollInterval) {
204
+ clearInterval(scrollInterval);
205
+ }
206
+
207
+ // Calculate duration based on speed (in seconds)
208
+ const baseDuration = 30; // Base duration for 1x speed
209
+ const duration = (baseDuration / currentSpeed) * 1000; // Convert to milliseconds
210
+
211
+ // Reset animation
212
+ elements.previewText.style.animation = 'none';
213
+ void elements.previewText.offsetWidth; // Trigger reflow
214
+
215
+ // Apply scrolling animation
216
+ elements.previewText.style.animation = `scroll ${duration}ms linear infinite`;
217
+
218
+ // Add scrolling class for styling
219
+ elements.previewContainer.classList.add('scrolling');
220
+ }
221
+
222
+ // Stop scrolling animation
223
+ function stopScrolling() {
224
+ isScrolling = false;
225
+ clearInterval(scrollInterval);
226
+ elements.previewText.style.animation = 'none';
227
+ elements.previewContainer.classList.remove('scrolling');
228
+ }
229
+
230
+ // Save script to localStorage
231
+ function saveScript() {
232
+ const scriptData = {
233
+ title: elements.scriptTitle.value,
234
+ content: elements.scriptTextarea.value,
235
+ speed: currentSpeed,
236
+ theme: currentTheme,
237
+ textSize: currentTextSize,
238
+ alignment: currentAlignment,
239
+ font: currentFont
240
+ };
241
+
242
+ localStorage.setItem('teleprompterScript', JSON.stringify(scriptData));
243
+ showToast('Script saved successfully!');
244
+ }
245
+
246
+ // Load script from localStorage
247
+ function loadScript() {
248
+ const savedData = localStorage.getItem('teleprompterScript');
249
+
250
+ if (savedData) {
251
+ const scriptData = JSON.parse(savedData);
252
+
253
+ elements.scriptTitle.value = scriptData.title || '';
254
+ elements.scriptTextarea.value = scriptData.content || '';
255
+ elements.speedSlider.value = scriptData.speed || 1;
256
+ currentSpeed = scriptData.speed || 1;
257
+ elements.speedValue.textContent = `${currentSpeed.toFixed(1)}x`;
258
+
259
+ handleThemeChange(scriptData.theme || 'blue');
260
+ elements.textSizeSelect.value = scriptData.textSize || 'medium';
261
+ currentTextSize = scriptData.textSize || 'medium';
262
+
263
+ handleAlignmentChange(scriptData.alignment || 'center');
264
+ handleFontChange(scriptData.font || 'sans');
265
+
266
+ updatePreview();
267
+ showToast('Script loaded successfully!');
268
+ } else {
269
+ showToast('No saved script found.');
270
+ }
271
+ }
272
+
273
+ // Export script as file
274
+ function exportScript() {
275
+ const content = elements.scriptTextarea.value;
276
+ const title = elements.scriptTitle.value || 'teleprompter-script';
277
 
278
+ const blob = new Blob([content], { type: 'text/plain' });
279
+ const url = URL.createObjectURL(blob);
280
+
281
+ const a = document.createElement('a');
282
+ a.href = url;
283
+ a.download = `${title}.txt`;
284
+ document.body.appendChild(a);
285
+ a.click();
286
+
287
+ setTimeout(() => {
288
+ document.body.removeChild(a);
289
+ URL.revokeObjectURL(url);
290
+ }, 100);
291
+
292
+ showToast('Script exported successfully!');
293
+ }
294
+
295
+ // Import script from file
296
+ function importScriptFromFile(event) {
297
+ const file = event.target.files[0];
298
+ if (!file) return;
299
+
300
+ const reader = new FileReader();
301
+ reader.onload = function(e) {
302
+ elements.scriptTextarea.value = e.target.result;
303
+ elements.scriptTitle.value = file.name.replace(/\.[^/.]+$/, ""); // Remove extension
304
+ updatePreview();
305
+ showToast('Script imported successfully!');
306
+ };
307
+ reader.readAsText(file);
308
+
309
+ // Reset file input
310
+ elements.fileInput.value = '';
311
+ }
312
+
313
+ // Clear script
314
+ function clearScript() {
315
+ if (confirm('Are you sure you want to clear the current script?')) {
316
+ elements.scriptTextarea.value = '';
317
+ elements.scriptTitle.value = '';
318
+ updatePreview();
319
+ showToast('Script cleared.');
320
+ }
321
+ }
322
+
323
+ // Toggle preview mode
324
+ function togglePreviewMode() {
325
+ elements.previewContainer.classList.toggle('bg-black');
326
+ elements.previewContainer.classList.toggle('bg-gray-900');
327
+ showToast('Preview mode toggled.');
328
+ }
329
+
330
+ // Toggle mirror view
331
+ function toggleMirrorView() {
332
+ mirroredView = !mirroredView;
333
+ elements.previewContainer.classList.toggle('mirror', mirroredView);
334
+ showToast(mirroredView ? 'Mirror view enabled.' : 'Mirror view disabled.');
335
+ }
336
+
337
+ // Setup keyboard shortcuts
338
+ function setupKeyboardShortcuts() {
339
+ document.addEventListener('keydown', function(e) {
340
+ // Only trigger shortcuts when not in input fields
341
+ if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return;
342
+
343
+ // Spacebar to toggle scrolling
344
+ if (e.code === 'Space') {
345
+ e.preventDefault();
346
+ toggleScrolling();
347
+ }
348
+
349
+ // Ctrl+S to save
350
+ if (e.ctrlKey && e.code === 'KeyS') {
351
+ e.preventDefault();
352
+ saveScript();
353
  }
354
 
355
+ // Ctrl+O to load
356
+ if (e.ctrlKey && e.code === 'KeyO') {
357
+ e.preventDefault();
358
+ loadScript();
359
  }
360
 
361
+ // Ctrl+E to export
362
+ if (e.ctrlKey && e.code === 'KeyE') {
363
+ e.preventDefault();
364
+ exportScript();
365
+ }
366
+
367
+ // Up/Down arrows to adjust speed
368
+ if (e.code === 'ArrowUp') {
369
+ e.preventDefault();
370
+ const newValue = Math.min(5, parseFloat(elements.speedSlider.value) + 0.1);
371
+ elements.speedSlider.value = newValue.toFixed(1);
372
+ handleSpeedChange();
373
+ }
374
+
375
+ if (e.code === 'ArrowDown') {
376
+ e.preventDefault();
377
+ const newValue = Math.max(0.1, parseFloat(elements.speedSlider.value) - 0.1);
378
+ elements.speedSlider.value = newValue.toFixed(1);
379
+ handleSpeedChange();
380
+ }
381
  });
382
+ }
383
+
384
+ // Save settings to localStorage
385
+ function saveSettings() {
386
+ const settings = {
387
+ speed: currentSpeed,
388
+ theme: currentTheme,
389
+ textSize: currentTextSize,
390
+ alignment: currentAlignment,
391
+ font: currentFont,
392
+ mirroredView: mirroredView
393
+ };
394
+
395
+ localStorage.setItem('teleprompterSettings', JSON.stringify(settings));
396
+ }
397
+
398
+ // Load settings from localStorage
399
+ function loadSettings() {
400
+ const savedSettings = localStorage.getItem('teleprompterSettings');
401
+
402
+ if (savedSettings) {
403
+ const settings = JSON.parse(savedSettings);
404
+
405
+ currentSpeed = settings.speed || 1;
406
+ elements.speedSlider.value = currentSpeed;
407
+ elements.speedValue.textContent = `${currentSpeed.toFixed(1)}x`;
408
+
409
+ handleThemeChange(settings.theme || 'blue');
410
+ elements.textSizeSelect.value = settings.textSize || 'medium';
411
+ currentTextSize = settings.textSize || 'medium';
412
+
413
+ handleAlignmentChange(settings.alignment || 'center');
414
+ handleFontChange(settings.font || 'sans');
415
+
416
+ if (settings.mirroredView) {
417
+ mirroredView = true;
418
+ elements.previewContainer.classList.add('mirror');
419
+ }
420
+ }
421
+ }
422
+
423
+ // Show toast notification
424
+ function showToast(message) {
425
+ const toast = document.createElement('div');
426
+ toast.className = 'toast show';
427
+ toast.textContent = message;
428
+
429
+ document.body.appendChild(toast);
430
+
431
+ setTimeout(() => {
432
+ toast.classList.remove('show');
433
+ setTimeout(() => {
434
+ document.body.removeChild(toast);
435
+ }, 300);
436
+ }, 3000);
437
+ }
438
+
439
+ // Initialize when DOM is loaded
440
+ document.addEventListener('DOMContentLoaded', initializeComponents);
style.css CHANGED
@@ -1,7 +1,14 @@
 
1
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
 
2
 
3
  body {
4
  font-family: 'Inter', sans-serif;
 
 
 
 
 
5
  }
6
 
7
  /* Custom scrollbar */
@@ -22,6 +29,7 @@ body {
22
  ::-webkit-scrollbar-thumb:hover {
23
  background: #6B7280;
24
  }
 
25
  /* Animation for buttons */
26
  button {
27
  transition: all 0.2s ease;
@@ -32,6 +40,10 @@ button:hover {
32
  transform: translateY(-1px);
33
  }
34
 
 
 
 
 
35
  /* Custom range input styling */
36
  input[type="range"] {
37
  -webkit-appearance: none;
@@ -63,6 +75,7 @@ input[type="range"]::-webkit-slider-thumb:hover {
63
  .widget-controls:hover {
64
  opacity: 1 !important;
65
  }
 
66
  /* Custom glow effect */
67
  .glow {
68
  box-shadow: 0 0 15px rgba(59, 130, 246, 0.5);
@@ -73,4 +86,167 @@ input[type="range"]::-webkit-slider-thumb:hover {
73
  background: rgba(0, 0, 0, 0.2);
74
  backdrop-filter: blur(10px);
75
  border: 1px solid rgba(255, 255, 255, 0.1);
76
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
3
+ @import url('https://fonts.googleapis.com/css2?family=Merriweather:wght@300;400;700&display=swap');
4
 
5
  body {
6
  font-family: 'Inter', sans-serif;
7
+ overflow-x: hidden;
8
+ }
9
+
10
+ .font-serif {
11
+ font-family: 'Merriweather', serif;
12
  }
13
 
14
  /* Custom scrollbar */
 
29
  ::-webkit-scrollbar-thumb:hover {
30
  background: #6B7280;
31
  }
32
+
33
  /* Animation for buttons */
34
  button {
35
  transition: all 0.2s ease;
 
40
  transform: translateY(-1px);
41
  }
42
 
43
+ button.active {
44
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5);
45
+ }
46
+
47
  /* Custom range input styling */
48
  input[type="range"] {
49
  -webkit-appearance: none;
 
75
  .widget-controls:hover {
76
  opacity: 1 !important;
77
  }
78
+
79
  /* Custom glow effect */
80
  .glow {
81
  box-shadow: 0 0 15px rgba(59, 130, 246, 0.5);
 
86
  background: rgba(0, 0, 0, 0.2);
87
  backdrop-filter: blur(10px);
88
  border: 1px solid rgba(255, 255, 255, 0.1);
89
+ }
90
+
91
+ /* Preview container */
92
+ #preview-container {
93
+ transition: all 0.3s ease;
94
+ }
95
+
96
+ .mirror {
97
+ transform: scaleX(-1);
98
+ }
99
+
100
+ /* Text alignment */
101
+ .text-left {
102
+ text-align: left;
103
+ }
104
+
105
+ .text-center {
106
+ text-align: center;
107
+ }
108
+
109
+ .text-right {
110
+ text-align: right;
111
+ }
112
+
113
+ /* Text formatting */
114
+ .bold {
115
+ font-weight: bold;
116
+ }
117
+
118
+ .italic {
119
+ font-style: italic;
120
+ }
121
+
122
+ .underline {
123
+ text-decoration: underline;
124
+ }
125
+
126
+ /* Animation for scrolling text */
127
+ .scrolling-text {
128
+ animation: scroll linear infinite;
129
+ }
130
+
131
+ @keyframes scroll {
132
+ from {
133
+ transform: translateY(100%);
134
+ }
135
+ to {
136
+ transform: translateY(-100%);
137
+ }
138
+ }
139
+
140
+ /* Modal styles */
141
+ .modal {
142
+ position: fixed;
143
+ top: 0;
144
+ left: 0;
145
+ width: 100%;
146
+ height: 100%;
147
+ background: rgba(0, 0, 0, 0.7);
148
+ display: flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ z-index: 1000;
152
+ opacity: 0;
153
+ visibility: hidden;
154
+ transition: all 0.3s ease;
155
+ }
156
+
157
+ .modal.active {
158
+ opacity: 1;
159
+ visibility: visible;
160
+ }
161
+
162
+ .modal-content {
163
+ background: #1F2937;
164
+ border-radius: 10px;
165
+ width: 90%;
166
+ max-width: 500px;
167
+ max-height: 90vh;
168
+ overflow-y: auto;
169
+ transform: translateY(-20px);
170
+ transition: transform 0.3s ease;
171
+ }
172
+
173
+ .modal.active .modal-content {
174
+ transform: translateY(0);
175
+ }
176
+
177
+ .modal-header {
178
+ padding: 1rem 1.5rem;
179
+ border-bottom: 1px solid #374151;
180
+ display: flex;
181
+ justify-content: space-between;
182
+ align-items: center;
183
+ }
184
+
185
+ .modal-body {
186
+ padding: 1.5rem;
187
+ }
188
+
189
+ .modal-footer {
190
+ padding: 1rem 1.5rem;
191
+ border-top: 1px solid #374151;
192
+ display: flex;
193
+ justify-content: flex-end;
194
+ gap: 0.5rem;
195
+ }
196
+
197
+ /* Toast notifications */
198
+ .toast {
199
+ position: fixed;
200
+ bottom: 20px;
201
+ right: 20px;
202
+ background: #1F2937;
203
+ color: white;
204
+ padding: 1rem 1.5rem;
205
+ border-radius: 5px;
206
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
207
+ transform: translateX(150%);
208
+ transition: transform 0.3s ease;
209
+ z-index: 1001;
210
+ }
211
+
212
+ .toast.show {
213
+ transform: translateX(0);
214
+ }
215
+
216
+ /* Loading spinner */
217
+ .spinner {
218
+ width: 20px;
219
+ height: 20px;
220
+ border: 2px solid rgba(255, 255, 255, 0.3);
221
+ border-radius: 50%;
222
+ border-top-color: white;
223
+ animation: spin 1s linear infinite;
224
+ display: inline-block;
225
+ }
226
+
227
+ @keyframes spin {
228
+ to {
229
+ transform: rotate(360deg);
230
+ }
231
+ }
232
+
233
+ /* Responsive adjustments */
234
+ @media (max-width: 1024px) {
235
+ .lg\:col-span-1, .lg\:col-span-2 {
236
+ grid-column: span 3 / span 3;
237
+ }
238
+ }
239
+
240
+ @media (max-width: 768px) {
241
+ .p-6 {
242
+ padding: 1rem;
243
+ }
244
+
245
+ .gap-6 {
246
+ gap: 1rem;
247
+ }
248
+
249
+ #preview-container {
250
+ height: 200px;
251
+ }
252
+ }
templates.html ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>Script Templates | Teleprompter Factory</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ <script src="https://cdn.tailwindcss.com"></script>
9
+ <script src="https://unpkg.com/feather-icons"></script>
10
+ <script>
11
+ tailwind.config = {
12
+ theme: {
13
+ extend: {
14
+ colors: {
15
+ primary: {
16
+ 500: '#3B82F6',
17
+ },
18
+ secondary: {
19
+ 500: '#10B981',
20
+ }
21
+ }
22
+ }
23
+ }
24
+ }
25
+ </script>
26
+ </head>
27
+ <body class="bg-gray-900 text-gray-100 min-h-screen">
28
+ <custom-navbar></custom-navbar>
29
+
30
+ <main class="container mx-auto px-4 py-8">
31
+ <div class="max-w-6xl mx-auto">
32
+ <h1 class="text-3xl font-bold mb-2">Script Templates</h1>
33
+ <p class="text-gray-400 mb-8">Professional templates for various presentation types</p>
34
+
35
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
36
+ <!-- Template Card 1 -->
37
+ <div class="bg-gray-800 rounded-xl p-6 border border-gray-700 hover:border-primary-500 transition">
38
+ <div class="flex items-start justify-between mb-4">
39
+ <h3 class="text-xl font-semibold">Business Presentation</h3>
40
+ <span class="bg-blue-500 text-white text-xs px-2 py-1 rounded">Popular</span>
41
+ </div>
42
+ <p class="text-gray-400 mb-4">Structured template for corporate presentations with introduction, key points, and conclusion.</p>
43
+ <div class="flex justify-between items-center">
44
+ <span class="text-sm text-gray-500">5 min read</span>
45
+ <button class="px-4 py-2 bg-primary-500 hover:bg-primary-600 rounded-lg text-sm" onclick="loadTemplate('business')">Use Template</button>
46
+ </div>
47
+ </div>
48
+
49
+ <!-- Template Card 2 -->
50
+ <div class="bg-gray-800 rounded-xl p-6 border border-gray-700 hover:border-primary-500 transition">
51
+ <div class="flex items-start justify-between mb-4">
52
+ <h3 class="text-xl font-semibold">Product Launch</h3>
53
+ <span class="bg-green-500 text-white text-xs px-2 py-1 rounded">New</span>
54
+ </div>
55
+ <p class="text-gray-400 mb-4">Engaging script structure for unveiling new products with storytelling approach.</p>
56
+ <div class="flex justify-between items-center">
57
+ <span class="text-sm text-gray-500">7 min read</span>
58
+ <button class="px-4 py-2 bg-primary-500 hover:bg-primary-600 rounded-lg text-sm" onclick="loadTemplate('product')">Use Template</button>
59
+ </div>
60
+ </div>
61
+
62
+ <!-- Template Card 3 -->
63
+ <div class="bg-gray-800 rounded-xl p-6 border border-gray-700 hover:border-primary-500 transition">
64
+ <div class="flex items-start justify-between mb-4">
65
+ <h3 class="text-xl font-semibold">Educational Lecture</h3>
66
+ </div>
67
+ <p class="text-gray-400 mb-4">Academic-friendly template with clear sections for teaching complex topics.</p>
68
+ <div class="flex justify-between items-center">
69
+ <span class="text-sm text-gray-500">10 min read</span>
70
+ <button class="px-4 py-2 bg-primary-500 hover:bg-primary-600 rounded-lg text-sm" onclick="loadTemplate('education')">Use Template</button>
71
+ </div>
72
+ </div>
73
+
74
+ <!-- Template Card 4 -->
75
+ <div class="bg-gray-800 rounded-xl p-6 border border-gray-700 hover:border-primary-500 transition">
76
+ <div class="flex items-start justify-between mb-4">
77
+ <h3 class="text-xl font-semibold">Sales Pitch</h3>
78
+ </div>
79
+ <p class="text-gray-400 mb-4">Persuasive framework designed to convert prospects into customers effectively.</p>
80
+ <div class="flex justify-between items-center">
81
+ <span class="text-sm text-gray-500">4 min read</span>
82
+ <button class="px-4 py-2 bg-primary-500 hover:bg-primary-600 rounded-lg text-sm" onclick="loadTemplate('sales')">Use Template</button>
83
+ </div>
84
+ </div>
85
+
86
+ <!-- Template Card 5 -->
87
+ <div class="bg-gray-800 rounded-xl p-6 border border-gray-700 hover:border-primary-500 transition">
88
+ <div class="flex items-start justify-between mb-4">
89
+ <h3 class="text-xl font-semibold">Conference Keynote</h3>
90
+ </div>
91
+ <p class="text-gray-400 mb-4">High-impact structure for captivating large audiences at conferences.</p>
92
+ <div class="flex justify-between items-center">
93
+ <span class="text-sm text-gray-500">15 min read</span>
94
+ <button class="px-4 py-2 bg-primary-500 hover:bg-primary-600 rounded-lg text-sm" onclick="loadTemplate('keynote')">Use Template</button>
95
+ </div>
96
+ </div>
97
+
98
+ <!-- Template Card 6 -->
99
+ <div class="bg-gray-800 rounded-xl p-6 border border-gray-700 hover:border-primary-500 transition">
100
+ <div class="flex items-start justify-between mb-4">
101
+ <h3 class="text-xl font-semibold">Interview Script</h3>
102
+ </div>
103
+ <p class="text-gray-400 mb-4">Natural conversation flow for television or podcast interviews.</p>
104
+ <div class="flex justify-between items-center">
105
+ <span class="text-sm text-gray-500">8 min read</span>
106
+ <button class="px-4 py-2 bg-primary-500 hover:bg-primary-600 rounded-lg text-sm" onclick="loadTemplate('interview')">Use Template</button>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ </main>
112
+
113
+ <custom-footer></custom-footer>
114
+ <script src="components/navbar.js"></script>
115
+ <script src="components/footer.js"></script>
116
+ <script>
117
+ feather.replace();
118
+
119
+ function loadTemplate(type) {
120
+ // In a real implementation, this would load the actual template
121
+ alert(`Loading ${type} template. In a full implementation, this would populate your script editor.`);
122
+ }
123
+ </script>
124
+ </body>
125
+ </html>