helldivers-theme 1.0.0 → 1.3.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62b71fc7140e025e87cb6118ac1410008e3ed8784c0a4fa27ce8cdd57df0268c
4
- data.tar.gz: ac47c226e2a2df5d7732ff4e142e0afe310065abc2b944b21b61739c306d1c69
3
+ metadata.gz: ef9bcafbe4a33ebd2c37dae783b384aac9544d37e8a860f5ad21454f19ad9628
4
+ data.tar.gz: fc9b4d7014ce7ba2ad1cae32201dd23a16050062b9f527f10f44b87b6e5b75ed
5
5
  SHA512:
6
- metadata.gz: de349890a0d6dd1e67438a6919b913b27e2514acf71cd0e71e6804935179e1bdf555cbd5f57300d9539c03ce409dcac86d445f86ff5f22a4c395dfbb64f8d449
7
- data.tar.gz: 28fd3dec607bccd9e124d7a95058ac75b04a692712f2b31f1d441f54b135c4ec05fecaf78bd532ecab26afe8eaaeeeb5bb43110b29c6c444f9c06ccb2a625a17
6
+ metadata.gz: 210ac1d24abe43601df9802ebc697c2a89ce29a720b6f1337232ecbd916102b331497dd19b56934702b4d25b167218b5bbaf56c2cb0ac19abc29950e11d1fbce
7
+ data.tar.gz: b48aa79fbb784e68a79e9e33cd1d96f72f483fc841ce39e578b3121da6c19e85385bc70bf8abd943ae112255b910bd8fa4b0d2b49172ac2a75e74f7f374b417c
data/_data/squad.yaml CHANGED
@@ -1,5 +1,3 @@
1
- # _data/squad.yml
2
-
3
1
  # --- GENERAL INFO ---
4
2
  squad_name: "Dagger Squad"
5
3
  motto: "\"Liberty never sleeps, and neither do we.\""
@@ -75,6 +73,37 @@ requirements:
75
73
  value: "ANY (TRY HARD)"
76
74
  status: "pending" # Shows yellow/orange
77
75
 
76
+ hubs:
77
+ - name: "PC Division"
78
+ platform: "STEAM / PSN"
79
+ logo: "pc-logo.png"
80
+ commander: "CMDR. VEX" # Specific leader for this hub
81
+ members: "150+ Active"
82
+ status: "OPERATIONAL"
83
+ description: "Primary command center for PC Helldivers. Specializing in high-precision orbital strikes and rapid deployment strategies."
84
+ discord_link: "https://discord.gg/your-pc-link"
85
+ color_theme: "#00f0ff" # Optional: Cyan for PC
86
+
87
+ - name: "PlayStation Command"
88
+ platform: "PS5 / PS4"
89
+ logo: "ps-logo.png"
90
+ commander: "LT. RAX"
91
+ members: "200+ Active"
92
+ status: "OPERATIONAL"
93
+ description: "The backbone of Super Earth's console forces. Experts in heavy armor, defensive holds, and extraction tactics."
94
+ discord_link: "https://discord.gg/your-ps-link"
95
+ color_theme: "#0055ff" # Optional: Blue for PS
96
+
97
+ - name: "Xbox Battalion"
98
+ platform: "SERIES X / ONE"
99
+ logo: "xbox-logo.png"
100
+ commander: "SGT. KORA"
101
+ members: "120+ Active"
102
+ status: "OPERATIONAL"
103
+ description: "Rising defenders of democracy on Xbox. Known for aggressive push strategies, camaraderie, and sheer firepower."
104
+ discord_link: "https://discord.gg/your-xbox-link"
105
+ color_theme: "#00ff00" # Optional: Green for Xbox
106
+
78
107
  # --- SQUAD LEADERS ---
79
108
 
80
109
  leaders:
@@ -29,10 +29,11 @@
29
29
 
30
30
  <nav class="main-nav">
31
31
  <a href="{{ '/' | relative_url }}" class="nav-link {% if page.url == '/' %}active{% endif %}">HOME</a>
