Skip to content

Commit 8b182d9

Browse files
feat(pages): add roadmap page
1 parent 0768394 commit 8b182d9

1 file changed

Lines changed: 173 additions & 0 deletions

File tree

roadmap.html

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
---
2+
title: Roadmap
3+
layout: page
4+
full-width: true
5+
---
6+
7+
<div class="roadmap-container">
8+
<h1>LizardByte Roadmap</h1>
9+
<div id="issues-container">
10+
<p>Loading roadmap items...</p>
11+
</div>
12+
</div>
13+
14+
<script>
15+
document.addEventListener('DOMContentLoaded', function() {
16+
const issuesContainer = document.getElementById('issues-container');
17+
18+
// GitHub API endpoint for your repository's issues
19+
const apiUrl = 'https://api.github.com/repos/LizardByte/roadmap/issues?state=open&labels=planned&per_page=100';
20+
21+
fetch(apiUrl)
22+
.then(response => {
23+
if (!response.ok) {
24+
throw new Error('Network response was not ok');
25+
}
26+
return response.json();
27+
})
28+
.then(issues => {
29+
if (issues.length === 0) {
30+
issuesContainer.innerHTML = '<p>No roadmap items found.</p>';
31+
return;
32+
}
33+
34+
// Clear loading message
35+
issuesContainer.innerHTML = '';
36+
37+
// Create issues list
38+
const issuesList = document.createElement('div');
39+
issuesList.className = 'issues-list';
40+
41+
issues.forEach(issue => {
42+
const issueEl = document.createElement('div');
43+
issueEl.className = 'issue-card';
44+
45+
// Issue title with link
46+
const titleEl = document.createElement('h3');
47+
const titleLink = document.createElement('a');
48+
titleLink.href = issue.html_url;
49+
titleLink.textContent = issue.title;
50+
titleLink.target = '_blank';
51+
titleEl.appendChild(titleLink);
52+
53+
// Issue metadata
54+
const metaEl = document.createElement('div');
55+
metaEl.className = 'issue-meta';
56+
57+
// Issue number
58+
const numberEl = document.createElement('span');
59+
numberEl.className = 'issue-number';
60+
numberEl.textContent = `#${issue.number}`;
61+
62+
// Issue date
63+
const dateEl = document.createElement('span');
64+
dateEl.className = 'issue-date';
65+
const createdDate = new Date(issue.created_at);
66+
dateEl.textContent = createdDate.toLocaleDateString();
67+
68+
metaEl.appendChild(numberEl);
69+
metaEl.appendChild(dateEl);
70+
71+
// Labels
72+
const labelsEl = document.createElement('div');
73+
labelsEl.className = 'issue-labels';
74+
75+
issue.labels.forEach(label => {
76+
const labelEl = document.createElement('span');
77+
labelEl.className = 'issue-label';
78+
labelEl.textContent = label.name;
79+
labelEl.style.backgroundColor = `#${label.color}`;
80+
81+
// Determine if label text should be dark or light based on background
82+
const r = parseInt(label.color.substring(0, 2), 16);
83+
const g = parseInt(label.color.substring(2, 4), 16);
84+
const b = parseInt(label.color.substring(4, 6), 16);
85+
const brightness = (r * 299 + g * 587 + b * 114) / 1000;
86+
labelEl.style.color = brightness > 125 ? '#000' : '#fff';
87+
88+
labelsEl.appendChild(labelEl);
89+
});
90+
91+
// Issue body (truncated)
92+
const bodyEl = document.createElement('div');
93+
bodyEl.className = 'issue-body';
94+
bodyEl.textContent = issue.body ? issue.body.substring(0, 200) + (issue.body.length > 200 ? '...' : '') : '';
95+
96+
// Add all elements to the issue card
97+
issueEl.appendChild(titleEl);
98+
issueEl.appendChild(metaEl);
99+
issueEl.appendChild(labelsEl);
100+
issueEl.appendChild(bodyEl);
101+
102+
issuesList.appendChild(issueEl);
103+
});
104+
105+
issuesContainer.appendChild(issuesList);
106+
})
107+
.catch(error => {
108+
issuesContainer.innerHTML = `<p>Error loading roadmap items: ${error.message}</p>`;
109+
});
110+
});
111+
</script>
112+
113+
<style>
114+
.roadmap-container {
115+
max-width: 1200px;
116+
margin: 0 auto;
117+
padding: 20px;
118+
}
119+
120+
.issues-list {
121+
display: grid;
122+
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
123+
gap: 20px;
124+
margin-top: 20px;
125+
}
126+
127+
.issue-card {
128+
border: 1px solid #e1e4e8;
129+
border-radius: 6px;
130+
padding: 16px;
131+
background-color: #fff;
132+
box-shadow: 0 1px 3px rgba(0,0,0,0.12);
133+
transition: transform 0.2s, box-shadow 0.2s;
134+
}
135+
136+
.issue-card:hover {
137+
transform: translateY(-3px);
138+
box-shadow: 0 4px 6px rgba(0,0,0,0.16);
139+
}
140+
141+
.issue-card h3 {
142+
margin-top: 0;
143+
margin-bottom: 10px;
144+
}
145+
146+
.issue-meta {
147+
display: flex;
148+
justify-content: space-between;
149+
font-size: 14px;
150+
color: #586069;
151+
margin-bottom: 10px;
152+
}
153+
154+
.issue-labels {
155+
display: flex;
156+
flex-wrap: wrap;
157+
gap: 6px;
158+
margin-bottom: 10px;
159+
}
160+
161+
.issue-label {
162+
padding: 2px 8px;
163+
border-radius: 12px;
164+
font-size: 12px;
165+
font-weight: 500;
166+
}
167+
168+
.issue-body {
169+
font-size: 14px;
170+
color: #24292e;
171+
line-height: 1.5;
172+
}
173+
</style>

0 commit comments

Comments
 (0)