+
+
+ +

404

+

Page Not Found

-
404
-
Page Not Found
The page you are looking for doesn't exist or has been moved.
Please check the URL or return to the home page. diff --git a/views/pages/changelog.ejs b/views/pages/changelog.ejs index 2f5525a..b9de8f2 100644 --- a/views/pages/changelog.ejs +++ b/views/pages/changelog.ejs @@ -25,10 +25,57 @@ .container { min-height: auto; } + + /* Override hero styles for changelog */ + .hero { + text-align: center; + padding: var(--spacing-2xl) 0; + } + + .hero .container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + max-width: 1200px; + margin: 0 auto; + padding: 0 var(--spacing-lg); + } + + .hero-logo { + max-width: 280px; + height: auto; + margin: 0 auto var(--spacing-xl) auto; + display: block; + filter: drop-shadow(var(--shadow-glow)); + transition: transform 0.3s ease; + } + + .hero-title { + color: var(--text-primary); + font-size: clamp(2.5rem, 6vw, 4rem); + font-weight: 800; + margin: 0 0 var(--spacing-lg) 0; + background: var(--gradient-primary); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + text-align: center; + } + + .hero-subtitle { + color: var(--text-secondary); + font-size: var(--text-lg); + font-weight: 500; + margin: 0; + text-align: center; + max-width: 600px; + } + .changelog-section { max-width: 900px; margin: 0 auto; - padding: 20px; + padding: var(--spacing-xl); } .refresh-overlay { position: fixed; @@ -36,7 +83,8 @@ left: 0; width: 100%; height: 100%; - background-color: rgba(0, 0, 0, 0.2); + background: rgba(0, 0, 0, 0.6); + backdrop-filter: blur(4px); display: flex; justify-content: center; align-items: center; @@ -72,12 +120,13 @@ position: absolute; width: 60px; height: 60px; - background: rgba(0, 188, 212, 0.7); - border: 2px solid #008ba3; + background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%); + border: 2px solid var(--primary); display: flex; align-items: center; justify-content: center; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + box-shadow: var(--shadow-lg); + border-radius: var(--radius-sm); } .refresh-spinner .front { @@ -107,70 +156,206 @@ .loading-message { text-align: center; color: var(--text-secondary); - margin-top: 20px; - font-size: 1.1em; + margin-top: var(--spacing-lg); + font-size: var(--text-lg); + font-weight: 500; } .version-card { - background-color: var(--bg-card); - border-radius: 8px; - padding: 20px; - margin-bottom: 20px; - border: 1px solid var(--border); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + background: var(--bg-card); + border-radius: var(--radius-lg); + padding: var(--spacing-xl); + margin-bottom: var(--spacing-xl); + border: 1px solid var(--surface-border); + box-shadow: var(--shadow-md); + transition: all 0.3s ease; + position: relative; + overflow: hidden; + } + + .version-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 4px; + background: linear-gradient(90deg, var(--primary) 0%, var(--secondary) 50%, var(--accent) 100%); + } + + .version-card:hover { + background: var(--surface-hover); + transform: translateY(-4px); + box-shadow: var(--shadow-lg); + border-color: var(--primary); } .version-header { display: flex; justify-content: space-between; align-items: center; - margin-bottom: 15px; + margin-bottom: var(--spacing-lg); + padding-bottom: var(--spacing-md); + border-bottom: 2px solid var(--surface-border); } .version-title { - font-size: 1.3em; - font-weight: 600; + font-size: var(--text-xl); + font-weight: 700; + color: var(--text); + text-shadow: 0 1px 2px rgba(0,0,0,0.1); } .version-date { color: var(--text-secondary); + font-size: var(--text-sm); + font-weight: 500; + background: var(--bg-secondary); + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: var(--radius-sm); + border: 1px solid var(--surface-border); } .changelog-category { - margin-top: 15px; + margin-top: var(--spacing-lg); } .category-title { - font-size: 1.1em; - font-weight: 600; - margin-bottom: 10px; - padding-bottom: 5px; - border-bottom: 1px solid var(--border); + font-size: var(--text-lg); + font-weight: 700; + margin-bottom: var(--spacing-md); + padding-bottom: var(--spacing-xs); + border-bottom: 2px solid var(--primary); + color: var(--text); + text-transform: uppercase; + letter-spacing: 0.5px; + position: relative; + } + + .category-title::after { + content: ''; + position: absolute; + bottom: -2px; + left: 0; + width: 30%; + height: 2px; + background: linear-gradient(90deg, var(--accent), transparent); } .category-features { - color: var(--primary); + border-bottom-color: var(--primary); } .change-list { - padding-left: 25px; - margin: 10px 0; + padding-left: var(--spacing-xl); + margin: var(--spacing-md) 0; } .change-list li { - margin-bottom: 8px; + margin-bottom: var(--spacing-sm); + color: var(--text); + line-height: 1.6; + position: relative; + } + + .change-list li::marker { + color: var(--primary); } .back-link { display: inline-flex; align-items: center; - gap: 5px; - margin-bottom: 20px; + gap: var(--spacing-xs); + margin-bottom: var(--spacing-xl); color: var(--primary); text-decoration: none; + font-weight: 600; + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg-card); + border-radius: var(--radius-md); + border: 2px solid var(--primary); + transition: all 0.3s ease; } .back-link:hover { + background: var(--primary); + color: white; + transform: translateX(-4px); + box-shadow: var(--shadow-sm); + } + + .category-description { + color: var(--text); + line-height: 1.7; + font-size: var(--text-base); + } + + .category-description br { + margin-bottom: var(--spacing-xs); + } + + /* Footer specific styles */ + .footer { + background: var(--surface); + border-top: 1px solid var(--surface-border); + padding: var(--spacing-2xl) 0; + margin-top: var(--spacing-3xl); + text-align: center; + } + + .footer .container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + max-width: 1200px; + margin: 0 auto; + padding: 0 var(--spacing-lg); + } + + .footer-logo { + max-width: 200px; + height: auto; + margin: 0 auto var(--spacing-lg) auto; + display: block; + filter: drop-shadow(var(--shadow-sm)); + transition: transform 0.3s ease; + } + + .footer-logo:hover { + transform: scale(1.02); + } + + .footer-subtitle { + color: var(--text-primary); + font-size: var(--text-lg); + font-weight: 600; + margin-bottom: var(--spacing-sm); + background: var(--gradient-primary); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + } + + .footer-info { + color: var(--text-secondary); + font-size: var(--text-sm); + margin-bottom: var(--spacing-sm); + } + + .footer-copyright { + color: var(--text-tertiary); + font-size: var(--text-sm); + } + + .footer-copyright a { + color: var(--primary); + text-decoration: none; + transition: color 0.3s ease; + } + + .footer-copyright a:hover { + color: var(--accent); text-decoration: underline; } @@ -195,20 +380,46 @@ Back to Home - -
-
-
-
-
-
-
-
-
+ + <% if (changelogData && changelogData.length > 0) { %> + <% changelogData.forEach(day => { %> +
+
+
<%= day.date %>
+
<%= day.commits.length %> commit<%= day.commits.length !== 1 ? 's' : '' %>
+
+ +
+
Changes
+
    + <% day.commits.forEach(commit => { %> +
  • + + <%= commit.message %> + + + by <%= commit.author %> at <%= commit.time %> (<%= commit.sha %>) + +
  • + <% }) %> +
+
+
+ <% }) %> + <% } else { %> +
+
+
No Changelog Data
+
+
+

+ Unable to load changelog data. Please visit our + GitHub repository + to view recent changes. +

-
Loading changelog data...
-
+ <% } %>
@@ -221,168 +432,5 @@
- \ No newline at end of file diff --git a/views/pages/home.ejs b/views/pages/home.ejs index 387651a..7e4ea41 100644 --- a/views/pages/home.ejs +++ b/views/pages/home.ejs @@ -88,28 +88,16 @@ The ultimate companion for FRC teams tracking competition journeys with real-time updates

-
-
-

API Update

-

Vorel has received an API update to improve the live event data. If you encounter any issues while using the app, please report them to our GitHub Issues page.

-
-
- -
-
-

Beta Testing

-

Want to try out the latest version of vorel before it releases? Visit beta.vorel.app to try it out

-
-
- - + <% if (notices && notices.length > 0) { %> + <% notices.forEach(notice => { %> +
+
+

<%= notice.title %>

+

<%- notice.content %>

+
+
+ <% }); %> + <% } %>

Key Features

@@ -178,7 +166,7 @@
diff --git a/views/pages/login.ejs b/views/pages/login.ejs new file mode 100644 index 0000000..7f89ff7 --- /dev/null +++ b/views/pages/login.ejs @@ -0,0 +1,40 @@ + + + + + + Admin Login - Vorel + <%- include('../style/style-login') %> + + + + + diff --git a/views/partials/footer.ejs b/views/partials/footer.ejs index 2929353..5c7786a 100644 --- a/views/partials/footer.ejs +++ b/views/partials/footer.ejs @@ -1,4 +1,19 @@ \ No newline at end of file diff --git a/views/partials/scripts.ejs b/views/partials/scripts.ejs index d372e97..68657b7 100644 --- a/views/partials/scripts.ejs +++ b/views/partials/scripts.ejs @@ -302,6 +302,23 @@ } else if (data.type === 'update') { console.log('Received update via SSE'); lastHeartbeatTime = Date.now(); // Reset heartbeat timer on any message + + // Show different indicators for webhook vs polling updates + if (data.source === 'webhook') { + console.log('⚡ Real-time webhook update received'); + // Show a brief flash indicator for webhook updates + if (updateStatus) { + const originalBg = updateStatus.style.backgroundColor; + updateStatus.style.backgroundColor = '#4fc3f7'; + updateStatus.style.transition = 'background-color 0.3s'; + setTimeout(() => { + updateStatus.style.backgroundColor = originalBg; + }, 500); + } + } else { + console.log('🔄 Polling update received'); + } + // Update hash display with the hash from SSE if (data.hash && hashDisplay) { currentDataHash = data.hash; diff --git a/views/style/style-404.ejs b/views/style/style-404.ejs index 9e0faef..6b540cc 100644 --- a/views/style/style-404.ejs +++ b/views/style/style-404.ejs @@ -1,36 +1,116 @@ diff --git a/views/style/style-admin.ejs b/views/style/style-admin.ejs new file mode 100644 index 0000000..96f0e3a --- /dev/null +++ b/views/style/style-admin.ejs @@ -0,0 +1,341 @@ + diff --git a/views/style/style-embed.ejs b/views/style/style-embed.ejs index 2b29053..b8f99e9 100644 --- a/views/style/style-embed.ejs +++ b/views/style/style-embed.ejs @@ -1,15 +1,52 @@ diff --git a/views/style/style-login.ejs b/views/style/style-login.ejs new file mode 100644 index 0000000..202f820 --- /dev/null +++ b/views/style/style-login.ejs @@ -0,0 +1,131 @@ + diff --git a/views/style/style-matches.ejs b/views/style/style-matches.ejs index 776f0cf..cf7f178 100644 --- a/views/style/style-matches.ejs +++ b/views/style/style-matches.ejs @@ -1,30 +1,89 @@