32
- <a href="{{ '/about/' | relative_url }}" class="nav-link {% if page.url == '/about/' %}active{% endif %}">INTEL</a>
33
- <a href="{{ '/join/' | relative_url }}" class="nav-link {% if page.url == '/join/' %}active{% endif %}">ENLIST</a>
34
- <a href="{{ '/contact/' | relative_url }}" class="nav-link {% if page.url == '/contact/' %}active{% endif %}">COMMS</a>
35
- <a href="{{ '/watch/' | relative_url }}" class="nav-link {% if page.url == '/watch/' %}active{% endif %}">LIVE FEED<span class="live-dot"id="status-dot"></span>
32
+ <a href="{{ '/about/' | relative_url }}" class="nav-link {% if page.url == '/about/' %}active{% endif %}" onclick="if(typeof SFX!=='undefined')SFX.playClick()">INTEL</a>
33
+ <a href="{{ '/join/' | relative_url }}" class="nav-link {% if page.url == '/join/' %}active{% endif %}" onclick="if(typeof SFX!=='undefined')SFX.playClick()">ENLIST</a>
34
+ <a href="{{ '/contact/' | relative_url }}" class="nav-link {% if page.url == '/contact/' %}active{% endif %}" onclick="if(typeof SFX!=='undefined')SFX.playClick()">COMMS</a>
35
+ <a href="{{ '/hub/' | relative_url }}" class="nav-link {% if page.url == '/hub/' %}active{% endif %}" onclick="if(typeof SFX!=='undefined')SFX.playClick()">HUBS</a>
36
+ <a href="{{ '/watch/' | relative_url }}" class="nav-link {% if page.url == '/watch/' %}active{% endif %}" onclick="if(typeof SFX!=='undefined')SFX.playClick()">LIVE FEED<span class="live-dot"id="status-dot"></span>
36
37
  </a>
37
38
 
38
39
  </nav>
@@ -57,5 +58,8 @@
57
58
 
58
59
  <!-- Leader Profiles Script -->
59
60
  <script src="{{ '/assets/js/profile-modal.js' | relative_url }}"></script>
61
+
62
+ <!-- Sound Effects Generator -->
63
+ <script src="{{ '/assets/js/sfx.js' | relative_url }}"></script>
60
64
  </body>
