shell-mirror 1.5.69 → 1.5.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shell-mirror",
3
- "version": "1.5.69",
3
+ "version": "1.5.70",
4
4
  "description": "Access your Mac shell from any device securely. Perfect for mobile coding with Claude Code CLI, Gemini CLI, and any shell tool.",
5
5
  "main": "server.js",
6
6
  "bin": {
@@ -64,6 +64,26 @@ body {
64
64
  backdrop-filter: blur(10px);
65
65
  }
66
66
 
67
+ .help-button {
68
+ background: rgba(255, 255, 255, 0.2);
69
+ border: 1px solid rgba(255, 255, 255, 0.3);
70
+ border-radius: 8px;
71
+ color: white;
72
+ padding: 8px 16px;
73
+ cursor: pointer;
74
+ transition: all 0.2s ease;
75
+ font-size: 0.9rem;
76
+ font-weight: 500;
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 6px;
80
+ }
81
+
82
+ .help-button:hover {
83
+ background: rgba(255, 255, 255, 0.3);
84
+ transform: translateY(-1px);
85
+ }
86
+
67
87
  .user-info {
68
88
  display: flex;
69
89
  align-items: center;
@@ -880,6 +900,239 @@ body {
880
900
  text-align: center;
881
901
  }
882
902
 
903
+ /* Empty Agent State Styles */
904
+ .empty-agent-state {
905
+ padding: 20px;
906
+ }
907
+
908
+ .empty-state-header {
909
+ text-align: center;
910
+ margin-bottom: 32px;
911
+ }
912
+
913
+ .empty-state-header h3 {
914
+ margin: 0 0 8px 0;
915
+ font-size: 1.4rem;
916
+ color: #333;
917
+ font-weight: 600;
918
+ }
919
+
920
+ .empty-state-header p {
921
+ margin: 0;
922
+ color: #666;
923
+ font-size: 1rem;
924
+ }
925
+
926
+ .empty-state-steps {
927
+ max-width: 600px;
928
+ margin: 0 auto;
929
+ }
930
+
931
+ .empty-state-step {
932
+ display: flex;
933
+ gap: 16px;
934
+ margin-bottom: 24px;
935
+ align-items: flex-start;
936
+ }
937
+
938
+ .empty-step-number {
939
+ flex-shrink: 0;
940
+ width: 36px;
941
+ height: 36px;
942
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
943
+ color: white;
944
+ border-radius: 50%;
945
+ display: flex;
946
+ align-items: center;
947
+ justify-content: center;
948
+ font-weight: 600;
949
+ font-size: 1.1rem;
950
+ }
951
+
952
+ .empty-step-content {
953
+ flex: 1;
954
+ }
955
+
956
+ .empty-step-content h4 {
957
+ margin: 0 0 10px 0;
958
+ font-size: 1.05rem;
959
+ font-weight: 600;
960
+ color: #333;
961
+ }
962
+
963
+ .inline-command-box {
964
+ background: #2d3748;
965
+ border-radius: 8px;
966
+ padding: 14px 16px;
967
+ display: flex;
968
+ align-items: center;
969
+ justify-content: space-between;
970
+ gap: 12px;
971
+ }
972
+
973
+ .inline-command-box code {
974
+ font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
975
+ font-size: 0.95rem;
976
+ color: #48bb78;
977
+ flex: 1;
978
+ font-weight: 500;
979
+ }
980
+
981
+ .inline-copy-btn {
982
+ background: #667eea;
983
+ color: white;
984
+ border: none;
985
+ border-radius: 6px;
986
+ padding: 7px 14px;
987
+ font-size: 0.85rem;
988
+ cursor: pointer;
989
+ transition: all 0.2s ease;
990
+ flex-shrink: 0;
991
+ font-weight: 500;
992
+ }
993
+
994
+ .inline-copy-btn:hover {
995
+ background: #5568d3;
996
+ }
997
+
998
+ .inline-copy-btn:active {
999
+ transform: scale(0.95);
1000
+ }
1001
+
1002
+ .empty-state-footer {
1003
+ text-align: center;
1004
+ margin-top: 32px;
1005
+ padding-top: 24px;
1006
+ border-top: 1px solid #eee;
1007
+ }
1008
+
1009
+ .empty-state-footer p {
1010
+ margin: 0;
1011
+ color: #666;
1012
+ font-size: 0.95rem;
1013
+ }
1014
+
1015
+ /* Help Modal Styles */
1016
+ .help-modal-content {
1017
+ font-size: 0.95rem;
1018
+ }
1019
+
1020
+ .help-intro {
1021
+ margin-top: 0;
1022
+ margin-bottom: 24px;
1023
+ color: #666;
1024
+ font-size: 1rem;
1025
+ }
1026
+
1027
+ .help-step {
1028
+ display: flex;
1029
+ gap: 16px;
1030
+ margin-bottom: 24px;
1031
+ align-items: flex-start;
1032
+ }
1033
+
1034
+ .step-number {
1035
+ flex-shrink: 0;
1036
+ width: 32px;
1037
+ height: 32px;
1038
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
1039
+ color: white;
1040
+ border-radius: 50%;
1041
+ display: flex;
1042
+ align-items: center;
1043
+ justify-content: center;
1044
+ font-weight: 600;
1045
+ font-size: 0.95rem;
1046
+ }
1047
+
1048
+ .step-content {
1049
+ flex: 1;
1050
+ }
1051
+
1052
+ .step-content h4 {
1053
+ margin: 0 0 12px 0;
1054
+ font-size: 1.05rem;
1055
+ font-weight: 600;
1056
+ color: #333;
1057
+ }
1058
+
1059
+ .command-box {
1060
+ background: #f8f9fa;
1061
+ border: 1px solid #e1e4e8;
1062
+ border-radius: 8px;
1063
+ padding: 12px 14px;
1064
+ display: flex;
1065
+ align-items: center;
1066
+ justify-content: space-between;
1067
+ gap: 12px;
1068
+ margin-bottom: 8px;
1069
+ }
1070
+
1071
+ .command-box code {
1072
+ font-family: 'Monaco', 'Menlo', 'Courier New', monospace;
1073
+ font-size: 0.9rem;
1074
+ color: #1a1a1a;
1075
+ flex: 1;
1076
+ }
1077
+
1078
+ .copy-btn {
1079
+ background: #667eea;
1080
+ color: white;
1081
+ border: none;
1082
+ border-radius: 6px;
1083
+ padding: 6px 12px;
1084
+ font-size: 0.85rem;
1085
+ cursor: pointer;
1086
+ transition: all 0.2s ease;
1087
+ flex-shrink: 0;
1088
+ }
1089
+
1090
+ .copy-btn:hover {
1091
+ background: #5568d3;
1092
+ }
1093
+
1094
+ .copy-btn:active {
1095
+ transform: scale(0.95);
1096
+ }
1097
+
1098
+ .help-note {
1099
+ margin: 8px 0 0 0;
1100
+ font-size: 0.85rem;
1101
+ color: #666;
1102
+ font-style: italic;
1103
+ }
1104
+
1105
+ .help-troubleshooting {
1106
+ margin-top: 32px;
1107
+ padding: 16px;
1108
+ background: #f8f9fa;
1109
+ border-radius: 8px;
1110
+ border-left: 4px solid #667eea;
1111
+ }
1112
+
1113
+ .help-troubleshooting h4 {
1114
+ margin: 0 0 12px 0;
1115
+ font-size: 1rem;
1116
+ font-weight: 600;
1117
+ color: #333;
1118
+ }
1119
+
1120
+ .help-troubleshooting ul {
1121
+ margin: 0;
1122
+ padding-left: 20px;
1123
+ list-style-type: disc;
1124
+ }
1125
+
1126
+ .help-troubleshooting li {
1127
+ margin-bottom: 8px;
1128
+ color: #555;
1129
+ font-size: 0.9rem;
1130
+ }
1131
+
1132
+ .help-troubleshooting li:last-child {
1133
+ margin-bottom: 0;
1134
+ }
1135
+
883
1136
  /* Agent Notifications */
884
1137
  .agent-notification {
885
1138
  position: fixed;
@@ -504,6 +504,9 @@ class ShellMirrorDashboard {
504
504
  <span id="connection-status" class="connection-status" style="display: none;"></span>
505
505
  <span id="refresh-status" class="refresh-status">Initializing...</span>
506
506
  </div>
507
+ <button class="help-button" onclick="dashboard.showAgentInstructions()" title="How to Use">
508
+ 📖 How to Use
509
+ </button>
507
510
  <div class="user-info">
508
511
  <span class="user-name">${this.user.name || this.user.email}</span>
509
512
  <div class="user-dropdown">
@@ -607,7 +610,46 @@ class ShellMirrorDashboard {
607
610
  </div>
608
611
  </div>
609
612
  <div class="card-content">
610
- ${agentCount > 0 ? agentsHtml : '<p class="no-data">No active agents. <a href="#" onclick="dashboard.showAgentInstructions()">Set up an agent</a></p>'}
613
+ ${agentCount > 0 ? agentsHtml : this.renderEmptyAgentState()}
614
+ </div>
615
+ </div>
616
+ `;
617
+ }
618
+
619
+ renderEmptyAgentState() {
620
+ return `
621
+ <div class="empty-agent-state">
622
+ <div class="empty-state-header">
623
+ <h3>🚀 Get Started with Shell Mirror</h3>
624
+ <p>Connect your Mac in 2 simple steps:</p>
625
+ </div>
626
+
627
+ <div class="empty-state-steps">
628
+ <div class="empty-state-step">
629
+ <div class="empty-step-number">1</div>
630
+ <div class="empty-step-content">
631
+ <h4>Install the agent</h4>
632
+ <div class="inline-command-box">
633
+ <code>npm install -g shell-mirror</code>
634
+ <button class="inline-copy-btn" onclick="navigator.clipboard.writeText('npm install -g shell-mirror'); this.textContent = 'Copied!'; setTimeout(() => this.textContent = 'Copy', 2000)">Copy</button>
635
+ </div>
636
+ </div>
637
+ </div>
638
+
639
+ <div class="empty-state-step">
640
+ <div class="empty-step-number">2</div>
641
+ <div class="empty-step-content">
642
+ <h4>Run the agent</h4>
643
+ <div class="inline-command-box">
644
+ <code>shell-mirror</code>
645
+ <button class="inline-copy-btn" onclick="navigator.clipboard.writeText('shell-mirror'); this.textContent = 'Copied!'; setTimeout(() => this.textContent = 'Copy', 2000)">Copy</button>
646
+ </div>
647
+ </div>
648
+ </div>
649
+ </div>
650
+
651
+ <div class="empty-state-footer">
652
+ <p>✨ Your agent will appear here once connected</p>
611
653
  </div>
612
654
  </div>
613
655
  `;
@@ -1186,8 +1228,45 @@ class ShellMirrorDashboard {
1186
1228
  }
1187
1229
 
1188
1230
  showAgentInstructions() {
1189
- // TODO: Show modal with agent setup instructions
1190
- alert('Agent setup instructions coming soon!');
1231
+ const content = `
1232
+ <div class="help-modal-content">
1233
+ <p class="help-intro">Get started in 2 easy steps:</p>
1234
+
1235
+ <div class="help-step">
1236
+ <div class="step-number">1</div>
1237
+ <div class="step-content">
1238
+ <h4>Install the agent</h4>
1239
+ <div class="command-box">
1240
+ <code>npm install -g shell-mirror</code>
1241
+ <button class="copy-btn" onclick="navigator.clipboard.writeText('npm install -g shell-mirror'); this.textContent = 'Copied!'; setTimeout(() => this.textContent = 'Copy', 2000)">Copy</button>
1242
+ </div>
1243
+ </div>
1244
+ </div>
1245
+
1246
+ <div class="help-step">
1247
+ <div class="step-number">2</div>
1248
+ <div class="step-content">
1249
+ <h4>Run the agent</h4>
1250
+ <div class="command-box">
1251
+ <code>shell-mirror</code>
1252
+ <button class="copy-btn" onclick="navigator.clipboard.writeText('shell-mirror'); this.textContent = 'Copied!'; setTimeout(() => this.textContent = 'Copy', 2000)">Copy</button>
1253
+ </div>
1254
+ <p class="help-note">The agent will automatically connect to your dashboard</p>
1255
+ </div>
1256
+ </div>
1257
+
1258
+ <div class="help-troubleshooting">
1259
+ <h4>💡 Troubleshooting</h4>
1260
+ <ul>
1261
+ <li>Make sure you're logged in with the same Google account</li>
1262
+ <li>Check that the agent is running in your terminal</li>
1263
+ <li>Refresh this dashboard after starting the agent</li>
1264
+ </ul>
1265
+ </div>
1266
+ </div>
1267
+ `;
1268
+
1269
+ this.showModal('🚀 How to Use Shell Mirror', content);
1191
1270
  }
1192
1271
 
1193
1272
  showSettings() {
@@ -176,6 +176,32 @@
176
176
  #agent-id-input { font-size: 1.2em; padding: 8px; width: 400px; margin-bottom: 1em; }
177
177
  #connect-btn { font-size: 1.2em; padding: 10px 20px; }
178
178
 
179
+ /* How to Use Button */
180
+ .how-to-use-btn {
181
+ position: fixed;
182
+ top: 20px;
183
+ left: 170px;
184
+ background: rgba(102, 126, 234, 0.9);
185
+ color: white;
186
+ border: none;
187
+ border-radius: 8px;
188
+ padding: 10px 16px;
189
+ cursor: pointer;
190
+ font-size: 0.9em;
191
+ font-weight: 500;
192
+ display: flex;
193
+ align-items: center;
194
+ gap: 6px;
195
+ z-index: 10000;
196
+ backdrop-filter: blur(10px);
197
+ transition: all 0.2s ease;
198
+ }
199
+
200
+ .how-to-use-btn:hover {
201
+ background: rgba(102, 126, 234, 1);
202
+ transform: translateY(-1px);
203
+ }
204
+
179
205
  /* Back to Dashboard Button */
180
206
  .back-to-dashboard {
181
207
  position: fixed;
@@ -234,6 +260,11 @@
234
260
  <span>←</span>
235
261
  <span>Dashboard</span>
236
262
  </a>
263
+
264
+ <!-- How to Use Button -->
265
+ <button class="how-to-use-btn" id="how-to-use-btn" onclick="showHelpModal()">
266
+ 📖 How to Use
267
+ </button>
237
268
 
238
269
  <div id="connect-container">
239
270
  <h2>Terminal Mirror</h2>
@@ -262,6 +293,51 @@
262
293
  <div id="terminal"></div>
263
294
  </div>
264
295
 
296
+ <!-- Help Modal -->
297
+ <div id="help-modal" style="display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.8); align-items: center; justify-content: center; z-index: 20000;">
298
+ <div style="background: white; border-radius: 12px; max-width: 500px; width: 90%; max-height: 80vh; overflow: hidden;">
299
+ <div style="padding: 20px 24px; border-bottom: 1px solid #eee; display: flex; justify-content: space-between; align-items: center;">
300
+ <h3 style="margin: 0; font-size: 1.2rem; color: #333;">🚀 How to Use Shell Mirror</h3>
301
+ <button onclick="closeHelpModal()" style="background: none; border: none; font-size: 1.5rem; cursor: pointer; padding: 0; width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; border-radius: 50%; color: #666;">×</button>
302
+ </div>
303
+ <div style="padding: 24px; max-height: 60vh; overflow-y: auto;">
304
+ <p style="margin-top: 0; margin-bottom: 24px; color: #666; font-size: 1rem;">Get started in 2 easy steps:</p>
305
+
306
+ <div style="display: flex; gap: 16px; margin-bottom: 24px; align-items: flex-start;">
307
+ <div style="flex-shrink: 0; width: 32px; height: 32px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 0.95rem;">1</div>
308
+ <div style="flex: 1;">
309
+ <h4 style="margin: 0 0 12px 0; font-size: 1.05rem; font-weight: 600; color: #333;">Install the agent</h4>
310
+ <div style="background: #f8f9fa; border: 1px solid #e1e4e8; border-radius: 8px; padding: 12px 14px; display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px;">
311
+ <code style="font-family: 'Monaco', 'Menlo', 'Courier New', monospace; font-size: 0.9rem; color: #1a1a1a; flex: 1;">npm install -g shell-mirror</code>
312
+ <button onclick="copyToClipboard('npm install -g shell-mirror', this)" style="background: #667eea; color: white; border: none; border-radius: 6px; padding: 6px 12px; font-size: 0.85rem; cursor: pointer; transition: all 0.2s ease; flex-shrink: 0;">Copy</button>
313
+ </div>
314
+ </div>
315
+ </div>
316
+
317
+ <div style="display: flex; gap: 16px; margin-bottom: 24px; align-items: flex-start;">
318
+ <div style="flex-shrink: 0; width: 32px; height: 32px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 0.95rem;">2</div>
319
+ <div style="flex: 1;">
320
+ <h4 style="margin: 0 0 12px 0; font-size: 1.05rem; font-weight: 600; color: #333;">Run the agent</h4>
321
+ <div style="background: #f8f9fa; border: 1px solid #e1e4e8; border-radius: 8px; padding: 12px 14px; display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px;">
322
+ <code style="font-family: 'Monaco', 'Menlo', 'Courier New', monospace; font-size: 0.9rem; color: #1a1a1a; flex: 1;">shell-mirror</code>
323
+ <button onclick="copyToClipboard('shell-mirror', this)" style="background: #667eea; color: white; border: none; border-radius: 6px; padding: 6px 12px; font-size: 0.85rem; cursor: pointer; transition: all 0.2s ease; flex-shrink: 0;">Copy</button>
324
+ </div>
325
+ <p style="margin: 8px 0 0 0; font-size: 0.85rem; color: #666; font-style: italic;">The agent will automatically connect to your dashboard</p>
326
+ </div>
327
+ </div>
328
+
329
+ <div style="margin-top: 32px; padding: 16px; background: #f8f9fa; border-radius: 8px; border-left: 4px solid #667eea;">
330
+ <h4 style="margin: 0 0 12px 0; font-size: 1rem; font-weight: 600; color: #333;">💡 Troubleshooting</h4>
331
+ <ul style="margin: 0; padding-left: 20px; list-style-type: disc;">
332
+ <li style="margin-bottom: 8px; color: #555; font-size: 0.9rem;">Make sure you're logged in with the same Google account</li>
333
+ <li style="margin-bottom: 8px; color: #555; font-size: 0.9rem;">Check that the agent is running in your terminal</li>
334
+ <li style="margin-bottom: 0; color: #555; font-size: 0.9rem;">Refresh your dashboard after starting the agent</li>
335
+ </ul>
336
+ </div>
337
+ </div>
338
+ </div>
339
+ </div>
340
+
265
341
  <!-- Version Footer -->
266
342
  <footer style="background: #ff6b35; color: white; text-align: center; padding: 10px 0; font-size: 0.8rem; position: fixed; bottom: 0; left: 0; right: 0; z-index: 1000;">
267
343
  <div style="max-width: 1200px; margin: 0 auto;">
@@ -269,6 +345,39 @@
269
345
  </div>
270
346
  </footer>
271
347
 
348
+ <script>
349
+ // Help Modal Functions
350
+ function showHelpModal() {
351
+ const modal = document.getElementById('help-modal');
352
+ modal.style.display = 'flex';
353
+ }
354
+
355
+ function closeHelpModal() {
356
+ const modal = document.getElementById('help-modal');
357
+ modal.style.display = 'none';
358
+ }
359
+
360
+ function copyToClipboard(text, button) {
361
+ navigator.clipboard.writeText(text).then(() => {
362
+ const originalText = button.textContent;
363
+ button.textContent = 'Copied!';
364
+ setTimeout(() => {
365
+ button.textContent = originalText;
366
+ }, 2000);
367
+ }).catch(err => {
368
+ console.error('Failed to copy:', err);
369
+ });
370
+ }
371
+
372
+ // Close modal when clicking outside
373
+ document.addEventListener('click', function(event) {
374
+ const modal = document.getElementById('help-modal');
375
+ if (event.target === modal) {
376
+ closeHelpModal();
377
+ }
378
+ });
379
+ </script>
380
+
272
381
  <script src="/app/terminal.js?v=chunked-20250820"></script>
273
382
  </body>
274
383
  </html>
package/public/index.html CHANGED
@@ -199,6 +199,12 @@
199
199
  text-align: center;
200
200
  }
201
201
 
202
+ /* Quick Start Section */
203
+ .quick-start {
204
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
205
+ padding: 60px 0;
206
+ }
207
+
202
208
  /* Installation Code */
203
209
  .install-code {
204
210
  background: rgba(0, 0, 0, 0.3);
@@ -569,6 +575,57 @@
569
575
  </div>
570
576
  </section>
571
577
 
578
+ <!-- Quick Start Section -->
579
+ <section class="quick-start" id="quick-start">
580
+ <div class="container">
581
+ <h2 class="section-title" style="color: white; margin-bottom: 30px;">Quick Start</h2>
582
+ <p style="text-align: center; color: rgba(255, 255, 255, 0.9); font-size: 1.1rem; margin-bottom: 40px;">
583
+ Get started in 2 simple steps:
584
+ </p>
585
+
586
+ <div class="setup-steps">
587
+ <div class="setup-step">
588
+ <div class="step-number">1</div>
589
+ <div class="install-code">
590
+ <pre>npm install -g shell-mirror</pre>
591
+ <button class="copy-btn" onclick="copyToClipboard('npm install -g shell-mirror', this)" title="Copy to clipboard">
592
+ <svg width="16" height="16" fill="white" viewBox="0 0 16 16">
593
+ <path d="M4 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V2z"/>
594
+ <path d="M2 6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2v-2H4a2 2 0 0 1-2-2V6z"/>
595
+ </svg>
596
+ </button>
597
+ </div>
598
+ </div>
599
+
600
+ <div class="setup-step">
601
+ <div class="step-number">2</div>
602
+ <div class="install-code">
603
+ <pre>shell-mirror</pre>
604
+ <button class="copy-btn" onclick="copyToClipboard('shell-mirror', this)" title="Copy to clipboard">
605
+ <svg width="16" height="16" fill="white" viewBox="0 0 16 16">
606
+ <path d="M4 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V2z"/>
607
+ <path d="M2 6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2v-2H4a2 2 0 0 1-2-2V6z"/>
608
+ </svg>
609
+ </button>
610
+ </div>
611
+ </div>
612
+
613
+ <div class="setup-step">
614
+ <div class="step-number">3</div>
615
+ <button class="btn-google" onclick="handleGoogleLogin()">
616
+ <svg width="20" height="20" viewBox="0 0 24 24">
617
+ <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
618
+ <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
619
+ <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"/>
620
+ <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"/>
621
+ </svg>
622
+ Login with Google
623
+ </button>
624
+ </div>
625
+ </div>
626
+ </div>
627
+ </section>
628
+
572
629
  <!-- How It Works -->
573
630
  <section class="how-it-works" id="how-it-works">
574
631
  <div class="container">
@@ -696,6 +753,23 @@
696
753
 
697
754
 
698
755
  <script>
756
+ // Copy to clipboard function
757
+ function copyToClipboard(text, button) {
758
+ navigator.clipboard.writeText(text).then(() => {
759
+ // Show feedback
760
+ const originalHTML = button.innerHTML;
761
+ button.innerHTML = '<span style="font-size: 0.9rem;">✓</span>';
762
+ button.style.background = 'rgba(0, 255, 136, 0.3)';
763
+
764
+ setTimeout(() => {
765
+ button.innerHTML = originalHTML;
766
+ button.style.background = 'rgba(255, 255, 255, 0.1)';
767
+ }, 2000);
768
+ }).catch(err => {
769
+ console.error('Failed to copy:', err);
770
+ });
771
+ }
772
+
699
773
  // Check authentication status without auto-redirect
700
774
  async function checkAuthStatus() {
701
775
  try {