devusman commited on
Commit
fca968c
·
verified ·
1 Parent(s): 3363ce5
Files changed (4) hide show
  1. components/darkmode-toggle.js +82 -0
  2. components/navbar.js +3 -2
  3. index.html +1 -0
  4. style.css +23 -0
components/darkmode-toggle.js ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class DarkModeToggle extends HTMLElement {
2
+ connectedCallback() {
3
+ this.attachShadow({ mode: 'open' });
4
+ this.shadowRoot.innerHTML = `
5
+ <style>
6
+ .toggle-container {
7
+ display: flex;
8
+ align-items: center;
9
+ }
10
+ .toggle-switch {
11
+ position: relative;
12
+ display: inline-block;
13
+ width: 60px;
14
+ height: 30px;
15
+ margin: 0 10px;
16
+ }
17
+ .toggle-switch input {
18
+ opacity: 0;
19
+ width: 0;
20
+ height: 0;
21
+ }
22
+ .slider {
23
+ position: absolute;
24
+ cursor: pointer;
25
+ top: 0;
26
+ left: 0;
27
+ right: 0;
28
+ bottom: 0;
29
+ background-color: #4a5568;
30
+ transition: .4s;
31
+ border-radius: 34px;
32
+ }
33
+ .slider:before {
34
+ position: absolute;
35
+ content: "";
36
+ height: 22px;
37
+ width: 22px;
38
+ left: 4px;
39
+ bottom: 4px;
40
+ background-color: white;
41
+ transition: .4s;
42
+ border-radius: 50%;
43
+ }
44
+ input:checked + .slider {
45
+ background-color: #8b5cf6;
46
+ }
47
+ input:checked + .slider:before {
48
+ transform: translateX(30px);
49
+ }
50
+ .icon {
51
+ font-size: 1.2rem;
52
+ }
53
+ </style>
54
+ <div class="toggle-container">
55
+ <span class="icon">🌞</span>
56
+ <label class="toggle-switch">
57
+ <input type="checkbox">
58
+ <span class="slider"></span>
59
+ </label>
60
+ <span class="icon">🌜</span>
61
+ </div>
62
+ `;
63
+
64
+ const toggle = this.shadowRoot.querySelector('input');
65
+ toggle.addEventListener('change', this.toggleDarkMode.bind(this));
66
+
67
+ // Check for saved preference or system preference
68
+ if (localStorage.getItem('darkMode') === 'true' ||
69
+ (!localStorage.getItem('darkMode') && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
70
+ toggle.checked = true;
71
+ document.documentElement.classList.add('dark');
72
+ }
73
+ }
74
+
75
+ toggleDarkMode() {
76
+ const isDark = this.shadowRoot.querySelector('input').checked;
77
+ document.documentElement.classList.toggle('dark', isDark);
78
+ localStorage.setItem('darkMode', isDark);
79
+ }
80
+ }
81
+
82
+ customElements.define('darkmode-toggle', DarkModeToggle);
components/navbar.js CHANGED
@@ -81,8 +81,9 @@ class CustomNavbar extends HTMLElement {
81
  <div class="hidden md:block">
82
  <div class="ml-4 flex items-center space-x-4">
83
  <a href="/login" class="text-gray-400 hover:text-white px-3 py-2 text-sm font-medium">Sign In</a>
84
- <a href="/register" class="bg-gradient-to-r from-purple-500 to-blue-500 hover:from-purple-600 hover:to-blue-600 text-white px-4 py-2 rounded-lg text-sm font-medium transition-all duration-300">Get Started</a>
85
- </div>
 
86
  </div>
87
 
88
  <!-- Mobile menu button -->
 
81
  <div class="hidden md:block">
82
  <div class="ml-4 flex items-center space-x-4">
83
  <a href="/login" class="text-gray-400 hover:text-white px-3 py-2 text-sm font-medium">Sign In</a>
84
+ <darkmode-toggle></darkmode-toggle>
85
+ <a href="/register" class="bg-gradient-to-r from-purple-500 to-blue-500 hover:from-purple-600 hover:to-blue-600 text-white px-4 py-2 rounded-lg text-sm font-medium transition-all duration-300">Get Started</a>
86
+ </div>
87
  </div>
88
 
89
  <!-- Mobile menu button -->
index.html CHANGED
@@ -12,6 +12,7 @@
12
  <script src="components/footer.js"></script>
13
  <script src="components/cta-banner.js"></script>
14
  <script src="components/price-ticker.js"></script>
 
15
  </head>
16
  <body class="bg-gray-900 text-white font-sans flex flex-col min-h-screen">
17
  <custom-navbar></custom-navbar>
 
12
  <script src="components/footer.js"></script>
13
  <script src="components/cta-banner.js"></script>
14
  <script src="components/price-ticker.js"></script>
15
+ <script src="components/darkmode-toggle.js"></script>
16
  </head>
17
  <body class="bg-gray-900 text-white font-sans flex flex-col min-h-screen">
18
  <custom-navbar></custom-navbar>
style.css CHANGED
@@ -6,6 +6,29 @@ body {
6
  display: flex;
7
  flex-direction: column;
8
  min-height: 100vh;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
10
  /* Custom scrollbar */
11
  ::-webkit-scrollbar {
 
6
  display: flex;
7
  flex-direction: column;
8
  min-height: 100vh;
9
+ background-color: #f7fafc;
10
+ color: #1a202c;
11
+ }
12
+
13
+ .dark body {
14
+ background-color: #1a202c;
15
+ color: #f7fafc;
16
+ }
17
+
18
+ .dark .bg-gray-900 {
19
+ background-color: #0f172a;
20
+ }
21
+
22
+ .dark .bg-gray-800 {
23
+ background-color: #1e293b;
24
+ }
25
+
26
+ .dark .text-gray-400 {
27
+ color: #94a3b8;
28
+ }
29
+
30
+ .dark .border-gray-700 {
31
+ border-color: #334155;
32
  }
33
  /* Custom scrollbar */
34
  ::-webkit-scrollbar {