61
- </html>
65
+ </html>
data/_sass/_base.scss CHANGED
@@ -1,88 +1,106 @@
1
- // _sass/_base.scss
2
-
3
- * {
4
- box-sizing: border-box;
5
- margin: 0;
6
- padding: 0;
7
- }
8
-
9
- body {
10
- background-color: $hd-blue-deep;
11
- color: $hd-white;
12
- font-family: $font-mono;
13
- min-height: 100vh;
14
- display: flex;
15
- justify-content: center;
16
- align-items: center;
17
- padding: 20px;
18
- overflow-x: hidden;
19
-
20
- // SPACE BACKGROUND
21
- // Using a deep space nebula image
22
- background-size: cover;
23
- background-position: center;
24
- background-attachment: fixed; // Parallax effect
25
-
26
- // Subtle animated stars could be added later, but this is a great start
27
- }
28
-
29
- // Optional: Add a subtle scanline overlay for that "screen" feel
30
- body::after {
31
- content: "";
32
- position: fixed;
33
- top: 0; left: 0; width: 100%; height: 100%;
34
- background: repeating-linear-gradient(
35
- 0deg,
36
- rgba(0, 0, 0, 0.1),
37
- rgba(0, 0, 0, 0.1) 1px,
38
- transparent 1px,
39
- transparent 2px
40
- );
41
- pointer-events: none;
42
- z-index: 9999;
43
- }
44
-
45
- // =========================================
46
- // PARTICLE SWIRL BACKGROUND
47
- // =========================================
48
-
49
- #particle-swirl {
50
- position: fixed;
51
- top: 0;
52
- left: 0;
53
- width: 100%;
54
- height: 100%;
55
- pointer-events: none; // Allows clicking through the particles
56
- z-index: 0; // Behind the terminal card (which is z-index 10+)
57
- overflow: hidden;
58
- perspective: 1000px;
59
- opacity: 0.6; // Adjust transparency so it doesn't distract from text
60
- }
61
-
62
- .wrap {
63
- position: absolute;
64
- top: 50%;
65
- left: 50%;
66
- width: 0;
67
- height: 0;
68
- transform-style: preserve-3d;
69
- animation: rotate-swirl 14s infinite linear;
70
- }
71
-
72
- @keyframes rotate-swirl {
73
- 100% {
74
- transform: rotateY(360deg) rotateX(360deg);
75
- }
76
- }
77
-
78
- .c {
79
- position: absolute;
80
- width: 3px;
81
- height: 3px;
82
- border-radius: 50%;
83
- opacity: 0;
84
- }
85
-
86
- .c {
87
- will-change: transform, opacity;
88
- }
1
+ // _sass/_base.scss
2
+
3
+ * {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ body {
10
+ background-color: $hd-blue-deep;
11
+ color: $hd-white;
12
+ font-family: $font-mono;
13
+ min-height: 100vh;
14
+ display: flex;
15
+ justify-content: center;
16
+ align-items: center;
17
+ padding: 20px;
18
+ overflow-x: hidden;
19
+
20
+ // SPACE BACKGROUND
21
+ // Using a deep space nebula image
22
+ background-size: cover;
23
+ background-position: center;
24
+ background-attachment: fixed; // Parallax effect
25
+
26
+ // Subtle animated stars could be added later, but this is a great start
27
+ }
28
+
29
+ // Optional: Add a subtle scanline overlay for that "screen" feel
30
+ body::after {
31
+ content: "";
32
+ position: fixed;
33
+ top: 0; left: 0; width: 100%; height: 100%;
34
+ background: repeating-linear-gradient(
35
+ 0deg,
36
+ rgba(0, 0, 0, 0.1),
37
+ rgba(0, 0, 0, 0.1) 1px,
38
+ transparent 1px,
39
+ transparent 2px
40
+ );
41
+ pointer-events: none;
42
+ z-index: 9999;
43
+ }
44
+
45
+ // =========================================
46
+ // PARTICLE SWIRL BACKGROUND
47
+ // =========================================
48
+
49
+ #particle-swirl {
50
+ position: fixed;
51
+ top: 0;
52
+ left: 0;
53
+ width: 100%;
54
+ height: 100%;
55
+ pointer-events: none; // Allows clicking through the particles
56
+ z-index: 0; // Behind the terminal card (which is z-index 10+)
57
+ overflow: hidden;
58
+ perspective: 1000px;
59
+ opacity: 0.6; // Adjust transparency so it doesn't distract from text
60
+ }
61
+
62
+ .wrap {
63
+ position: absolute;
64
+ top: 50%;
65
+ left: 50%;
66
+ width: 0;
67
+ height: 0;
68
+ transform-style: preserve-3d;
69
+ animation: rotate-swirl 14s infinite linear;
70
+ }
71
+
72
+ @keyframes rotate-swirl {
73
+ 100% {
74
+ transform: rotateY(360deg) rotateX(360deg);
75
+ }
76
+ }
77
+
78
+ .c {
79
+ position: absolute;
80
+ width: 3px;
81
+ height: 3px;
82
+ border-radius: 50%;
83
+ opacity: 0;
84
+ }
85
+
86
+ .c {
87
+ will-change: transform, opacity;
88
+ }
89
+
90
+ body {
91
+ font-size: 16px; // Base size for readability
92
+ line-height: 1.6;
93
+
94
+ @media (max-width: 768px) {
95
+ font-size: 15px; // Slightly smaller but still readable
96
+ }
97
+ }
98
+
99
+ // Ensure code/mono text doesn't get too tiny
100
+ code, pre, .font-mono {
101
+ font-size: 0.9em;
102
+
103
+ @media (max-width: 768px) {
104
+ font-size: 1em; // Scale up slightly on mobile
105
+ }
106
+ }
data/_sass/_layout.scss CHANGED
@@ -1,205 +1,308 @@
1
- // _sass/_layout.scss
2
-
3
- .terminal-wrapper {
4
- width: 100%;
5
- max-width: 1200px;
6
- display: flex;
7
- flex-direction: column;
8
- gap: 25px;
9
- position: relative;
10
- z-index: 10;
11
- }
12
-
13
- .terminal-header {
14
- display: flex;
15
- justify-content: space-between;
16
- align-items: center;
17
- padding: 20px 30px;
18
-
19
- // Glass Header
20
- background: rgba(2, 4, 10, 0.8);
21
- backdrop-filter: blur(10px);
22
- border-bottom: 2px solid $hd-gold;
23
- box-shadow: 0 10px 30px rgba(0,0,0,0.5);
24
-
25
- // Angled corners for sci-fi look
26
- clip-path: polygon(0 0, 100% 0, 100% 75%, 98% 100%, 2% 100%, 0 75%);
27
-
28
- h1 {
29
- font-family: $font-head;
30
- font-size: 3.5rem;
31
- color: $hd-white;
32
- text-transform: uppercase;
33
- margin: 0;
34
- text-shadow: 0 0 10px rgba($hd-gold, 0.6);
35
- letter-spacing: 2px;
36
-
37
- span {
38
- color: $hd-gold;
39
- }
40
- }
41
-
42
- .subtitle {
43
- color: $hd-cyan;
44
- font-size: 0.9rem;
45
- letter-spacing: 3px;
46
- text-shadow: 0 0 5px $hd-cyan;
47
- display: block;
48
- margin-top: 5px;
49
- }
50
- }
51
-
52
- .main-nav {
53
- display: flex;
54
- gap: 25px;
55
- }
56
-
57
- .nav-link {
58
- text-decoration: none;
59
- color: $hd-white;
60
- font-family: $font-head;
61
- font-size: 1.4rem;
62
- letter-spacing: 2px;
63
- transition: all 0.3s ease;
64
- text-transform: uppercase;
65
- position: relative;
66
-
67
- &:visited { color: $hd-white; }
68
-
69
- &:hover {
70
- color: $hd-cyan;
71
- text-shadow: 0 0 12px $hd-cyan;
72
- transform: translateY(-2px);
73
- }
74
-
75
- &.active {
76
- color: $hd-gold;
77
- text-shadow: 0 0 15px $hd-gold;
78
-
79
- // Little underline indicator
80
- &::after {
81
- content: '';
82
- position: absolute;
83
- bottom: -5px;
84
- left: 0;
85
- width: 100%;
86
- height: 2px;
87
- background: $hd-gold;
88
- box-shadow: 0 0 10px $hd-gold;
89
- }
90
- }
91
- }
92
-
93
- // Existing Red Pulse
94
- .live-dot {
95
- display: inline-block;
96
- width: 8px;
97
- height: 8px;
98
- background-color: $hd-red; // Default to Red (Offline)
99
- border-radius: 50%;
100
- margin-left: 6px;
101
- box-shadow: 0 0 5px $hd-red;
102
- animation: pulse-red 1.5s infinite;
103
- transition: all 0.5s ease; // Smooth color change
104
- flex-shrink: 0; // CRITICAL: Prevents the dot from squishing
105
- margin: 0; // Remove default margins, use gap in parent instead
106
- }
107
-
108
- // New Green Pulse (Added via JS when live)
109
- .live-dot.is-live {
110
- background-color: #0f0; // Bright Green
111
- box-shadow: 0 0 8px #0f0;
112
- animation: pulse-green 1.5s infinite;
113
- }
114
-
115
- @keyframes pulse-red {
116
- 0% { opacity: 1; transform: scale(1); }
117
- 50% { opacity: 0.5; transform: scale(1.2); }
118
- 100% { opacity: 1; transform: scale(1); }
119
- }
120
-
121
- @keyframes pulse-green {
122
- 0% { opacity: 1; transform: scale(1); box-shadow: 0 0 5px #0f0; }
123
- 50% { opacity: 0.6; transform: scale(1.3); box-shadow: 0 0 15px #0f0; }
124
- 100% { opacity: 1; transform: scale(1); box-shadow: 0 0 5px #0f0; }
125
- }
126
-
127
- // THE MAIN HOLOGRAPHIC CARD
128
-
129
- // _sass/_layout.scss
130
-
131
- .terminal-card {
132
- display: grid;
133
- // DEFAULT: Sidebar (280px) + Content (Rest)
134
- // This applies to the Home Page automatically because it has an <aside>
135
- grid-template-columns: 280px 1fr;
136
- gap: 25px;
137
-
138
- // Glassmorphism & Borders
139
- background: $glass-bg;
140
- backdrop-filter: blur(12px);
141
- -webkit-backdrop-filter: blur(12px);
142
- border: 1px solid $glass-border;
143
- border-top: 1px solid rgba($hd-gold, 0.6);
144
- border-left: 1px solid rgba($hd-cyan, 0.3);
145
- padding: 30px;
146
- border-radius: 4px;
147
- box-shadow: 0 20px 50px rgba(0,0,0,0.6), inset 0 0 30px rgba(0, 240, 255, 0.05);
148
- position: relative;
149
- min-height: 600px;
150
-
151
- // Decorative Corners
152
- &::before, &::after {
153
- content: '';
154
- position: absolute;
155
- width: 20px;
156
- height: 20px;
157
- border: 2px solid $hd-cyan;
158
- transition: all 0.3s ease;
159
- z-index: 10;
160
- }
161
- &::before { top: -2px; left: -2px; border-right: none; border-bottom: none; }
162
- &::after { bottom: -2px; right: -2px; border-left: none; border-top: none; }
163
-
164
- &:hover {
165
- box-shadow: 0 20px 60px rgba(0,0,0,0.7), inset 0 0 40px rgba(0, 240, 255, 0.1);
166
- &::before, &::after {
167
- width: 30px;
168
- height: 30px;
169
- border-color: $hd-gold;
170
- box-shadow: 0 0 10px $hd-gold;
171
- }
172
- }
173
-
174
- // --- EXCEPTION: ENLIST & INTEL PAGES ---
175
- // If the direct child is our specific centered containers, force single column
176
- &:has(> .enlist-container),
177
- &:has(> .intel-container),
178
- &:has(> .comms-container),
179
- &:has(> .watch-container) {
180
- grid-template-columns: 1fr; // Remove sidebar column
181
- justify-items: center; // Center content
182
- }
183
- }
184
-
185
- // Force these containers to span full width and center themselves
186
- .enlist-container, .intel-container, .comms-container, .watch-container {
187
- grid-column: 1 / -1; // Span across all columns
188
- width: 100%;
189
- max-width: 1200px; // Cap width so it doesn't stretch too far
190
- margin: 0 auto; // Center horizontally
191
- display: flex;
192
- flex-direction: column;
193
- align-items: center;
194
- }
195
-
196
- // Mobile Responsiveness
197
- @media (max-width: 900px) {
198
- .terminal-card {
199
- grid-template-columns: 1fr; // Stack sidebar on top for mobile
200
- }
201
-
202
- .enlist-container, .intel-container {
203
- max-width: 100%;
204
- }
205
- }
1
+ // _sass/_layout.scss
2
+
3
+ // =========================================
4
+ // 1. MAIN WRAPPER & HEADER
5
+ // =========================================
6
+
7
+ .terminal-wrapper {
8
+ width: 100%;
9
+ max-width: 1200px;
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: 25px;
13
+ position: relative;
14
+ z-index: 10;
15
+ margin: 0 auto; // Center the wrapper itself
16
+ }
17
+
18
+ .terminal-header {
19
+ display: flex;
20
+ justify-content: space-between;
21
+ align-items: center;
22
+ padding: 20px 30px;
23
+ background: rgba(2, 4, 10, 0.8);
24
+ backdrop-filter: blur(10px);
25
+ border-bottom: 2px solid $hd-gold;
26
+ box-shadow: 0 10px 30px rgba(0,0,0,0.5);
27
+ clip-path: polygon(0 0, 100% 0, 100% 75%, 98% 100%, 2% 100%, 0 75%);
28
+
29
+ h1 {
30
+ font-family: $font-head;
31
+ font-size: 3.5rem;
32
+ color: $hd-white;
33
+ text-transform: uppercase;
34
+ margin: 0;
35
+ text-shadow: 0 0 10px rgba($hd-gold, 0.6);
36
+ letter-spacing: 2px;
37
+ span { color: $hd-gold; }
38
+ }
39
+
40
+ .subtitle {
41
+ color: $hd-cyan;
42
+ font-size: 0.9rem;
43
+ letter-spacing: 3px;
44
+ text-shadow: 0 0 5px $hd-cyan;
45
+ display: block;
46
+ margin-top: 5px;
47
+ }
48
+ }
49
+
50
+ // =========================================
51
+ // 2. NAVIGATION
52
+ // =========================================
53
+
54
+ .main-nav {
55
+ display: flex;
56
+ gap: 25px;
57
+ align-items: center;
58
+ }
59
+
60
+ .nav-link {
61
+ text-decoration: none;
62
+ color: $hd-white;
63
+ font-family: $font-head;
64
+ font-size: 1.4rem;
65
+ letter-spacing: 2px;
66
+ transition: all 0.3s ease;
67
+ text-transform: uppercase;
68
+ position: relative;
69
+ white-space: nowrap;
70
+
71
+ &:visited { color: $hd-white; }
72
+
73
+ &:hover {
74
+ color: $hd-cyan;
75
+ text-shadow: 0 0 12px $hd-cyan;
76
+ transform: translateY(-2px);
77
+ }
78
+
79
+ &.active {
80
+ color: $hd-gold;
81
+ text-shadow: 0 0 15px $hd-gold;
82
+ &::after {
83
+ content: '';
84
+ position: absolute;
85
+ bottom: -5px;
86
+ left: 0;
87
+ width: 100%;
88
+ height: 2px;
89
+ background: $hd-gold;
90
+ box-shadow: 0 0 10px $hd-gold;
91
+ }
92
+ }
93
+ }
94
+
95
+ // =========================================
96
+ // 3. LIVE DOT ANIMATION
97
+ // =========================================
98
+
99
+ .live-dot {
100
+ display: inline-block;
101
+ width: 8px;
102
+ height: 8px;
103
+ background-color: $hd-red;
104
+ border-radius: 50%;
105
+ margin-left: 6px;
106
+ box-shadow: 0 0 5px $hd-red;
107
+ animation: pulse-red 1.5s infinite;
108
+ transition: all 0.5s ease;
109
+ flex-shrink: 0;
110
+ }
111
+
112
+ .live-dot.is-live {
113
+ background-color: #0f0;
114
+ box-shadow: 0 0 8px #0f0;
115
+ animation: pulse-green 1.5s infinite;
116
+ }
117
+
118
+ @keyframes pulse-red {
119
+ 0% { opacity: 1; transform: scale(1); }
120
+ 50% { opacity: 0.5; transform: scale(1.2); }
121
+ 100% { opacity: 1; transform: scale(1); }
122
+ }
123
+
124
+ @keyframes pulse-green {
125
+ 0% { opacity: 1; transform: scale(1); box-shadow: 0 0 5px #0f0; }
126
+ 50% { opacity: 0.6; transform: scale(1.3); box-shadow: 0 0 15px #0f0; }
127
+ 100% { opacity: 1; transform: scale(1); box-shadow: 0 0 5px #0f0; }
128
+ }
129
+
130
+ // =========================================
131
+ // 4. MAIN TERMINAL CARD (GRID SYSTEM)
132
+ // =========================================
133
+
134
+ .terminal-card {
135
+ display: grid;
136
+ // DEFAULT: Sidebar (280px) + Content (Rest)
137
+ grid-template-columns: 280px 1fr;
138
+ gap: 25px;
139
+
140
+ background: $glass-bg;
141
+ backdrop-filter: blur(12px);
142
+ -webkit-backdrop-filter: blur(12px);
143
+ border: 1px solid $glass-border;
144
+ border-top: 1px solid rgba($hd-gold, 0.6);
145
+ border-left: 1px solid rgba($hd-cyan, 0.3);
146
+ padding: 30px;
147
+ border-radius: 4px;
148
+ box-shadow: 0 20px 50px rgba(0,0,0,0.6), inset 0 0 30px rgba(0, 240, 255, 0.05);
149
+ position: relative;
150
+ min-height: 600px;
151
+
152
+ // Decorative Corners
153
+ &::before, &::after {
154
+ content: '';
155
+ position: absolute;
156
+ width: 20px;
157
+ height: 20px;
158
+ border: 2px solid $hd-cyan;
159
+ transition: all 0.3s ease;
160
+ z-index: 10;
161
+ }
162
+ &::before { top: -2px; left: -2px; border-right: none; border-bottom: none; }
163
+ &::after { bottom: -2px; right: -2px; border-left: none; border-top: none; }
164
+
165
+ &:hover {
166
+ box-shadow: 0 20px 60px rgba(0,0,0,0.7), inset 0 0 40px rgba(0, 240, 255, 0.1);
167
+ &::before, &::after {
168
+ width: 30px;
169
+ height: 30px;
170
+ border-color: $hd-gold;
171
+ box-shadow: 0 0 10px $hd-gold;
172
+ }
173
+ }
174
+
175
+ // EXCEPTION: Full Width for Specific Pages
176
+ &:has(> .enlist-container),
177
+ &:has(> .intel-container),
178
+ &:has(> .comms-container),
179
+ &:has(> .watch-container) {
180
+ grid-template-columns: 1fr;
181
+ justify-items: center;
182
+ }
183
+ }
184
+
185
+ // Force specific containers to span full width
186
+ .enlist-container,
187
+ .intel-container,
188
+ .comms-container,
189
+ .watch-container {
190
+ grid-column: 1 / -1;
191
+ width: 100%;
192
+ max-width: 1200px;
193
+ margin: 0 auto;
194
+ display: flex;
195
+ flex-direction: column;
196
+ align-items: center;
197
+ }
198
+
199
+ // =========================================
200
+ // 5. MOBILE RESPONSIVENESS (CONSOLIDATED)
201
+ // =========================================
202
+
203
+ @media (max-width: 900px) {
204
+ // Switch Header to Column on very small screens
205
+ .terminal-header {
206
+ flex-direction: column;
207
+ text-align: center;
208
+ gap: 15px;
209
+ clip-path: none; // Remove angled cut on mobile for better space
210
+ border-radius: 0 0 10px 10px;
211
+ }
212
+
213
+ .logo-area h1 {
214
+ font-size: 2.5rem;
215
+ }
216
+
217
+ .main-nav {
218
+ flex-wrap: wrap;
219
+ justify-content: center;
220
+ gap: 15px;
221
+ }
222
+
223
+ .nav-link {
224
+ font-size: 1.1rem;
225
+ }
226
+ }
227
+
228
+ @media (max-width: 768px) {
229
+ // 1. FORCE SINGLE COLUMN GRID FOR HOME PAGE
230
+ .terminal-card {
231
+ display: grid !important; // Keep as Grid, just change columns
232
+ grid-template-columns: 1fr !important; // Stack sidebar on top of content
233
+ gap: 20px;
234
+ padding: 15px;
235
+ }
236
+
237
+ // 2. SIDEBAR FULL WIDTH
238
+ .sidebar {
239
+ width: 100%;
240
+ margin-bottom: 25px;
241
+ // Optional: Add a bottom border to separate from content on mobile
242
+ border-bottom: 1px solid rgba($hd-cyan, 0.3);
243
+ padding-bottom: 20px;
244
+ }
245
+
246
+ // 3. CONTENT AREA FULL WIDTH
247
+ .content-area {
248
+ width: 100%;
249
+ }
250
+
251
+ // 4. FIX MARQUEE
252
+ .alert-marquee {
253
+ width: 100%;
254
+ overflow: hidden;
255
+ }
256
+
257
+ // 5. FIX LEADER CARDS
258
+ .command-grid {
259
+ display: flex;
260
+ flex-direction: column;
261
+ gap: 20px;
262
+ }
263
+
264
+ .leader-card {
265
+ width: 100%;
266
+ display: flex;
267
+ flex-direction: column; // Stack image above text
268
+ align-items: center;
269
+ text-align: center;
270
+ }
271
+
272
+ .octagon-mask {
273
+ width: 100px;
274
+ height: 100px;
275
+ margin: 0 auto 15px auto;
276
+ }
277
+
278
+ // 6. FIX MODAL
279
+ .modal-terminal {
280
+ width: 95% !important;
281
+ max-height: 90vh !important;
282
+ padding: 15px !important;
283
+ clip-path: none; // Remove cut corner on mobile
284
+ }
285
+
286
+ .modal-stats-grid {
287
+ grid-template-columns: 1fr !important; // Stack stats
288
+ }
289
+
290
+ .modal-image-top {
291
+ width: 120px;
292
+ height: 120px;
293
+ margin: 0 auto 15px auto;
294
+ }
295
+
296
+ // 7. PREVENT HORIZONTAL SCROLL
297
+ body, html {
298
+ overflow-x: hidden;
299
+ width: 100%;
300
+ max-width: 100%;
301
+ }
302
+
303
+ img {
304
+ max-width: 100%;
305
+ height: auto;
306
+ display: block; // Removes tiny gap below images
307
+ }
308
+ }
@@ -73,6 +73,7 @@ document.addEventListener('DOMContentLoaded', () => {
73
73
 
74
74
  modal.style.opacity = '1';
75
75
  modal.querySelector('.modal-terminal').style.transform = 'scale(1)';
76
+ if (typeof SFX !== 'undefined') SFX.playOpen();
76
77
 
77
78
  // Prevent background scrolling
78
79
  document.body.style.overflow = 'hidden';
@@ -87,6 +88,8 @@ document.addEventListener('DOMContentLoaded', () => {
87
88
  // Fade out
88
89
  modal.style.opacity = '0';
89
90
  modal.querySelector('.modal-terminal').style.transform = 'scale(0.9)';
91
+ if (typeof SFX !== 'undefined') SFX.playClose();
92
+
90
93
 
91
94
  // Wait for transition to finish before hiding display
92
95
  setTimeout(() => {
data/assets/js/sfx.js ADDED
@@ -0,0 +1,77 @@
1
+ // assets/js/sfx.js
2
+
3
+ const SFX = {
4
+ ctx: null,
5
+
6
+ // Initialize Audio Context (must be triggered by user interaction first)
7
+ init() {
8
+ if (!this.ctx) {
9
+ this.ctx = new (window.AudioContext || window.webkitAudioContext)();
10
+ }
11
+ if (this.ctx.state === 'suspended') {
12
+ this.ctx.resume();
13
+ }
14
+ },
15
+
16
+ // 1. Modal Open Sound (Soft Sci-Fi Hum/Power Up)
17
+ playOpen() {
18
+ this.init();
19
+ const osc = this.ctx.createOscillator();
20
+ const gain = this.ctx.createGain();
21
+
22
+ osc.type = 'sine';
23
+ osc.frequency.setValueAtTime(200, this.ctx.currentTime);
24
+ osc.frequency.exponentialRampToValueAtTime(600, this.ctx.currentTime + 0.3);
25
+
26
+ gain.gain.setValueAtTime(0.1, this.ctx.currentTime);
27
+ gain.gain.exponentialRampToValueAtTime(0.01, this.ctx.currentTime + 0.3);
28
+
29
+ osc.connect(gain);
30
+ gain.connect(this.ctx.destination);
31
+
32
+ osc.start();
33
+ osc.stop(this.ctx.currentTime + 0.3);
34
+ },
35
+
36
+ // 2. Modal Close Sound (Digital Power Down)
37
+ playClose() {
38
+ this.init();
39
+ const osc = this.ctx.createOscillator();
40
+ const gain = this.ctx.createGain();
41
+
42
+ osc.type = 'square';
43
+ osc.frequency.setValueAtTime(400, this.ctx.currentTime);
44
+ osc.frequency.exponentialRampToValueAtTime(100, this.ctx.currentTime + 0.2);
45
+
46
+ gain.gain.setValueAtTime(0.05, this.ctx.currentTime);
47
+ gain.gain.exponentialRampToValueAtTime(0.01, this.ctx.currentTime + 0.2);
48
+
49
+ osc.connect(gain);
50
+ gain.connect(this.ctx.destination);
51
+
52
+ osc.start();
53
+ osc.stop(this.ctx.currentTime + 0.2);
54
+ },
55
+
56
+ // 3. Button Click/Hover (Sharp Mechanical Click)
57
+ playClick() {
58
+ this.init();
59
+ const osc = this.ctx.createOscillator();
60
+ const gain = this.ctx.createGain();
61
+
62
+ osc.type = 'triangle';
63
+ osc.frequency.setValueAtTime(800, this.ctx.currentTime);
64
+
65
+ gain.gain.setValueAtTime(0.05, this.ctx.currentTime);
66
+ gain.gain.exponentialRampToValueAtTime(0.01, this.ctx.currentTime + 0.05);
67
+
68
+ osc.connect(gain);
69
+ gain.connect(this.ctx.destination);
70
+
71
+ osc.start();
72
+ osc.stop(this.ctx.currentTime + 0.05);
73
+ }
74
+ };
75
+
76
+ // Auto-initialize on first click anywhere on the page
77
+ document.addEventListener('click', () => SFX.init(), { once: true });
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: helldivers-theme
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DAR
@@ -89,6 +89,7 @@ files:
89
89
  - assets/js/main.js
90
90
  - assets/js/particles.js
91
91
  - assets/js/profile-modal.js
92
+ - assets/js/sfx.js
92
93
  - assets/main.scss
93
94
  - contact.md
94
95
  - index.html