Skip to content

Commit bda4dd0

Browse files
Add an open source page (#801)
1 parent cba3ccd commit bda4dd0

File tree

7 files changed

+674
-6
lines changed

7 files changed

+674
-6
lines changed

ui/public/content/open-source.html

Lines changed: 522 additions & 0 deletions
Large diffs are not rendered by default.

ui/src/App.svelte

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import TeamProjects from './pages/team/TeamProjects.svelte';
7878
import Project from './pages/project/Project.svelte';
7979
import Dashboard from './pages/Dashboard.svelte';
80+
import OpenSource from './pages/support/OpenSource.svelte';
8081
8182
const {
8283
FeaturePoker,
@@ -160,6 +161,13 @@
160161
name: 'support',
161162
};
162163
});
164+
router.on(appRoutes.openSource, () => {
165+
currentPage = {
166+
route: OpenSource,
167+
params: {},
168+
name: 'open-source',
169+
};
170+
});
163171
router.on(`${appRoutes.register}`, params => {
164172
currentPage = {
165173
route: Register,

ui/src/components/checkin/Comment.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
toggleEdit();
5252
}
5353
54-
function formatDate(dateString) {
54+
function formatDate(dateString: string) {
5555
const date = new Date(dateString);
5656
const now = new Date();
5757
const diff = now.getTime() - date.getTime();
@@ -95,7 +95,7 @@ let showDeleteConfirm = $state(false);
9595
<div class="flex-1 min-w-0">
9696
<div class="flex items-center gap-2 flex-wrap">
9797
<h4 class="font-semibold text-gray-900 dark:text-white text-sm truncate">
98-
{userMap[comment.user_id] || 'Loading...'}
98+
{userMap[comment.user_id].name || 'Loading...'}
9999
</h4>
100100
<span class="text-xs text-gray-500 dark:text-gray-400">•</span>
101101
<time class="text-xs text-gray-500 dark:text-gray-400 whitespace-nowrap">

ui/src/components/global/GlobalFooter.svelte

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,14 @@
8282
{$LL.userGuide()}
8383
</a>
8484
</li>
85+
<li>
86+
<a
87+
href="{appRoutes.openSource}"
88+
class="{navLinkClasses} block py-1"
89+
>
90+
{$LL.openSource()}
91+
</a>
92+
</li>
8593
<li>
8694
<a
8795
href="{appRoutes.privacyPolicy}"

ui/src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ const appRoutes = {
6666
privacyPolicy: `${PathPrefix}/privacy-policy`,
6767
termsConditions: `${PathPrefix}/terms-conditions`,
6868
support: `${PathPrefix}/support`,
69+
openSource: `${PathPrefix}/open-source`,
6970
invite: `${PathPrefix}/invite`,
7071
projects: `${PathPrefix}/projects`,
7172
};
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
<script lang="ts">
2+
import PageLayout from '../../components/PageLayout.svelte';
3+
import LL from '../../i18n/i18n-svelte';
4+
import { onMount } from 'svelte';
5+
let htmlContent = $state('');
6+
7+
onMount(() => {
8+
window.scrollTo(0, 0);
9+
fetch('/content/open-source.html')
10+
.then((res) => res.text())
11+
.then((data) => {
12+
htmlContent = data;
13+
});
14+
});
15+
</script>
16+
17+
<svelte:head>
18+
<title>Open Source | {$LL.appName()}</title>
19+
</svelte:head>
20+
21+
<div class="relative overflow-hidden bg-gradient-to-br from-blue-600 via-blue-700 to-indigo-900 dark:from-blue-900 dark:via-slate-900 dark:to-gray-900 flex items-center">
22+
<div class="absolute inset-0">
23+
<!-- Gradient Mesh -->
24+
<div class="absolute inset-0 bg-gradient-to-tr from-purple-500/20 via-transparent to-cyan-500/20"></div>
25+
<!-- Radial Gradient Overlay -->
26+
<div class="absolute inset-0 bg-gradient-radial from-transparent via-transparent to-black/20"></div>
27+
</div>
28+
29+
<!-- Content -->
30+
<div class="relative max-w-7xl mx-auto px-6 py-20 z-10">
31+
<div class="text-center text-white">
32+
<!-- Main Heading -->
33+
<h1 class="text-6xl md:text-8xl font-black mb-8 leading-none tracking-tight">
34+
<span class="block transform transition-all duration-700 hover:scale-105">
35+
Open Source
36+
</span>
37+
<span class="block bg-gradient-to-r from-blue-200 via-purple-200 to-cyan-200 bg-clip-text text-transparent relative transform transition-all duration-700 hover:scale-105">
38+
First
39+
<!-- Subtle glow effect -->
40+
<div class="absolute inset-0 bg-gradient-to-r from-blue-400/20 via-purple-400/20 to-cyan-400/20 blur-3xl -z-10 animate-pulse"></div>
41+
</span>
42+
</h1>
43+
44+
<!-- Subtitle -->
45+
<p class="text-2xl md:text-3xl font-light mb-8 opacity-90 max-w-4xl mx-auto transform transition-all duration-500 hover:opacity-100">
46+
Building <span class="text-blue-200 font-medium bg-gradient-to-r from-blue-200 to-cyan-200 bg-clip-text text-transparent">Agile Tools</span> the Right Way
47+
</p>
48+
49+
<!-- Description -->
50+
<p class="text-lg md:text-xl opacity-80 max-w-5xl mx-auto leading-relaxed mb-12 transform transition-all duration-500 hover:opacity-95">
51+
At Thunderdome, open source isn't just a development model—it's a <strong class="text-white font-semibold">core principle</strong> that shapes everything we do. We've remained committed to building agile planning tools that are transparent, community-driven, and accessible to teams worldwide.
52+
</p>
53+
54+
<!-- Enhanced CTA Buttons -->
55+
<div class="flex flex-col sm:flex-row gap-6 justify-center">
56+
<a href="https://thunderdome.dev" target="_blank" class="group relative inline-flex items-center gap-3 bg-white text-blue-600 px-10 py-5 rounded-2xl font-bold text-lg hover:bg-blue-50 transition-all duration-500 shadow-2xl shadow-blue-500/25 hover:shadow-blue-500/40 hover:scale-105 transform hover:-translate-y-1">
57+
<span>Try Thunderdome</span>
58+
<svg class="w-5 h-5 group-hover:translate-x-1 transition-transform duration-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
59+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
60+
</svg>
61+
<!-- Button glow -->
62+
<div class="absolute inset-0 bg-white rounded-2xl blur opacity-20 group-hover:opacity-30 transition-opacity duration-500 -z-10"></div>
63+
</a>
64+
65+
<a href="https://github.com/StevenWeathers/thunderdome-planning-poker/blob/main/docs/INSTALLATION.md" target="_blank" class="group relative inline-flex items-center gap-3 bg-white/10 backdrop-blur-md text-white px-10 py-5 rounded-2xl font-bold text-lg hover:bg-white/20 transition-all duration-500 border border-white/30 hover:border-white/50 hover:scale-105 transform hover:-translate-y-1 overflow-hidden">
66+
<svg class="w-5 h-5 group-hover:rotate-12 transition-transform duration-300" fill="currentColor" viewBox="0 0 24 24">
67+
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
68+
</svg>
69+
<span>View on GitHub</span>
70+
<!-- Shimmer effect using gradient -->
71+
<div class="absolute inset-0 bg-gradient-to-r from-transparent via-white/10 to-transparent -skew-x-12 translate-x-[-200%] group-hover:translate-x-[200%] transition-transform duration-1000 ease-out"></div>
72+
</a>
73+
</div>
74+
75+
<!-- Stats or Social Proof -->
76+
<div class="mt-16 flex flex-wrap justify-center gap-8 text-sm opacity-60 transition-opacity duration-300 hover:opacity-80">
77+
<div class="flex items-center gap-2 group">
78+
<div class="w-2 h-2 bg-green-400 rounded-full animate-pulse group-hover:scale-125 transition-transform duration-300"></div>
79+
<span class="group-hover:text-green-200 transition-colors duration-300">5+ years of development</span>
80+
</div>
81+
<div class="flex items-center gap-2 group">
82+
<div class="w-2 h-2 bg-blue-400 rounded-full animate-pulse delay-300 group-hover:scale-125 transition-transform duration-300"></div>
83+
<span class="group-hover:text-blue-200 transition-colors duration-300">Community-driven</span>
84+
</div>
85+
<div class="flex items-center gap-2 group">
86+
<div class="w-2 h-2 bg-purple-400 rounded-full animate-pulse delay-700 group-hover:scale-125 transition-transform duration-300"></div>
87+
<span class="group-hover:text-purple-200 transition-colors duration-300">100% Open Source</span>
88+
</div>
89+
</div>
90+
91+
<!-- Feature highlights -->
92+
<div class="mt-20 grid grid-cols-1 md:grid-cols-3 gap-8 max-w-4xl mx-auto">
93+
<div class="group bg-white/5 backdrop-blur-sm rounded-xl p-6 border border-white/10 hover:border-white/20 transition-all duration-300 hover:scale-105 hover:bg-white/10">
94+
<div class="w-12 h-12 mx-auto bg-blue-400/20 rounded-lg flex items-center justify-center mb-4 group-hover:scale-110 transition-transform duration-300">
95+
<svg class="w-6 h-6 text-blue-300 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
96+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/>
97+
</svg>
98+
</div>
99+
<h3 class="text-lg font-semibold mb-2 group-hover:text-blue-200 transition-colors duration-300">Lightning Fast</h3>
100+
<p class="text-sm opacity-80 group-hover:opacity-100 transition-opacity duration-300">Built for speed and efficiency</p>
101+
</div>
102+
103+
<div class="group bg-white/5 backdrop-blur-sm rounded-xl p-6 border border-white/10 hover:border-white/20 transition-all duration-300 hover:scale-105 hover:bg-white/10">
104+
<div class="w-12 h-12 mx-auto bg-purple-400/20 rounded-lg flex items-center justify-center mb-4 group-hover:scale-110 transition-transform duration-300">
105+
<svg class="w-6 h-6 text-purple-300 flex-shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg">
106+
<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/>
107+
<path d="M16 3.128a4 4 0 0 1 0 7.744"/>
108+
<path d="M22 21v-2a4 4 0 0 0-3-3.87"/>
109+
<circle cx="9" cy="7" r="4"/>
110+
</svg>
111+
</div>
112+
<h3 class="text-lg font-semibold mb-2 group-hover:text-purple-200 transition-colors duration-300">Team Focused</h3>
113+
<p class="text-sm opacity-80 group-hover:opacity-100 transition-opacity duration-300">Designed for collaborative teams</p>
114+
</div>
115+
116+
<div class="group bg-white/5 backdrop-blur-sm rounded-xl p-6 border border-white/10 hover:border-white/20 transition-all duration-300 hover:scale-105 hover:bg-white/10">
117+
<div class="w-12 h-12 mx-auto bg-cyan-400/20 rounded-lg flex items-center justify-center mb-4 group-hover:scale-110 transition-transform duration-300">
118+
<svg class="w-6 h-6 text-cyan-300 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
119+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
120+
</svg>
121+
</div>
122+
<h3 class="text-lg font-semibold mb-2 group-hover:text-cyan-200 transition-colors duration-300">Secure & Reliable</h3>
123+
<p class="text-sm opacity-80 group-hover:opacity-100 transition-opacity duration-300">Enterprise-grade security</p>
124+
</div>
125+
</div>
126+
</div>
127+
</div>
128+
</div>
129+
130+
<PageLayout>
131+
{@html htmlContent}
132+
</PageLayout>

ui/src/pages/team/TeamCheckin.svelte

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
let { xfetch, router, notifications, organizationId, departmentId, teamId } =
2929
$props();
3030
31-
const { AllowRegistration, AllowGuests } = AppConfig;
32-
3331
// State variables using $state()
3432
let timezone = $state(getTimezoneName());
3533
let showCheckin = $state(false);
@@ -134,6 +132,7 @@
134132
.then(res => res.json())
135133
.then(function (result) {
136134
checkins = result.data;
135+
calculateCheckinStats();
137136
filterCheckins();
138137
})
139138
.catch(function () {
@@ -358,8 +357,6 @@
358357
teamRole !== '',
359358
);
360359
361-
const checkStats = $derived(checkins && userCount && calculateCheckinStats());
362-
363360
const alreadyCheckedIn = $derived(
364361
checkins && checkins.find(c => c.user.id === $user.id) !== undefined,
365362
);

0 commit comments

Comments
 (0)