vscode commited on
Commit
e1fabf0
·
verified ·
1 Parent(s): f35f42c

Upload 4 files

Browse files
Files changed (4) hide show
  1. AI_SETUP.md +166 -0
  2. index.html +838 -0
  3. script.js +1664 -0
  4. styles.css +1873 -0
AI_SETUP.md ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AI Caption Generator Setup
2
+
3
+ ## 🤖 Features Integrated
4
+
5
+ Your Social Hub now includes an **AI-powered Image Caption Generator** that:
6
+
7
+ 1. **Analyzes uploaded images** using BLIP (Salesforce image captioning model via Hugging Face)
8
+ 2. **Generates 3 creative captions** using Groq's Llama-3.1-8b-instant model
9
+ 3. **Creates relevant hashtags** using AI based on image content
10
+ 4. **Allows posting directly** to social media platforms
11
+
12
+ ---
13
+
14
+ ## 🔑 API Configuration
15
+
16
+ ### Current Setup (Real-Time AI)
17
+ The app uses **two AI services**:
18
+
19
+ #### 1. **Groq API** (for caption & hashtag generation)
20
+ ```javascript
21
+ const GROQ_API_KEY = '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';
22
+ ```
23
+
24
+ #### 2. **Hugging Face API** (for image analysis)
25
+ ```javascript
26
+ const HF_API_TOKEN = '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';
27
+ ```
28
+
29
+ ⚠️ **Note**: These are demo tokens with limited requests.
30
+
31
+ ### Get Your Own FREE API Key:
32
+
33
+ 1. **Sign up at Hugging Face**: https://huggingface.co/join
34
+ 2. **Generate API Token**:
35
+ - Go to Settings → Access Tokens
36
+ - Click "New Token"
37
+ - Name it "Social Hub AI"
38
+ - Copy the token
39
+
40
+ 3. **Replace token in `script.js`**:
41
+ ```javascript
42
+ const HF_API_TOKEN = 'your_token_here';
43
+ ```
44
+
45
+ ### Free Tier Limits:
46
+ - ✅ **1,000 requests/month** (more than enough for personal use)
47
+ - ✅ **No credit card required**
48
+ - ✅ **No time limit**
49
+
50
+ ---
51
+
52
+ ## 🚀 How to Use
53
+
54
+ ### 1. **Upload Image**
55
+ - Click camera icon in header (or press `Ctrl+I`)
56
+ - Upload or drag & drop an image
57
+ - Supports: JPG, PNG, JPEG
58
+
59
+ ### 2. **AI Processing**
60
+ - Image is analyzed automatically
61
+ - Description generated in ~2-3 seconds
62
+ - 3 unique captions created
63
+ - 10 relevant hashtags generated
64
+
65
+ ### 3. **Post to Platform**
66
+ - Click any platform button (Instagram, Facebook, Twitter, LinkedIn)
67
+ - Caption + hashtags automatically copied to clipboard
68
+ - Platform opens in new window
69
+ - Paste and post!
70
+
71
+ ### 4. **Copy Options**
72
+ - Copy just captions
73
+ - Copy just hashtags
74
+ - Copy everything
75
+
76
+ ---
77
+
78
+ ## 🎯 Keyboard Shortcuts
79
+
80
+ - **Ctrl + I**: Open AI Caption Generator
81
+ - **Esc**: Close modal
82
+
83
+ ---
84
+
85
+ ## 🔧 Alternative AI Services (Optional)
86
+
87
+ Want to use a different AI? You can modify `script.js` to use:
88
+
89
+ ### OpenAI GPT-4 Vision:
90
+ ```javascript
91
+ // Replace in script.js
92
+ const OPENAI_API_KEY = 'your_openai_key';
93
+ const OPENAI_API = 'https://api.openai.com/v1/chat/completions';
94
+ ```
95
+
96
+ ### Google Gemini:
97
+ ```javascript
98
+ const GEMINI_API_KEY = 'your_gemini_key';
99
+ const GEMINI_API = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision';
100
+ ```
101
+
102
+ ### Groq (like your original code):
103
+ ```javascript
104
+ const GROQ_API_KEY = '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';
105
+ const GROQ_API = 'https://api.groq.com/openai/v1/chat/completions';
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 🛡️ Privacy & Security
111
+
112
+ - ✅ Images processed via Hugging Face API (HTTPS encrypted)
113
+ - ✅ No images stored on servers
114
+ - ✅ Results generated in real-time
115
+ - ✅ All processing happens client-side except API calls
116
+
117
+ ---
118
+
119
+ ## 💡 Tips
120
+
121
+ 1. **Better results**: Upload clear, high-quality images
122
+ 2. **Edit captions**: Feel free to modify AI-generated content
123
+ 3. **Hashtag relevance**: Remove irrelevant hashtags before posting
124
+ 4. **Multiple tries**: Upload different angles for varied captions
125
+
126
+ ---
127
+
128
+ ## 🐛 Troubleshooting
129
+
130
+ ### "AI generation failed"
131
+ - **Solution**: App uses fallback captions automatically
132
+ - Check console for errors (F12)
133
+ - Verify internet connection
134
+ - API might be at rate limit (wait 1 minute)
135
+
136
+ ### Captions not copying
137
+ - **Solution**: Browser might block clipboard access
138
+ - Allow clipboard permissions
139
+ - Manually select and copy text
140
+
141
+ ### Platform won't open
142
+ - **Solution**: Check pop-up blocker settings
143
+ - Allow pop-ups from localhost/your domain
144
+
145
+ ---
146
+
147
+ ## 📝 Customization
148
+
149
+ Want to customize AI behavior? Edit these in `script.js`:
150
+
151
+ ```javascript
152
+ // Change caption style
153
+ const prompt = `Generate 3 captions...`; // Line ~895
154
+
155
+ // Modify hashtag count
156
+ const allHashtags = [...baseHashtags, ...genericHashtags].slice(0, 15); // More hashtags
157
+
158
+ // Adjust AI temperature (creativity)
159
+ parameters: {
160
+ temperature: 0.9, // Higher = more creative (0.1-1.0)
161
+ }
162
+ ```
163
+
164
+ ---
165
+
166
+ Enjoy your AI-powered Social Hub! 🎉
index.html ADDED
@@ -0,0 +1,838 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>Social Media Hub - Your Digital Gateway</title>
7
+ <link rel="stylesheet" href="styles.css">
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <!-- Google Sign-In -->
10
+ <script src="https://accounts.google.com/gsi/client" async defer></script>
11
+ <meta name="google-signin-client_id" content="YOUR_GOOGLE_CLIENT_ID.apps.googleusercontent.com">
12
+ </head>
13
+ <body>
14
+ <div class="container">
15
+ <!-- Header Section -->
16
+ <header class="header">
17
+ <div class="header-top">
18
+ <div class="header-controls">
19
+ <!-- Theme Toggle -->
20
+ <button class="control-icon-btn" id="themeToggle" title="Toggle Dark/Light Mode">
21
+ <i class="fas fa-moon"></i>
22
+ </button>
23
+ <!-- AI Caption Generator -->
24
+ <button class="control-icon-btn" id="aiCaptionBtn" title="AI Caption Generator">
25
+ <i class="fas fa-camera"></i>
26
+ </button>
27
+ <!-- Keyboard Shortcuts Help -->
28
+ <button class="control-icon-btn" id="shortcutsBtn" title="Keyboard Shortcuts (?)">
29
+ <i class="fas fa-keyboard"></i>
30
+ </button>
31
+ <!-- Analytics Dashboard -->
32
+ <button class="control-icon-btn" id="analyticsBtn" title="Usage Analytics">
33
+ <i class="fas fa-chart-bar"></i>
34
+ </button>
35
+ <!-- Add Custom Platform -->
36
+ <button class="control-icon-btn" id="addPlatformBtn" title="Add Custom Platform">
37
+ <i class="fas fa-plus-circle"></i>
38
+ </button>
39
+ </div>
40
+ </div>
41
+ <div class="logo-section">
42
+ <div class="logo-icon">
43
+ <i class="fas fa-share-alt"></i>
44
+ </div>
45
+ <h1 class="title">Social Hub</h1>
46
+ </div>
47
+ <p class="subtitle">Connect to your favorite platforms instantly</p>
48
+ <!-- System Status -->
49
+ <div class="system-status" id="systemStatus">
50
+ <i class="fas fa-check-circle"></i>
51
+ <span>All Systems Operational</span>
52
+ </div>
53
+ </header>
54
+
55
+ <!-- Filter Tabs -->
56
+ <div class="filter-tabs" id="filterTabs">
57
+ <button class="filter-tab active" data-filter="all">All</button>
58
+ <button class="filter-tab" data-filter="favorites">
59
+ <i class="fas fa-star"></i> Favorites
60
+ </button>
61
+ <button class="filter-tab" data-filter="recent">
62
+ <i class="fas fa-history"></i> Recent
63
+ </button>
64
+ <button class="filter-tab" data-filter="social">Social</button>
65
+ <button class="filter-tab" data-filter="messaging">Messaging</button>
66
+ <button class="filter-tab" data-filter="professional">Professional</button>
67
+ <button class="filter-tab" data-filter="media">Media</button>
68
+ </div>
69
+
70
+ <!-- Search Bar -->
71
+ <div class="search-container">
72
+ <input type="text" id="searchInput" class="search-bar" placeholder="Search platforms...">
73
+ <i class="fas fa-search search-icon"></i>
74
+ </div>
75
+
76
+ <!-- Recent Activity Timeline -->
77
+ <div class="recent-timeline" id="recentTimeline" style="display: none;">
78
+ <h3>Recent Activity</h3>
79
+ <div class="timeline-items" id="timelineItems"></div>
80
+ </div>
81
+
82
+ <!-- Social Media Grid -->
83
+ <div class="social-grid" id="socialGrid">
84
+ <!-- Facebook -->
85
+ <div class="social-card" data-platform="facebook" data-category="social">
86
+ <div class="card-inner">
87
+ <div class="card-front facebook-bg">
88
+ <div class="card-top-controls">
89
+ <button class="favorite-btn" title="Add to Favorites">
90
+ <i class="far fa-star"></i>
91
+ </button>
92
+ <button class="note-btn" title="Add Note">
93
+ <i class="far fa-sticky-note"></i>
94
+ </button>
95
+ <div class="status-indicator" title="Status: Online"></div>
96
+ </div>
97
+ <div class="platform-logo">
98
+ <i class="fab fa-facebook-f"></i>
99
+ </div>
100
+ <h3 class="platform-name">Facebook</h3>
101
+ <div class="platform-badges">
102
+ <span class="visit-badge" style="display: none;">0 visits</span>
103
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
104
+ </div>
105
+ <p class="platform-desc">Connect with friends and the world</p>
106
+ <div class="card-stats">
107
+ <span><i class="fas fa-users"></i> 2.9B users</span>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ <a href="https://www.facebook.com" target="_blank" class="launch-btn" data-url="https://www.facebook.com">
112
+ <i class="fas fa-external-link-alt"></i> Launch
113
+ </a>
114
+ </div>
115
+
116
+ <!-- Instagram -->
117
+ <div class="social-card" data-platform="instagram" data-category="social">
118
+ <div class="card-inner">
119
+ <div class="card-front instagram-bg">
120
+ <div class="card-top-controls">
121
+ <button class="favorite-btn" title="Add to Favorites">
122
+ <i class="far fa-star"></i>
123
+ </button>
124
+ <button class="note-btn" title="Add Note">
125
+ <i class="far fa-sticky-note"></i>
126
+ </button>
127
+ <div class="status-indicator" title="Status: Online"></div>
128
+ </div>
129
+ <div class="platform-logo">
130
+ <i class="fab fa-instagram"></i>
131
+ </div>
132
+ <h3 class="platform-name">Instagram</h3>
133
+ <div class="platform-badges">
134
+ <span class="visit-badge" style="display: none;">0 visits</span>
135
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
136
+ </div>
137
+ <p class="platform-desc">Share your moments visually</p>
138
+ <div class="card-stats">
139
+ <span><i class="fas fa-users"></i> 2.0B users</span>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ <a href="https://www.instagram.com" target="_blank" class="launch-btn" data-url="https://www.instagram.com">
144
+ <i class="fas fa-external-link-alt"></i> Launch
145
+ </a>
146
+ </div>
147
+
148
+ <!-- Twitter/X -->
149
+ <div class="social-card" data-platform="twitter" data-category="social">
150
+ <div class="card-inner">
151
+ <div class="card-front twitter-bg">
152
+ <div class="card-top-controls">
153
+ <button class="favorite-btn" title="Add to Favorites">
154
+ <i class="far fa-star"></i>
155
+ </button>
156
+ <button class="note-btn" title="Add Note">
157
+ <i class="far fa-sticky-note"></i>
158
+ </button>
159
+ <div class="status-indicator" title="Status: Online"></div>
160
+ </div>
161
+ <div class="platform-logo">
162
+ <i class="fab fa-twitter"></i>
163
+ </div>
164
+ <h3 class="platform-name">X (Twitter)</h3>
165
+ <div class="platform-badges">
166
+ <span class="visit-badge" style="display: none;">0 visits</span>
167
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
168
+ </div>
169
+ <p class="platform-desc">Join the conversation</p>
170
+ <div class="card-stats">
171
+ <span><i class="fas fa-users"></i> 556M users</span>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ <a href="https://www.twitter.com" target="_blank" class="launch-btn" data-url="https://www.twitter.com">
176
+ <i class="fas fa-external-link-alt"></i> Launch
177
+ </a>
178
+ </div>
179
+
180
+ <!-- LinkedIn -->
181
+ <div class="social-card" data-platform="linkedin" data-category="professional">
182
+ <div class="card-inner">
183
+ <div class="card-front linkedin-bg">
184
+ <div class="card-top-controls">
185
+ <button class="favorite-btn" title="Add to Favorites">
186
+ <i class="far fa-star"></i>
187
+ </button>
188
+ <button class="note-btn" title="Add Note">
189
+ <i class="far fa-sticky-note"></i>
190
+ </button>
191
+ <div class="status-indicator" title="Status: Online"></div>
192
+ </div>
193
+ <div class="platform-logo">
194
+ <i class="fab fa-linkedin-in"></i>
195
+ </div>
196
+ <h3 class="platform-name">LinkedIn</h3>
197
+ <div class="platform-badges">
198
+ <span class="visit-badge" style="display: none;">0 visits</span>
199
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
200
+ </div>
201
+ <p class="platform-desc">Professional networking</p>
202
+ <div class="card-stats">
203
+ <span><i class="fas fa-users"></i> 930M users</span>
204
+ </div>
205
+ </div>
206
+ </div>
207
+ <a href="https://www.linkedin.com" target="_blank" class="launch-btn" data-url="https://www.linkedin.com">
208
+ <i class="fas fa-external-link-alt"></i> Launch
209
+ </a>
210
+ </div>
211
+
212
+ <!-- YouTube -->
213
+ <div class="social-card" data-platform="youtube" data-category="media">
214
+ <div class="card-inner">
215
+ <div class="card-front youtube-bg">
216
+ <div class="card-top-controls">
217
+ <button class="favorite-btn" title="Add to Favorites">
218
+ <i class="far fa-star"></i>
219
+ </button>
220
+ <button class="note-btn" title="Add Note">
221
+ <i class="far fa-sticky-note"></i>
222
+ </button>
223
+ <div class="status-indicator" title="Status: Online"></div>
224
+ </div>
225
+ <div class="platform-logo">
226
+ <i class="fab fa-youtube"></i>
227
+ </div>
228
+ <h3 class="platform-name">YouTube</h3>
229
+ <div class="platform-badges">
230
+ <span class="visit-badge" style="display: none;">0 visits</span>
231
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
232
+ </div>
233
+ <p class="platform-desc">Watch and share videos</p>
234
+ <div class="card-stats">
235
+ <span><i class="fas fa-users"></i> 2.5B users</span>
236
+ </div>
237
+ </div>
238
+ </div>
239
+ <a href="https://www.youtube.com" target="_blank" class="launch-btn" data-url="https://www.youtube.com">
240
+ <i class="fas fa-external-link-alt"></i> Launch
241
+ </a>
242
+ </div>
243
+
244
+ <!-- TikTok -->
245
+ <div class="social-card" data-platform="tiktok" data-category="media">
246
+ <div class="card-inner">
247
+ <div class="card-front tiktok-bg">
248
+ <div class="card-top-controls">
249
+ <button class="favorite-btn" title="Add to Favorites">
250
+ <i class="far fa-star"></i>
251
+ </button>
252
+ <button class="note-btn" title="Add Note">
253
+ <i class="far fa-sticky-note"></i>
254
+ </button>
255
+ <div class="status-indicator" title="Status: Online"></div>
256
+ </div>
257
+ <div class="platform-logo">
258
+ <i class="fab fa-tiktok"></i>
259
+ </div>
260
+ <h3 class="platform-name">TikTok</h3>
261
+ <div class="platform-badges">
262
+ <span class="visit-badge" style="display: none;">0 visits</span>
263
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
264
+ </div>
265
+ <p class="platform-desc">Create short entertaining videos</p>
266
+ <div class="card-stats">
267
+ <span><i class="fas fa-users"></i> 1.5B users</span>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ <a href="https://www.tiktok.com" target="_blank" class="launch-btn" data-url="https://www.tiktok.com">
272
+ <i class="fas fa-external-link-alt"></i> Launch
273
+ </a>
274
+ </div>
275
+
276
+ <!-- Reddit -->
277
+ <div class="social-card" data-platform="reddit" data-category="social">
278
+ <div class="card-inner">
279
+ <div class="card-front reddit-bg">
280
+ <div class="card-top-controls">
281
+ <button class="favorite-btn" title="Add to Favorites">
282
+ <i class="far fa-star"></i>
283
+ </button>
284
+ <button class="note-btn" title="Add Note">
285
+ <i class="far fa-sticky-note"></i>
286
+ </button>
287
+ <div class="status-indicator" title="Status: Online"></div>
288
+ </div>
289
+ <div class="platform-logo">
290
+ <i class="fab fa-reddit-alien"></i>
291
+ </div>
292
+ <h3 class="platform-name">Reddit</h3>
293
+ <div class="platform-badges">
294
+ <span class="visit-badge" style="display: none;">0 visits</span>
295
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
296
+ </div>
297
+ <p class="platform-desc">Dive into communities</p>
298
+ <div class="card-stats">
299
+ <span><i class="fas fa-users"></i> 430M users</span>
300
+ </div>
301
+ </div>
302
+ </div>
303
+ <a href="https://www.reddit.com" target="_blank" class="launch-btn" data-url="https://www.reddit.com">
304
+ <i class="fas fa-external-link-alt"></i> Launch
305
+ </a>
306
+ </div>
307
+
308
+ <!-- WhatsApp -->
309
+ <div class="social-card" data-platform="whatsapp" data-category="messaging">
310
+ <div class="card-inner">
311
+ <div class="card-front whatsapp-bg">
312
+ <div class="card-top-controls">
313
+ <button class="favorite-btn" title="Add to Favorites">
314
+ <i class="far fa-star"></i>
315
+ </button>
316
+ <button class="note-btn" title="Add Note">
317
+ <i class="far fa-sticky-note"></i>
318
+ </button>
319
+ <div class="status-indicator" title="Status: Online"></div>
320
+ </div>
321
+ <div class="platform-logo">
322
+ <i class="fab fa-whatsapp"></i>
323
+ </div>
324
+ <h3 class="platform-name">WhatsApp</h3>
325
+ <div class="platform-badges">
326
+ <span class="visit-badge" style="display: none;">0 visits</span>
327
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
328
+ </div>
329
+ <p class="platform-desc">Simple. Secure. Messaging.</p>
330
+ <div class="card-stats">
331
+ <span><i class="fas fa-users"></i> 2.7B users</span>
332
+ </div>
333
+ </div>
334
+ </div>
335
+ <a href="https://web.whatsapp.com" target="_blank" class="launch-btn" data-url="https://web.whatsapp.com">
336
+ <i class="fas fa-external-link-alt"></i> Launch
337
+ </a>
338
+ </div>
339
+
340
+ <!-- Telegram -->
341
+ <div class="social-card" data-platform="telegram" data-category="messaging">
342
+ <div class="card-inner">
343
+ <div class="card-front telegram-bg">
344
+ <div class="card-top-controls">
345
+ <button class="favorite-btn" title="Add to Favorites">
346
+ <i class="far fa-star"></i>
347
+ </button>
348
+ <button class="note-btn" title="Add Note">
349
+ <i class="far fa-sticky-note"></i>
350
+ </button>
351
+ <div class="status-indicator" title="Status: Online"></div>
352
+ </div>
353
+ <div class="platform-logo">
354
+ <i class="fab fa-telegram-plane"></i>
355
+ </div>
356
+ <h3 class="platform-name">Telegram</h3>
357
+ <div class="platform-badges">
358
+ <span class="visit-badge" style="display: none;">0 visits</span>
359
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
360
+ </div>
361
+ <p class="platform-desc">Fast and secure messaging</p>
362
+ <div class="card-stats">
363
+ <span><i class="fas fa-users"></i> 800M users</span>
364
+ </div>
365
+ </div>
366
+ </div>
367
+ <a href="https://web.telegram.org" target="_blank" class="launch-btn" data-url="https://web.telegram.org">
368
+ <i class="fas fa-external-link-alt"></i> Launch
369
+ </a>
370
+ </div>
371
+
372
+ <!-- Discord -->
373
+ <div class="social-card" data-platform="discord" data-category="messaging">
374
+ <div class="card-inner">
375
+ <div class="card-front discord-bg">
376
+ <div class="card-top-controls">
377
+ <button class="favorite-btn" title="Add to Favorites">
378
+ <i class="far fa-star"></i>
379
+ </button>
380
+ <button class="note-btn" title="Add Note">
381
+ <i class="far fa-sticky-note"></i>
382
+ </button>
383
+ <div class="status-indicator" title="Status: Online"></div>
384
+ </div>
385
+ <div class="platform-logo">
386
+ <i class="fab fa-discord"></i>
387
+ </div>
388
+ <h3 class="platform-name">Discord</h3>
389
+ <div class="platform-badges">
390
+ <span class="visit-badge" style="display: none;">0 visits</span>
391
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
392
+ </div>
393
+ <p class="platform-desc">Voice, video, and text chat</p>
394
+ <div class="card-stats">
395
+ <span><i class="fas fa-users"></i> 563M users</span>
396
+ </div>
397
+ </div>
398
+ </div>
399
+ <a href="https://discord.com/app" target="_blank" class="launch-btn" data-url="https://discord.com/app">
400
+ <i class="fas fa-external-link-alt"></i> Launch
401
+ </a>
402
+ </div>
403
+
404
+ <!-- Snapchat -->
405
+ <div class="social-card" data-platform="snapchat" data-category="social">
406
+ <div class="card-inner">
407
+ <div class="card-front snapchat-bg">
408
+ <div class="card-top-controls">
409
+ <button class="favorite-btn" title="Add to Favorites">
410
+ <i class="far fa-star"></i>
411
+ </button>
412
+ <button class="note-btn" title="Add Note">
413
+ <i class="far fa-sticky-note"></i>
414
+ </button>
415
+ <div class="status-indicator" title="Status: Online"></div>
416
+ </div>
417
+ <div class="platform-logo">
418
+ <i class="fab fa-snapchat-ghost"></i>
419
+ </div>
420
+ <h3 class="platform-name">Snapchat</h3>
421
+ <div class="platform-badges">
422
+ <span class="visit-badge" style="display: none;">0 visits</span>
423
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
424
+ </div>
425
+ <p class="platform-desc">Share the moment</p>
426
+ <div class="card-stats">
427
+ <span><i class="fas fa-users"></i> 750M users</span>
428
+ </div>
429
+ </div>
430
+ </div>
431
+ <a href="https://www.snapchat.com" target="_blank" class="launch-btn" data-url="https://www.snapchat.com">
432
+ <i class="fas fa-external-link-alt"></i> Launch
433
+ </a>
434
+ </div>
435
+
436
+ <!-- Pinterest -->
437
+ <div class="social-card" data-platform="pinterest" data-category="media">
438
+ <div class="card-inner">
439
+ <div class="card-front pinterest-bg">
440
+ <div class="card-top-controls">
441
+ <button class="favorite-btn" title="Add to Favorites">
442
+ <i class="far fa-star"></i>
443
+ </button>
444
+ <button class="note-btn" title="Add Note">
445
+ <i class="far fa-sticky-note"></i>
446
+ </button>
447
+ <div class="status-indicator" title="Status: Online"></div>
448
+ </div>
449
+ <div class="platform-logo">
450
+ <i class="fab fa-pinterest-p"></i>
451
+ </div>
452
+ <h3 class="platform-name">Pinterest</h3>
453
+ <div class="platform-badges">
454
+ <span class="visit-badge" style="display: none;">0 visits</span>
455
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
456
+ </div>
457
+ <p class="platform-desc">Discover ideas and inspiration</p>
458
+ <div class="card-stats">
459
+ <span><i class="fas fa-users"></i> 465M users</span>
460
+ </div>
461
+ </div>
462
+ </div>
463
+ <a href="https://www.pinterest.com" target="_blank" class="launch-btn" data-url="https://www.pinterest.com">
464
+ <i class="fas fa-external-link-alt"></i> Launch
465
+ </a>
466
+ </div>
467
+ </div>
468
+
469
+ <!-- Footer -->
470
+ <footer class="footer">
471
+ <p>© 2025 Social Hub | Your Digital Gateway to All Platforms</p>
472
+ <div class="footer-links">
473
+ <a href="#"><i class="fas fa-shield-alt"></i> Privacy</a>
474
+ <a href="#"><i class="fas fa-file-contract"></i> Terms</a>
475
+ <a href="#"><i class="fas fa-envelope"></i> Contact</a>
476
+ </div>
477
+ </footer>
478
+ </div>
479
+
480
+ <!-- Particles Background -->
481
+ <canvas id="particles"></canvas>
482
+
483
+ <!-- Keyboard Shortcuts Modal -->
484
+ <div id="shortcutsModal" class="modal">
485
+ <div class="modal-content shortcuts-modal">
486
+ <div class="modal-header">
487
+ <div class="modal-title">
488
+ <i class="fas fa-keyboard"></i>
489
+ <span>Keyboard Shortcuts</span>
490
+ </div>
491
+ <button class="modal-btn close-btn" onclick="document.getElementById('shortcutsModal').classList.remove('active')">
492
+ <i class="fas fa-times"></i>
493
+ </button>
494
+ </div>
495
+ <div class="modal-body shortcuts-body">
496
+ <div class="shortcut-item">
497
+ <kbd>/</kbd>
498
+ <span>Focus search bar</span>
499
+ </div>
500
+ <div class="shortcut-item">
501
+ <kbd>Esc</kbd>
502
+ <span>Close modal / Clear search</span>
503
+ </div>
504
+ <div class="shortcut-item">
505
+ <kbd>?</kbd>
506
+ <span>Show shortcuts</span>
507
+ </div>
508
+ <div class="shortcut-item">
509
+ <kbd>1-9</kbd>
510
+ <span>Quick launch platforms</span>
511
+ </div>
512
+ <div class="shortcut-item">
513
+ <kbd>Ctrl</kbd> + <kbd>K</kbd>
514
+ <span>Open analytics</span>
515
+ </div>
516
+ <div class="shortcut-item">
517
+ <kbd>Ctrl</kbd> + <kbd>D</kbd>
518
+ <span>Toggle dark/light mode</span>
519
+ </div>
520
+ <div class="shortcut-item">
521
+ <kbd>Ctrl</kbd> + <kbd>I</kbd>
522
+ <span>Open AI Caption Generator</span>
523
+ </div>
524
+ </div>
525
+ </div>
526
+ </div>
527
+
528
+ <!-- Analytics Modal -->
529
+ <div id="analyticsModal" class="modal">
530
+ <div class="modal-content analytics-modal">
531
+ <div class="modal-header">
532
+ <div class="modal-title">
533
+ <i class="fas fa-chart-bar"></i>
534
+ <span>Usage Analytics</span>
535
+ </div>
536
+ <button class="modal-btn close-btn" onclick="document.getElementById('analyticsModal').classList.remove('active')">
537
+ <i class="fas fa-times"></i>
538
+ </button>
539
+ </div>
540
+ <div class="modal-body analytics-body">
541
+ <div class="analytics-stats">
542
+ <div class="stat-card">
543
+ <i class="fas fa-mouse-pointer"></i>
544
+ <h3 id="totalVisits">0</h3>
545
+ <p>Total Visits</p>
546
+ </div>
547
+ <div class="stat-card">
548
+ <i class="fas fa-clock"></i>
549
+ <h3 id="totalTime">0h 0m</h3>
550
+ <p>Total Time</p>
551
+ </div>
552
+ <div class="stat-card">
553
+ <i class="fas fa-star"></i>
554
+ <h3 id="totalFavorites">0</h3>
555
+ <p>Favorites</p>
556
+ </div>
557
+ <div class="stat-card">
558
+ <i class="fas fa-fire"></i>
559
+ <h3 id="mostUsed">-</h3>
560
+ <p>Most Used</p>
561
+ </div>
562
+ </div>
563
+ <div class="analytics-chart">
564
+ <h3>Platform Usage</h3>
565
+ <div id="usageChart" class="usage-chart"></div>
566
+ </div>
567
+ </div>
568
+ </div>
569
+ </div>
570
+
571
+ <!-- Add Platform Modal -->
572
+ <div id="addPlatformModal" class="modal">
573
+ <div class="modal-content add-platform-modal">
574
+ <div class="modal-header">
575
+ <div class="modal-title">
576
+ <i class="fas fa-plus-circle"></i>
577
+ <span>Add Custom Platform</span>
578
+ </div>
579
+ <button class="modal-btn close-btn" onclick="document.getElementById('addPlatformModal').classList.remove('active')">
580
+ <i class="fas fa-times"></i>
581
+ </button>
582
+ </div>
583
+ <div class="modal-body add-platform-body">
584
+ <form id="addPlatformForm">
585
+ <div class="form-group">
586
+ <label>Platform Name</label>
587
+ <input type="text" id="customPlatformName" placeholder="e.g., My Custom App" required>
588
+ </div>
589
+ <div class="form-group">
590
+ <label>Platform URL</label>
591
+ <input type="url" id="customPlatformURL" placeholder="https://example.com" required>
592
+ </div>
593
+ <div class="form-group">
594
+ <label>Icon Class (Font Awesome)</label>
595
+ <input type="text" id="customPlatformIcon" placeholder="fab fa-custom" value="fas fa-globe">
596
+ </div>
597
+ <div class="form-group">
598
+ <label>Background Color</label>
599
+ <input type="color" id="customPlatformColor" value="#00d4ff">
600
+ </div>
601
+ <div class="form-group">
602
+ <label>Category</label>
603
+ <select id="customPlatformCategory">
604
+ <option value="social">Social</option>
605
+ <option value="messaging">Messaging</option>
606
+ <option value="professional">Professional</option>
607
+ <option value="media">Media</option>
608
+ </select>
609
+ </div>
610
+ <button type="submit" class="submit-btn">Add Platform</button>
611
+ </form>
612
+ </div>
613
+ </div>
614
+ </div>
615
+
616
+ <!-- Note Modal -->
617
+ <div id="noteModal" class="modal">
618
+ <div class="modal-content note-modal">
619
+ <div class="modal-header">
620
+ <div class="modal-title">
621
+ <i class="fas fa-sticky-note"></i>
622
+ <span>Platform Note</span>
623
+ </div>
624
+ <button class="modal-btn close-btn" onclick="document.getElementById('noteModal').classList.remove('active')">
625
+ <i class="fas fa-times"></i>
626
+ </button>
627
+ </div>
628
+ <div class="modal-body note-body">
629
+ <h3 id="notePlatformName"></h3>
630
+ <textarea id="noteTextarea" placeholder="Add a note or reminder..." rows="5"></textarea>
631
+ <div class="note-actions">
632
+ <button class="cancel-btn" onclick="document.getElementById('noteModal').classList.remove('active')">Cancel</button>
633
+ <button class="save-btn" id="saveNoteBtn">Save Note</button>
634
+ <button class="delete-btn" id="deleteNoteBtn">Delete Note</button>
635
+ </div>
636
+ </div>
637
+ </div>
638
+ </div>
639
+
640
+ <!-- Time Tracking Widget -->
641
+ <div id="timeTracker" class="time-tracker" style="display: none;">
642
+ <div class="tracker-header">
643
+ <i class="fas fa-stopwatch"></i>
644
+ <span>Time Spent: </span>
645
+ <span id="trackerTime">00:00</span>
646
+ </div>
647
+ <button class="tracker-stop" id="stopTracking">
648
+ <i class="fas fa-stop"></i>
649
+ </button>
650
+ </div>
651
+
652
+ <!-- AI Caption Generator Modal -->
653
+ <div id="aiCaptionModal" class="modal">
654
+ <div class="modal-content ai-caption-modal">
655
+ <div class="modal-header">
656
+ <div class="modal-title">
657
+ <i class="fas fa-camera"></i>
658
+ <span>AI Caption Generator</span>
659
+ </div>
660
+ <button class="modal-btn close-btn" onclick="document.getElementById('aiCaptionModal').classList.remove('active')">
661
+ <i class="fas fa-times"></i>
662
+ </button>
663
+ </div>
664
+ <div class="modal-body ai-caption-body">
665
+ <!-- Upload Section -->
666
+ <div class="upload-section" id="uploadSection">
667
+ <div class="upload-area" id="uploadArea">
668
+ <i class="fas fa-cloud-upload-alt"></i>
669
+ <h3>Upload Your Photo</h3>
670
+ <p>Drop an image here or click to browse</p>
671
+ <input type="file" id="imageInput" accept="image/*" hidden>
672
+ <button class="upload-btn" onclick="document.getElementById('imageInput').click()">
673
+ <i class="fas fa-folder-open"></i> Choose Image
674
+ </button>
675
+ </div>
676
+ </div>
677
+
678
+ <!-- Preview & Results Section -->
679
+ <div class="results-section" id="resultsSection" style="display: none;">
680
+ <div class="image-preview-container">
681
+ <img id="imagePreview" src="" alt="Preview">
682
+ <button class="change-image-btn" onclick="document.getElementById('imageInput').click()">
683
+ <i class="fas fa-exchange-alt"></i> Change Image
684
+ </button>
685
+ </div>
686
+
687
+ <div class="ai-results">
688
+ <!-- Description -->
689
+ <div class="result-card">
690
+ <div class="result-header">
691
+ <i class="fas fa-align-left"></i>
692
+ <h4>AI Description</h4>
693
+ </div>
694
+ <div class="result-content" id="aiDescription">
695
+ <div class="loading-dots">
696
+ <span></span><span></span><span></span>
697
+ </div>
698
+ </div>
699
+ </div>
700
+
701
+ <!-- Captions -->
702
+ <div class="result-card">
703
+ <div class="result-header">
704
+ <i class="fas fa-quote-right"></i>
705
+ <h4>Generated Captions</h4>
706
+ </div>
707
+ <div class="result-content" id="aiCaptions">
708
+ <div class="loading-dots">
709
+ <span></span><span></span><span></span>
710
+ </div>
711
+ </div>
712
+ </div>
713
+
714
+ <!-- Hashtags -->
715
+ <div class="result-card">
716
+ <div class="result-header">
717
+ <i class="fas fa-hashtag"></i>
718
+ <h4>Hashtags</h4>
719
+ </div>
720
+ <div class="result-content" id="aiHashtags">
721
+ <div class="loading-dots">
722
+ <span></span><span></span><span></span>
723
+ </div>
724
+ </div>
725
+ </div>
726
+
727
+ <!-- Post to Platform -->
728
+ <div class="post-section">
729
+ <h4><i class="fas fa-share-alt"></i> Post to Platform</h4>
730
+ <div class="platform-select-grid">
731
+ <button class="platform-post-btn" data-platform="instagram">
732
+ <i class="fab fa-instagram"></i> Instagram
733
+ </button>
734
+ <button class="platform-post-btn" data-platform="facebook">
735
+ <i class="fab fa-facebook"></i> Facebook
736
+ </button>
737
+ <button class="platform-post-btn" data-platform="twitter">
738
+ <i class="fab fa-twitter"></i> Twitter/X
739
+ </button>
740
+ <button class="platform-post-btn" data-platform="linkedin">
741
+ <i class="fab fa-linkedin"></i> LinkedIn
742
+ </button>
743
+ </div>
744
+ <div class="copy-buttons">
745
+ <button class="copy-btn" id="copyCaptionBtn">
746
+ <i class="fas fa-copy"></i> Copy Caption
747
+ </button>
748
+ <button class="copy-btn" id="copyHashtagsBtn">
749
+ <i class="fas fa-copy"></i> Copy Hashtags
750
+ </button>
751
+ <button class="copy-btn" id="copyAllBtn">
752
+ <i class="fas fa-copy"></i> Copy All
753
+ </button>
754
+ </div>
755
+ </div>
756
+ </div>
757
+ </div>
758
+ </div>
759
+ </div>
760
+ </div>
761
+
762
+ <!-- Modal for Embedded Platform -->
763
+ <div id="platformModal" class="modal">
764
+ <div class="modal-content">
765
+ <div class="modal-header">
766
+ <div class="modal-title">
767
+ <i class="platform-icon"></i>
768
+ <span class="platform-title">Platform</span>
769
+ </div>
770
+ <div class="modal-controls">
771
+ <button class="modal-btn close-btn" title="Close">
772
+ <i class="fas fa-times"></i>
773
+ </button>
774
+ </div>
775
+ </div>
776
+ <div class="modal-body">
777
+ <!-- Login/Authentication Section -->
778
+ <div id="authSection" class="auth-section">
779
+ <div class="auth-container">
780
+ <div class="auth-icon">
781
+ <i class="platform-icon-large"></i>
782
+ </div>
783
+ <h2 class="auth-title">Connect to <span class="platform-name-text">Platform</span></h2>
784
+ <p class="auth-description">Choose your preferred method to access this platform. A new window will open for secure authentication.</p>
785
+
786
+ <div class="auth-options">
787
+ <!-- Google Sign-In Button -->
788
+ <button class="auth-btn google-btn" id="googleSignIn">
789
+ <i class="fab fa-google"></i>
790
+ <span>Sign in with Google (Opens in New Window)</span>
791
+ </button>
792
+
793
+ <!-- Direct Platform Login -->
794
+ <button class="auth-btn platform-btn" id="platformSignIn">
795
+ <i class="platform-icon-small"></i>
796
+ <span class="platform-login-text">Login with Platform Account</span>
797
+ </button>
798
+
799
+ <!-- Guest/Web Version -->
800
+ <button class="auth-btn guest-btn" id="guestAccess">
801
+ <i class="fas fa-globe"></i>
802
+ <span>Open Web Version (New Window)</span>
803
+ </button>
804
+ </div>
805
+
806
+ <div class="auth-footer">
807
+ <i class="fas fa-shield-alt"></i>
808
+ <p>Your credentials are secure and handled by the platform's official authentication</p>
809
+ </div>
810
+ </div>
811
+ </div>
812
+
813
+ <!-- Platform Content Section -->
814
+ <div id="platformSection" class="platform-section" style="display: none;">
815
+ <div class="platform-controls">
816
+ <button class="control-btn refresh-btn" title="Refresh">
817
+ <i class="fas fa-sync-alt"></i>
818
+ </button>
819
+ <button class="control-btn fullscreen-btn" title="Fullscreen">
820
+ <i class="fas fa-expand"></i>
821
+ </button>
822
+ <button class="control-btn logout-btn" title="Logout">
823
+ <i class="fas fa-sign-out-alt"></i>
824
+ </button>
825
+ </div>
826
+ <iframe id="platformFrame" src="" frameborder="0" allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>
827
+ <div class="loading-spinner">
828
+ <i class="fas fa-circle-notch fa-spin"></i>
829
+ <p>Loading platform...</p>
830
+ </div>
831
+ </div>
832
+ </div>
833
+ </div>
834
+ </div>
835
+
836
+ <script src="script.js"></script>
837
+ </body>
838
+ </html>
script.js ADDED
@@ -0,0 +1,1664 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // ===== GLOBAL VARIABLES AND INITIALIZATION =====
2
+ let currentPlatformURL = '';
3
+ let currentPlatformName = '';
4
+ let currentPlatform = '';
5
+ let currentNoteEditPlatform = '';
6
+ let timeTrackingInterval = null;
7
+ let startTime = null;
8
+ let currentImageData = null;
9
+ let currentDescription = '';
10
+ let currentCaptions = '';
11
+ let currentHashtags = '';
12
+
13
+ // ===== STORAGE MANAGER =====
14
+ const StorageManager = {
15
+ // Get favorites
16
+ getFavorites: () => {
17
+ const favorites = localStorage.getItem('socialHub_favorites');
18
+ return favorites ? JSON.parse(favorites) : [];
19
+ },
20
+
21
+ // Set favorites
22
+ setFavorites: (favorites) => {
23
+ localStorage.setItem('socialHub_favorites', JSON.stringify(favorites));
24
+ },
25
+
26
+ // Toggle favorite
27
+ toggleFavorite: (platform) => {
28
+ const favorites = StorageManager.getFavorites();
29
+ const index = favorites.indexOf(platform);
30
+ if (index > -1) {
31
+ favorites.splice(index, 1);
32
+ } else {
33
+ favorites.push(platform);
34
+ }
35
+ StorageManager.setFavorites(favorites);
36
+ return favorites;
37
+ },
38
+
39
+ // Get notes
40
+ getNotes: () => {
41
+ const notes = localStorage.getItem('socialHub_notes');
42
+ return notes ? JSON.parse(notes) : {};
43
+ },
44
+
45
+ // Set note
46
+ setNote: (platform, note) => {
47
+ const notes = StorageManager.getNotes();
48
+ if (note.trim()) {
49
+ notes[platform] = note;
50
+ } else {
51
+ delete notes[platform];
52
+ }
53
+ localStorage.setItem('socialHub_notes', JSON.stringify(notes));
54
+ },
55
+
56
+ // Get analytics
57
+ getAnalytics: () => {
58
+ const analytics = localStorage.getItem('socialHub_analytics');
59
+ return analytics ? JSON.parse(analytics) : {};
60
+ },
61
+
62
+ // Update analytics
63
+ updateAnalytics: (platform) => {
64
+ const analytics = StorageManager.getAnalytics();
65
+ if (!analytics[platform]) {
66
+ analytics[platform] = { visits: 0, time: 0, lastVisit: null };
67
+ }
68
+ analytics[platform].visits++;
69
+ analytics[platform].lastVisit = new Date().toISOString();
70
+ localStorage.setItem('socialHub_analytics', JSON.stringify(analytics));
71
+ },
72
+
73
+ // Update time spent
74
+ updateTimeSpent: (platform, seconds) => {
75
+ const analytics = StorageManager.getAnalytics();
76
+ if (!analytics[platform]) {
77
+ analytics[platform] = { visits: 0, time: 0, lastVisit: null };
78
+ }
79
+ analytics[platform].time = (analytics[platform].time || 0) + seconds;
80
+ localStorage.setItem('socialHub_analytics', JSON.stringify(analytics));
81
+ },
82
+
83
+ // Get recent activity
84
+ getRecentActivity: () => {
85
+ const recent = localStorage.getItem('socialHub_recent');
86
+ return recent ? JSON.parse(recent) : [];
87
+ },
88
+
89
+ // Add to recent
90
+ addToRecent: (platform, name, icon) => {
91
+ let recent = StorageManager.getRecentActivity();
92
+ recent = recent.filter(item => item.platform !== platform);
93
+ recent.unshift({ platform, name, icon, timestamp: new Date().toISOString() });
94
+ recent = recent.slice(0, 10);
95
+ localStorage.setItem('socialHub_recent', JSON.stringify(recent));
96
+ },
97
+
98
+ // Get theme
99
+ getTheme: () => {
100
+ return localStorage.getItem('socialHub_theme') || 'dark';
101
+ },
102
+
103
+ // Set theme
104
+ setTheme: (theme) => {
105
+ localStorage.setItem('socialHub_theme', theme);
106
+ },
107
+
108
+ // Get custom platforms
109
+ getCustomPlatforms: () => {
110
+ const custom = localStorage.getItem('socialHub_custom');
111
+ return custom ? JSON.parse(custom) : [];
112
+ },
113
+
114
+ // Add custom platform
115
+ addCustomPlatform: (platform) => {
116
+ const custom = StorageManager.getCustomPlatforms();
117
+ custom.push(platform);
118
+ localStorage.setItem('socialHub_custom', JSON.stringify(custom));
119
+ },
120
+
121
+ // Remove custom platform
122
+ removeCustomPlatform: (id) => {
123
+ let custom = StorageManager.getCustomPlatforms();
124
+ custom = custom.filter(p => p.id !== id);
125
+ localStorage.setItem('socialHub_custom', JSON.stringify(custom));
126
+ }
127
+ };
128
+
129
+ // ===== Particles Background Animation =====
130
+ const canvas = document.getElementById('particles');
131
+ const ctx = canvas.getContext('2d');
132
+
133
+ canvas.width = window.innerWidth;
134
+ canvas.height = window.innerHeight;
135
+
136
+ let particlesArray = [];
137
+ const numberOfParticles = 100;
138
+
139
+ class Particle {
140
+ constructor() {
141
+ this.x = Math.random() * canvas.width;
142
+ this.y = Math.random() * canvas.height;
143
+ this.size = Math.random() * 2 + 1;
144
+ this.speedX = Math.random() * 1 - 0.5;
145
+ this.speedY = Math.random() * 1 - 0.5;
146
+ this.opacity = Math.random() * 0.5 + 0.2;
147
+ }
148
+
149
+ update() {
150
+ this.x += this.speedX;
151
+ this.y += this.speedY;
152
+
153
+ if (this.x > canvas.width || this.x < 0) {
154
+ this.speedX = -this.speedX;
155
+ }
156
+ if (this.y > canvas.height || this.y < 0) {
157
+ this.speedY = -this.speedY;
158
+ }
159
+ }
160
+
161
+ draw() {
162
+ ctx.fillStyle = `rgba(0, 212, 255, ${this.opacity})`;
163
+ ctx.beginPath();
164
+ ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
165
+ ctx.fill();
166
+ }
167
+ }
168
+
169
+ function initParticles() {
170
+ particlesArray = [];
171
+ for (let i = 0; i < numberOfParticles; i++) {
172
+ particlesArray.push(new Particle());
173
+ }
174
+ }
175
+
176
+ function animateParticles() {
177
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
178
+
179
+ for (let i = 0; i < particlesArray.length; i++) {
180
+ particlesArray[i].update();
181
+ particlesArray[i].draw();
182
+
183
+ // Connect particles with lines
184
+ for (let j = i; j < particlesArray.length; j++) {
185
+ const dx = particlesArray[i].x - particlesArray[j].x;
186
+ const dy = particlesArray[i].y - particlesArray[j].y;
187
+ const distance = Math.sqrt(dx * dx + dy * dy);
188
+
189
+ if (distance < 100) {
190
+ ctx.strokeStyle = `rgba(0, 212, 255, ${0.2 * (1 - distance / 100)})`;
191
+ ctx.lineWidth = 1;
192
+ ctx.beginPath();
193
+ ctx.moveTo(particlesArray[i].x, particlesArray[i].y);
194
+ ctx.lineTo(particlesArray[j].x, particlesArray[j].y);
195
+ ctx.stroke();
196
+ }
197
+ }
198
+ }
199
+
200
+ requestAnimationFrame(animateParticles);
201
+ }
202
+
203
+ // ===== Window Resize Handler =====
204
+ window.addEventListener('resize', () => {
205
+ canvas.width = window.innerWidth;
206
+ canvas.height = window.innerHeight;
207
+ initParticles();
208
+ });
209
+
210
+ // ===== Search Functionality =====
211
+ const searchInput = document.getElementById('searchInput');
212
+ const socialCards = document.querySelectorAll('.social-card');
213
+
214
+ searchInput.addEventListener('input', (e) => {
215
+ const searchTerm = e.target.value.toLowerCase();
216
+ const activeFilter = document.querySelector('.filter-tab.active')?.getAttribute('data-filter') || 'all';
217
+
218
+ socialCards.forEach(card => {
219
+ const platform = card.getAttribute('data-platform');
220
+ const platformName = card.querySelector('.platform-name').textContent.toLowerCase();
221
+ const platformDesc = card.querySelector('.platform-desc').textContent.toLowerCase();
222
+ const category = card.getAttribute('data-category');
223
+ const isFavorite = StorageManager.getFavorites().includes(platform);
224
+
225
+ const matchesSearch = platform.includes(searchTerm) ||
226
+ platformName.includes(searchTerm) ||
227
+ platformDesc.includes(searchTerm);
228
+
229
+ const matchesFilter = activeFilter === 'all' ||
230
+ (activeFilter === 'favorites' && isFavorite) ||
231
+ (activeFilter === 'recent' && isInRecentActivity(platform)) ||
232
+ (activeFilter !== 'favorites' && activeFilter !== 'recent' && category === activeFilter);
233
+
234
+ if (matchesSearch && matchesFilter) {
235
+ card.classList.remove('hidden');
236
+ } else {
237
+ card.classList.add('hidden');
238
+ }
239
+ });
240
+ });
241
+
242
+ function isInRecentActivity(platform) {
243
+ const recent = StorageManager.getRecentActivity();
244
+ return recent.some(item => item.platform === platform);
245
+ }
246
+
247
+ // ===== FILTER FUNCTIONALITY =====
248
+ const filterTabs = document.querySelectorAll('.filter-tab');
249
+ const recentTimeline = document.getElementById('recentTimeline');
250
+
251
+ filterTabs.forEach(tab => {
252
+ tab.addEventListener('click', () => {
253
+ // Update active tab
254
+ filterTabs.forEach(t => t.classList.remove('active'));
255
+ tab.classList.add('active');
256
+
257
+ const filter = tab.getAttribute('data-filter');
258
+
259
+ // Show/hide recent timeline
260
+ if (filter === 'recent') {
261
+ updateRecentTimeline();
262
+ recentTimeline.style.display = 'block';
263
+ } else {
264
+ recentTimeline.style.display = 'none';
265
+ }
266
+
267
+ // Filter cards
268
+ filterCards(filter);
269
+ });
270
+ });
271
+
272
+ function filterCards(filter) {
273
+ const favorites = StorageManager.getFavorites();
274
+
275
+ socialCards.forEach(card => {
276
+ const platform = card.getAttribute('data-platform');
277
+ const category = card.getAttribute('data-category');
278
+ const searchTerm = searchInput.value.toLowerCase();
279
+ const platformName = card.querySelector('.platform-name').textContent.toLowerCase();
280
+ const platformDesc = card.querySelector('.platform-desc').textContent.toLowerCase();
281
+
282
+ const matchesSearch = !searchTerm || platform.includes(searchTerm) ||
283
+ platformName.includes(searchTerm) || platformDesc.includes(searchTerm);
284
+
285
+ let show = false;
286
+
287
+ if (filter === 'all') {
288
+ show = true;
289
+ } else if (filter === 'favorites') {
290
+ show = favorites.includes(platform);
291
+ } else if (filter === 'recent') {
292
+ show = isInRecentActivity(platform);
293
+ } else {
294
+ show = category === filter;
295
+ }
296
+
297
+ if (show && matchesSearch) {
298
+ card.classList.remove('hidden');
299
+ } else {
300
+ card.classList.add('hidden');
301
+ }
302
+ });
303
+ }
304
+
305
+ // ===== FAVORITES FUNCTIONALITY =====
306
+ function initializeFavorites() {
307
+ const favorites = StorageManager.getFavorites();
308
+
309
+ socialCards.forEach(card => {
310
+ const platform = card.getAttribute('data-platform');
311
+ const favBtn = card.querySelector('.favorite-btn');
312
+
313
+ if (favorites.includes(platform)) {
314
+ favBtn.classList.add('active');
315
+ favBtn.querySelector('i').classList.remove('far');
316
+ favBtn.querySelector('i').classList.add('fas');
317
+ }
318
+
319
+ favBtn.addEventListener('click', (e) => {
320
+ e.stopPropagation();
321
+ e.preventDefault();
322
+ toggleFavorite(platform, favBtn);
323
+ });
324
+ });
325
+ }
326
+
327
+ function toggleFavorite(platform, btn) {
328
+ const favorites = StorageManager.toggleFavorite(platform);
329
+ const isFavorite = favorites.includes(platform);
330
+
331
+ if (isFavorite) {
332
+ btn.classList.add('active');
333
+ btn.querySelector('i').classList.remove('far');
334
+ btn.querySelector('i').classList.add('fas');
335
+ showNotification(`Added to favorites!`, 'success');
336
+ } else {
337
+ btn.classList.remove('active');
338
+ btn.querySelector('i').classList.remove('fas');
339
+ btn.querySelector('i').classList.add('far');
340
+ showNotification(`Removed from favorites`, 'info');
341
+ }
342
+
343
+ updateAnalyticsDisplay();
344
+ }
345
+
346
+ // ===== NOTES FUNCTIONALITY =====
347
+ const noteModal = document.getElementById('noteModal');
348
+ const noteTextarea = document.getElementById('noteTextarea');
349
+ const notePlatformName = document.getElementById('notePlatformName');
350
+ const saveNoteBtn = document.getElementById('saveNoteBtn');
351
+ const deleteNoteBtn = document.getElementById('deleteNoteBtn');
352
+
353
+ function initializeNotes() {
354
+ const notes = StorageManager.getNotes();
355
+
356
+ socialCards.forEach(card => {
357
+ const platform = card.getAttribute('data-platform');
358
+ const noteBtn = card.querySelector('.note-btn');
359
+ const noteIndicator = card.querySelector('.note-indicator');
360
+
361
+ if (notes[platform]) {
362
+ noteBtn.classList.add('has-note');
363
+ noteIndicator.style.display = 'inline-flex';
364
+ }
365
+
366
+ noteBtn.addEventListener('click', (e) => {
367
+ e.stopPropagation();
368
+ e.preventDefault();
369
+ openNoteModal(platform, card.querySelector('.platform-name').textContent);
370
+ });
371
+ });
372
+ }
373
+
374
+ function openNoteModal(platform, name) {
375
+ currentNoteEditPlatform = platform;
376
+ notePlatformName.textContent = name;
377
+
378
+ const notes = StorageManager.getNotes();
379
+ noteTextarea.value = notes[platform] || '';
380
+
381
+ noteModal.classList.add('active');
382
+ document.body.style.overflow = 'hidden';
383
+ noteTextarea.focus();
384
+ }
385
+
386
+ saveNoteBtn.addEventListener('click', () => {
387
+ const note = noteTextarea.value;
388
+ StorageManager.setNote(currentNoteEditPlatform, note);
389
+
390
+ // Update UI
391
+ const card = document.querySelector(`[data-platform="${currentNoteEditPlatform}"]`);
392
+ const noteBtn = card.querySelector('.note-btn');
393
+ const noteIndicator = card.querySelector('.note-indicator');
394
+
395
+ if (note.trim()) {
396
+ noteBtn.classList.add('has-note');
397
+ noteIndicator.style.display = 'inline-flex';
398
+ showNotification('Note saved!', 'success');
399
+ } else {
400
+ noteBtn.classList.remove('has-note');
401
+ noteIndicator.style.display = 'none';
402
+ showNotification('Note deleted', 'info');
403
+ }
404
+
405
+ noteModal.classList.remove('active');
406
+ document.body.style.overflow = '';
407
+ });
408
+
409
+ deleteNoteBtn.addEventListener('click', () => {
410
+ noteTextarea.value = '';
411
+ saveNoteBtn.click();
412
+ });
413
+
414
+ // ===== Card Click Analytics (Optional) =====
415
+ // Platform URLs mapping
416
+ const platformURLs = {
417
+ facebook: 'https://www.facebook.com',
418
+ instagram: 'https://www.instagram.com',
419
+ twitter: 'https://www.twitter.com',
420
+ linkedin: 'https://www.linkedin.com',
421
+ youtube: 'https://www.youtube.com',
422
+ tiktok: 'https://www.tiktok.com',
423
+ reddit: 'https://www.reddit.com',
424
+ whatsapp: 'https://web.whatsapp.com',
425
+ telegram: 'https://web.telegram.org',
426
+ discord: 'https://discord.com/app',
427
+ snapchat: 'https://www.snapchat.com',
428
+ pinterest: 'https://www.pinterest.com'
429
+ };
430
+
431
+ // Platform icons mapping
432
+ const platformIcons = {
433
+ facebook: 'fab fa-facebook-f',
434
+ instagram: 'fab fa-instagram',
435
+ twitter: 'fab fa-twitter',
436
+ linkedin: 'fab fa-linkedin-in',
437
+ youtube: 'fab fa-youtube',
438
+ tiktok: 'fab fa-tiktok',
439
+ reddit: 'fab fa-reddit-alien',
440
+ whatsapp: 'fab fa-whatsapp',
441
+ telegram: 'fab fa-telegram-plane',
442
+ discord: 'fab fa-discord',
443
+ snapchat: 'fab fa-snapchat-ghost',
444
+ pinterest: 'fab fa-pinterest-p'
445
+ };
446
+
447
+ // Modal elements
448
+ const modal = document.getElementById('platformModal');
449
+ const modalFrame = document.getElementById('platformFrame');
450
+ const loadingSpinner = document.querySelector('.loading-spinner');
451
+ const closeBtn = document.querySelector('.close-btn');
452
+ const platformIcon = document.querySelector('.platform-icon');
453
+ const platformTitle = document.querySelector('.platform-title');
454
+ const modalContent = document.querySelector('.modal-content');
455
+
456
+ // Auth section elements
457
+ const authSection = document.getElementById('authSection');
458
+ const platformSection = document.getElementById('platformSection');
459
+ const googleSignInBtn = document.getElementById('googleSignIn');
460
+ const platformSignInBtn = document.getElementById('platformSignIn');
461
+ const guestAccessBtn = document.getElementById('guestAccess');
462
+ const refreshBtn = document.querySelector('.refresh-btn');
463
+ const fullscreenBtn = document.querySelector('.fullscreen-btn');
464
+ const logoutBtn = document.querySelector('.logout-btn');
465
+ const platformIconLarge = document.querySelector('.platform-icon-large');
466
+ const platformIconSmall = document.querySelector('.platform-icon-small');
467
+ const platformNameText = document.querySelector('.platform-name-text');
468
+ const platformLoginText = document.querySelector('.platform-login-text');
469
+
470
+ socialCards.forEach(card => {
471
+ const launchBtn = card.querySelector('.launch-btn');
472
+
473
+ launchBtn.addEventListener('click', (e) => {
474
+ e.preventDefault();
475
+ const platform = card.getAttribute('data-platform');
476
+ const platformName = card.querySelector('.platform-name').textContent;
477
+ const url = platformURLs[platform];
478
+ const icon = platformIcons[platform];
479
+
480
+ console.log(`Opening ${platform} in modal`);
481
+
482
+ // Update analytics
483
+ StorageManager.updateAnalytics(platform);
484
+ StorageManager.addToRecent(platform, platformName, icon);
485
+ updateVisitBadge(card, platform);
486
+ updateAnalyticsDisplay();
487
+
488
+ // Open platform in modal
489
+ openPlatformModal(url, platformName, platform);
490
+
491
+ // Add a visual feedback
492
+ card.style.transform = 'scale(0.95)';
493
+ setTimeout(() => {
494
+ card.style.transform = '';
495
+ }, 200);
496
+ });
497
+ });
498
+
499
+ // Open platform in modal
500
+ function openPlatformModal(url, name, platform) {
501
+ currentPlatformURL = url;
502
+ currentPlatformName = name;
503
+ currentPlatform = platform;
504
+
505
+ // Set platform info in header
506
+ platformTitle.textContent = name;
507
+ platformIcon.className = 'platform-icon ' + platformIcons[platform];
508
+
509
+ // Set platform info in auth section
510
+ platformNameText.textContent = name;
511
+ platformIconLarge.className = 'platform-icon-large ' + platformIcons[platform];
512
+ platformIconSmall.className = 'platform-icon-small ' + platformIcons[platform];
513
+ platformLoginText.textContent = `Login with ${name} Account`;
514
+
515
+ // Show modal with auth section
516
+ modal.classList.add('active');
517
+ document.body.style.overflow = 'hidden';
518
+
519
+ // Show auth section, hide platform section
520
+ authSection.style.display = 'flex';
521
+ platformSection.style.display = 'none';
522
+ }
523
+
524
+ // Close modal
525
+ function closePlatformModal() {
526
+ modal.classList.remove('active');
527
+ document.body.style.overflow = '';
528
+ modalContent.classList.remove('fullscreen');
529
+
530
+ // Stop time tracking
531
+ stopTimeTracking();
532
+
533
+ // Clear iframe and reset to auth section
534
+ setTimeout(() => {
535
+ modalFrame.src = '';
536
+ authSection.style.display = 'flex';
537
+ platformSection.style.display = 'none';
538
+ loadingSpinner.classList.remove('hidden');
539
+ }, 300);
540
+ }
541
+
542
+ // Load platform with authentication
543
+ function loadPlatform(authMethod) {
544
+ console.log(`Loading ${currentPlatformName} with ${authMethod} authentication`);
545
+
546
+ // Hide auth section, show platform section
547
+ authSection.style.display = 'none';
548
+ platformSection.style.display = 'block';
549
+
550
+ // Show loading
551
+ loadingSpinner.classList.remove('hidden');
552
+
553
+ // Load iframe
554
+ modalFrame.src = currentPlatformURL;
555
+
556
+ // Hide loading when iframe loads (or after timeout)
557
+ modalFrame.onload = () => {
558
+ setTimeout(() => {
559
+ loadingSpinner.classList.add('hidden');
560
+ }, 500);
561
+ };
562
+
563
+ // Fallback timeout for platforms that block iframes
564
+ setTimeout(() => {
565
+ loadingSpinner.classList.add('hidden');
566
+ }, 3000);
567
+ }
568
+
569
+ // Google Sign-In
570
+ googleSignInBtn.addEventListener('click', () => {
571
+ console.log('Google Sign-In clicked');
572
+ showNotification('Google Sign-In feature coming soon! Opening platform directly...', 'info');
573
+
574
+ // Open platform in a large popup window
575
+ const width = 1200;
576
+ const height = 800;
577
+ const left = (screen.width - width) / 2;
578
+ const top = (screen.height - height) / 2;
579
+
580
+ setTimeout(() => {
581
+ window.open(
582
+ currentPlatformURL,
583
+ currentPlatformName,
584
+ `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no,scrollbars=yes,resizable=yes`
585
+ );
586
+
587
+ closePlatformModal();
588
+ }, 1000);
589
+ });
590
+
591
+ // Platform Sign-In
592
+ platformSignInBtn.addEventListener('click', () => {
593
+ console.log('Platform Sign-In clicked');
594
+ showNotification(`Opening ${currentPlatformName} in new window...`, 'success');
595
+
596
+ // Start time tracking
597
+ startTimeTracking(currentPlatform);
598
+
599
+ // Open platform in a large popup window
600
+ const width = 1200;
601
+ const height = 800;
602
+ const left = (screen.width - width) / 2;
603
+ const top = (screen.height - height) / 2;
604
+
605
+ window.open(
606
+ currentPlatformURL,
607
+ currentPlatformName,
608
+ `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no,scrollbars=yes,resizable=yes`
609
+ );
610
+
611
+ // Close the modal since platform opened in new window
612
+ setTimeout(() => {
613
+ closePlatformModal();
614
+ }, 500);
615
+ });
616
+
617
+ // Guest Access / Web Version
618
+ guestAccessBtn.addEventListener('click', () => {
619
+ console.log('Guest access clicked');
620
+ showNotification(`Opening ${currentPlatformName} web version...`, 'info');
621
+
622
+ // Open platform in a large popup window
623
+ const width = 1200;
624
+ const height = 800;
625
+ const left = (screen.width - width) / 2;
626
+ const top = (screen.height - height) / 2;
627
+
628
+ window.open(
629
+ currentPlatformURL,
630
+ currentPlatformName + '_Web',
631
+ `width=${width},height=${height},left=${left},top=${top},toolbar=yes,menubar=no,scrollbars=yes,resizable=yes,location=yes`
632
+ );
633
+
634
+ // Close the modal
635
+ setTimeout(() => {
636
+ closePlatformModal();
637
+ }, 500);
638
+ });
639
+
640
+ // Notification system
641
+ function showNotification(message, type = 'info') {
642
+ const notification = document.createElement('div');
643
+ notification.className = `notification notification-${type}`;
644
+ notification.innerHTML = `
645
+ <i class="fas fa-${type === 'success' ? 'check-circle' : type === 'warning' ? 'exclamation-triangle' : 'info-circle'}"></i>
646
+ <span>${message}</span>
647
+ `;
648
+
649
+ document.body.appendChild(notification);
650
+
651
+ // Animate in
652
+ setTimeout(() => notification.classList.add('show'), 10);
653
+
654
+ // Remove after 3 seconds
655
+ setTimeout(() => {
656
+ notification.classList.remove('show');
657
+ setTimeout(() => notification.remove(), 300);
658
+ }, 3000);
659
+ }
660
+
661
+ // Close button
662
+ closeBtn.addEventListener('click', closePlatformModal);
663
+
664
+ // Close on background click
665
+ modal.addEventListener('click', (e) => {
666
+ if (e.target === modal) {
667
+ closePlatformModal();
668
+ }
669
+ });
670
+
671
+ // Refresh button
672
+ refreshBtn.addEventListener('click', () => {
673
+ loadingSpinner.classList.remove('hidden');
674
+ modalFrame.src = modalFrame.src;
675
+
676
+ setTimeout(() => {
677
+ loadingSpinner.classList.add('hidden');
678
+ }, 2000);
679
+ });
680
+
681
+ // Fullscreen button
682
+ fullscreenBtn.addEventListener('click', () => {
683
+ modalContent.classList.toggle('fullscreen');
684
+ const icon = fullscreenBtn.querySelector('i');
685
+
686
+ if (modalContent.classList.contains('fullscreen')) {
687
+ icon.classList.remove('fa-expand');
688
+ icon.classList.add('fa-compress');
689
+ fullscreenBtn.title = 'Exit Fullscreen';
690
+ } else {
691
+ icon.classList.remove('fa-compress');
692
+ icon.classList.add('fa-expand');
693
+ fullscreenBtn.title = 'Fullscreen';
694
+ }
695
+ });
696
+
697
+ // Logout button - returns to auth screen
698
+ logoutBtn.addEventListener('click', () => {
699
+ showNotification('Logged out successfully', 'success');
700
+ authSection.style.display = 'flex';
701
+ platformSection.style.display = 'none';
702
+ modalFrame.src = '';
703
+ });
704
+
705
+ // Escape key to close modal
706
+ document.addEventListener('keydown', (e) => {
707
+ if (e.key === 'Escape' && modal.classList.contains('active')) {
708
+ closePlatformModal();
709
+ }
710
+ });
711
+
712
+ // ===== Card Hover Sound Effect (Optional) =====
713
+ socialCards.forEach(card => {
714
+ card.addEventListener('mouseenter', () => {
715
+ card.style.transition = 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)';
716
+ });
717
+ });
718
+
719
+ // ===== Smooth Scroll =====
720
+ document.querySelectorAll('a[href^="#"]').forEach(anchor => {
721
+ anchor.addEventListener('click', function (e) {
722
+ e.preventDefault();
723
+ const target = document.querySelector(this.getAttribute('href'));
724
+ if (target) {
725
+ target.scrollIntoView({
726
+ behavior: 'smooth',
727
+ block: 'start'
728
+ });
729
+ }
730
+ });
731
+ });
732
+
733
+ // ===== Dynamic Time-based Greeting (Optional Enhancement) =====
734
+ function updateGreeting() {
735
+ const hour = new Date().getHours();
736
+ const subtitle = document.querySelector('.subtitle');
737
+
738
+ if (hour >= 5 && hour < 12) {
739
+ subtitle.textContent = 'Good morning! Connect to your favorite platforms';
740
+ } else if (hour >= 12 && hour < 17) {
741
+ subtitle.textContent = 'Good afternoon! Connect to your favorite platforms';
742
+ } else if (hour >= 17 && hour < 21) {
743
+ subtitle.textContent = 'Good evening! Connect to your favorite platforms';
744
+ } else {
745
+ subtitle.textContent = 'Connect to your favorite platforms instantly';
746
+ }
747
+ }
748
+
749
+ // ===== Loading Animation =====
750
+ window.addEventListener('load', () => {
751
+ document.body.style.opacity = '0';
752
+ setTimeout(() => {
753
+ document.body.style.transition = 'opacity 0.5s ease';
754
+ document.body.style.opacity = '1';
755
+ }, 100);
756
+ });
757
+
758
+ // ===== Initialize Everything =====
759
+ initParticles();
760
+ animateParticles();
761
+ updateGreeting();
762
+ initializeFavorites();
763
+ initializeNotes();
764
+ initializeAnalytics();
765
+ initializeTheme();
766
+ initializeCustomPlatforms();
767
+ initializeStatusIndicators();
768
+ initializeKeyboardShortcuts();
769
+ initializeHeaderControls();
770
+
771
+ // ===== ANALYTICS FUNCTIONS =====
772
+ function initializeAnalytics() {
773
+ const analytics = StorageManager.getAnalytics();
774
+
775
+ socialCards.forEach(card => {
776
+ const platform = card.getAttribute('data-platform');
777
+ updateVisitBadge(card, platform);
778
+ });
779
+ }
780
+
781
+ function updateVisitBadge(card, platform) {
782
+ const analytics = StorageManager.getAnalytics();
783
+ const visitBadge = card.querySelector('.visit-badge');
784
+
785
+ if (analytics[platform] && analytics[platform].visits > 0) {
786
+ visitBadge.textContent = `${analytics[platform].visits} visits`;
787
+ visitBadge.style.display = 'inline-flex';
788
+ }
789
+ }
790
+
791
+ function updateAnalyticsDisplay() {
792
+ const analytics = StorageManager.getAnalytics();
793
+ const favorites = StorageManager.getFavorites();
794
+
795
+ let totalVisits = 0;
796
+ let totalTime = 0;
797
+ let mostUsedPlatform = '-';
798
+ let maxVisits = 0;
799
+
800
+ Object.keys(analytics).forEach(platform => {
801
+ totalVisits += analytics[platform].visits || 0;
802
+ totalTime += analytics[platform].time || 0;
803
+
804
+ if (analytics[platform].visits > maxVisits) {
805
+ maxVisits = analytics[platform].visits;
806
+ mostUsedPlatform = platform;
807
+ }
808
+ });
809
+
810
+ document.getElementById('totalVisits').textContent = totalVisits;
811
+ document.getElementById('totalFavorites').textContent = favorites.length;
812
+
813
+ const hours = Math.floor(totalTime / 3600);
814
+ const minutes = Math.floor((totalTime % 3600) / 60);
815
+ document.getElementById('totalTime').textContent = `${hours}h ${minutes}m`;
816
+
817
+ if (mostUsedPlatform !== '-') {
818
+ const card = document.querySelector(`[data-platform="${mostUsedPlatform}"]`);
819
+ if (card) {
820
+ mostUsedPlatform = card.querySelector('.platform-name').textContent;
821
+ }
822
+ }
823
+ document.getElementById('mostUsed').textContent = mostUsedPlatform;
824
+
825
+ updateUsageChart(analytics);
826
+ }
827
+
828
+ function updateUsageChart(analytics) {
829
+ const chartContainer = document.getElementById('usageChart');
830
+ chartContainer.innerHTML = '';
831
+
832
+ const sorted = Object.entries(analytics)
833
+ .sort((a, b) => b[1].visits - a[1].visits)
834
+ .slice(0, 10);
835
+
836
+ if (sorted.length === 0) {
837
+ chartContainer.innerHTML = '<p style="color: var(--text-secondary); text-align: center;">No usage data yet</p>';
838
+ return;
839
+ }
840
+
841
+ const maxVisits = sorted[0][1].visits;
842
+
843
+ sorted.forEach(([platform, data]) => {
844
+ const card = document.querySelector(`[data-platform="${platform}"]`);
845
+ const name = card ? card.querySelector('.platform-name').textContent : platform;
846
+ const percentage = (data.visits / maxVisits) * 100;
847
+
848
+ const barHTML = `
849
+ <div class="chart-bar">
850
+ <div class="chart-label">${name}</div>
851
+ <div class="chart-bar-container">
852
+ <div class="chart-bar-fill" style="width: ${percentage}%">
853
+ ${data.visits}
854
+ </div>
855
+ </div>
856
+ </div>
857
+ `;
858
+ chartContainer.innerHTML += barHTML;
859
+ });
860
+ }
861
+
862
+ // ===== THEME TOGGLE =====
863
+ function initializeTheme() {
864
+ const theme = StorageManager.getTheme();
865
+ applyTheme(theme);
866
+ }
867
+
868
+ function applyTheme(theme) {
869
+ const themeToggle = document.getElementById('themeToggle');
870
+ const icon = themeToggle.querySelector('i');
871
+
872
+ if (theme === 'light') {
873
+ document.body.classList.add('light-mode');
874
+ icon.classList.remove('fa-moon');
875
+ icon.classList.add('fa-sun');
876
+ } else {
877
+ document.body.classList.remove('light-mode');
878
+ icon.classList.remove('fa-sun');
879
+ icon.classList.add('fa-moon');
880
+ }
881
+ }
882
+
883
+ // ===== RECENT ACTIVITY TIMELINE =====
884
+ function updateRecentTimeline() {
885
+ const recent = StorageManager.getRecentActivity();
886
+ const timelineItems = document.getElementById('timelineItems');
887
+
888
+ if (recent.length === 0) {
889
+ timelineItems.innerHTML = '<p style="color: var(--text-secondary); text-align: center;">No recent activity</p>';
890
+ return;
891
+ }
892
+
893
+ timelineItems.innerHTML = '';
894
+
895
+ recent.forEach(item => {
896
+ const timeAgo = getTimeAgo(new Date(item.timestamp));
897
+ const itemHTML = `
898
+ <div class="timeline-item" data-platform="${item.platform}">
899
+ <i class="${item.icon}"></i>
900
+ <div class="timeline-info">
901
+ <h4>${item.name}</h4>
902
+ <span>${timeAgo}</span>
903
+ </div>
904
+ </div>
905
+ `;
906
+ timelineItems.innerHTML += itemHTML;
907
+ });
908
+
909
+ // Add click handlers
910
+ timelineItems.querySelectorAll('.timeline-item').forEach(item => {
911
+ item.addEventListener('click', () => {
912
+ const platform = item.getAttribute('data-platform');
913
+ const card = document.querySelector(`[data-platform="${platform}"]`);
914
+ if (card) {
915
+ card.querySelector('.launch-btn').click();
916
+ }
917
+ });
918
+ });
919
+ }
920
+
921
+ function getTimeAgo(date) {
922
+ const seconds = Math.floor((new Date() - date) / 1000);
923
+
924
+ if (seconds < 60) return 'Just now';
925
+ if (seconds < 3600) return `${Math.floor(seconds / 60)} minutes ago`;
926
+ if (seconds < 86400) return `${Math.floor(seconds / 3600)} hours ago`;
927
+ return `${Math.floor(seconds / 86400)} days ago`;
928
+ }
929
+
930
+ // ===== CUSTOM PLATFORMS =====
931
+ function initializeCustomPlatforms() {
932
+ const customPlatforms = StorageManager.getCustomPlatforms();
933
+ const socialGrid = document.getElementById('socialGrid');
934
+
935
+ customPlatforms.forEach(platform => {
936
+ addCustomPlatformCard(platform, socialGrid);
937
+ });
938
+ }
939
+
940
+ function addCustomPlatformCard(platform, container) {
941
+ const cardHTML = `
942
+ <div class="social-card" data-platform="${platform.id}" data-category="${platform.category}" data-custom="true">
943
+ <div class="card-inner">
944
+ <div class="card-front" style="background: ${platform.color};">
945
+ <div class="card-top-controls">
946
+ <button class="favorite-btn" title="Add to Favorites">
947
+ <i class="far fa-star"></i>
948
+ </button>
949
+ <button class="note-btn" title="Add Note">
950
+ <i class="far fa-sticky-note"></i>
951
+ </button>
952
+ <button class="delete-custom-btn" title="Delete Platform" style="background: rgba(255, 71, 87, 0.8);">
953
+ <i class="fas fa-trash"></i>
954
+ </button>
955
+ <div class="status-indicator" title="Status: Online"></div>
956
+ </div>
957
+ <div class="platform-logo">
958
+ <i class="${platform.icon}"></i>
959
+ </div>
960
+ <h3 class="platform-name">${platform.name}</h3>
961
+ <div class="platform-badges">
962
+ <span class="visit-badge" style="display: none;">0 visits</span>
963
+ <span class="note-indicator" style="display: none;"><i class="fas fa-sticky-note"></i></span>
964
+ </div>
965
+ <p class="platform-desc">Custom platform</p>
966
+ <div class="card-stats">
967
+ <span><i class="fas fa-globe"></i> Custom</span>
968
+ </div>
969
+ </div>
970
+ </div>
971
+ <a href="${platform.url}" target="_blank" class="launch-btn" data-url="${platform.url}">
972
+ <i class="fas fa-external-link-alt"></i> Launch
973
+ </a>
974
+ </div>
975
+ `;
976
+
977
+ container.innerHTML += cardHTML;
978
+
979
+ // Re-initialize features for new card
980
+ const newCard = container.lastElementChild;
981
+ initializeCardFeatures(newCard, platform.id);
982
+ }
983
+
984
+ function initializeCardFeatures(card, platform) {
985
+ // Favorite button
986
+ const favBtn = card.querySelector('.favorite-btn');
987
+ const favorites = StorageManager.getFavorites();
988
+ if (favorites.includes(platform)) {
989
+ favBtn.classList.add('active');
990
+ favBtn.querySelector('i').classList.remove('far');
991
+ favBtn.querySelector('i').classList.add('fas');
992
+ }
993
+ favBtn.addEventListener('click', (e) => {
994
+ e.stopPropagation();
995
+ e.preventDefault();
996
+ toggleFavorite(platform, favBtn);
997
+ });
998
+
999
+ // Note button
1000
+ const noteBtn = card.querySelector('.note-btn');
1001
+ const notes = StorageManager.getNotes();
1002
+ if (notes[platform]) {
1003
+ noteBtn.classList.add('has-note');
1004
+ card.querySelector('.note-indicator').style.display = 'inline-flex';
1005
+ }
1006
+ noteBtn.addEventListener('click', (e) => {
1007
+ e.stopPropagation();
1008
+ e.preventDefault();
1009
+ openNoteModal(platform, card.querySelector('.platform-name').textContent);
1010
+ });
1011
+
1012
+ // Delete custom platform button
1013
+ const deleteBtn = card.querySelector('.delete-custom-btn');
1014
+ if (deleteBtn) {
1015
+ deleteBtn.addEventListener('click', (e) => {
1016
+ e.stopPropagation();
1017
+ e.preventDefault();
1018
+ if (confirm('Delete this custom platform?')) {
1019
+ StorageManager.removeCustomPlatform(platform);
1020
+ card.remove();
1021
+ showNotification('Platform deleted', 'success');
1022
+ }
1023
+ });
1024
+ }
1025
+
1026
+ // Launch button
1027
+ const launchBtn = card.querySelector('.launch-btn');
1028
+ launchBtn.addEventListener('click', (e) => {
1029
+ e.preventDefault();
1030
+ const platformName = card.querySelector('.platform-name').textContent;
1031
+ const url = launchBtn.getAttribute('data-url');
1032
+ const icon = card.querySelector('.platform-logo i').className;
1033
+
1034
+ StorageManager.updateAnalytics(platform);
1035
+ StorageManager.addToRecent(platform, platformName, icon);
1036
+ updateVisitBadge(card, platform);
1037
+ updateAnalyticsDisplay();
1038
+
1039
+ openPlatformModal(url, platformName, platform);
1040
+
1041
+ card.style.transform = 'scale(0.95)';
1042
+ setTimeout(() => {
1043
+ card.style.transform = '';
1044
+ }, 200);
1045
+ });
1046
+ }
1047
+
1048
+ // ===== STATUS INDICATORS =====
1049
+ function initializeStatusIndicators() {
1050
+ // Simulated status check - in real app, you'd ping the services
1051
+ // For now, all are marked as online
1052
+ document.querySelectorAll('.status-indicator').forEach(indicator => {
1053
+ indicator.classList.remove('offline');
1054
+ });
1055
+ }
1056
+
1057
+ // ===== KEYBOARD SHORTCUTS =====
1058
+ function initializeKeyboardShortcuts() {
1059
+ document.addEventListener('keydown', (e) => {
1060
+ // Don't trigger if typing in input
1061
+ if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') {
1062
+ return;
1063
+ }
1064
+
1065
+ // ? - Show shortcuts
1066
+ if (e.key === '?') {
1067
+ e.preventDefault();
1068
+ document.getElementById('shortcutsModal').classList.add('active');
1069
+ }
1070
+
1071
+ // Ctrl+K - Analytics
1072
+ if (e.ctrlKey && e.key === 'k') {
1073
+ e.preventDefault();
1074
+ document.getElementById('analyticsModal').classList.add('active');
1075
+ updateAnalyticsDisplay();
1076
+ }
1077
+
1078
+ // Ctrl+D - Theme toggle
1079
+ if (e.ctrlKey && e.key === 'd') {
1080
+ e.preventDefault();
1081
+ document.getElementById('themeToggle').click();
1082
+ }
1083
+
1084
+ // Ctrl+I - AI Caption Generator
1085
+ if (e.ctrlKey && e.key === 'i') {
1086
+ e.preventDefault();
1087
+ document.getElementById('aiCaptionBtn').click();
1088
+ }
1089
+
1090
+ // 1-9 - Quick launch
1091
+ if (e.key >= '1' && e.key <= '9') {
1092
+ const index = parseInt(e.key) - 1;
1093
+ const visibleCards = Array.from(socialCards).filter(card => !card.classList.contains('hidden'));
1094
+ if (visibleCards[index]) {
1095
+ visibleCards[index].querySelector('.launch-btn').click();
1096
+ }
1097
+ }
1098
+ });
1099
+ }
1100
+
1101
+ // ===== HEADER CONTROLS =====
1102
+ function initializeHeaderControls() {
1103
+ // Theme toggle
1104
+ document.getElementById('themeToggle').addEventListener('click', () => {
1105
+ const currentTheme = StorageManager.getTheme();
1106
+ const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
1107
+ StorageManager.setTheme(newTheme);
1108
+ applyTheme(newTheme);
1109
+ showNotification(`Switched to ${newTheme} mode`, 'success');
1110
+ });
1111
+
1112
+ // AI Caption Generator button (already initialized above)
1113
+ // document.getElementById('aiCaptionBtn') - handled in AI section
1114
+
1115
+ // Shortcuts button
1116
+ document.getElementById('shortcutsBtn').addEventListener('click', () => {
1117
+ document.getElementById('shortcutsModal').classList.add('active');
1118
+ });
1119
+
1120
+ // Analytics button
1121
+ document.getElementById('analyticsBtn').addEventListener('click', () => {
1122
+ document.getElementById('analyticsModal').classList.add('active');
1123
+ updateAnalyticsDisplay();
1124
+ });
1125
+
1126
+ // Add platform button
1127
+ document.getElementById('addPlatformBtn').addEventListener('click', () => {
1128
+ document.getElementById('addPlatformModal').classList.add('active');
1129
+ });
1130
+ }
1131
+
1132
+ // ===== ADD CUSTOM PLATFORM FORM =====
1133
+ document.getElementById('addPlatformForm').addEventListener('submit', (e) => {
1134
+ e.preventDefault();
1135
+
1136
+ const platform = {
1137
+ id: 'custom_' + Date.now(),
1138
+ name: document.getElementById('customPlatformName').value,
1139
+ url: document.getElementById('customPlatformURL').value,
1140
+ icon: document.getElementById('customPlatformIcon').value,
1141
+ color: document.getElementById('customPlatformColor').value,
1142
+ category: document.getElementById('customPlatformCategory').value
1143
+ };
1144
+
1145
+ StorageManager.addCustomPlatform(platform);
1146
+ addCustomPlatformCard(platform, document.getElementById('socialGrid'));
1147
+
1148
+ document.getElementById('addPlatformModal').classList.remove('active');
1149
+ document.getElementById('addPlatformForm').reset();
1150
+ showNotification('Custom platform added!', 'success');
1151
+ });
1152
+
1153
+ // ===== TIME TRACKING =====
1154
+ function startTimeTracking(platform) {
1155
+ startTime = Date.now();
1156
+ const tracker = document.getElementById('timeTracker');
1157
+ tracker.style.display = 'flex';
1158
+
1159
+ timeTrackingInterval = setInterval(() => {
1160
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
1161
+ const minutes = Math.floor(elapsed / 60);
1162
+ const seconds = elapsed % 60;
1163
+ document.getElementById('trackerTime').textContent =
1164
+ `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
1165
+ }, 1000);
1166
+ }
1167
+
1168
+ function stopTimeTracking() {
1169
+ if (timeTrackingInterval) {
1170
+ clearInterval(timeTrackingInterval);
1171
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
1172
+ StorageManager.updateTimeSpent(currentPlatform, elapsed);
1173
+ document.getElementById('timeTracker').style.display = 'none';
1174
+ updateAnalyticsDisplay();
1175
+ }
1176
+ }
1177
+
1178
+ document.getElementById('stopTracking').addEventListener('click', stopTimeTracking);
1179
+
1180
+ // ===== AI CAPTION GENERATOR =====
1181
+ // Groq API Configuration (from your original code)
1182
+ const GROQ_API_KEY = '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';
1183
+ const GROQ_API_URL = 'https://api.groq.com/openai/v1/chat/completions';
1184
+ const HF_IMAGE_API = 'https://api-inference.huggingface.co/models/Salesforce/blip-image-captioning-base';
1185
+ const HF_API_TOKEN = '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';
1186
+
1187
+ // AI Caption Button
1188
+ document.getElementById('aiCaptionBtn').addEventListener('click', () => {
1189
+ document.getElementById('aiCaptionModal').classList.add('active');
1190
+ document.body.style.overflow = 'hidden';
1191
+ });
1192
+
1193
+ // Image Upload Handler
1194
+ const imageInput = document.getElementById('imageInput');
1195
+ const uploadArea = document.getElementById('uploadArea');
1196
+ const uploadSection = document.getElementById('uploadSection');
1197
+ const resultsSection = document.getElementById('resultsSection');
1198
+ const imagePreview = document.getElementById('imagePreview');
1199
+
1200
+ imageInput.addEventListener('change', handleImageUpload);
1201
+
1202
+ // Drag and drop
1203
+ uploadArea.addEventListener('dragover', (e) => {
1204
+ e.preventDefault();
1205
+ uploadArea.style.borderColor = 'var(--accent-color)';
1206
+ uploadArea.style.background = 'rgba(0, 212, 255, 0.15)';
1207
+ });
1208
+
1209
+ uploadArea.addEventListener('dragleave', () => {
1210
+ uploadArea.style.borderColor = 'rgba(0, 212, 255, 0.3)';
1211
+ uploadArea.style.background = 'rgba(0, 212, 255, 0.05)';
1212
+ });
1213
+
1214
+ uploadArea.addEventListener('drop', (e) => {
1215
+ e.preventDefault();
1216
+ uploadArea.style.borderColor = 'rgba(0, 212, 255, 0.3)';
1217
+ uploadArea.style.background = 'rgba(0, 212, 255, 0.05)';
1218
+
1219
+ const files = e.dataTransfer.files;
1220
+ if (files.length > 0 && files[0].type.startsWith('image/')) {
1221
+ imageInput.files = files;
1222
+ handleImageUpload();
1223
+ }
1224
+ });
1225
+
1226
+ async function handleImageUpload() {
1227
+ const file = imageInput.files[0];
1228
+ if (!file) return;
1229
+
1230
+ // Show preview
1231
+ const reader = new FileReader();
1232
+ reader.onload = (e) => {
1233
+ imagePreview.src = e.target.result;
1234
+ currentImageData = e.target.result;
1235
+ };
1236
+ reader.readAsDataURL(file);
1237
+
1238
+ // Switch to results view
1239
+ uploadSection.style.display = 'none';
1240
+ resultsSection.style.display = 'grid';
1241
+
1242
+ // Reset loading states
1243
+ showLoadingState();
1244
+
1245
+ // Generate AI content
1246
+ await generateAIContent(file);
1247
+ }
1248
+
1249
+ function showLoadingState() {
1250
+ document.getElementById('aiDescription').innerHTML = '<div class="loading-dots"><span></span><span></span><span></span></div>';
1251
+ document.getElementById('aiCaptions').innerHTML = '<div class="loading-dots"><span></span><span></span><span></span></div>';
1252
+ document.getElementById('aiHashtags').innerHTML = '<div class="loading-dots"><span></span><span></span><span></span></div>';
1253
+ }
1254
+
1255
+ async function generateAIContent(imageFile) {
1256
+ try {
1257
+ console.log('=== Starting AI Generation ===');
1258
+ console.log('Image file:', imageFile.name, imageFile.type, imageFile.size, 'bytes');
1259
+
1260
+ // Step 1: Get image description using BLIP
1261
+ showNotification('Analyzing image with AI...', 'info');
1262
+ const description = await getImageDescription(imageFile);
1263
+ currentDescription = description;
1264
+
1265
+ console.log('✓ Image description:', description);
1266
+ document.getElementById('aiDescription').innerHTML = `<p>${description}</p>`;
1267
+
1268
+ // Step 2: Generate captions
1269
+ showNotification('Generating creative captions...', 'info');
1270
+ const captions = await generateCaptions(description);
1271
+ currentCaptions = captions;
1272
+
1273
+ console.log('✓ Captions generated:', captions);
1274
+ document.getElementById('aiCaptions').innerHTML = formatCaptions(captions);
1275
+
1276
+ // Step 3: Generate hashtags
1277
+ showNotification('Creating hashtags...', 'info');
1278
+ const hashtags = await generateHashtags(description);
1279
+ currentHashtags = hashtags;
1280
+
1281
+ console.log('✓ Hashtags created:', hashtags);
1282
+ document.getElementById('aiHashtags').innerHTML = `<p>${hashtags}</p>`;
1283
+
1284
+ console.log('=== AI Generation Complete ===');
1285
+ showNotification('AI generation complete! ✨', 'success');
1286
+ } catch (error) {
1287
+ console.error('=== AI Generation Error ===');
1288
+ console.error('Error:', error);
1289
+ showNotification('AI generation failed. Using fallback content...', 'warning');
1290
+ useFallbackGeneration();
1291
+ }
1292
+ }
1293
+
1294
+ async function getImageDescription(imageFile) {
1295
+ try {
1296
+ // Convert image to base64 for API
1297
+ const imageData = await imageFile.arrayBuffer();
1298
+ const blob = new Blob([imageData]);
1299
+
1300
+ const response = await fetch(HF_IMAGE_API, {
1301
+ method: 'POST',
1302
+ headers: {
1303
+ 'Authorization': `Bearer ${HF_API_TOKEN}`,
1304
+ },
1305
+ body: blob
1306
+ });
1307
+
1308
+ if (!response.ok) {
1309
+ const errorText = await response.text();
1310
+ console.error('HF API Error:', errorText);
1311
+
1312
+ // If model is loading, wait and retry
1313
+ if (response.status === 503) {
1314
+ showNotification('AI model is loading, retrying in 3 seconds...', 'info');
1315
+ await new Promise(resolve => setTimeout(resolve, 3000));
1316
+ return getImageDescription(imageFile); // Retry
1317
+ }
1318
+
1319
+ throw new Error('Image API request failed');
1320
+ }
1321
+
1322
+ const result = await response.json();
1323
+ console.log('Image description result:', result);
1324
+
1325
+ // Extract description from response
1326
+ const description = result[0]?.generated_text || result?.generated_text || 'an interesting image';
1327
+ return description.trim();
1328
+ } catch (error) {
1329
+ console.error('Image description error:', error);
1330
+ showNotification('Using basic image analysis...', 'warning');
1331
+ return 'a photo with interesting elements';
1332
+ }
1333
+ }
1334
+
1335
+ async function generateCaptions(description) {
1336
+ const prompt = `Generate exactly 3 unique, creative, and engaging social media captions for a photo that shows: "${description}". Make them catchy and suitable for Instagram, Facebook, or Twitter. Format as:
1337
+ 1. [first caption]
1338
+ 2. [second caption]
1339
+ 3. [third caption]
1340
+
1341
+ Only provide the numbered captions, nothing else.`;
1342
+
1343
+ try {
1344
+ console.log('Generating captions for:', description);
1345
+
1346
+ const response = await fetch(GROQ_API_URL, {
1347
+ method: 'POST',
1348
+ headers: {
1349
+ 'Authorization': `Bearer ${GROQ_API_KEY}`,
1350
+ 'Content-Type': 'application/json'
1351
+ },
1352
+ body: JSON.stringify({
1353
+ model: 'llama-3.1-8b-instant',
1354
+ messages: [
1355
+ {
1356
+ role: 'system',
1357
+ content: 'You are a creative social media caption writer. Generate engaging, concise captions.'
1358
+ },
1359
+ {
1360
+ role: 'user',
1361
+ content: prompt
1362
+ }
1363
+ ],
1364
+ max_tokens: 200,
1365
+ temperature: 0.8
1366
+ })
1367
+ });
1368
+
1369
+ if (!response.ok) {
1370
+ const errorText = await response.text();
1371
+ console.error('Groq API Error:', errorText);
1372
+ throw new Error('Caption API request failed');
1373
+ }
1374
+
1375
+ const result = await response.json();
1376
+ console.log('Caption result:', result);
1377
+
1378
+ const generatedText = result.choices[0]?.message?.content || '';
1379
+ return generatedText.trim() || getFallbackCaptions(description);
1380
+ } catch (error) {
1381
+ console.error('Caption generation error:', error);
1382
+ showNotification('Using fallback captions...', 'warning');
1383
+ return getFallbackCaptions(description);
1384
+ }
1385
+ }
1386
+
1387
+ async function generateHashtags(description) {
1388
+ const prompt = `Generate exactly 10 relevant and trending hashtags for a photo that shows: "${description}". Only provide the hashtags with # symbol, separated by spaces. No explanations.`;
1389
+
1390
+ try {
1391
+ console.log('Generating hashtags for:', description);
1392
+
1393
+ const response = await fetch(GROQ_API_URL, {
1394
+ method: 'POST',
1395
+ headers: {
1396
+ 'Authorization': `Bearer ${GROQ_API_KEY}`,
1397
+ 'Content-Type': 'application/json'
1398
+ },
1399
+ body: JSON.stringify({
1400
+ model: 'llama-3.1-8b-instant',
1401
+ messages: [
1402
+ {
1403
+ role: 'system',
1404
+ content: 'You are a social media expert. Generate relevant hashtags based on image descriptions.'
1405
+ },
1406
+ {
1407
+ role: 'user',
1408
+ content: prompt
1409
+ }
1410
+ ],
1411
+ max_tokens: 100,
1412
+ temperature: 0.7
1413
+ })
1414
+ });
1415
+
1416
+ if (!response.ok) {
1417
+ const errorText = await response.text();
1418
+ console.error('Hashtag API Error:', errorText);
1419
+ throw new Error('Hashtag API request failed');
1420
+ }
1421
+
1422
+ const result = await response.json();
1423
+ console.log('Hashtag result:', result);
1424
+
1425
+ let hashtags = result.choices[0]?.message?.content || '';
1426
+
1427
+ // Clean up hashtags - ensure they have # and are properly formatted
1428
+ hashtags = hashtags.split(/\s+/)
1429
+ .map(tag => tag.trim())
1430
+ .filter(tag => tag.length > 0)
1431
+ .map(tag => tag.startsWith('#') ? tag : '#' + tag)
1432
+ .slice(0, 10)
1433
+ .join(' ');
1434
+
1435
+ return hashtags || getFallbackHashtags(description);
1436
+ } catch (error) {
1437
+ console.error('Hashtag generation error:', error);
1438
+ return getFallbackHashtags(description);
1439
+ }
1440
+ }
1441
+
1442
+ function getFallbackHashtags(description) {
1443
+ // Extract keywords from description and create hashtags
1444
+ const words = description.split(' ')
1445
+ .filter(w => w.length > 3)
1446
+ .map(w => w.replace(/[^a-zA-Z]/g, ''))
1447
+ .filter(w => w.length > 0);
1448
+
1449
+ const baseHashtags = words.slice(0, 5).map(w => '#' + w.toLowerCase());
1450
+
1451
+ const genericHashtags = [
1452
+ '#photography', '#photooftheday', '#instagood',
1453
+ '#beautiful', '#instadaily', '#picoftheday',
1454
+ '#instagram', '#love', '#amazing', '#art'
1455
+ ];
1456
+
1457
+ const allHashtags = [...new Set([...baseHashtags, ...genericHashtags])].slice(0, 10);
1458
+ return allHashtags.join(' ');
1459
+ }
1460
+
1461
+ function getFallbackCaptions(description) {
1462
+ // Create captions based on the actual description
1463
+ const mainSubject = description.split(' ').slice(0, 3).join(' ');
1464
+
1465
+ return `1. Capturing the beauty of ${description} 📸✨
1466
+
1467
+ 2. ${description.charAt(0).toUpperCase() + description.slice(1)} - moments like these make life special 🌟
1468
+
1469
+ 3. Just ${mainSubject}... living my best life! 💫 #blessed`;
1470
+ }
1471
+
1472
+ function formatCaptions(captions) {
1473
+ // Split captions by numbers or newlines
1474
+ const captionArray = captions.split(/\d+\./).filter(c => c.trim());
1475
+
1476
+ let html = '';
1477
+ captionArray.forEach((caption, index) => {
1478
+ if (caption.trim()) {
1479
+ html += `<p><strong>Caption ${index + 1}:</strong> ${caption.trim()}</p>`;
1480
+ }
1481
+ });
1482
+
1483
+ return html || `<p>${captions}</p>`;
1484
+ }
1485
+
1486
+ function useFallbackGeneration() {
1487
+ currentDescription = 'a wonderful moment captured in time';
1488
+ currentCaptions = getFallbackCaptions(currentDescription);
1489
+ currentHashtags = '#photography #photooftheday #instagood #beautiful #instadaily #picoftheday #instagram #love #amazing #art';
1490
+
1491
+ document.getElementById('aiDescription').innerHTML = `<p>${currentDescription}</p>`;
1492
+ document.getElementById('aiCaptions').innerHTML = formatCaptions(currentCaptions);
1493
+ document.getElementById('aiHashtags').innerHTML = `<p>${currentHashtags}</p>`;
1494
+ }
1495
+
1496
+ // Copy functionality
1497
+ document.getElementById('copyCaptionBtn').addEventListener('click', () => {
1498
+ copyToClipboard(currentCaptions, 'Caption copied!');
1499
+ });
1500
+
1501
+ document.getElementById('copyHashtagsBtn').addEventListener('click', () => {
1502
+ copyToClipboard(currentHashtags, 'Hashtags copied!');
1503
+ });
1504
+
1505
+ document.getElementById('copyAllBtn').addEventListener('click', () => {
1506
+ const allText = `${currentCaptions}\n\n${currentHashtags}`;
1507
+ copyToClipboard(allText, 'All content copied!');
1508
+ });
1509
+
1510
+ function copyToClipboard(text, message) {
1511
+ navigator.clipboard.writeText(text).then(() => {
1512
+ showNotification(message, 'success');
1513
+ }).catch(() => {
1514
+ showNotification('Copy failed', 'warning');
1515
+ });
1516
+ }
1517
+
1518
+ // Post to platform
1519
+ document.querySelectorAll('.platform-post-btn').forEach(btn => {
1520
+ btn.addEventListener('click', () => {
1521
+ const platform = btn.getAttribute('data-platform');
1522
+ postToPlatform(platform);
1523
+ });
1524
+ });
1525
+
1526
+ function postToPlatform(platform) {
1527
+ // Copy caption and hashtags to clipboard first
1528
+ const fullContent = `${currentCaptions.split('\n')[0]}\n\n${currentHashtags}`;
1529
+ copyToClipboard(fullContent, `Content copied! Opening ${platform}...`);
1530
+
1531
+ // Open platform in popup
1532
+ const platformURL = platformURLs[platform];
1533
+ if (platformURL) {
1534
+ setTimeout(() => {
1535
+ const width = 1200;
1536
+ const height = 800;
1537
+ const left = (screen.width - width) / 2;
1538
+ const top = (screen.height - height) / 2;
1539
+
1540
+ window.open(
1541
+ platformURL,
1542
+ platform,
1543
+ `width=${width},height=${height},left=${left},top=${top},toolbar=yes,menubar=no,scrollbars=yes,resizable=yes`
1544
+ );
1545
+
1546
+ showNotification(`Paste your caption and upload the image on ${platform}!`, 'info');
1547
+ }, 500);
1548
+ }
1549
+ }
1550
+
1551
+ // ===== Performance Optimization =====
1552
+ // Throttle scroll events
1553
+ let ticking = false;
1554
+ window.addEventListener('scroll', () => {
1555
+ if (!ticking) {
1556
+ window.requestAnimationFrame(() => {
1557
+ // Add scroll-based animations here if needed
1558
+ ticking = false;
1559
+ });
1560
+ ticking = true;
1561
+ }
1562
+ });
1563
+
1564
+ // ===== Keyboard Navigation =====
1565
+ document.addEventListener('keydown', (e) => {
1566
+ // Don't trigger shortcuts if modal is open (except Escape)
1567
+ if (modal.classList.contains('active') && e.key !== 'Escape') {
1568
+ return;
1569
+ }
1570
+
1571
+ if (e.key === '/') {
1572
+ e.preventDefault();
1573
+ searchInput.focus();
1574
+ }
1575
+ if (e.key === 'Escape') {
1576
+ if (modal.classList.contains('active')) {
1577
+ closePlatformModal();
1578
+ } else {
1579
+ searchInput.blur();
1580
+ searchInput.value = '';
1581
+ searchInput.dispatchEvent(new Event('input'));
1582
+ }
1583
+ }
1584
+ });
1585
+
1586
+ // ===== Show keyboard shortcut hint =====
1587
+ const searchContainer = document.querySelector('.search-container');
1588
+ const hintElement = document.createElement('div');
1589
+ hintElement.style.cssText = `
1590
+ position: absolute;
1591
+ right: 4rem;
1592
+ top: 50%;
1593
+ transform: translateY(-50%);
1594
+ font-size: 0.8rem;
1595
+ color: var(--text-secondary);
1596
+ opacity: 0.6;
1597
+ pointer-events: none;
1598
+ `;
1599
+ hintElement.innerHTML = '<kbd style="background: rgba(0,212,255,0.1); padding: 2px 6px; border-radius: 3px; font-size: 0.7rem;">/ to search</kbd>';
1600
+ searchContainer.appendChild(hintElement);
1601
+
1602
+ searchInput.addEventListener('focus', () => {
1603
+ hintElement.style.opacity = '0';
1604
+ });
1605
+
1606
+ searchInput.addEventListener('blur', () => {
1607
+ if (!searchInput.value) {
1608
+ hintElement.style.opacity = '0.6';
1609
+ }
1610
+ });
1611
+
1612
+ // ===== Add ripple effect on card click =====
1613
+ socialCards.forEach(card => {
1614
+ card.addEventListener('click', function(e) {
1615
+ const ripple = document.createElement('div');
1616
+ const rect = this.getBoundingClientRect();
1617
+ const size = Math.max(rect.width, rect.height);
1618
+ const x = e.clientX - rect.left - size / 2;
1619
+ const y = e.clientY - rect.top - size / 2;
1620
+
1621
+ ripple.style.cssText = `
1622
+ position: absolute;
1623
+ width: ${size}px;
1624
+ height: ${size}px;
1625
+ border-radius: 50%;
1626
+ background: rgba(255, 255, 255, 0.3);
1627
+ left: ${x}px;
1628
+ top: ${y}px;
1629
+ pointer-events: none;
1630
+ animation: rippleEffect 0.6s ease-out;
1631
+ `;
1632
+
1633
+ this.style.position = 'relative';
1634
+ this.style.overflow = 'hidden';
1635
+ this.appendChild(ripple);
1636
+
1637
+ setTimeout(() => ripple.remove(), 600);
1638
+ });
1639
+ });
1640
+
1641
+ // Add ripple animation to stylesheet dynamically
1642
+ const style = document.createElement('style');
1643
+ style.textContent = `
1644
+ @keyframes rippleEffect {
1645
+ 0% {
1646
+ transform: scale(0);
1647
+ opacity: 1;
1648
+ }
1649
+ 100% {
1650
+ transform: scale(2);
1651
+ opacity: 0;
1652
+ }
1653
+ }
1654
+
1655
+ kbd {
1656
+ font-family: 'Courier New', monospace;
1657
+ }
1658
+ `;
1659
+ document.head.appendChild(style);
1660
+
1661
+ console.log('%c🚀 Social Hub Loaded Successfully!', 'color: #00d4ff; font-size: 20px; font-weight: bold;');
1662
+ console.log('%cPress "/" to search platforms', 'color: #00ff88; font-size: 14px;');
1663
+ console.log('%cPress "Ctrl+I" to open AI Caption Generator', 'color: #00ff88; font-size: 14px;');
1664
+ console.log('%c🤖 AI Features: Real-time image analysis with Groq + Hugging Face', 'color: #ffa502; font-size: 12px;');
styles.css ADDED
@@ -0,0 +1,1873 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ===== CSS Variables ===== */
2
+ :root {
3
+ --primary-bg: #0a0e27;
4
+ --secondary-bg: #151a35;
5
+ --accent-color: #00d4ff;
6
+ --text-primary: #ffffff;
7
+ --text-secondary: #a8b2d1;
8
+ --card-shadow: rgba(0, 212, 255, 0.15);
9
+ --success-color: #00ff88;
10
+ --warning-color: #ffa502;
11
+ --danger-color: #ff4757;
12
+
13
+ /* Social Media Colors */
14
+ --facebook: linear-gradient(135deg, #1877f2, #0d5dbf);
15
+ --instagram: linear-gradient(135deg, #f58529, #dd2a7b, #8134af, #515bd4);
16
+ --twitter: linear-gradient(135deg, #1da1f2, #0d8bd9);
17
+ --linkedin: linear-gradient(135deg, #0077b5, #005582);
18
+ --youtube: linear-gradient(135deg, #ff0000, #cc0000);
19
+ --tiktok: linear-gradient(135deg, #000000, #ee1d52, #69c9d0);
20
+ --reddit: linear-gradient(135deg, #ff4500, #cc3700);
21
+ --whatsapp: linear-gradient(135deg, #25d366, #1da851);
22
+ --telegram: linear-gradient(135deg, #0088cc, #006699);
23
+ --discord: linear-gradient(135deg, #5865f2, #4752c4);
24
+ --snapchat: linear-gradient(135deg, #fffc00, #ccca00);
25
+ --pinterest: linear-gradient(135deg, #e60023, #bd001c);
26
+ }
27
+
28
+ /* Light Mode Variables */
29
+ body.light-mode {
30
+ --primary-bg: #f5f7fa;
31
+ --secondary-bg: #ffffff;
32
+ --text-primary: #1a1a2e;
33
+ --text-secondary: #4a5568;
34
+ --card-shadow: rgba(0, 0, 0, 0.1);
35
+ }
36
+
37
+ /* ===== Global Styles ===== */
38
+ * {
39
+ margin: 0;
40
+ padding: 0;
41
+ box-sizing: border-box;
42
+ }
43
+
44
+ body {
45
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
46
+ background: var(--primary-bg);
47
+ color: var(--text-primary);
48
+ min-height: 100vh;
49
+ overflow-x: hidden;
50
+ position: relative;
51
+ transition: background 0.3s ease, color 0.3s ease;
52
+ }
53
+
54
+ /* Light Mode Particles */
55
+ body.light-mode #particles {
56
+ opacity: 0.2;
57
+ filter: invert(1);
58
+ }
59
+
60
+ /* ===== Particles Background ===== */
61
+ #particles {
62
+ position: fixed;
63
+ top: 0;
64
+ left: 0;
65
+ width: 100%;
66
+ height: 100%;
67
+ z-index: 0;
68
+ opacity: 0.6;
69
+ }
70
+
71
+ /* ===== Container ===== */
72
+ .container {
73
+ max-width: 1400px;
74
+ margin: 0 auto;
75
+ padding: 2rem;
76
+ position: relative;
77
+ z-index: 1;
78
+ }
79
+
80
+ /* ===== Header ===== */
81
+ .header {
82
+ text-align: center;
83
+ margin-bottom: 2rem;
84
+ animation: fadeInDown 0.8s ease-out;
85
+ }
86
+
87
+ .header-top {
88
+ display: flex;
89
+ justify-content: flex-end;
90
+ margin-bottom: 1rem;
91
+ }
92
+
93
+ .header-controls {
94
+ display: flex;
95
+ gap: 0.5rem;
96
+ align-items: center;
97
+ }
98
+
99
+ .control-icon-btn {
100
+ padding: 0.6rem 1rem;
101
+ background: rgba(0, 212, 255, 0.1);
102
+ border: 2px solid rgba(0, 212, 255, 0.3);
103
+ border-radius: 10px;
104
+ color: var(--accent-color);
105
+ cursor: pointer;
106
+ font-size: 1rem;
107
+ transition: all 0.3s ease;
108
+ display: flex;
109
+ align-items: center;
110
+ gap: 0.5rem;
111
+ }
112
+
113
+ .control-icon-btn:hover {
114
+ background: var(--accent-color);
115
+ color: var(--primary-bg);
116
+ transform: translateY(-2px);
117
+ box-shadow: 0 5px 15px rgba(0, 212, 255, 0.3);
118
+ }
119
+
120
+ .system-status {
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ gap: 0.5rem;
125
+ margin-top: 1rem;
126
+ padding: 0.5rem 1.5rem;
127
+ background: rgba(0, 255, 136, 0.1);
128
+ border: 1px solid rgba(0, 255, 136, 0.3);
129
+ border-radius: 50px;
130
+ color: var(--success-color);
131
+ font-size: 0.9rem;
132
+ max-width: fit-content;
133
+ margin-left: auto;
134
+ margin-right: auto;
135
+ }
136
+
137
+ .logo-section {
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ gap: 1rem;
142
+ margin-bottom: 1rem;
143
+ }
144
+
145
+ .logo-icon {
146
+ width: 60px;
147
+ height: 60px;
148
+ background: linear-gradient(135deg, var(--accent-color), #00a8cc);
149
+ border-radius: 15px;
150
+ display: flex;
151
+ align-items: center;
152
+ justify-content: center;
153
+ font-size: 2rem;
154
+ box-shadow: 0 8px 32px rgba(0, 212, 255, 0.3);
155
+ animation: pulse 2s infinite;
156
+ }
157
+
158
+ .title {
159
+ font-size: 3.5rem;
160
+ font-weight: 700;
161
+ background: linear-gradient(135deg, var(--accent-color), #00ff88);
162
+ -webkit-background-clip: text;
163
+ -webkit-text-fill-color: transparent;
164
+ background-clip: text;
165
+ text-shadow: 0 0 30px rgba(0, 212, 255, 0.5);
166
+ }
167
+
168
+ .subtitle {
169
+ font-size: 1.2rem;
170
+ color: var(--text-secondary);
171
+ font-weight: 300;
172
+ letter-spacing: 1px;
173
+ }
174
+
175
+ /* ===== Filter Tabs ===== */
176
+ .filter-tabs {
177
+ display: flex;
178
+ gap: 1rem;
179
+ justify-content: center;
180
+ flex-wrap: wrap;
181
+ margin-bottom: 2rem;
182
+ animation: fadeInUp 0.8s ease-out 0.1s backwards;
183
+ }
184
+
185
+ .filter-tab {
186
+ padding: 0.7rem 1.5rem;
187
+ background: var(--secondary-bg);
188
+ border: 2px solid rgba(0, 212, 255, 0.3);
189
+ border-radius: 25px;
190
+ color: var(--text-secondary);
191
+ cursor: pointer;
192
+ font-size: 0.95rem;
193
+ font-weight: 500;
194
+ transition: all 0.3s ease;
195
+ display: flex;
196
+ align-items: center;
197
+ gap: 0.5rem;
198
+ }
199
+
200
+ .filter-tab:hover {
201
+ border-color: var(--accent-color);
202
+ color: var(--accent-color);
203
+ transform: translateY(-2px);
204
+ }
205
+
206
+ .filter-tab.active {
207
+ background: var(--accent-color);
208
+ border-color: var(--accent-color);
209
+ color: var(--primary-bg);
210
+ box-shadow: 0 5px 20px rgba(0, 212, 255, 0.3);
211
+ }
212
+
213
+ .filter-tab i {
214
+ font-size: 1rem;
215
+ }
216
+
217
+ /* ===== Search Bar ===== */
218
+ .search-container {
219
+ position: relative;
220
+ max-width: 600px;
221
+ margin: 0 auto 3rem;
222
+ animation: fadeInUp 0.8s ease-out 0.2s backwards;
223
+ }
224
+
225
+ .search-bar {
226
+ width: 100%;
227
+ padding: 1rem 3rem 1rem 1.5rem;
228
+ font-size: 1rem;
229
+ background: var(--secondary-bg);
230
+ border: 2px solid rgba(0, 212, 255, 0.3);
231
+ border-radius: 50px;
232
+ color: var(--text-primary);
233
+ outline: none;
234
+ transition: all 0.3s ease;
235
+ }
236
+
237
+ .search-bar:focus {
238
+ border-color: var(--accent-color);
239
+ box-shadow: 0 0 20px rgba(0, 212, 255, 0.3);
240
+ }
241
+
242
+ .search-bar::placeholder {
243
+ color: var(--text-secondary);
244
+ }
245
+
246
+ .search-icon {
247
+ position: absolute;
248
+ right: 1.5rem;
249
+ top: 50%;
250
+ transform: translateY(-50%);
251
+ color: var(--accent-color);
252
+ font-size: 1.2rem;
253
+ }
254
+
255
+ /* ===== Recent Timeline ===== */
256
+ .recent-timeline {
257
+ max-width: 900px;
258
+ margin: 0 auto 2rem;
259
+ padding: 1.5rem;
260
+ background: var(--secondary-bg);
261
+ border-radius: 15px;
262
+ border: 2px solid rgba(0, 212, 255, 0.2);
263
+ animation: fadeInUp 0.6s ease-out;
264
+ }
265
+
266
+ .recent-timeline h3 {
267
+ color: var(--accent-color);
268
+ margin-bottom: 1rem;
269
+ font-size: 1.3rem;
270
+ display: flex;
271
+ align-items: center;
272
+ gap: 0.5rem;
273
+ }
274
+
275
+ .timeline-items {
276
+ display: flex;
277
+ flex-direction: column;
278
+ gap: 0.8rem;
279
+ }
280
+
281
+ .timeline-item {
282
+ display: flex;
283
+ align-items: center;
284
+ gap: 1rem;
285
+ padding: 0.8rem;
286
+ background: rgba(0, 212, 255, 0.05);
287
+ border-radius: 10px;
288
+ border-left: 3px solid var(--accent-color);
289
+ cursor: pointer;
290
+ transition: all 0.3s ease;
291
+ }
292
+
293
+ .timeline-item:hover {
294
+ background: rgba(0, 212, 255, 0.1);
295
+ transform: translateX(5px);
296
+ }
297
+
298
+ .timeline-item i {
299
+ font-size: 1.5rem;
300
+ color: var(--accent-color);
301
+ }
302
+
303
+ .timeline-info {
304
+ flex: 1;
305
+ }
306
+
307
+ .timeline-info h4 {
308
+ color: var(--text-primary);
309
+ font-size: 1rem;
310
+ margin-bottom: 0.2rem;
311
+ }
312
+
313
+ .timeline-info span {
314
+ color: var(--text-secondary);
315
+ font-size: 0.85rem;
316
+ }
317
+
318
+ /* ===== Social Media Grid ===== */
319
+ .social-grid {
320
+ display: grid;
321
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
322
+ gap: 2rem;
323
+ margin-bottom: 3rem;
324
+ }
325
+
326
+ /* ===== Social Card ===== */
327
+ .social-card {
328
+ position: relative;
329
+ animation: fadeInUp 0.6s ease-out backwards;
330
+ animation-delay: calc(var(--card-index) * 0.1s);
331
+ }
332
+
333
+ .social-card:nth-child(1) { --card-index: 1; }
334
+ .social-card:nth-child(2) { --card-index: 2; }
335
+ .social-card:nth-child(3) { --card-index: 3; }
336
+ .social-card:nth-child(4) { --card-index: 4; }
337
+ .social-card:nth-child(5) { --card-index: 5; }
338
+ .social-card:nth-child(6) { --card-index: 6; }
339
+ .social-card:nth-child(7) { --card-index: 7; }
340
+ .social-card:nth-child(8) { --card-index: 8; }
341
+ .social-card:nth-child(9) { --card-index: 9; }
342
+ .social-card:nth-child(10) { --card-index: 10; }
343
+ .social-card:nth-child(11) { --card-index: 11; }
344
+ .social-card:nth-child(12) { --card-index: 12; }
345
+
346
+ .card-inner {
347
+ position: relative;
348
+ height: 280px;
349
+ border-radius: 20px;
350
+ transition: transform 0.3s ease;
351
+ }
352
+
353
+ .social-card:hover .card-inner {
354
+ transform: translateY(-10px);
355
+ }
356
+
357
+ .card-front {
358
+ position: absolute;
359
+ width: 100%;
360
+ height: 100%;
361
+ border-radius: 20px;
362
+ padding: 2rem;
363
+ display: flex;
364
+ flex-direction: column;
365
+ justify-content: space-between;
366
+ box-shadow: 0 10px 40px var(--card-shadow);
367
+ transition: all 0.3s ease;
368
+ overflow: hidden;
369
+ }
370
+
371
+ .card-front::before {
372
+ content: '';
373
+ position: absolute;
374
+ top: 0;
375
+ left: 0;
376
+ right: 0;
377
+ bottom: 0;
378
+ background: rgba(255, 255, 255, 0.05);
379
+ opacity: 0;
380
+ transition: opacity 0.3s ease;
381
+ }
382
+
383
+ .social-card:hover .card-front::before {
384
+ opacity: 1;
385
+ }
386
+
387
+ /* Card Top Controls */
388
+ .card-top-controls {
389
+ display: flex;
390
+ justify-content: flex-end;
391
+ gap: 0.5rem;
392
+ margin-bottom: 0.5rem;
393
+ position: relative;
394
+ z-index: 5;
395
+ }
396
+
397
+ .favorite-btn,
398
+ .note-btn {
399
+ width: 32px;
400
+ height: 32px;
401
+ background: rgba(255, 255, 255, 0.2);
402
+ backdrop-filter: blur(10px);
403
+ border: none;
404
+ border-radius: 8px;
405
+ color: white;
406
+ cursor: pointer;
407
+ font-size: 0.9rem;
408
+ transition: all 0.3s ease;
409
+ display: flex;
410
+ align-items: center;
411
+ justify-content: center;
412
+ }
413
+
414
+ .favorite-btn:hover,
415
+ .note-btn:hover {
416
+ background: rgba(255, 255, 255, 0.3);
417
+ transform: scale(1.1);
418
+ }
419
+
420
+ .favorite-btn.active {
421
+ background: rgba(255, 215, 0, 0.9);
422
+ color: #fff;
423
+ }
424
+
425
+ .favorite-btn.active i {
426
+ font-weight: 900;
427
+ }
428
+
429
+ .note-btn.has-note {
430
+ background: rgba(0, 212, 255, 0.8);
431
+ }
432
+
433
+ .status-indicator {
434
+ width: 12px;
435
+ height: 12px;
436
+ border-radius: 50%;
437
+ background: var(--success-color);
438
+ border: 2px solid rgba(255, 255, 255, 0.3);
439
+ box-shadow: 0 0 10px var(--success-color);
440
+ animation: pulse 2s infinite;
441
+ }
442
+
443
+ .status-indicator.offline {
444
+ background: var(--danger-color);
445
+ box-shadow: 0 0 10px var(--danger-color);
446
+ }
447
+
448
+ /* Platform Specific Backgrounds */
449
+ .facebook-bg { background: var(--facebook); }
450
+ .instagram-bg { background: var(--instagram); }
451
+ .twitter-bg { background: var(--twitter); }
452
+ .linkedin-bg { background: var(--linkedin); }
453
+ .youtube-bg { background: var(--youtube); }
454
+ .tiktok-bg { background: var(--tiktok); }
455
+ .reddit-bg { background: var(--reddit); }
456
+ .whatsapp-bg { background: var(--whatsapp); }
457
+ .telegram-bg { background: var(--telegram); }
458
+ .discord-bg { background: var(--discord); }
459
+ .snapchat-bg { background: var(--snapchat); }
460
+ .pinterest-bg { background: var(--pinterest); }
461
+
462
+ /* Platform Logo */
463
+ .platform-logo {
464
+ width: 70px;
465
+ height: 70px;
466
+ background: rgba(255, 255, 255, 0.2);
467
+ backdrop-filter: blur(10px);
468
+ border-radius: 18px;
469
+ display: flex;
470
+ align-items: center;
471
+ justify-content: center;
472
+ font-size: 2.2rem;
473
+ margin-bottom: 1rem;
474
+ transition: all 0.3s ease;
475
+ border: 2px solid rgba(255, 255, 255, 0.3);
476
+ }
477
+
478
+ .social-card:hover .platform-logo {
479
+ transform: rotate(360deg) scale(1.1);
480
+ background: rgba(255, 255, 255, 0.3);
481
+ }
482
+
483
+ .platform-name {
484
+ font-size: 1.5rem;
485
+ font-weight: 700;
486
+ margin-bottom: 0.5rem;
487
+ text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
488
+ }
489
+
490
+ .platform-desc {
491
+ font-size: 0.9rem;
492
+ opacity: 0.9;
493
+ margin-bottom: 1rem;
494
+ line-height: 1.4;
495
+ }
496
+
497
+ .platform-badges {
498
+ display: flex;
499
+ gap: 0.5rem;
500
+ align-items: center;
501
+ margin-bottom: 0.5rem;
502
+ flex-wrap: wrap;
503
+ }
504
+
505
+ .visit-badge {
506
+ padding: 0.3rem 0.7rem;
507
+ background: rgba(255, 255, 255, 0.2);
508
+ backdrop-filter: blur(10px);
509
+ border-radius: 12px;
510
+ font-size: 0.75rem;
511
+ font-weight: 600;
512
+ display: flex;
513
+ align-items: center;
514
+ gap: 0.3rem;
515
+ }
516
+
517
+ .note-indicator {
518
+ padding: 0.3rem 0.5rem;
519
+ background: rgba(0, 212, 255, 0.3);
520
+ border-radius: 8px;
521
+ font-size: 0.75rem;
522
+ display: flex;
523
+ align-items: center;
524
+ }
525
+
526
+ .card-stats {
527
+ display: flex;
528
+ gap: 1rem;
529
+ font-size: 0.85rem;
530
+ opacity: 0.85;
531
+ }
532
+
533
+ .card-stats i {
534
+ margin-right: 0.3rem;
535
+ }
536
+
537
+ /* Launch Button */
538
+ .launch-btn {
539
+ position: absolute;
540
+ bottom: -20px;
541
+ left: 50%;
542
+ transform: translateX(-50%);
543
+ padding: 0.8rem 2rem;
544
+ background: var(--accent-color);
545
+ color: var(--primary-bg);
546
+ text-decoration: none;
547
+ border-radius: 50px;
548
+ font-weight: 600;
549
+ font-size: 0.9rem;
550
+ opacity: 0;
551
+ transition: all 0.3s ease;
552
+ box-shadow: 0 5px 20px rgba(0, 212, 255, 0.4);
553
+ z-index: 10;
554
+ }
555
+
556
+ .social-card:hover .launch-btn {
557
+ opacity: 1;
558
+ bottom: 1.5rem;
559
+ }
560
+
561
+ .launch-btn:hover {
562
+ background: #00ff88;
563
+ transform: translateX(-50%) scale(1.05);
564
+ box-shadow: 0 8px 30px rgba(0, 255, 136, 0.5);
565
+ }
566
+
567
+ .launch-btn i {
568
+ margin-right: 0.5rem;
569
+ }
570
+
571
+ /* ===== Footer ===== */
572
+ .footer {
573
+ text-align: center;
574
+ padding: 2rem 0;
575
+ border-top: 1px solid rgba(168, 178, 209, 0.1);
576
+ margin-top: 3rem;
577
+ animation: fadeIn 1s ease-out 0.5s backwards;
578
+ }
579
+
580
+ .footer p {
581
+ color: var(--text-secondary);
582
+ margin-bottom: 1rem;
583
+ }
584
+
585
+ .footer-links {
586
+ display: flex;
587
+ justify-content: center;
588
+ gap: 2rem;
589
+ }
590
+
591
+ .footer-links a {
592
+ color: var(--accent-color);
593
+ text-decoration: none;
594
+ transition: all 0.3s ease;
595
+ font-size: 0.9rem;
596
+ }
597
+
598
+ .footer-links a:hover {
599
+ color: #00ff88;
600
+ transform: translateY(-2px);
601
+ }
602
+
603
+ .footer-links a i {
604
+ margin-right: 0.5rem;
605
+ }
606
+
607
+ /* ===== Animations ===== */
608
+ @keyframes fadeInDown {
609
+ from {
610
+ opacity: 0;
611
+ transform: translateY(-30px);
612
+ }
613
+ to {
614
+ opacity: 1;
615
+ transform: translateY(0);
616
+ }
617
+ }
618
+
619
+ @keyframes fadeInUp {
620
+ from {
621
+ opacity: 0;
622
+ transform: translateY(30px);
623
+ }
624
+ to {
625
+ opacity: 1;
626
+ transform: translateY(0);
627
+ }
628
+ }
629
+
630
+ @keyframes fadeIn {
631
+ from {
632
+ opacity: 0;
633
+ }
634
+ to {
635
+ opacity: 1;
636
+ }
637
+ }
638
+
639
+ @keyframes pulse {
640
+ 0%, 100% {
641
+ transform: scale(1);
642
+ }
643
+ 50% {
644
+ transform: scale(1.05);
645
+ }
646
+ }
647
+
648
+ /* ===== Responsive Design ===== */
649
+ @media (max-width: 768px) {
650
+ .container {
651
+ padding: 1rem;
652
+ }
653
+
654
+ .title {
655
+ font-size: 2.5rem;
656
+ }
657
+
658
+ .subtitle {
659
+ font-size: 1rem;
660
+ }
661
+
662
+ .header-controls {
663
+ flex-wrap: wrap;
664
+ }
665
+
666
+ .control-icon-btn {
667
+ padding: 0.5rem 0.8rem;
668
+ font-size: 0.9rem;
669
+ }
670
+
671
+ .filter-tabs {
672
+ gap: 0.5rem;
673
+ }
674
+
675
+ .filter-tab {
676
+ padding: 0.5rem 1rem;
677
+ font-size: 0.85rem;
678
+ }
679
+
680
+ .social-grid {
681
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
682
+ gap: 1.5rem;
683
+ }
684
+
685
+ .footer-links {
686
+ flex-direction: column;
687
+ gap: 1rem;
688
+ }
689
+
690
+ .analytics-stats {
691
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
692
+ }
693
+
694
+ .stat-card h3 {
695
+ font-size: 1.5rem;
696
+ }
697
+
698
+ .time-tracker {
699
+ bottom: 1rem;
700
+ right: 1rem;
701
+ left: 1rem;
702
+ }
703
+ }
704
+
705
+ @media (max-width: 480px) {
706
+ .logo-section {
707
+ flex-direction: column;
708
+ }
709
+
710
+ .title {
711
+ font-size: 2rem;
712
+ }
713
+
714
+ .social-grid {
715
+ grid-template-columns: 1fr;
716
+ }
717
+ }
718
+
719
+ /* ===== Hidden Class for Search ===== */
720
+ .hidden {
721
+ display: none !important;
722
+ }
723
+
724
+ /* ===== Snapchat Special Styling ===== */
725
+ .snapchat-bg .platform-logo,
726
+ .snapchat-bg .platform-name,
727
+ .snapchat-bg .platform-desc,
728
+ .snapchat-bg .card-stats {
729
+ color: #000000;
730
+ }
731
+
732
+ /* ===== Scrollbar Styling ===== */
733
+ ::-webkit-scrollbar {
734
+ width: 10px;
735
+ }
736
+
737
+ ::-webkit-scrollbar-track {
738
+ background: var(--primary-bg);
739
+ }
740
+
741
+ ::-webkit-scrollbar-thumb {
742
+ background: var(--accent-color);
743
+ border-radius: 5px;
744
+ }
745
+
746
+ ::-webkit-scrollbar-thumb:hover {
747
+ background: #00ff88;
748
+ }
749
+
750
+ /* ===== Modal Styles ===== */
751
+ .modal {
752
+ display: none;
753
+ position: fixed;
754
+ top: 0;
755
+ left: 0;
756
+ width: 100%;
757
+ height: 100%;
758
+ background: rgba(10, 14, 39, 0.95);
759
+ backdrop-filter: blur(10px);
760
+ z-index: 1000;
761
+ animation: fadeIn 0.3s ease;
762
+ }
763
+
764
+ .modal.active {
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: center;
768
+ }
769
+
770
+ .modal-content {
771
+ width: 95%;
772
+ height: 90%;
773
+ max-width: 1600px;
774
+ background: var(--secondary-bg);
775
+ border-radius: 20px;
776
+ overflow: hidden;
777
+ box-shadow: 0 20px 60px rgba(0, 212, 255, 0.3);
778
+ border: 2px solid rgba(0, 212, 255, 0.2);
779
+ display: flex;
780
+ flex-direction: column;
781
+ animation: slideUp 0.4s ease;
782
+ }
783
+
784
+ @keyframes slideUp {
785
+ from {
786
+ opacity: 0;
787
+ transform: translateY(50px) scale(0.95);
788
+ }
789
+ to {
790
+ opacity: 1;
791
+ transform: translateY(0) scale(1);
792
+ }
793
+ }
794
+
795
+ /* Modal Header */
796
+ .modal-header {
797
+ display: flex;
798
+ align-items: center;
799
+ justify-content: space-between;
800
+ padding: 1.5rem 2rem;
801
+ background: linear-gradient(135deg, rgba(0, 212, 255, 0.1), rgba(0, 168, 204, 0.05));
802
+ border-bottom: 2px solid rgba(0, 212, 255, 0.2);
803
+ }
804
+
805
+ .modal-title {
806
+ display: flex;
807
+ align-items: center;
808
+ gap: 1rem;
809
+ font-size: 1.5rem;
810
+ font-weight: 600;
811
+ color: var(--text-primary);
812
+ }
813
+
814
+ .modal-title .platform-icon {
815
+ font-size: 2rem;
816
+ color: var(--accent-color);
817
+ }
818
+
819
+ .modal-controls {
820
+ display: flex;
821
+ gap: 0.5rem;
822
+ }
823
+
824
+ .modal-btn {
825
+ width: 40px;
826
+ height: 40px;
827
+ border: none;
828
+ background: rgba(0, 212, 255, 0.1);
829
+ color: var(--accent-color);
830
+ border-radius: 10px;
831
+ cursor: pointer;
832
+ font-size: 1rem;
833
+ transition: all 0.3s ease;
834
+ display: flex;
835
+ align-items: center;
836
+ justify-content: center;
837
+ }
838
+
839
+ .modal-btn:hover {
840
+ background: var(--accent-color);
841
+ color: var(--primary-bg);
842
+ transform: scale(1.1);
843
+ }
844
+
845
+ .close-btn:hover {
846
+ background: #ff4757;
847
+ color: white;
848
+ }
849
+
850
+ /* Modal Body */
851
+ .modal-body {
852
+ flex: 1;
853
+ position: relative;
854
+ background: var(--primary-bg);
855
+ overflow: hidden;
856
+ }
857
+
858
+ /* ===== Authentication Section ===== */
859
+ .auth-section {
860
+ width: 100%;
861
+ height: 100%;
862
+ display: flex;
863
+ align-items: center;
864
+ justify-content: center;
865
+ padding: 2rem;
866
+ background: linear-gradient(135deg, var(--primary-bg), var(--secondary-bg));
867
+ }
868
+
869
+ .auth-container {
870
+ max-width: 500px;
871
+ width: 100%;
872
+ text-align: center;
873
+ animation: fadeInUp 0.5s ease;
874
+ }
875
+
876
+ .auth-icon {
877
+ width: 100px;
878
+ height: 100px;
879
+ margin: 0 auto 2rem;
880
+ background: linear-gradient(135deg, var(--accent-color), #00a8cc);
881
+ border-radius: 25px;
882
+ display: flex;
883
+ align-items: center;
884
+ justify-content: center;
885
+ font-size: 3rem;
886
+ box-shadow: 0 10px 40px rgba(0, 212, 255, 0.3);
887
+ animation: pulse 2s infinite;
888
+ }
889
+
890
+ .platform-icon-large {
891
+ font-size: 3.5rem;
892
+ color: white;
893
+ }
894
+
895
+ .auth-title {
896
+ font-size: 2rem;
897
+ font-weight: 700;
898
+ color: var(--text-primary);
899
+ margin-bottom: 0.5rem;
900
+ }
901
+
902
+ .platform-name-text {
903
+ background: linear-gradient(135deg, var(--accent-color), #00ff88);
904
+ -webkit-background-clip: text;
905
+ -webkit-text-fill-color: transparent;
906
+ background-clip: text;
907
+ }
908
+
909
+ .auth-description {
910
+ font-size: 1rem;
911
+ color: var(--text-secondary);
912
+ margin-bottom: 3rem;
913
+ line-height: 1.6;
914
+ }
915
+
916
+ /* Auth Options */
917
+ .auth-options {
918
+ display: flex;
919
+ flex-direction: column;
920
+ gap: 1rem;
921
+ margin-bottom: 2rem;
922
+ }
923
+
924
+ .auth-btn {
925
+ width: 100%;
926
+ padding: 1.2rem 2rem;
927
+ border: none;
928
+ border-radius: 15px;
929
+ font-size: 1.1rem;
930
+ font-weight: 600;
931
+ cursor: pointer;
932
+ display: flex;
933
+ align-items: center;
934
+ justify-content: center;
935
+ gap: 1rem;
936
+ transition: all 0.3s ease;
937
+ position: relative;
938
+ overflow: hidden;
939
+ }
940
+
941
+ .auth-btn::before {
942
+ content: '';
943
+ position: absolute;
944
+ top: 0;
945
+ left: -100%;
946
+ width: 100%;
947
+ height: 100%;
948
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
949
+ transition: left 0.5s ease;
950
+ }
951
+
952
+ .auth-btn:hover::before {
953
+ left: 100%;
954
+ }
955
+
956
+ .auth-btn i {
957
+ font-size: 1.5rem;
958
+ }
959
+
960
+ /* Google Button */
961
+ .google-btn {
962
+ background: linear-gradient(135deg, #4285f4, #34a853);
963
+ color: white;
964
+ box-shadow: 0 5px 20px rgba(66, 133, 244, 0.3);
965
+ }
966
+
967
+ .google-btn:hover {
968
+ transform: translateY(-3px);
969
+ box-shadow: 0 8px 30px rgba(66, 133, 244, 0.5);
970
+ }
971
+
972
+ /* Platform Button */
973
+ .platform-btn {
974
+ background: linear-gradient(135deg, var(--accent-color), #00a8cc);
975
+ color: white;
976
+ box-shadow: 0 5px 20px rgba(0, 212, 255, 0.3);
977
+ }
978
+
979
+ .platform-btn:hover {
980
+ transform: translateY(-3px);
981
+ box-shadow: 0 8px 30px rgba(0, 212, 255, 0.5);
982
+ }
983
+
984
+ /* Guest Button */
985
+ .guest-btn {
986
+ background: rgba(255, 255, 255, 0.1);
987
+ color: var(--text-primary);
988
+ border: 2px solid rgba(255, 255, 255, 0.2);
989
+ box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2);
990
+ }
991
+
992
+ .guest-btn:hover {
993
+ background: rgba(255, 255, 255, 0.15);
994
+ border-color: var(--accent-color);
995
+ transform: translateY(-3px);
996
+ box-shadow: 0 8px 30px rgba(0, 212, 255, 0.3);
997
+ }
998
+
999
+ /* Auth Footer */
1000
+ .auth-footer {
1001
+ display: flex;
1002
+ align-items: center;
1003
+ justify-content: center;
1004
+ gap: 0.5rem;
1005
+ padding: 1.5rem;
1006
+ background: rgba(0, 212, 255, 0.05);
1007
+ border-radius: 10px;
1008
+ border: 1px solid rgba(0, 212, 255, 0.1);
1009
+ }
1010
+
1011
+ .auth-footer i {
1012
+ color: var(--accent-color);
1013
+ font-size: 1.2rem;
1014
+ }
1015
+
1016
+ .auth-footer p {
1017
+ font-size: 0.85rem;
1018
+ color: var(--text-secondary);
1019
+ margin: 0;
1020
+ line-height: 1.4;
1021
+ }
1022
+
1023
+ /* ===== Platform Section ===== */
1024
+ .platform-section {
1025
+ width: 100%;
1026
+ height: 100%;
1027
+ position: relative;
1028
+ background: #000;
1029
+ }
1030
+
1031
+ .platform-controls {
1032
+ position: absolute;
1033
+ top: 1rem;
1034
+ right: 1rem;
1035
+ display: flex;
1036
+ gap: 0.5rem;
1037
+ z-index: 10;
1038
+ }
1039
+
1040
+ .control-btn {
1041
+ width: 40px;
1042
+ height: 40px;
1043
+ border: none;
1044
+ background: rgba(0, 0, 0, 0.7);
1045
+ backdrop-filter: blur(10px);
1046
+ color: var(--accent-color);
1047
+ border-radius: 10px;
1048
+ cursor: pointer;
1049
+ font-size: 1rem;
1050
+ transition: all 0.3s ease;
1051
+ display: flex;
1052
+ align-items: center;
1053
+ justify-content: center;
1054
+ border: 1px solid rgba(0, 212, 255, 0.2);
1055
+ }
1056
+
1057
+ .control-btn:hover {
1058
+ background: var(--accent-color);
1059
+ color: var(--primary-bg);
1060
+ transform: scale(1.1);
1061
+ }
1062
+
1063
+ .logout-btn:hover {
1064
+ background: #ff4757;
1065
+ color: white;
1066
+ border-color: #ff4757;
1067
+ }
1068
+
1069
+ #platformFrame {
1070
+ width: 100%;
1071
+ height: 100%;
1072
+ border: none;
1073
+ display: block;
1074
+ background: white;
1075
+ }
1076
+
1077
+ /* Loading Spinner */
1078
+ .loading-spinner {
1079
+ position: absolute;
1080
+ top: 50%;
1081
+ left: 50%;
1082
+ transform: translate(-50%, -50%);
1083
+ text-align: center;
1084
+ color: var(--accent-color);
1085
+ }
1086
+
1087
+ .loading-spinner i {
1088
+ font-size: 3rem;
1089
+ margin-bottom: 1rem;
1090
+ }
1091
+
1092
+ .loading-spinner p {
1093
+ font-size: 1.2rem;
1094
+ color: var(--text-secondary);
1095
+ }
1096
+
1097
+ .loading-spinner.hidden {
1098
+ display: none;
1099
+ }
1100
+
1101
+ /* Fullscreen Mode */
1102
+ .modal-content.fullscreen {
1103
+ width: 100%;
1104
+ height: 100%;
1105
+ max-width: 100%;
1106
+ border-radius: 0;
1107
+ }
1108
+
1109
+ /* Mobile Responsive */
1110
+ @media (max-width: 768px) {
1111
+ .modal-content {
1112
+ width: 100%;
1113
+ height: 100%;
1114
+ border-radius: 0;
1115
+ }
1116
+
1117
+ .modal-header {
1118
+ padding: 1rem;
1119
+ }
1120
+
1121
+ .modal-title {
1122
+ font-size: 1.2rem;
1123
+ }
1124
+
1125
+ .modal-title .platform-icon {
1126
+ font-size: 1.5rem;
1127
+ }
1128
+
1129
+ .modal-btn {
1130
+ width: 35px;
1131
+ height: 35px;
1132
+ font-size: 0.9rem;
1133
+ }
1134
+
1135
+ .platform-title {
1136
+ font-size: 1rem;
1137
+ }
1138
+
1139
+ .auth-container {
1140
+ padding: 1rem;
1141
+ }
1142
+
1143
+ .auth-title {
1144
+ font-size: 1.5rem;
1145
+ }
1146
+
1147
+ .auth-btn {
1148
+ padding: 1rem 1.5rem;
1149
+ font-size: 1rem;
1150
+ }
1151
+
1152
+ .platform-controls {
1153
+ top: 0.5rem;
1154
+ right: 0.5rem;
1155
+ }
1156
+
1157
+ .control-btn {
1158
+ width: 35px;
1159
+ height: 35px;
1160
+ }
1161
+ }
1162
+
1163
+ /* ===== Notification Styles ===== */
1164
+ .notification {
1165
+ position: fixed;
1166
+ top: 2rem;
1167
+ right: -400px;
1168
+ background: var(--secondary-bg);
1169
+ color: var(--text-primary);
1170
+ padding: 1rem 1.5rem;
1171
+ border-radius: 10px;
1172
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
1173
+ border-left: 4px solid var(--accent-color);
1174
+ display: flex;
1175
+ align-items: center;
1176
+ gap: 1rem;
1177
+ z-index: 10000;
1178
+ min-width: 300px;
1179
+ transition: right 0.3s ease;
1180
+ }
1181
+
1182
+ .notification.show {
1183
+ right: 2rem;
1184
+ }
1185
+
1186
+ .notification i {
1187
+ font-size: 1.5rem;
1188
+ }
1189
+
1190
+ .notification-success {
1191
+ border-left-color: #00ff88;
1192
+ }
1193
+
1194
+ .notification-success i {
1195
+ color: #00ff88;
1196
+ }
1197
+
1198
+ .notification-warning {
1199
+ border-left-color: #ffa502;
1200
+ }
1201
+
1202
+ .notification-warning i {
1203
+ color: #ffa502;
1204
+ }
1205
+
1206
+ .notification-info {
1207
+ border-left-color: var(--accent-color);
1208
+ }
1209
+
1210
+ .notification-info i {
1211
+ color: var(--accent-color);
1212
+ }
1213
+
1214
+ /* ===== Shortcuts Modal ===== */
1215
+ .shortcuts-modal {
1216
+ max-width: 600px;
1217
+ max-height: 80vh;
1218
+ }
1219
+
1220
+ .shortcuts-body {
1221
+ padding: 2rem;
1222
+ display: flex;
1223
+ flex-direction: column;
1224
+ gap: 1rem;
1225
+ }
1226
+
1227
+ .shortcut-item {
1228
+ display: flex;
1229
+ align-items: center;
1230
+ gap: 1.5rem;
1231
+ padding: 1rem;
1232
+ background: rgba(0, 212, 255, 0.05);
1233
+ border-radius: 10px;
1234
+ border-left: 3px solid var(--accent-color);
1235
+ }
1236
+
1237
+ .shortcut-item kbd {
1238
+ min-width: 50px;
1239
+ padding: 0.5rem 1rem;
1240
+ background: var(--secondary-bg);
1241
+ border: 2px solid rgba(0, 212, 255, 0.3);
1242
+ border-radius: 8px;
1243
+ font-family: 'Courier New', monospace;
1244
+ font-size: 0.9rem;
1245
+ font-weight: 600;
1246
+ color: var(--accent-color);
1247
+ text-align: center;
1248
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
1249
+ }
1250
+
1251
+ .shortcut-item span {
1252
+ flex: 1;
1253
+ color: var(--text-primary);
1254
+ font-size: 1rem;
1255
+ }
1256
+
1257
+ /* ===== Analytics Modal ===== */
1258
+ .analytics-modal {
1259
+ max-width: 900px;
1260
+ max-height: 85vh;
1261
+ }
1262
+
1263
+ .analytics-body {
1264
+ padding: 2rem;
1265
+ overflow-y: auto;
1266
+ }
1267
+
1268
+ .analytics-stats {
1269
+ display: grid;
1270
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1271
+ gap: 1.5rem;
1272
+ margin-bottom: 2rem;
1273
+ }
1274
+
1275
+ .stat-card {
1276
+ padding: 1.5rem;
1277
+ background: linear-gradient(135deg, rgba(0, 212, 255, 0.1), rgba(0, 168, 204, 0.05));
1278
+ border-radius: 15px;
1279
+ border: 2px solid rgba(0, 212, 255, 0.2);
1280
+ text-align: center;
1281
+ transition: all 0.3s ease;
1282
+ }
1283
+
1284
+ .stat-card:hover {
1285
+ transform: translateY(-5px);
1286
+ box-shadow: 0 10px 30px rgba(0, 212, 255, 0.2);
1287
+ }
1288
+
1289
+ .stat-card i {
1290
+ font-size: 2.5rem;
1291
+ color: var(--accent-color);
1292
+ margin-bottom: 1rem;
1293
+ }
1294
+
1295
+ .stat-card h3 {
1296
+ font-size: 2rem;
1297
+ color: var(--text-primary);
1298
+ margin-bottom: 0.5rem;
1299
+ font-weight: 700;
1300
+ }
1301
+
1302
+ .stat-card p {
1303
+ color: var(--text-secondary);
1304
+ font-size: 0.9rem;
1305
+ margin: 0;
1306
+ }
1307
+
1308
+ .analytics-chart {
1309
+ background: rgba(0, 212, 255, 0.05);
1310
+ padding: 2rem;
1311
+ border-radius: 15px;
1312
+ border: 2px solid rgba(0, 212, 255, 0.1);
1313
+ }
1314
+
1315
+ .analytics-chart h3 {
1316
+ color: var(--accent-color);
1317
+ margin-bottom: 1.5rem;
1318
+ font-size: 1.3rem;
1319
+ }
1320
+
1321
+ .usage-chart {
1322
+ display: flex;
1323
+ flex-direction: column;
1324
+ gap: 1rem;
1325
+ }
1326
+
1327
+ .chart-bar {
1328
+ display: flex;
1329
+ align-items: center;
1330
+ gap: 1rem;
1331
+ }
1332
+
1333
+ .chart-label {
1334
+ min-width: 120px;
1335
+ color: var(--text-primary);
1336
+ font-size: 0.95rem;
1337
+ font-weight: 500;
1338
+ }
1339
+
1340
+ .chart-bar-container {
1341
+ flex: 1;
1342
+ height: 30px;
1343
+ background: rgba(255, 255, 255, 0.05);
1344
+ border-radius: 15px;
1345
+ overflow: hidden;
1346
+ position: relative;
1347
+ }
1348
+
1349
+ .chart-bar-fill {
1350
+ height: 100%;
1351
+ background: linear-gradient(90deg, var(--accent-color), var(--success-color));
1352
+ border-radius: 15px;
1353
+ transition: width 0.5s ease;
1354
+ display: flex;
1355
+ align-items: center;
1356
+ justify-content: flex-end;
1357
+ padding-right: 0.8rem;
1358
+ color: white;
1359
+ font-size: 0.85rem;
1360
+ font-weight: 600;
1361
+ }
1362
+
1363
+ /* ===== Add Platform Modal ===== */
1364
+ .add-platform-modal {
1365
+ max-width: 550px;
1366
+ }
1367
+
1368
+ .add-platform-body {
1369
+ padding: 2rem;
1370
+ }
1371
+
1372
+ .form-group {
1373
+ margin-bottom: 1.5rem;
1374
+ }
1375
+
1376
+ .form-group label {
1377
+ display: block;
1378
+ color: var(--text-primary);
1379
+ font-weight: 600;
1380
+ margin-bottom: 0.5rem;
1381
+ font-size: 0.95rem;
1382
+ }
1383
+
1384
+ .form-group input,
1385
+ .form-group select {
1386
+ width: 100%;
1387
+ padding: 0.9rem;
1388
+ background: var(--secondary-bg);
1389
+ border: 2px solid rgba(0, 212, 255, 0.3);
1390
+ border-radius: 10px;
1391
+ color: var(--text-primary);
1392
+ font-size: 1rem;
1393
+ transition: all 0.3s ease;
1394
+ }
1395
+
1396
+ .form-group input:focus,
1397
+ .form-group select:focus {
1398
+ outline: none;
1399
+ border-color: var(--accent-color);
1400
+ box-shadow: 0 0 15px rgba(0, 212, 255, 0.2);
1401
+ }
1402
+
1403
+ .form-group input[type="color"] {
1404
+ height: 50px;
1405
+ cursor: pointer;
1406
+ }
1407
+
1408
+ .submit-btn {
1409
+ width: 100%;
1410
+ padding: 1rem;
1411
+ background: linear-gradient(135deg, var(--accent-color), var(--success-color));
1412
+ border: none;
1413
+ border-radius: 12px;
1414
+ color: white;
1415
+ font-size: 1.1rem;
1416
+ font-weight: 600;
1417
+ cursor: pointer;
1418
+ transition: all 0.3s ease;
1419
+ }
1420
+
1421
+ .submit-btn:hover {
1422
+ transform: translateY(-2px);
1423
+ box-shadow: 0 8px 25px rgba(0, 212, 255, 0.4);
1424
+ }
1425
+
1426
+ /* ===== Note Modal ===== */
1427
+ .note-modal {
1428
+ max-width: 550px;
1429
+ }
1430
+
1431
+ .note-body {
1432
+ padding: 2rem;
1433
+ }
1434
+
1435
+ .note-body h3 {
1436
+ color: var(--accent-color);
1437
+ margin-bottom: 1rem;
1438
+ font-size: 1.5rem;
1439
+ }
1440
+
1441
+ .note-body textarea {
1442
+ width: 100%;
1443
+ padding: 1rem;
1444
+ background: var(--secondary-bg);
1445
+ border: 2px solid rgba(0, 212, 255, 0.3);
1446
+ border-radius: 12px;
1447
+ color: var(--text-primary);
1448
+ font-size: 1rem;
1449
+ font-family: inherit;
1450
+ resize: vertical;
1451
+ transition: all 0.3s ease;
1452
+ }
1453
+
1454
+ .note-body textarea:focus {
1455
+ outline: none;
1456
+ border-color: var(--accent-color);
1457
+ box-shadow: 0 0 15px rgba(0, 212, 255, 0.2);
1458
+ }
1459
+
1460
+ .note-actions {
1461
+ display: flex;
1462
+ gap: 1rem;
1463
+ margin-top: 1.5rem;
1464
+ }
1465
+
1466
+ .cancel-btn,
1467
+ .save-btn,
1468
+ .delete-btn {
1469
+ flex: 1;
1470
+ padding: 0.9rem;
1471
+ border: none;
1472
+ border-radius: 10px;
1473
+ font-size: 1rem;
1474
+ font-weight: 600;
1475
+ cursor: pointer;
1476
+ transition: all 0.3s ease;
1477
+ }
1478
+
1479
+ .cancel-btn {
1480
+ background: rgba(255, 255, 255, 0.1);
1481
+ color: var(--text-primary);
1482
+ border: 2px solid rgba(255, 255, 255, 0.2);
1483
+ }
1484
+
1485
+ .cancel-btn:hover {
1486
+ background: rgba(255, 255, 255, 0.15);
1487
+ }
1488
+
1489
+ .save-btn {
1490
+ background: linear-gradient(135deg, var(--accent-color), var(--success-color));
1491
+ color: white;
1492
+ }
1493
+
1494
+ .save-btn:hover {
1495
+ transform: translateY(-2px);
1496
+ box-shadow: 0 5px 20px rgba(0, 212, 255, 0.4);
1497
+ }
1498
+
1499
+ .delete-btn {
1500
+ background: var(--danger-color);
1501
+ color: white;
1502
+ }
1503
+
1504
+ .delete-btn:hover {
1505
+ transform: translateY(-2px);
1506
+ box-shadow: 0 5px 20px rgba(255, 71, 87, 0.4);
1507
+ }
1508
+
1509
+ /* ===== Time Tracker Widget ===== */
1510
+ .time-tracker {
1511
+ position: fixed;
1512
+ bottom: 2rem;
1513
+ right: 2rem;
1514
+ background: var(--secondary-bg);
1515
+ padding: 1rem 1.5rem;
1516
+ border-radius: 15px;
1517
+ border: 2px solid var(--accent-color);
1518
+ box-shadow: 0 10px 40px rgba(0, 212, 255, 0.3);
1519
+ display: flex;
1520
+ align-items: center;
1521
+ gap: 1rem;
1522
+ z-index: 999;
1523
+ animation: slideInRight 0.5s ease;
1524
+ }
1525
+
1526
+ @keyframes slideInRight {
1527
+ from {
1528
+ transform: translateX(400px);
1529
+ opacity: 0;
1530
+ }
1531
+ to {
1532
+ transform: translateX(0);
1533
+ opacity: 1;
1534
+ }
1535
+ }
1536
+
1537
+ .tracker-header {
1538
+ display: flex;
1539
+ align-items: center;
1540
+ gap: 0.5rem;
1541
+ color: var(--text-primary);
1542
+ font-weight: 600;
1543
+ }
1544
+
1545
+ .tracker-header i {
1546
+ color: var(--accent-color);
1547
+ font-size: 1.2rem;
1548
+ }
1549
+
1550
+ #trackerTime {
1551
+ color: var(--accent-color);
1552
+ font-family: 'Courier New', monospace;
1553
+ font-size: 1.1rem;
1554
+ }
1555
+
1556
+ .tracker-stop {
1557
+ padding: 0.5rem 1rem;
1558
+ background: var(--danger-color);
1559
+ border: none;
1560
+ border-radius: 8px;
1561
+ color: white;
1562
+ cursor: pointer;
1563
+ font-size: 0.9rem;
1564
+ transition: all 0.3s ease;
1565
+ }
1566
+
1567
+ .tracker-stop:hover {
1568
+ transform: scale(1.05);
1569
+ box-shadow: 0 5px 15px rgba(255, 71, 87, 0.4);
1570
+ }
1571
+
1572
+ /* ===== AI Caption Generator Modal ===== */
1573
+ .ai-caption-modal {
1574
+ max-width: 1000px;
1575
+ max-height: 90vh;
1576
+ }
1577
+
1578
+ .ai-caption-body {
1579
+ padding: 2rem;
1580
+ overflow-y: auto;
1581
+ max-height: calc(90vh - 80px);
1582
+ }
1583
+
1584
+ /* Upload Section */
1585
+ .upload-section {
1586
+ display: flex;
1587
+ justify-content: center;
1588
+ align-items: center;
1589
+ min-height: 400px;
1590
+ }
1591
+
1592
+ .upload-area {
1593
+ width: 100%;
1594
+ max-width: 500px;
1595
+ padding: 3rem;
1596
+ border: 3px dashed rgba(0, 212, 255, 0.3);
1597
+ border-radius: 20px;
1598
+ text-align: center;
1599
+ background: rgba(0, 212, 255, 0.05);
1600
+ transition: all 0.3s ease;
1601
+ cursor: pointer;
1602
+ }
1603
+
1604
+ .upload-area:hover {
1605
+ border-color: var(--accent-color);
1606
+ background: rgba(0, 212, 255, 0.1);
1607
+ transform: translateY(-5px);
1608
+ }
1609
+
1610
+ .upload-area i {
1611
+ font-size: 4rem;
1612
+ color: var(--accent-color);
1613
+ margin-bottom: 1.5rem;
1614
+ }
1615
+
1616
+ .upload-area h3 {
1617
+ color: var(--text-primary);
1618
+ font-size: 1.5rem;
1619
+ margin-bottom: 0.5rem;
1620
+ }
1621
+
1622
+ .upload-area p {
1623
+ color: var(--text-secondary);
1624
+ margin-bottom: 1.5rem;
1625
+ }
1626
+
1627
+ .upload-btn {
1628
+ padding: 0.9rem 2rem;
1629
+ background: linear-gradient(135deg, var(--accent-color), var(--success-color));
1630
+ border: none;
1631
+ border-radius: 12px;
1632
+ color: white;
1633
+ font-size: 1rem;
1634
+ font-weight: 600;
1635
+ cursor: pointer;
1636
+ transition: all 0.3s ease;
1637
+ }
1638
+
1639
+ .upload-btn:hover {
1640
+ transform: translateY(-2px);
1641
+ box-shadow: 0 8px 25px rgba(0, 212, 255, 0.4);
1642
+ }
1643
+
1644
+ /* Results Section */
1645
+ .results-section {
1646
+ display: grid;
1647
+ grid-template-columns: 1fr 1.5fr;
1648
+ gap: 2rem;
1649
+ }
1650
+
1651
+ .image-preview-container {
1652
+ position: relative;
1653
+ }
1654
+
1655
+ .image-preview-container img {
1656
+ width: 100%;
1657
+ max-height: 500px;
1658
+ object-fit: contain;
1659
+ border-radius: 15px;
1660
+ border: 2px solid rgba(0, 212, 255, 0.2);
1661
+ background: rgba(0, 0, 0, 0.3);
1662
+ }
1663
+
1664
+ .change-image-btn {
1665
+ width: 100%;
1666
+ margin-top: 1rem;
1667
+ padding: 0.8rem;
1668
+ background: rgba(255, 255, 255, 0.1);
1669
+ border: 2px solid rgba(255, 255, 255, 0.2);
1670
+ border-radius: 10px;
1671
+ color: var(--text-primary);
1672
+ font-size: 0.95rem;
1673
+ font-weight: 600;
1674
+ cursor: pointer;
1675
+ transition: all 0.3s ease;
1676
+ }
1677
+
1678
+ .change-image-btn:hover {
1679
+ background: rgba(255, 255, 255, 0.15);
1680
+ border-color: var(--accent-color);
1681
+ }
1682
+
1683
+ /* AI Results */
1684
+ .ai-results {
1685
+ display: flex;
1686
+ flex-direction: column;
1687
+ gap: 1.5rem;
1688
+ }
1689
+
1690
+ .result-card {
1691
+ background: rgba(0, 212, 255, 0.05);
1692
+ border: 2px solid rgba(0, 212, 255, 0.2);
1693
+ border-radius: 15px;
1694
+ padding: 1.5rem;
1695
+ transition: all 0.3s ease;
1696
+ }
1697
+
1698
+ .result-card:hover {
1699
+ border-color: var(--accent-color);
1700
+ background: rgba(0, 212, 255, 0.08);
1701
+ }
1702
+
1703
+ .result-header {
1704
+ display: flex;
1705
+ align-items: center;
1706
+ gap: 0.8rem;
1707
+ margin-bottom: 1rem;
1708
+ }
1709
+
1710
+ .result-header i {
1711
+ font-size: 1.3rem;
1712
+ color: var(--accent-color);
1713
+ }
1714
+
1715
+ .result-header h4 {
1716
+ color: var(--text-primary);
1717
+ font-size: 1.1rem;
1718
+ margin: 0;
1719
+ }
1720
+
1721
+ .result-content {
1722
+ color: var(--text-primary);
1723
+ font-size: 1rem;
1724
+ line-height: 1.8;
1725
+ min-height: 60px;
1726
+ padding: 1rem;
1727
+ background: rgba(0, 0, 0, 0.2);
1728
+ border-radius: 10px;
1729
+ }
1730
+
1731
+ .result-content p {
1732
+ margin: 0.5rem 0;
1733
+ }
1734
+
1735
+ /* Loading Animation */
1736
+ .loading-dots {
1737
+ display: flex;
1738
+ gap: 0.5rem;
1739
+ justify-content: center;
1740
+ align-items: center;
1741
+ height: 60px;
1742
+ }
1743
+
1744
+ .loading-dots span {
1745
+ width: 10px;
1746
+ height: 10px;
1747
+ background: var(--accent-color);
1748
+ border-radius: 50%;
1749
+ animation: loadingBounce 1.4s infinite ease-in-out both;
1750
+ }
1751
+
1752
+ .loading-dots span:nth-child(1) {
1753
+ animation-delay: -0.32s;
1754
+ }
1755
+
1756
+ .loading-dots span:nth-child(2) {
1757
+ animation-delay: -0.16s;
1758
+ }
1759
+
1760
+ @keyframes loadingBounce {
1761
+ 0%, 80%, 100% {
1762
+ transform: scale(0);
1763
+ }
1764
+ 40% {
1765
+ transform: scale(1);
1766
+ }
1767
+ }
1768
+
1769
+ /* Post Section */
1770
+ .post-section {
1771
+ background: rgba(0, 212, 255, 0.05);
1772
+ border: 2px solid rgba(0, 212, 255, 0.2);
1773
+ border-radius: 15px;
1774
+ padding: 1.5rem;
1775
+ }
1776
+
1777
+ .post-section h4 {
1778
+ color: var(--text-primary);
1779
+ font-size: 1.1rem;
1780
+ margin-bottom: 1rem;
1781
+ display: flex;
1782
+ align-items: center;
1783
+ gap: 0.5rem;
1784
+ }
1785
+
1786
+ .platform-select-grid {
1787
+ display: grid;
1788
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1789
+ gap: 1rem;
1790
+ margin-bottom: 1.5rem;
1791
+ }
1792
+
1793
+ .platform-post-btn {
1794
+ padding: 0.9rem;
1795
+ background: var(--secondary-bg);
1796
+ border: 2px solid rgba(0, 212, 255, 0.3);
1797
+ border-radius: 12px;
1798
+ color: var(--text-primary);
1799
+ font-size: 0.95rem;
1800
+ font-weight: 600;
1801
+ cursor: pointer;
1802
+ transition: all 0.3s ease;
1803
+ display: flex;
1804
+ align-items: center;
1805
+ justify-content: center;
1806
+ gap: 0.5rem;
1807
+ }
1808
+
1809
+ .platform-post-btn:hover {
1810
+ background: var(--accent-color);
1811
+ color: var(--primary-bg);
1812
+ transform: translateY(-3px);
1813
+ box-shadow: 0 5px 20px rgba(0, 212, 255, 0.3);
1814
+ }
1815
+
1816
+ .platform-post-btn i {
1817
+ font-size: 1.2rem;
1818
+ }
1819
+
1820
+ .copy-buttons {
1821
+ display: flex;
1822
+ gap: 1rem;
1823
+ flex-wrap: wrap;
1824
+ }
1825
+
1826
+ .copy-btn {
1827
+ flex: 1;
1828
+ min-width: 140px;
1829
+ padding: 0.8rem 1.2rem;
1830
+ background: rgba(0, 255, 136, 0.1);
1831
+ border: 2px solid rgba(0, 255, 136, 0.3);
1832
+ border-radius: 10px;
1833
+ color: var(--success-color);
1834
+ font-size: 0.9rem;
1835
+ font-weight: 600;
1836
+ cursor: pointer;
1837
+ transition: all 0.3s ease;
1838
+ display: flex;
1839
+ align-items: center;
1840
+ justify-content: center;
1841
+ gap: 0.5rem;
1842
+ }
1843
+
1844
+ .copy-btn:hover {
1845
+ background: var(--success-color);
1846
+ color: var(--primary-bg);
1847
+ transform: translateY(-2px);
1848
+ box-shadow: 0 5px 15px rgba(0, 255, 136, 0.3);
1849
+ }
1850
+
1851
+ .copy-btn.copied {
1852
+ background: var(--success-color);
1853
+ color: white;
1854
+ }
1855
+
1856
+ /* Responsive AI Modal */
1857
+ @media (max-width: 768px) {
1858
+ .results-section {
1859
+ grid-template-columns: 1fr;
1860
+ }
1861
+
1862
+ .platform-select-grid {
1863
+ grid-template-columns: repeat(2, 1fr);
1864
+ }
1865
+
1866
+ .copy-buttons {
1867
+ flex-direction: column;
1868
+ }
1869
+
1870
+ .copy-btn {
1871
+ width: 100%;
1872
+ }
1873
+ }