Skip to content

Commit 90f3f33

Browse files
authored
feat: add results page (#6)
* fix: apply welcome panel css correctly * fix: only one panel open at a time * fix: unable to scroll on smaller browser window
1 parent 7031927 commit 90f3f33

File tree

8 files changed

+120
-24
lines changed

8 files changed

+120
-24
lines changed

src/core/ExtensionManager.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,24 @@ class ExtensionManager {
6969
}
7070
}
7171

72+
removeVisiblePanels() {
73+
const panels = document.querySelectorAll('.cv-panel.cv-panel--visible');
74+
if (!panels.length) return;
75+
76+
panels.forEach((panel) => {
77+
panel.classList.remove('cv-panel--visible');
78+
setTimeout(() => {
79+
panel.remove();
80+
}, 300);
81+
});
82+
}
83+
7284
async togglePanel(panelType) {
7385
try {
74-
const panel = this.panels.get(panelType);
86+
const visiblePanels = document.querySelectorAll('.cv-panel.cv-panel--visible');
7587

76-
if (panel && panel.isVisible) {
77-
this.closePanel(panelType);
88+
if (visiblePanels.length) {
89+
this.removeVisiblePanels();
7890
} else {
7991
await this.openPanel(panelType);
8092
}
@@ -98,6 +110,8 @@ class ExtensionManager {
98110
}
99111

100112
async openPanel(panelType, data = {}) {
113+
this.removeVisiblePanels();
114+
101115
let panel = this.panels.get(panelType);
102116

103117
// Create a new panel if one does not already exist
@@ -111,10 +125,10 @@ class ExtensionManager {
111125
await panel.show();
112126
}
113127

114-
closePanel(panelType) {
128+
async closePanel(panelType) {
115129
const panel = this.panels.get(panelType);
116130
if (panel) {
117-
panel.hide();
131+
await panel.hide();
118132
}
119133
}
120134

@@ -137,3 +151,5 @@ class ExtensionManager {
137151
}
138152

139153
export { ExtensionManager };
154+
155+
export const extensionManager = new ExtensionManager();

src/core/Panel.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,15 @@ class Panel {
1616
cssFile: 'src/styles/styles.css',
1717
jsFile: 'src/panels/welcome/welcome.js',
1818
containerId: 'carbon-visualizer-welcome-panel',
19-
className: 'cv cv-panel--welcome'
20-
}
19+
className: 'cv-panel--welcome'
20+
},
21+
results: {
22+
htmlFile: 'src/panels/results/results.html',
23+
cssFile: 'src/panels/results/results.css',
24+
jsFile: 'src/panels/results/results.js',
25+
containerId: 'carbon-visualizer-results-panel',
26+
className: 'cv-panel--results'
27+
},
2128
};
2229

2330
return configs[type] || configs.welcome;
@@ -119,8 +126,9 @@ class Panel {
119126

120127
while (retries < maxRetries) {
121128
const analyzeBtn = this.container.querySelector('#analyze-page-btn');
129+
const backToWelcomeBtn = this.container.querySelector('#back-to-welcome-btn');
122130

123-
if (analyzeBtn) {
131+
if (analyzeBtn || backToWelcomeBtn) {
124132
return; // Element found, we're good to go
125133
}
126134

src/panels/results/results.html

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
</head>
7+
<body>
8+
<div id="cv-panel-content">
9+
<header class="cv-panel__header">
10+
<h1 class="cv-panel__title">Carbon Visualizer</h1>
11+
</header>
12+
13+
<main class="cv-panel__content">
14+
<div class="cv-results">
15+
<div class="cv-results__icon">
16+
🌱
17+
</div>
18+
<h2 class="cv-results__title">Results</h2>
19+
<p class="cv-results__description">
20+
This is where you'd see the results of the analysis. Coming soon!
21+
</p>
22+
23+
<button class="cv-btn cv-btn--primary" id="back-to-welcome-btn">
24+
Analyze another page
25+
</button>
26+
</div>
27+
</main>
28+
</div>
29+
</body>
30+
</html>

src/panels/results/results.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Results panel JavaScript
2+
import { extensionManager } from "../../core/ExtensionManager.js";
3+
4+
export function initializePanel(panelType, data) {
5+
// Get the container element
6+
const container = data.container;
7+
8+
if (!container) {
9+
return;
10+
}
11+
12+
// Get back to welcome button from within the container
13+
const backToWelcomeBtn = container.querySelector('#back-to-welcome-btn');
14+
15+
// Check if button exists before adding event listener
16+
if (!backToWelcomeBtn) {
17+
return;
18+
}
19+
20+
// Event listener for back to welcome button
21+
backToWelcomeBtn.addEventListener('click', async () => {
22+
await extensionManager.openPanel('welcome');
23+
});
24+
}

src/panels/welcome/welcome.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ <h1 class="cv-panel__title">Carbon Visualizer</h1>
1212

1313
<main class="cv-panel__content">
1414
<div class="cv-welcome">
15-
<div class="cv-welcome__icon">
15+
<div class="cv-panel--welcome__icon">
1616
🌱
1717
</div>
18-
<h2 class="cv-welcome__title">Welcome to Carbon Visualizer</h2>
19-
<p class="cv-welcome__description">
18+
<h2 class="cv-panel--welcome__title">Welcome to Carbon Visualizer</h2>
19+
<p class="cv-panel--welcome__description">
2020
Assess your website's carbon footprint using Lighthouse performance metrics and CO2.js calculations.
2121
</p>
2222

23-
<ul class="cv-welcome__features">
23+
<ul class="cv-panel--welcome__features">
2424
<li class="cv-feature">
2525
<span class="cv-feature__icon"></span>
2626
<span class="cv-feature__text">Performance Analysis</span>
@@ -36,7 +36,7 @@ <h2 class="cv-welcome__title">Welcome to Carbon Visualizer</h2>
3636
</ul>
3737

3838
<button class="cv-btn cv-btn--primary" id="analyze-page-btn">
39-
Analyze This Page
39+
Analyze this website
4040
</button>
4141
</div>
4242
</main>

src/panels/welcome/welcome.js

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Welcome panel JavaScript
2+
import { extensionManager } from "../../core/ExtensionManager.js";
23

34
export function initializePanel(panelType, data) {
45
// Get the container element
@@ -17,14 +18,7 @@ export function initializePanel(panelType, data) {
1718
}
1819

1920
// Event listener for analyze button
20-
analyzeBtn.addEventListener('click', () => {
21-
// For now, just show a simple message
22-
analyzeBtn.disabled = true;
23-
analyzeBtn.textContent = 'Coming Soon!';
24-
25-
setTimeout(() => {
26-
analyzeBtn.disabled = false;
27-
analyzeBtn.textContent = 'Analyze This Page';
28-
}, 2000);
21+
analyzeBtn.addEventListener('click', async () => {
22+
await extensionManager.openPanel('results');
2923
});
3024
}

src/styles/results.css

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
2+
/* Results panel variant styles */
3+
4+
.cv-panel--results {
5+
text-align: center;
6+
background: linear-gradient(to bottom,var(--cv-primary-green-10), var(--cv-primary-green-70) 80%);
7+
color: var(--cv-white);
8+
}
9+
10+
.cv-results__icon {
11+
font-size: 3rem;
12+
margin-bottom: 1rem;
13+
}
14+
15+
.cv-results__title {
16+
margin: 0 0 1rem 0;
17+
font-size: 1.25rem;
18+
font-weight: 600;
19+
color: var(--cv-white);
20+
}
21+
22+
.cv-results__description {
23+
margin: 0 0 2rem 0;
24+
color: var(--cv-white);
25+
line-height: 1.5;
26+
}

src/styles/welcome.css

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
text-align: center;
66
background: linear-gradient(to bottom,var(--cv-primary-green-10), var(--cv-primary-green-70) 80%);
77
color: var(--cv-white);
8-
min-block-size: fit-content;
98
}
109

1110
.cv-panel--welcome__icon {
@@ -32,4 +31,3 @@
3231
gap: 0.75rem;
3332
margin-bottom: 2rem;
3433
}
35-

0 commit comments

Comments
 (0)