FossilRepo

Polish UI: add definition to cards, inputs, tables, buttons across 38 templates

ragelink 2026-04-08 14:46 trunk
Commit 2f13242692d36cf68bf3174396dd4e8a278c2f90d092d4d590a779beeb0aab49
38 files changed +1 -1 +7 -7 +2 -2 +7 -3 +13 -13 +12 -12 +8 -8 +6 -6 +2 -2 +1 -1 +5 -5 +2 -2 +4 -4 +2 -2 +1 -1 +8 -8 +2 -2 +2 -2 +7 -7 +6 -6 +12 -12 +11 -11 +3 -3 +6 -6 +5 -5 +2 -2 +2 -2 +2 -2 +2 -2 +9 -9 +6 -6 +7 -7 +7 -7 +8 -8 +8 -8 +6 -6 +3 -3 +1 -1
~ templates/accounts/login.html ~ templates/accounts/profile.html ~ templates/accounts/profile_edit.html ~ templates/base.html ~ templates/dashboard.html ~ templates/fossil/_project_nav.html ~ templates/fossil/branch_list.html ~ templates/fossil/checkin_detail.html ~ templates/fossil/code_browser.html ~ templates/fossil/code_file.html ~ templates/fossil/forum_form.html ~ templates/fossil/forum_list.html ~ templates/fossil/forum_thread.html ~ templates/fossil/partials/explorer_table.html ~ templates/fossil/partials/file_tree.html ~ templates/fossil/partials/ticket_table.html ~ templates/fossil/partials/timeline_entries.html ~ templates/fossil/release_list.html ~ templates/fossil/tag_list.html ~ templates/fossil/ticket_detail.html ~ templates/fossil/ticket_edit.html ~ templates/fossil/ticket_form.html ~ templates/fossil/ticket_list.html ~ templates/fossil/unversioned_list.html ~ templates/fossil/wiki_form.html ~ templates/fossil/wiki_list.html ~ templates/fossil/wiki_page.html ~ templates/includes/_pagination.html ~ templates/includes/_pagination_manual.html ~ templates/organization/partials/member_table.html ~ templates/organization/partials/team_member_table.html ~ templates/organization/partials/team_table.html ~ templates/pages/partials/page_table.html ~ templates/projects/partials/group_table.html ~ templates/projects/partials/project_table.html ~ templates/projects/partials/project_team_table.html ~ templates/projects/project_form.html ~ templates/projects/project_list.html
--- templates/accounts/login.html
+++ templates/accounts/login.html
@@ -41,11 +41,11 @@
4141
</div>
4242
{% if turnstile_enabled %}
4343
<div class="cf-turnstile" data-sitekey="{{ turnstile_site_key }}" data-theme="dark"></div>
4444
{% endif %}
4545
<button type="submit"
46
- class="w-full rounded-md bg-brand px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand">
46
+ class="w-full rounded-md bg-brand px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
4747
Sign in
4848
</button>
4949
</form>
5050
</div>
5151
</div>
5252
--- templates/accounts/login.html
+++ templates/accounts/login.html
@@ -41,11 +41,11 @@
41 </div>
42 {% if turnstile_enabled %}
43 <div class="cf-turnstile" data-sitekey="{{ turnstile_site_key }}" data-theme="dark"></div>
44 {% endif %}
45 <button type="submit"
46 class="w-full rounded-md bg-brand px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand">
47 Sign in
48 </button>
49 </form>
50 </div>
51 </div>
52
--- templates/accounts/login.html
+++ templates/accounts/login.html
@@ -41,11 +41,11 @@
41 </div>
42 {% if turnstile_enabled %}
43 <div class="cf-turnstile" data-sitekey="{{ turnstile_site_key }}" data-theme="dark"></div>
44 {% endif %}
45 <button type="submit"
46 class="w-full rounded-md bg-brand px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
47 Sign in
48 </button>
49 </form>
50 </div>
51 </div>
52
--- templates/accounts/profile.html
+++ templates/accounts/profile.html
@@ -20,22 +20,22 @@
2020
</div>
2121
</div>
2222
</div>
2323
<div class="flex flex-wrap items-center gap-2 mt-4 sm:mt-0">
2424
<a href="{% url 'accounts:profile_edit' %}"
25
- class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-200 hover:bg-gray-600">
25
+ class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-200 hover:bg-gray-600 border border-gray-600 transition-colors">
2626
Edit Profile
2727
</a>
2828
<a href="{% url 'organization:user_password' username=user.username %}"
29
- class="rounded-md bg-gray-800 px-4 py-2 text-sm font-medium text-gray-400 hover:text-gray-200 hover:bg-gray-700 ring-1 ring-gray-700">
29
+ class="rounded-md bg-gray-800 px-4 py-2 text-sm font-medium text-gray-400 hover:text-gray-200 hover:bg-gray-700 ring-1 ring-gray-700 transition-colors">
3030
Change Password
3131
</a>
3232
</div>
3333
</div>
3434
3535
<!-- Profile Info Card -->
36
-<div class="rounded-lg bg-gray-800 border border-gray-700 p-6 mb-6">
36
+<div class="rounded-lg bg-gray-800 border border-gray-700 p-6 mb-6 shadow-sm">
3737
<h2 class="text-lg font-semibold text-gray-200 mb-4">Profile Info</h2>
3838
<dl class="grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-3 text-sm">
3939
<div>
4040
<dt class="text-gray-500">Full Name</dt>
4141
<dd class="text-gray-200 mt-0.5">{{ user.get_full_name|default:"Not set" }}</dd>
@@ -66,11 +66,11 @@
6666
</div>
6767
</dl>
6868
</div>
6969
7070
<!-- SSH Keys Card -->
71
-<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6">
71
+<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
7272
<div class="p-4 border-b border-gray-700 flex items-center justify-between">
7373
<h2 class="text-lg font-semibold text-gray-200">SSH Keys</h2>
7474
<a href="{% url 'accounts:ssh_keys' %}" class="text-sm text-brand-light hover:text-brand">Manage Keys</a>
7575
</div>
7676
{% if ssh_keys %}
@@ -94,11 +94,11 @@
9494
</div>
9595
{% endif %}
9696
</div>
9797
9898
<!-- Notification Preferences Card -->
99
-<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6">
99
+<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
100100
<div class="p-4 border-b border-gray-700 flex items-center justify-between">
101101
<h2 class="text-lg font-semibold text-gray-200">Notification Preferences</h2>
102102
<a href="{% url 'accounts:notification_prefs' %}" class="text-sm text-brand-light hover:text-brand">Edit Preferences</a>
103103
</div>
104104
<div class="p-4">
@@ -121,15 +121,15 @@
121121
</dl>
122122
</div>
123123
</div>
124124
125125
<!-- Personal Access Tokens Card -->
126
-<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6">
126
+<div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
127127
<div class="p-4 border-b border-gray-700 flex items-center justify-between">
128128
<h2 class="text-lg font-semibold text-gray-200">Personal Access Tokens</h2>
129129
<a href="{% url 'accounts:profile_token_create' %}"
130
- class="rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white hover:bg-brand-hover">
130
+ class="rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
131131
Generate Token
132132
</a>
133133
</div>
134134
{% if tokens %}
135135
<div class="divide-y divide-gray-700">
136136
--- templates/accounts/profile.html
+++ templates/accounts/profile.html
@@ -20,22 +20,22 @@
20 </div>
21 </div>
22 </div>
23 <div class="flex flex-wrap items-center gap-2 mt-4 sm:mt-0">
24 <a href="{% url 'accounts:profile_edit' %}"
25 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-200 hover:bg-gray-600">
26 Edit Profile
27 </a>
28 <a href="{% url 'organization:user_password' username=user.username %}"
29 class="rounded-md bg-gray-800 px-4 py-2 text-sm font-medium text-gray-400 hover:text-gray-200 hover:bg-gray-700 ring-1 ring-gray-700">
30 Change Password
31 </a>
32 </div>
33 </div>
34
35 <!-- Profile Info Card -->
36 <div class="rounded-lg bg-gray-800 border border-gray-700 p-6 mb-6">
37 <h2 class="text-lg font-semibold text-gray-200 mb-4">Profile Info</h2>
38 <dl class="grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-3 text-sm">
39 <div>
40 <dt class="text-gray-500">Full Name</dt>
41 <dd class="text-gray-200 mt-0.5">{{ user.get_full_name|default:"Not set" }}</dd>
@@ -66,11 +66,11 @@
66 </div>
67 </dl>
68 </div>
69
70 <!-- SSH Keys Card -->
71 <div class="rounded-lg bg-gray-800 border border-gray-700 mb-6">
72 <div class="p-4 border-b border-gray-700 flex items-center justify-between">
73 <h2 class="text-lg font-semibold text-gray-200">SSH Keys</h2>
74 <a href="{% url 'accounts:ssh_keys' %}" class="text-sm text-brand-light hover:text-brand">Manage Keys</a>
75 </div>
76 {% if ssh_keys %}
@@ -94,11 +94,11 @@
94 </div>
95 {% endif %}
96 </div>
97
98 <!-- Notification Preferences Card -->
99 <div class="rounded-lg bg-gray-800 border border-gray-700 mb-6">
100 <div class="p-4 border-b border-gray-700 flex items-center justify-between">
101 <h2 class="text-lg font-semibold text-gray-200">Notification Preferences</h2>
102 <a href="{% url 'accounts:notification_prefs' %}" class="text-sm text-brand-light hover:text-brand">Edit Preferences</a>
103 </div>
104 <div class="p-4">
@@ -121,15 +121,15 @@
121 </dl>
122 </div>
123 </div>
124
125 <!-- Personal Access Tokens Card -->
126 <div class="rounded-lg bg-gray-800 border border-gray-700 mb-6">
127 <div class="p-4 border-b border-gray-700 flex items-center justify-between">
128 <h2 class="text-lg font-semibold text-gray-200">Personal Access Tokens</h2>
129 <a href="{% url 'accounts:profile_token_create' %}"
130 class="rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white hover:bg-brand-hover">
131 Generate Token
132 </a>
133 </div>
134 {% if tokens %}
135 <div class="divide-y divide-gray-700">
136
--- templates/accounts/profile.html
+++ templates/accounts/profile.html
@@ -20,22 +20,22 @@
20 </div>
21 </div>
22 </div>
23 <div class="flex flex-wrap items-center gap-2 mt-4 sm:mt-0">
24 <a href="{% url 'accounts:profile_edit' %}"
25 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-200 hover:bg-gray-600 border border-gray-600 transition-colors">
26 Edit Profile
27 </a>
28 <a href="{% url 'organization:user_password' username=user.username %}"
29 class="rounded-md bg-gray-800 px-4 py-2 text-sm font-medium text-gray-400 hover:text-gray-200 hover:bg-gray-700 ring-1 ring-gray-700 transition-colors">
30 Change Password
31 </a>
32 </div>
33 </div>
34
35 <!-- Profile Info Card -->
36 <div class="rounded-lg bg-gray-800 border border-gray-700 p-6 mb-6 shadow-sm">
37 <h2 class="text-lg font-semibold text-gray-200 mb-4">Profile Info</h2>
38 <dl class="grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-3 text-sm">
39 <div>
40 <dt class="text-gray-500">Full Name</dt>
41 <dd class="text-gray-200 mt-0.5">{{ user.get_full_name|default:"Not set" }}</dd>
@@ -66,11 +66,11 @@
66 </div>
67 </dl>
68 </div>
69
70 <!-- SSH Keys Card -->
71 <div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
72 <div class="p-4 border-b border-gray-700 flex items-center justify-between">
73 <h2 class="text-lg font-semibold text-gray-200">SSH Keys</h2>
74 <a href="{% url 'accounts:ssh_keys' %}" class="text-sm text-brand-light hover:text-brand">Manage Keys</a>
75 </div>
76 {% if ssh_keys %}
@@ -94,11 +94,11 @@
94 </div>
95 {% endif %}
96 </div>
97
98 <!-- Notification Preferences Card -->
99 <div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
100 <div class="p-4 border-b border-gray-700 flex items-center justify-between">
101 <h2 class="text-lg font-semibold text-gray-200">Notification Preferences</h2>
102 <a href="{% url 'accounts:notification_prefs' %}" class="text-sm text-brand-light hover:text-brand">Edit Preferences</a>
103 </div>
104 <div class="p-4">
@@ -121,15 +121,15 @@
121 </dl>
122 </div>
123 </div>
124
125 <!-- Personal Access Tokens Card -->
126 <div class="rounded-lg bg-gray-800 border border-gray-700 mb-6 shadow-sm">
127 <div class="p-4 border-b border-gray-700 flex items-center justify-between">
128 <h2 class="text-lg font-semibold text-gray-200">Personal Access Tokens</h2>
129 <a href="{% url 'accounts:profile_token_create' %}"
130 class="rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
131 Generate Token
132 </a>
133 </div>
134 {% if tokens %}
135 <div class="divide-y divide-gray-700">
136
--- templates/accounts/profile_edit.html
+++ templates/accounts/profile_edit.html
@@ -13,11 +13,11 @@
1313
</div>
1414
1515
<form method="post" class="space-y-6">
1616
{% csrf_token %}
1717
18
- <div class="rounded-lg bg-gray-800 border border-gray-700 p-6 space-y-4">
18
+ <div class="rounded-lg bg-gray-800 border border-gray-700 p-6 space-y-4 shadow-sm">
1919
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
2020
<div>
2121
<label for="first_name" class="block text-sm font-medium text-gray-300 mb-1">First Name</label>
2222
<input type="text" name="first_name" id="first_name" value="{{ user.first_name }}" maxlength="30"
2323
class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 text-sm px-3 py-2 focus:border-brand focus:ring-brand">
@@ -68,13 +68,13 @@
6868
</div>
6969
</div>
7070
</div>
7171
7272
<div class="flex items-center gap-3">
73
- <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white hover:bg-brand-hover">
73
+ <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
7474
Save Changes
7575
</button>
7676
<a href="{% url 'accounts:profile' %}" class="text-sm text-gray-400 hover:text-white">Cancel</a>
7777
</div>
7878
</form>
7979
</div>
8080
{% endblock %}
8181
--- templates/accounts/profile_edit.html
+++ templates/accounts/profile_edit.html
@@ -13,11 +13,11 @@
13 </div>
14
15 <form method="post" class="space-y-6">
16 {% csrf_token %}
17
18 <div class="rounded-lg bg-gray-800 border border-gray-700 p-6 space-y-4">
19 <div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
20 <div>
21 <label for="first_name" class="block text-sm font-medium text-gray-300 mb-1">First Name</label>
22 <input type="text" name="first_name" id="first_name" value="{{ user.first_name }}" maxlength="30"
23 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 text-sm px-3 py-2 focus:border-brand focus:ring-brand">
@@ -68,13 +68,13 @@
68 </div>
69 </div>
70 </div>
71
72 <div class="flex items-center gap-3">
73 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white hover:bg-brand-hover">
74 Save Changes
75 </button>
76 <a href="{% url 'accounts:profile' %}" class="text-sm text-gray-400 hover:text-white">Cancel</a>
77 </div>
78 </form>
79 </div>
80 {% endblock %}
81
--- templates/accounts/profile_edit.html
+++ templates/accounts/profile_edit.html
@@ -13,11 +13,11 @@
13 </div>
14
15 <form method="post" class="space-y-6">
16 {% csrf_token %}
17
18 <div class="rounded-lg bg-gray-800 border border-gray-700 p-6 space-y-4 shadow-sm">
19 <div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
20 <div>
21 <label for="first_name" class="block text-sm font-medium text-gray-300 mb-1">First Name</label>
22 <input type="text" name="first_name" id="first_name" value="{{ user.first_name }}" maxlength="30"
23 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 text-sm px-3 py-2 focus:border-brand focus:ring-brand">
@@ -68,13 +68,13 @@
68 </div>
69 </div>
70 </div>
71
72 <div class="flex items-center gap-3">
73 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
74 Save Changes
75 </button>
76 <a href="{% url 'accounts:profile' %}" class="text-sm text-gray-400 hover:text-white">Cancel</a>
77 </div>
78 </form>
79 </div>
80 {% endblock %}
81
--- templates/base.html
+++ templates/base.html
@@ -38,13 +38,17 @@
3838
<style type="text/tailwindcss">
3939
@layer base {
4040
input[type="text"], input[type="number"], input[type="email"],
4141
input[type="password"], input[type="search"], input[type="url"],
4242
textarea, select {
43
- @apply bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600
44
- text-gray-900 dark:text-gray-100 rounded-md shadow-sm
45
- focus:border-brand focus:ring-brand sm:text-sm;
43
+ @apply bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600
44
+ text-gray-900 dark:text-gray-100 rounded-md
45
+ shadow-sm dark:shadow-inner
46
+ focus:border-brand focus:ring-1 focus:ring-brand
47
+ placeholder-gray-500 dark:placeholder-gray-500
48
+ transition-colors duration-150
49
+ sm:text-sm;
4650
}
4751
}
4852
</style>
4953
<style>
5054
/* Hide scrollbar on horizontal-scroll navs (tabs, filter pills) */
5155
--- templates/base.html
+++ templates/base.html
@@ -38,13 +38,17 @@
38 <style type="text/tailwindcss">
39 @layer base {
40 input[type="text"], input[type="number"], input[type="email"],
41 input[type="password"], input[type="search"], input[type="url"],
42 textarea, select {
43 @apply bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600
44 text-gray-900 dark:text-gray-100 rounded-md shadow-sm
45 focus:border-brand focus:ring-brand sm:text-sm;
 
 
 
 
46 }
47 }
48 </style>
49 <style>
50 /* Hide scrollbar on horizontal-scroll navs (tabs, filter pills) */
51
--- templates/base.html
+++ templates/base.html
@@ -38,13 +38,17 @@
38 <style type="text/tailwindcss">
39 @layer base {
40 input[type="text"], input[type="number"], input[type="email"],
41 input[type="password"], input[type="search"], input[type="url"],
42 textarea, select {
43 @apply bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600
44 text-gray-900 dark:text-gray-100 rounded-md
45 shadow-sm dark:shadow-inner
46 focus:border-brand focus:ring-1 focus:ring-brand
47 placeholder-gray-500 dark:placeholder-gray-500
48 transition-colors duration-150
49 sm:text-sm;
50 }
51 }
52 </style>
53 <style>
54 /* Hide scrollbar on horizontal-scroll navs (tabs, filter pills) */
55
--- templates/dashboard.html
+++ templates/dashboard.html
@@ -12,31 +12,31 @@
1212
<p class="mt-1 text-sm text-gray-400">Welcome back, {{ user.get_full_name|default:user.username }}</p>
1313
</div>
1414
1515
<!-- Stats cards -->
1616
<div class="grid grid-cols-2 gap-4 sm:grid-cols-4 mb-6">
17
- <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
17
+ <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors">
1818
<div class="text-2xl font-bold text-gray-100">{{ total_projects }}</div>
1919
<div class="text-xs text-gray-500 mt-1">Projects</div>
2020
</div>
21
- <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
21
+ <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors">
2222
<div class="text-2xl font-bold text-gray-100">{{ total_checkins|default:"0" }}</div>
2323
<div class="text-xs text-gray-500 mt-1">Total Checkins</div>
2424
</div>
25
- <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
25
+ <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors">
2626
<div class="text-2xl font-bold text-gray-100">{{ total_tickets|default:"0" }}</div>
2727
<div class="text-xs text-gray-500 mt-1">Tickets</div>
2828
</div>
29
- <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
29
+ <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors">
3030
<div class="text-2xl font-bold text-gray-100">{{ total_wiki|default:"0" }}</div>
3131
<div class="text-xs text-gray-500 mt-1">Wiki Pages</div>
3232
</div>
3333
</div>
3434
3535
<!-- Activity heatmap (all projects, last year) -->
3636
{% if heatmap_json %}
37
-<div class="rounded-lg bg-gray-800 border border-gray-700 p-4 mb-6">
37
+<div class="rounded-lg bg-gray-800 border border-gray-700 p-4 mb-6 shadow-sm">
3838
<h3 class="text-sm font-medium text-gray-300 mb-3">Activity (last year)</h3>
3939
<div id="heatmap" class="overflow-x-auto"></div>
4040
<div class="flex items-center justify-end gap-1 mt-2 text-xs text-gray-500">
4141
<span>Less</span>
4242
<span class="inline-block w-3 h-3 rounded-sm bg-gray-700"></span>
@@ -52,27 +52,27 @@
5252
<div class="grid grid-cols-1 gap-6 lg:grid-cols-3">
5353
<!-- Main column -->
5454
<div class="lg:col-span-2 space-y-6">
5555
{% if system_activity_json and system_activity_json != "[]" %}
5656
<!-- System-wide activity chart -->
57
- <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
57
+ <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm">
5858
<h3 class="text-sm font-medium text-gray-300 mb-3">System Activity (26 weeks)</h3>
5959
<div style="height: 140px;">
6060
<canvas id="systemChart"></canvas>
6161
</div>
6262
</div>
6363
{% endif %}
6464
6565
{% if recent_across_all %}
6666
<!-- Recent activity across all projects -->
67
- <div class="rounded-lg bg-gray-800 border border-gray-700">
67
+ <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm">
6868
<div class="px-4 py-3 border-b border-gray-700">
6969
<h3 class="text-sm font-medium text-gray-300">Recent Activity</h3>
7070
</div>
7171
<div class="divide-y divide-gray-700">
7272
{% for item in recent_across_all %}
73
- <div class="px-4 py-3 flex items-start gap-3">
73
+ <div class="px-4 py-3 flex items-start gap-3 hover:bg-gray-700/30 transition-colors">
7474
<div class="flex-shrink-0 mt-1">
7575
<div class="w-2.5 h-2.5 rounded-full bg-brand"></div>
7676
</div>
7777
<div class="flex-1 min-w-0">
7878
<a href="{% url 'fossil:checkin_detail' slug=item.project.slug checkin_uuid=item.entry.uuid %}"
@@ -102,35 +102,35 @@
102102
103103
<!-- Sidebar -->
104104
<div class="space-y-4">
105105
<!-- Quick links -->
106106
{% if perms.projects.view_project %}
107
- <a href="{% url 'projects:list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
107
+ <a href="{% url 'projects:list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
108108
<h3 class="text-sm font-semibold text-gray-100">Projects</h3>
109109
<p class="mt-1 text-xs text-gray-500">Manage projects and team access</p>
110110
</a>
111111
{% endif %}
112112
{% if perms.organization.view_team %}
113
- <a href="{% url 'organization:team_list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
113
+ <a href="{% url 'organization:team_list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
114114
<h3 class="text-sm font-semibold text-gray-100">Teams</h3>
115115
<p class="mt-1 text-xs text-gray-500">Organize members into teams</p>
116116
</a>
117117
{% endif %}
118118
{% if perms.pages.view_page %}
119
- <a href="{% url 'pages:list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
119
+ <a href="{% url 'pages:list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
120120
<h3 class="text-sm font-semibold text-gray-100">FossilRepo Docs</h3>
121121
<p class="mt-1 text-xs text-gray-500">Guides, runbooks, documentation</p>
122122
</a>
123123
{% endif %}
124124
{% if perms.organization.view_organization %}
125
- <a href="{% url 'organization:settings' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
125
+ <a href="{% url 'organization:settings' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
126126
<h3 class="text-sm font-semibold text-gray-100">Settings</h3>
127127
<p class="mt-1 text-xs text-gray-500">Organization configuration</p>
128128
</a>
129129
{% endif %}
130130
{% if user.is_staff %}
131
- <a href="{% url 'admin:index' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
131
+ <a href="{% url 'admin:index' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
132132
<h3 class="text-sm font-semibold text-gray-100">Admin</h3>
133133
<p class="mt-1 text-xs text-gray-500">Users, groups, permissions</p>
134134
</a>
135135
{% endif %}
136136
</div>
137137
--- templates/dashboard.html
+++ templates/dashboard.html
@@ -12,31 +12,31 @@
12 <p class="mt-1 text-sm text-gray-400">Welcome back, {{ user.get_full_name|default:user.username }}</p>
13 </div>
14
15 <!-- Stats cards -->
16 <div class="grid grid-cols-2 gap-4 sm:grid-cols-4 mb-6">
17 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
18 <div class="text-2xl font-bold text-gray-100">{{ total_projects }}</div>
19 <div class="text-xs text-gray-500 mt-1">Projects</div>
20 </div>
21 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
22 <div class="text-2xl font-bold text-gray-100">{{ total_checkins|default:"0" }}</div>
23 <div class="text-xs text-gray-500 mt-1">Total Checkins</div>
24 </div>
25 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
26 <div class="text-2xl font-bold text-gray-100">{{ total_tickets|default:"0" }}</div>
27 <div class="text-xs text-gray-500 mt-1">Tickets</div>
28 </div>
29 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
30 <div class="text-2xl font-bold text-gray-100">{{ total_wiki|default:"0" }}</div>
31 <div class="text-xs text-gray-500 mt-1">Wiki Pages</div>
32 </div>
33 </div>
34
35 <!-- Activity heatmap (all projects, last year) -->
36 {% if heatmap_json %}
37 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 mb-6">
38 <h3 class="text-sm font-medium text-gray-300 mb-3">Activity (last year)</h3>
39 <div id="heatmap" class="overflow-x-auto"></div>
40 <div class="flex items-center justify-end gap-1 mt-2 text-xs text-gray-500">
41 <span>Less</span>
42 <span class="inline-block w-3 h-3 rounded-sm bg-gray-700"></span>
@@ -52,27 +52,27 @@
52 <div class="grid grid-cols-1 gap-6 lg:grid-cols-3">
53 <!-- Main column -->
54 <div class="lg:col-span-2 space-y-6">
55 {% if system_activity_json and system_activity_json != "[]" %}
56 <!-- System-wide activity chart -->
57 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4">
58 <h3 class="text-sm font-medium text-gray-300 mb-3">System Activity (26 weeks)</h3>
59 <div style="height: 140px;">
60 <canvas id="systemChart"></canvas>
61 </div>
62 </div>
63 {% endif %}
64
65 {% if recent_across_all %}
66 <!-- Recent activity across all projects -->
67 <div class="rounded-lg bg-gray-800 border border-gray-700">
68 <div class="px-4 py-3 border-b border-gray-700">
69 <h3 class="text-sm font-medium text-gray-300">Recent Activity</h3>
70 </div>
71 <div class="divide-y divide-gray-700">
72 {% for item in recent_across_all %}
73 <div class="px-4 py-3 flex items-start gap-3">
74 <div class="flex-shrink-0 mt-1">
75 <div class="w-2.5 h-2.5 rounded-full bg-brand"></div>
76 </div>
77 <div class="flex-1 min-w-0">
78 <a href="{% url 'fossil:checkin_detail' slug=item.project.slug checkin_uuid=item.entry.uuid %}"
@@ -102,35 +102,35 @@
102
103 <!-- Sidebar -->
104 <div class="space-y-4">
105 <!-- Quick links -->
106 {% if perms.projects.view_project %}
107 <a href="{% url 'projects:list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
108 <h3 class="text-sm font-semibold text-gray-100">Projects</h3>
109 <p class="mt-1 text-xs text-gray-500">Manage projects and team access</p>
110 </a>
111 {% endif %}
112 {% if perms.organization.view_team %}
113 <a href="{% url 'organization:team_list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
114 <h3 class="text-sm font-semibold text-gray-100">Teams</h3>
115 <p class="mt-1 text-xs text-gray-500">Organize members into teams</p>
116 </a>
117 {% endif %}
118 {% if perms.pages.view_page %}
119 <a href="{% url 'pages:list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
120 <h3 class="text-sm font-semibold text-gray-100">FossilRepo Docs</h3>
121 <p class="mt-1 text-xs text-gray-500">Guides, runbooks, documentation</p>
122 </a>
123 {% endif %}
124 {% if perms.organization.view_organization %}
125 <a href="{% url 'organization:settings' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
126 <h3 class="text-sm font-semibold text-gray-100">Settings</h3>
127 <p class="mt-1 text-xs text-gray-500">Organization configuration</p>
128 </a>
129 {% endif %}
130 {% if user.is_staff %}
131 <a href="{% url 'admin:index' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 hover:border-brand transition-colors">
132 <h3 class="text-sm font-semibold text-gray-100">Admin</h3>
133 <p class="mt-1 text-xs text-gray-500">Users, groups, permissions</p>
134 </a>
135 {% endif %}
136 </div>
137
--- templates/dashboard.html
+++ templates/dashboard.html
@@ -12,31 +12,31 @@
12 <p class="mt-1 text-sm text-gray-400">Welcome back, {{ user.get_full_name|default:user.username }}</p>
13 </div>
14
15 <!-- Stats cards -->
16 <div class="grid grid-cols-2 gap-4 sm:grid-cols-4 mb-6">
17 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors">
18 <div class="text-2xl font-bold text-gray-100">{{ total_projects }}</div>
19 <div class="text-xs text-gray-500 mt-1">Projects</div>
20 </div>
21 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors">
22 <div class="text-2xl font-bold text-gray-100">{{ total_checkins|default:"0" }}</div>
23 <div class="text-xs text-gray-500 mt-1">Total Checkins</div>
24 </div>
25 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors">
26 <div class="text-2xl font-bold text-gray-100">{{ total_tickets|default:"0" }}</div>
27 <div class="text-xs text-gray-500 mt-1">Tickets</div>
28 </div>
29 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors">
30 <div class="text-2xl font-bold text-gray-100">{{ total_wiki|default:"0" }}</div>
31 <div class="text-xs text-gray-500 mt-1">Wiki Pages</div>
32 </div>
33 </div>
34
35 <!-- Activity heatmap (all projects, last year) -->
36 {% if heatmap_json %}
37 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 mb-6 shadow-sm">
38 <h3 class="text-sm font-medium text-gray-300 mb-3">Activity (last year)</h3>
39 <div id="heatmap" class="overflow-x-auto"></div>
40 <div class="flex items-center justify-end gap-1 mt-2 text-xs text-gray-500">
41 <span>Less</span>
42 <span class="inline-block w-3 h-3 rounded-sm bg-gray-700"></span>
@@ -52,27 +52,27 @@
52 <div class="grid grid-cols-1 gap-6 lg:grid-cols-3">
53 <!-- Main column -->
54 <div class="lg:col-span-2 space-y-6">
55 {% if system_activity_json and system_activity_json != "[]" %}
56 <!-- System-wide activity chart -->
57 <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm">
58 <h3 class="text-sm font-medium text-gray-300 mb-3">System Activity (26 weeks)</h3>
59 <div style="height: 140px;">
60 <canvas id="systemChart"></canvas>
61 </div>
62 </div>
63 {% endif %}
64
65 {% if recent_across_all %}
66 <!-- Recent activity across all projects -->
67 <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm">
68 <div class="px-4 py-3 border-b border-gray-700">
69 <h3 class="text-sm font-medium text-gray-300">Recent Activity</h3>
70 </div>
71 <div class="divide-y divide-gray-700">
72 {% for item in recent_across_all %}
73 <div class="px-4 py-3 flex items-start gap-3 hover:bg-gray-700/30 transition-colors">
74 <div class="flex-shrink-0 mt-1">
75 <div class="w-2.5 h-2.5 rounded-full bg-brand"></div>
76 </div>
77 <div class="flex-1 min-w-0">
78 <a href="{% url 'fossil:checkin_detail' slug=item.project.slug checkin_uuid=item.entry.uuid %}"
@@ -102,35 +102,35 @@
102
103 <!-- Sidebar -->
104 <div class="space-y-4">
105 <!-- Quick links -->
106 {% if perms.projects.view_project %}
107 <a href="{% url 'projects:list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
108 <h3 class="text-sm font-semibold text-gray-100">Projects</h3>
109 <p class="mt-1 text-xs text-gray-500">Manage projects and team access</p>
110 </a>
111 {% endif %}
112 {% if perms.organization.view_team %}
113 <a href="{% url 'organization:team_list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
114 <h3 class="text-sm font-semibold text-gray-100">Teams</h3>
115 <p class="mt-1 text-xs text-gray-500">Organize members into teams</p>
116 </a>
117 {% endif %}
118 {% if perms.pages.view_page %}
119 <a href="{% url 'pages:list' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
120 <h3 class="text-sm font-semibold text-gray-100">FossilRepo Docs</h3>
121 <p class="mt-1 text-xs text-gray-500">Guides, runbooks, documentation</p>
122 </a>
123 {% endif %}
124 {% if perms.organization.view_organization %}
125 <a href="{% url 'organization:settings' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
126 <h3 class="text-sm font-semibold text-gray-100">Settings</h3>
127 <p class="mt-1 text-xs text-gray-500">Organization configuration</p>
128 </a>
129 {% endif %}
130 {% if user.is_staff %}
131 <a href="{% url 'admin:index' %}" class="block rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-brand hover:shadow-md transition-all">
132 <h3 class="text-sm font-semibold text-gray-100">Admin</h3>
133 <p class="mt-1 text-xs text-gray-500">Users, groups, permissions</p>
134 </a>
135 {% endif %}
136 </div>
137
--- templates/fossil/_project_nav.html
+++ templates/fossil/_project_nav.html
@@ -1,52 +1,52 @@
11
<nav aria-label="Project sections" class="flex space-x-1 border-b border-gray-700 mb-6 overflow-x-auto scrollbar-hide">
22
<a href="{% url 'projects:detail' slug=project.slug %}"
3
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'overview' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
3
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'overview' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
44
Overview
55
</a>
66
<a href="{% url 'fossil:code' slug=project.slug %}"
7
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'code' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
7
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'code' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
88
Code
99
</a>
1010
<a href="{% url 'fossil:branches' slug=project.slug %}"
11
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'branches' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
11
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'branches' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
1212
Branches
1313
</a>
1414
<a href="{% url 'fossil:timeline' slug=project.slug %}"
15
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'timeline' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
15
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'timeline' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
1616
Timeline
1717
</a>
1818
<a href="{% url 'fossil:tickets' slug=project.slug %}"
19
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'tickets' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
19
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'tickets' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
2020
Tickets
2121
</a>
2222
<a href="{% url 'fossil:wiki' slug=project.slug %}"
23
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'wiki' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
23
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'wiki' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
2424
Wiki
2525
</a>
2626
<a href="{% url 'fossil:forum' slug=project.slug %}"
27
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'forum' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
27
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'forum' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
2828
Forum
2929
</a>
3030
<a href="{% url 'fossil:releases' slug=project.slug %}"
31
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'releases' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
31
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'releases' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
3232
Releases
3333
</a>
3434
<a href="{% url 'fossil:unversioned' slug=project.slug %}"
35
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'files' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
35
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'files' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
3636
Files
3737
</a>
3838
{% if perms.projects.change_project %}
3939
<a href="{% url 'fossil:sync' slug=project.slug %}"
40
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'sync' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
40
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'sync' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
4141
{% if fossil_repo.remote_url %}Sync{% else %}Setup Sync{% endif %}
4242
</a>
4343
<a href="{% url 'fossil:repo_settings' slug=project.slug %}"
44
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'settings' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
44
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'settings' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
4545
Settings
4646
</a>
4747
<a href="{% url 'fossil:explorer' slug=project.slug %}"
48
- class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'explorer' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
48
+ class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'explorer' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
4949
Explorer
5050
</a>
5151
{% endif %}
5252
</nav>
5353
--- templates/fossil/_project_nav.html
+++ templates/fossil/_project_nav.html
@@ -1,52 +1,52 @@
1 <nav aria-label="Project sections" class="flex space-x-1 border-b border-gray-700 mb-6 overflow-x-auto scrollbar-hide">
2 <a href="{% url 'projects:detail' slug=project.slug %}"
3 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'overview' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
4 Overview
5 </a>
6 <a href="{% url 'fossil:code' slug=project.slug %}"
7 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'code' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
8 Code
9 </a>
10 <a href="{% url 'fossil:branches' slug=project.slug %}"
11 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'branches' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
12 Branches
13 </a>
14 <a href="{% url 'fossil:timeline' slug=project.slug %}"
15 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'timeline' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
16 Timeline
17 </a>
18 <a href="{% url 'fossil:tickets' slug=project.slug %}"
19 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'tickets' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
20 Tickets
21 </a>
22 <a href="{% url 'fossil:wiki' slug=project.slug %}"
23 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'wiki' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
24 Wiki
25 </a>
26 <a href="{% url 'fossil:forum' slug=project.slug %}"
27 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'forum' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
28 Forum
29 </a>
30 <a href="{% url 'fossil:releases' slug=project.slug %}"
31 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'releases' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
32 Releases
33 </a>
34 <a href="{% url 'fossil:unversioned' slug=project.slug %}"
35 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'files' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
36 Files
37 </a>
38 {% if perms.projects.change_project %}
39 <a href="{% url 'fossil:sync' slug=project.slug %}"
40 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'sync' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
41 {% if fossil_repo.remote_url %}Sync{% else %}Setup Sync{% endif %}
42 </a>
43 <a href="{% url 'fossil:repo_settings' slug=project.slug %}"
44 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'settings' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
45 Settings
46 </a>
47 <a href="{% url 'fossil:explorer' slug=project.slug %}"
48 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'explorer' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50{% endif %}">
49 Explorer
50 </a>
51 {% endif %}
52 </nav>
53
--- templates/fossil/_project_nav.html
+++ templates/fossil/_project_nav.html
@@ -1,52 +1,52 @@
1 <nav aria-label="Project sections" class="flex space-x-1 border-b border-gray-700 mb-6 overflow-x-auto scrollbar-hide">
2 <a href="{% url 'projects:detail' slug=project.slug %}"
3 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'overview' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
4 Overview
5 </a>
6 <a href="{% url 'fossil:code' slug=project.slug %}"
7 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'code' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
8 Code
9 </a>
10 <a href="{% url 'fossil:branches' slug=project.slug %}"
11 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'branches' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
12 Branches
13 </a>
14 <a href="{% url 'fossil:timeline' slug=project.slug %}"
15 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'timeline' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
16 Timeline
17 </a>
18 <a href="{% url 'fossil:tickets' slug=project.slug %}"
19 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'tickets' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
20 Tickets
21 </a>
22 <a href="{% url 'fossil:wiki' slug=project.slug %}"
23 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'wiki' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
24 Wiki
25 </a>
26 <a href="{% url 'fossil:forum' slug=project.slug %}"
27 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'forum' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
28 Forum
29 </a>
30 <a href="{% url 'fossil:releases' slug=project.slug %}"
31 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'releases' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
32 Releases
33 </a>
34 <a href="{% url 'fossil:unversioned' slug=project.slug %}"
35 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'files' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
36 Files
37 </a>
38 {% if perms.projects.change_project %}
39 <a href="{% url 'fossil:sync' slug=project.slug %}"
40 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'sync' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
41 {% if fossil_repo.remote_url %}Sync{% else %}Setup Sync{% endif %}
42 </a>
43 <a href="{% url 'fossil:repo_settings' slug=project.slug %}"
44 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'settings' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
45 Settings
46 </a>
47 <a href="{% url 'fossil:explorer' slug=project.slug %}"
48 class="px-3 py-2.5 sm:px-4 sm:py-2 text-sm font-medium rounded-t-md whitespace-nowrap {% if active_tab == 'explorer' %}bg-gray-800 text-gray-100 border-b-2 border-brand{% else %}text-gray-400 hover:text-gray-200 hover:bg-gray-800/50 transition-colors{% endif %}">
49 Explorer
50 </a>
51 {% endif %}
52 </nav>
53
--- templates/fossil/branch_list.html
+++ templates/fossil/branch_list.html
@@ -27,22 +27,22 @@
2727
</div>
2828
2929
<div id="branch-content">
3030
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3131
<table class="min-w-full divide-y divide-gray-700">
32
- <thead class="bg-gray-900">
32
+ <thead class="bg-gray-900/80">
3333
<tr>
34
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Branch</th>
35
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Last Checkin</th>
36
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">By</th>
37
- <th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-400">Checkins</th>
38
- <th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-400">Updated</th>
34
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Branch</th>
35
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Last Checkin</th>
36
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">By</th>
37
+ <th class="px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Checkins</th>
38
+ <th class="px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Updated</th>
3939
</tr>
4040
</thead>
41
- <tbody class="divide-y divide-gray-700 bg-gray-800">
41
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
4242
{% for branch in branches %}
43
- <tr class="hover:bg-gray-700/50">
43
+ <tr class="hover:bg-gray-700/40 transition-colors">
4444
<td class="px-4 py-3">
4545
<a href="{% url 'fossil:timeline' slug=project.slug %}?type=ci" class="inline-flex items-center rounded-md bg-brand/10 border border-brand/20 px-2 py-0.5 text-sm text-brand-light hover:text-brand">
4646
{{ branch.name }}
4747
</a>
4848
</td>
4949
--- templates/fossil/branch_list.html
+++ templates/fossil/branch_list.html
@@ -27,22 +27,22 @@
27 </div>
28
29 <div id="branch-content">
30 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
31 <table class="min-w-full divide-y divide-gray-700">
32 <thead class="bg-gray-900">
33 <tr>
34 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Branch</th>
35 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Last Checkin</th>
36 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">By</th>
37 <th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-400">Checkins</th>
38 <th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-400">Updated</th>
39 </tr>
40 </thead>
41 <tbody class="divide-y divide-gray-700 bg-gray-800">
42 {% for branch in branches %}
43 <tr class="hover:bg-gray-700/50">
44 <td class="px-4 py-3">
45 <a href="{% url 'fossil:timeline' slug=project.slug %}?type=ci" class="inline-flex items-center rounded-md bg-brand/10 border border-brand/20 px-2 py-0.5 text-sm text-brand-light hover:text-brand">
46 {{ branch.name }}
47 </a>
48 </td>
49
--- templates/fossil/branch_list.html
+++ templates/fossil/branch_list.html
@@ -27,22 +27,22 @@
27 </div>
28
29 <div id="branch-content">
30 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
31 <table class="min-w-full divide-y divide-gray-700">
32 <thead class="bg-gray-900/80">
33 <tr>
34 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Branch</th>
35 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Last Checkin</th>
36 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">By</th>
37 <th class="px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Checkins</th>
38 <th class="px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Updated</th>
39 </tr>
40 </thead>
41 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
42 {% for branch in branches %}
43 <tr class="hover:bg-gray-700/40 transition-colors">
44 <td class="px-4 py-3">
45 <a href="{% url 'fossil:timeline' slug=project.slug %}?type=ci" class="inline-flex items-center rounded-md bg-brand/10 border border-brand/20 px-2 py-0.5 text-sm text-brand-light hover:text-brand">
46 {{ branch.name }}
47 </a>
48 </td>
49
--- templates/fossil/checkin_detail.html
+++ templates/fossil/checkin_detail.html
@@ -56,11 +56,11 @@
5656
<h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
5757
{% include "fossil/_project_nav.html" %}
5858
5959
<div class="space-y-4">
6060
<!-- Commit header -->
61
- <div class="rounded-lg bg-gray-800 border border-gray-700">
61
+ <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm">
6262
<div class="px-6 py-5">
6363
<p class="text-lg text-gray-100 leading-relaxed">{{ checkin.comment }}</p>
6464
<div class="mt-3 flex items-center gap-x-4 gap-y-1 flex-wrap text-sm">
6565
<a href="{% url 'fossil:user_activity' slug=project.slug username=checkin.user %}" class="font-medium text-gray-200 hover:text-brand-light">{{ checkin.user|display_user }}</a>
6666
<span class="text-gray-500">{{ checkin.timestamp|date:"Y-m-d H:i" }}</span>
@@ -123,11 +123,11 @@
123123
</div>
124124
</div>
125125
126126
<!-- File summary bar -->
127127
{% if file_diffs %}
128
- <div class="rounded-lg bg-gray-800 border border-gray-700 px-4 py-3">
128
+ <div class="rounded-lg bg-gray-800 border border-gray-700 px-4 py-3 shadow-sm">
129129
<div class="flex items-center gap-4 text-sm">
130130
<span class="text-gray-300 font-medium">{{ file_diffs|length }} file{{ file_diffs|length|pluralize }} changed</span>
131131
{% with total_add=0 total_del=0 %}
132132
{% for fd in file_diffs %}
133133
{% if fd.additions %}
@@ -155,18 +155,18 @@
155155
</div>
156156
</div>
157157
158158
<!-- Diff mode toggle -->
159159
<div x-data="{ mode: localStorage.getItem('diff-mode') || 'unified' }" x-init="$watch('mode', val => localStorage.setItem('diff-mode', val))" x-ref="diffToggle">
160
- <div class="flex items-center gap-2 mb-3">
161
- <button @click="mode = 'unified'" :class="mode === 'unified' ? 'bg-gray-700 text-gray-100' : 'text-gray-400 hover:text-gray-200'" class="px-3 py-1 text-xs rounded-md">Unified</button>
162
- <button @click="mode = 'split'" :class="mode === 'split' ? 'bg-gray-700 text-gray-100' : 'text-gray-400 hover:text-gray-200'" class="px-3 py-1 text-xs rounded-md">Split</button>
160
+ <div class="flex items-center gap-1 mb-3">
161
+ <button @click="mode = 'unified'" :class="mode === 'unified' ? 'bg-gray-700 text-gray-100 shadow-sm' : 'text-gray-400 hover:text-gray-200 hover:bg-gray-800'" class="px-3 py-1 text-xs rounded-md border border-gray-700 transition-colors">Unified</button>
162
+ <button @click="mode = 'split'" :class="mode === 'split' ? 'bg-gray-700 text-gray-100 shadow-sm' : 'text-gray-400 hover:text-gray-200 hover:bg-gray-800'" class="px-3 py-1 text-xs rounded-md border border-gray-700 transition-colors">Split</button>
163163
</div>
164164
165165
<!-- Diffs -->
166166
{% for fd in file_diffs %}
167
- <div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden mb-4" id="diff-{{ forloop.counter }}" data-filename="{{ fd.name }}">
167
+ <div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden mb-4 shadow-sm" id="diff-{{ forloop.counter }}" data-filename="{{ fd.name }}">
168168
<div class="px-4 py-2.5 border-b border-gray-700 flex items-center justify-between bg-gray-900/50">
169169
<div class="flex items-center gap-3">
170170
{% if fd.change_type == "added" %}
171171
<span class="inline-flex items-center justify-center w-5 h-5 rounded text-xs font-bold bg-green-900/50 text-green-300">A</span>
172172
{% elif fd.change_type == "deleted" %}
173173
--- templates/fossil/checkin_detail.html
+++ templates/fossil/checkin_detail.html
@@ -56,11 +56,11 @@
56 <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
57 {% include "fossil/_project_nav.html" %}
58
59 <div class="space-y-4">
60 <!-- Commit header -->
61 <div class="rounded-lg bg-gray-800 border border-gray-700">
62 <div class="px-6 py-5">
63 <p class="text-lg text-gray-100 leading-relaxed">{{ checkin.comment }}</p>
64 <div class="mt-3 flex items-center gap-x-4 gap-y-1 flex-wrap text-sm">
65 <a href="{% url 'fossil:user_activity' slug=project.slug username=checkin.user %}" class="font-medium text-gray-200 hover:text-brand-light">{{ checkin.user|display_user }}</a>
66 <span class="text-gray-500">{{ checkin.timestamp|date:"Y-m-d H:i" }}</span>
@@ -123,11 +123,11 @@
123 </div>
124 </div>
125
126 <!-- File summary bar -->
127 {% if file_diffs %}
128 <div class="rounded-lg bg-gray-800 border border-gray-700 px-4 py-3">
129 <div class="flex items-center gap-4 text-sm">
130 <span class="text-gray-300 font-medium">{{ file_diffs|length }} file{{ file_diffs|length|pluralize }} changed</span>
131 {% with total_add=0 total_del=0 %}
132 {% for fd in file_diffs %}
133 {% if fd.additions %}
@@ -155,18 +155,18 @@
155 </div>
156 </div>
157
158 <!-- Diff mode toggle -->
159 <div x-data="{ mode: localStorage.getItem('diff-mode') || 'unified' }" x-init="$watch('mode', val => localStorage.setItem('diff-mode', val))" x-ref="diffToggle">
160 <div class="flex items-center gap-2 mb-3">
161 <button @click="mode = 'unified'" :class="mode === 'unified' ? 'bg-gray-700 text-gray-100' : 'text-gray-400 hover:text-gray-200'" class="px-3 py-1 text-xs rounded-md">Unified</button>
162 <button @click="mode = 'split'" :class="mode === 'split' ? 'bg-gray-700 text-gray-100' : 'text-gray-400 hover:text-gray-200'" class="px-3 py-1 text-xs rounded-md">Split</button>
163 </div>
164
165 <!-- Diffs -->
166 {% for fd in file_diffs %}
167 <div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden mb-4" id="diff-{{ forloop.counter }}" data-filename="{{ fd.name }}">
168 <div class="px-4 py-2.5 border-b border-gray-700 flex items-center justify-between bg-gray-900/50">
169 <div class="flex items-center gap-3">
170 {% if fd.change_type == "added" %}
171 <span class="inline-flex items-center justify-center w-5 h-5 rounded text-xs font-bold bg-green-900/50 text-green-300">A</span>
172 {% elif fd.change_type == "deleted" %}
173
--- templates/fossil/checkin_detail.html
+++ templates/fossil/checkin_detail.html
@@ -56,11 +56,11 @@
56 <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
57 {% include "fossil/_project_nav.html" %}
58
59 <div class="space-y-4">
60 <!-- Commit header -->
61 <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm">
62 <div class="px-6 py-5">
63 <p class="text-lg text-gray-100 leading-relaxed">{{ checkin.comment }}</p>
64 <div class="mt-3 flex items-center gap-x-4 gap-y-1 flex-wrap text-sm">
65 <a href="{% url 'fossil:user_activity' slug=project.slug username=checkin.user %}" class="font-medium text-gray-200 hover:text-brand-light">{{ checkin.user|display_user }}</a>
66 <span class="text-gray-500">{{ checkin.timestamp|date:"Y-m-d H:i" }}</span>
@@ -123,11 +123,11 @@
123 </div>
124 </div>
125
126 <!-- File summary bar -->
127 {% if file_diffs %}
128 <div class="rounded-lg bg-gray-800 border border-gray-700 px-4 py-3 shadow-sm">
129 <div class="flex items-center gap-4 text-sm">
130 <span class="text-gray-300 font-medium">{{ file_diffs|length }} file{{ file_diffs|length|pluralize }} changed</span>
131 {% with total_add=0 total_del=0 %}
132 {% for fd in file_diffs %}
133 {% if fd.additions %}
@@ -155,18 +155,18 @@
155 </div>
156 </div>
157
158 <!-- Diff mode toggle -->
159 <div x-data="{ mode: localStorage.getItem('diff-mode') || 'unified' }" x-init="$watch('mode', val => localStorage.setItem('diff-mode', val))" x-ref="diffToggle">
160 <div class="flex items-center gap-1 mb-3">
161 <button @click="mode = 'unified'" :class="mode === 'unified' ? 'bg-gray-700 text-gray-100 shadow-sm' : 'text-gray-400 hover:text-gray-200 hover:bg-gray-800'" class="px-3 py-1 text-xs rounded-md border border-gray-700 transition-colors">Unified</button>
162 <button @click="mode = 'split'" :class="mode === 'split' ? 'bg-gray-700 text-gray-100 shadow-sm' : 'text-gray-400 hover:text-gray-200 hover:bg-gray-800'" class="px-3 py-1 text-xs rounded-md border border-gray-700 transition-colors">Split</button>
163 </div>
164
165 <!-- Diffs -->
166 {% for fd in file_diffs %}
167 <div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden mb-4 shadow-sm" id="diff-{{ forloop.counter }}" data-filename="{{ fd.name }}">
168 <div class="px-4 py-2.5 border-b border-gray-700 flex items-center justify-between bg-gray-900/50">
169 <div class="flex items-center gap-3">
170 {% if fd.change_type == "added" %}
171 <span class="inline-flex items-center justify-center w-5 h-5 rounded text-xs font-bold bg-green-900/50 text-green-300">A</span>
172 {% elif fd.change_type == "deleted" %}
173
--- templates/fossil/code_browser.html
+++ templates/fossil/code_browser.html
@@ -5,11 +5,11 @@
55
66
{% block content %}
77
<h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
88
{% include "fossil/_project_nav.html" %}
99
10
-<div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
10
+<div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
1111
<!-- Breadcrumb + commit bar -->
1212
<div class="px-4 py-3 border-b border-gray-700">
1313
<!-- Breadcrumbs -->
1414
<div class="flex flex-wrap items-center justify-between gap-2">
1515
<div class="flex items-center gap-1 text-sm min-w-0">
@@ -47,15 +47,15 @@
4747
<!-- File table -->
4848
{% include "fossil/partials/file_tree.html" %}
4949
</div>
5050
5151
{% if readme_html %}
52
-<div class="mt-4 rounded-lg bg-gray-800 border border-gray-700">
52
+<div class="mt-4 rounded-lg bg-gray-800 border border-gray-700 shadow-sm">
5353
<div class="px-4 py-3 border-b border-gray-700 text-sm font-medium text-gray-300">README</div>
5454
<div class="px-6 py-5">
5555
<div class="prose prose-invert prose-gray max-w-none">
5656
{{ readme_html }}
5757
</div>
5858
</div>
5959
</div>
6060
{% endif %}
6161
{% endblock %}
6262
--- templates/fossil/code_browser.html
+++ templates/fossil/code_browser.html
@@ -5,11 +5,11 @@
5
6 {% block content %}
7 <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
8 {% include "fossil/_project_nav.html" %}
9
10 <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
11 <!-- Breadcrumb + commit bar -->
12 <div class="px-4 py-3 border-b border-gray-700">
13 <!-- Breadcrumbs -->
14 <div class="flex flex-wrap items-center justify-between gap-2">
15 <div class="flex items-center gap-1 text-sm min-w-0">
@@ -47,15 +47,15 @@
47 <!-- File table -->
48 {% include "fossil/partials/file_tree.html" %}
49 </div>
50
51 {% if readme_html %}
52 <div class="mt-4 rounded-lg bg-gray-800 border border-gray-700">
53 <div class="px-4 py-3 border-b border-gray-700 text-sm font-medium text-gray-300">README</div>
54 <div class="px-6 py-5">
55 <div class="prose prose-invert prose-gray max-w-none">
56 {{ readme_html }}
57 </div>
58 </div>
59 </div>
60 {% endif %}
61 {% endblock %}
62
--- templates/fossil/code_browser.html
+++ templates/fossil/code_browser.html
@@ -5,11 +5,11 @@
5
6 {% block content %}
7 <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
8 {% include "fossil/_project_nav.html" %}
9
10 <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
11 <!-- Breadcrumb + commit bar -->
12 <div class="px-4 py-3 border-b border-gray-700">
13 <!-- Breadcrumbs -->
14 <div class="flex flex-wrap items-center justify-between gap-2">
15 <div class="flex items-center gap-1 text-sm min-w-0">
@@ -47,15 +47,15 @@
47 <!-- File table -->
48 {% include "fossil/partials/file_tree.html" %}
49 </div>
50
51 {% if readme_html %}
52 <div class="mt-4 rounded-lg bg-gray-800 border border-gray-700 shadow-sm">
53 <div class="px-4 py-3 border-b border-gray-700 text-sm font-medium text-gray-300">README</div>
54 <div class="px-6 py-5">
55 <div class="prose prose-invert prose-gray max-w-none">
56 {{ readme_html }}
57 </div>
58 </div>
59 </div>
60 {% endif %}
61 {% endblock %}
62
--- templates/fossil/code_file.html
+++ templates/fossil/code_file.html
@@ -41,11 +41,11 @@
4141
4242
{% block content %}
4343
<h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
4444
{% include "fossil/_project_nav.html" %}
4545
46
-<div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
46
+<div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
4747
<!-- File path breadcrumb + stats -->
4848
<div class="px-4 py-3 border-b border-gray-700 flex flex-wrap items-center justify-between gap-x-2 gap-y-2">
4949
<div class="flex flex-wrap items-center gap-1 text-sm font-mono min-w-0">
5050
<a href="{% url 'fossil:code' slug=project.slug %}" class="text-brand-light hover:text-brand">{{ project.slug }}</a>
5151
{% for crumb in file_breadcrumbs %}
5252
--- templates/fossil/code_file.html
+++ templates/fossil/code_file.html
@@ -41,11 +41,11 @@
41
42 {% block content %}
43 <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
44 {% include "fossil/_project_nav.html" %}
45
46 <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
47 <!-- File path breadcrumb + stats -->
48 <div class="px-4 py-3 border-b border-gray-700 flex flex-wrap items-center justify-between gap-x-2 gap-y-2">
49 <div class="flex flex-wrap items-center gap-1 text-sm font-mono min-w-0">
50 <a href="{% url 'fossil:code' slug=project.slug %}" class="text-brand-light hover:text-brand">{{ project.slug }}</a>
51 {% for crumb in file_breadcrumbs %}
52
--- templates/fossil/code_file.html
+++ templates/fossil/code_file.html
@@ -41,11 +41,11 @@
41
42 {% block content %}
43 <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
44 {% include "fossil/_project_nav.html" %}
45
46 <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
47 <!-- File path breadcrumb + stats -->
48 <div class="px-4 py-3 border-b border-gray-700 flex flex-wrap items-center justify-between gap-x-2 gap-y-2">
49 <div class="flex flex-wrap items-center gap-1 text-sm font-mono min-w-0">
50 <a href="{% url 'fossil:code' slug=project.slug %}" class="text-brand-light hover:text-brand">{{ project.slug }}</a>
51 {% for crumb in file_breadcrumbs %}
52
--- templates/fossil/forum_form.html
+++ templates/fossil/forum_form.html
@@ -20,25 +20,25 @@
2020
<button @click="tab = 'write'" :class="tab === 'write' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Write</button>
2121
<button @click="tab = 'preview'; document.getElementById('preview-pane').innerHTML = DOMPurify.sanitize(marked.parse(document.getElementById('body-input').value))" :class="tab === 'preview' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Preview</button>
2222
</div>
2323
</div>
2424
25
- <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
25
+ <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
2626
{% csrf_token %}
2727
2828
{% if not parent %}
2929
<div>
3030
<label class="block text-sm font-medium text-gray-300 mb-1">Title <span class="text-red-400">*</span></label>
3131
<input type="text" name="title" required placeholder="Thread title"
32
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
32
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
3333
</div>
3434
{% endif %}
3535
3636
<div x-show="tab === 'write'">
3737
<label class="block text-sm font-medium text-gray-300 mb-1">Body (Markdown) <span class="text-red-400">*</span></label>
3838
<textarea id="body-input" name="body" rows="12" required placeholder="Write your post in Markdown..."
39
- class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm font-mono"></textarea>
39
+ class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm font-mono transition-colors"></textarea>
4040
</div>
4141
4242
<div x-show="tab === 'preview'" style="display:none">
4343
<div id="preview-pane" class="prose prose-invert prose-gray max-w-none min-h-[12rem] p-4 rounded-md border border-gray-700 bg-gray-900">
4444
<p class="text-gray-500 italic">Click Preview to render...</p>
@@ -45,15 +45,15 @@
4545
</div>
4646
</div>
4747
4848
<div class="flex justify-end gap-3 pt-2">
4949
<a href="{% url 'fossil:forum' slug=project.slug %}"
50
- class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
50
+ class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
5151
Cancel
5252
</a>
53
- <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
53
+ <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
5454
{% if parent %}Post Reply{% else %}Create Thread{% endif %}
5555
</button>
5656
</div>
5757
</form>
5858
</div>
5959
{% endblock %}
6060
--- templates/fossil/forum_form.html
+++ templates/fossil/forum_form.html
@@ -20,25 +20,25 @@
20 <button @click="tab = 'write'" :class="tab === 'write' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Write</button>
21 <button @click="tab = 'preview'; document.getElementById('preview-pane').innerHTML = DOMPurify.sanitize(marked.parse(document.getElementById('body-input').value))" :class="tab === 'preview' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Preview</button>
22 </div>
23 </div>
24
25 <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
26 {% csrf_token %}
27
28 {% if not parent %}
29 <div>
30 <label class="block text-sm font-medium text-gray-300 mb-1">Title <span class="text-red-400">*</span></label>
31 <input type="text" name="title" required placeholder="Thread title"
32 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
33 </div>
34 {% endif %}
35
36 <div x-show="tab === 'write'">
37 <label class="block text-sm font-medium text-gray-300 mb-1">Body (Markdown) <span class="text-red-400">*</span></label>
38 <textarea id="body-input" name="body" rows="12" required placeholder="Write your post in Markdown..."
39 class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm font-mono"></textarea>
40 </div>
41
42 <div x-show="tab === 'preview'" style="display:none">
43 <div id="preview-pane" class="prose prose-invert prose-gray max-w-none min-h-[12rem] p-4 rounded-md border border-gray-700 bg-gray-900">
44 <p class="text-gray-500 italic">Click Preview to render...</p>
@@ -45,15 +45,15 @@
45 </div>
46 </div>
47
48 <div class="flex justify-end gap-3 pt-2">
49 <a href="{% url 'fossil:forum' slug=project.slug %}"
50 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
51 Cancel
52 </a>
53 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
54 {% if parent %}Post Reply{% else %}Create Thread{% endif %}
55 </button>
56 </div>
57 </form>
58 </div>
59 {% endblock %}
60
--- templates/fossil/forum_form.html
+++ templates/fossil/forum_form.html
@@ -20,25 +20,25 @@
20 <button @click="tab = 'write'" :class="tab === 'write' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Write</button>
21 <button @click="tab = 'preview'; document.getElementById('preview-pane').innerHTML = DOMPurify.sanitize(marked.parse(document.getElementById('body-input').value))" :class="tab === 'preview' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Preview</button>
22 </div>
23 </div>
24
25 <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
26 {% csrf_token %}
27
28 {% if not parent %}
29 <div>
30 <label class="block text-sm font-medium text-gray-300 mb-1">Title <span class="text-red-400">*</span></label>
31 <input type="text" name="title" required placeholder="Thread title"
32 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
33 </div>
34 {% endif %}
35
36 <div x-show="tab === 'write'">
37 <label class="block text-sm font-medium text-gray-300 mb-1">Body (Markdown) <span class="text-red-400">*</span></label>
38 <textarea id="body-input" name="body" rows="12" required placeholder="Write your post in Markdown..."
39 class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm font-mono transition-colors"></textarea>
40 </div>
41
42 <div x-show="tab === 'preview'" style="display:none">
43 <div id="preview-pane" class="prose prose-invert prose-gray max-w-none min-h-[12rem] p-4 rounded-md border border-gray-700 bg-gray-900">
44 <p class="text-gray-500 italic">Click Preview to render...</p>
@@ -45,15 +45,15 @@
45 </div>
46 </div>
47
48 <div class="flex justify-end gap-3 pt-2">
49 <a href="{% url 'fossil:forum' slug=project.slug %}"
50 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
51 Cancel
52 </a>
53 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
54 {% if parent %}Post Reply{% else %}Create Thread{% endif %}
55 </button>
56 </div>
57 </form>
58 </div>
59 {% endblock %}
60
--- templates/fossil/forum_list.html
+++ templates/fossil/forum_list.html
@@ -24,21 +24,21 @@
2424
hx-indicator="closest .search-wrap" />
2525
<svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
2626
</span>
2727
{% if has_write %}
2828
<a href="{% url 'fossil:forum_create' slug=project.slug %}"
29
- class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
29
+ class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
3030
New Thread
3131
</a>
3232
{% endif %}
3333
</div>
3434
</div>
3535
3636
<div id="forum-content">
3737
<div class="space-y-3">
3838
{% for post in posts %}
39
- <div class="rounded-lg bg-gray-800 border border-gray-700 hover:border-gray-600 transition-colors">
39
+ <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm hover:border-gray-600 transition-colors">
4040
<div class="px-5 py-4">
4141
{% if post.source == "django" %}
4242
<a href="{% url 'fossil:forum_thread' slug=project.slug thread_uuid=post.uuid %}"
4343
class="text-base font-medium text-brand-light hover:text-brand">
4444
{{ post.title|default:"(untitled)" }}
4545
--- templates/fossil/forum_list.html
+++ templates/fossil/forum_list.html
@@ -24,21 +24,21 @@
24 hx-indicator="closest .search-wrap" />
25 <svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
26 </span>
27 {% if has_write %}
28 <a href="{% url 'fossil:forum_create' slug=project.slug %}"
29 class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
30 New Thread
31 </a>
32 {% endif %}
33 </div>
34 </div>
35
36 <div id="forum-content">
37 <div class="space-y-3">
38 {% for post in posts %}
39 <div class="rounded-lg bg-gray-800 border border-gray-700 hover:border-gray-600 transition-colors">
40 <div class="px-5 py-4">
41 {% if post.source == "django" %}
42 <a href="{% url 'fossil:forum_thread' slug=project.slug thread_uuid=post.uuid %}"
43 class="text-base font-medium text-brand-light hover:text-brand">
44 {{ post.title|default:"(untitled)" }}
45
--- templates/fossil/forum_list.html
+++ templates/fossil/forum_list.html
@@ -24,21 +24,21 @@
24 hx-indicator="closest .search-wrap" />
25 <svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
26 </span>
27 {% if has_write %}
28 <a href="{% url 'fossil:forum_create' slug=project.slug %}"
29 class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
30 New Thread
31 </a>
32 {% endif %}
33 </div>
34 </div>
35
36 <div id="forum-content">
37 <div class="space-y-3">
38 {% for post in posts %}
39 <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm hover:border-gray-600 transition-colors">
40 <div class="px-5 py-4">
41 {% if post.source == "django" %}
42 <a href="{% url 'fossil:forum_thread' slug=project.slug thread_uuid=post.uuid %}"
43 class="text-base font-medium text-brand-light hover:text-brand">
44 {{ post.title|default:"(untitled)" }}
45
--- templates/fossil/forum_thread.html
+++ templates/fossil/forum_thread.html
@@ -10,11 +10,11 @@
1010
<a href="{% url 'fossil:forum' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">&larr; Back to forum</a>
1111
</div>
1212
1313
<div class="space-y-3">
1414
{% for item in posts %}
15
- <div class="rounded-lg bg-gray-800 border border-gray-700 {% if item.post.in_reply_to %}ml-8{% endif %}">
15
+ <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm {% if item.post.in_reply_to %}ml-8{% endif %}">
1616
<div class="px-5 py-4">
1717
<div class="flex items-center justify-between mb-2">
1818
{% if is_django_thread %}
1919
<span class="text-sm font-medium text-gray-200">{{ item.post.user|display_user }}</span>
2020
{% else %}
@@ -40,19 +40,19 @@
4040
</div>
4141
4242
{% if has_write and is_django_thread %}
4343
<div class="mt-6">
4444
<h3 class="text-sm font-semibold text-gray-300 mb-3">Reply</h3>
45
- <form method="post" action="{% url 'fossil:forum_reply' slug=project.slug post_id=thread_uuid %}" class="space-y-3 rounded-lg bg-gray-800 p-5 border border-gray-700">
45
+ <form method="post" action="{% url 'fossil:forum_reply' slug=project.slug post_id=thread_uuid %}" class="space-y-3 rounded-lg bg-gray-800 p-5 border border-gray-700 shadow-sm">
4646
{% csrf_token %}
4747
<textarea name="body" rows="6" required placeholder="Write your reply in Markdown..."
4848
aria-label="Write a reply"
49
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm font-mono"></textarea>
49
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm font-mono transition-colors"></textarea>
5050
<div class="flex justify-end">
51
- <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
51
+ <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
5252
Post Reply
5353
</button>
5454
</div>
5555
</form>
5656
</div>
5757
{% endif %}
5858
{% endblock %}
5959
--- templates/fossil/forum_thread.html
+++ templates/fossil/forum_thread.html
@@ -10,11 +10,11 @@
10 <a href="{% url 'fossil:forum' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">&larr; Back to forum</a>
11 </div>
12
13 <div class="space-y-3">
14 {% for item in posts %}
15 <div class="rounded-lg bg-gray-800 border border-gray-700 {% if item.post.in_reply_to %}ml-8{% endif %}">
16 <div class="px-5 py-4">
17 <div class="flex items-center justify-between mb-2">
18 {% if is_django_thread %}
19 <span class="text-sm font-medium text-gray-200">{{ item.post.user|display_user }}</span>
20 {% else %}
@@ -40,19 +40,19 @@
40 </div>
41
42 {% if has_write and is_django_thread %}
43 <div class="mt-6">
44 <h3 class="text-sm font-semibold text-gray-300 mb-3">Reply</h3>
45 <form method="post" action="{% url 'fossil:forum_reply' slug=project.slug post_id=thread_uuid %}" class="space-y-3 rounded-lg bg-gray-800 p-5 border border-gray-700">
46 {% csrf_token %}
47 <textarea name="body" rows="6" required placeholder="Write your reply in Markdown..."
48 aria-label="Write a reply"
49 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm font-mono"></textarea>
50 <div class="flex justify-end">
51 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
52 Post Reply
53 </button>
54 </div>
55 </form>
56 </div>
57 {% endif %}
58 {% endblock %}
59
--- templates/fossil/forum_thread.html
+++ templates/fossil/forum_thread.html
@@ -10,11 +10,11 @@
10 <a href="{% url 'fossil:forum' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">&larr; Back to forum</a>
11 </div>
12
13 <div class="space-y-3">
14 {% for item in posts %}
15 <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm {% if item.post.in_reply_to %}ml-8{% endif %}">
16 <div class="px-5 py-4">
17 <div class="flex items-center justify-between mb-2">
18 {% if is_django_thread %}
19 <span class="text-sm font-medium text-gray-200">{{ item.post.user|display_user }}</span>
20 {% else %}
@@ -40,19 +40,19 @@
40 </div>
41
42 {% if has_write and is_django_thread %}
43 <div class="mt-6">
44 <h3 class="text-sm font-semibold text-gray-300 mb-3">Reply</h3>
45 <form method="post" action="{% url 'fossil:forum_reply' slug=project.slug post_id=thread_uuid %}" class="space-y-3 rounded-lg bg-gray-800 p-5 border border-gray-700 shadow-sm">
46 {% csrf_token %}
47 <textarea name="body" rows="6" required placeholder="Write your reply in Markdown..."
48 aria-label="Write a reply"
49 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm font-mono transition-colors"></textarea>
50 <div class="flex justify-end">
51 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
52 Post Reply
53 </button>
54 </div>
55 </form>
56 </div>
57 {% endif %}
58 {% endblock %}
59
--- templates/fossil/partials/explorer_table.html
+++ templates/fossil/partials/explorer_table.html
@@ -1,6 +1,6 @@
1
-<div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden">
1
+<div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden shadow-sm">
22
<!-- Header -->
33
<div class="px-4 py-3 border-b border-gray-700 flex items-center justify-between">
44
<div>
55
<h3 class="text-base font-mono font-semibold text-gray-100">{{ table_name }}</h3>
66
<p class="text-xs text-gray-500 mt-0.5">{{ total|default:"0" }} row{{ total|pluralize }} &middot; {{ columns|length }} column{{ columns|length|pluralize }}</p>
@@ -61,11 +61,11 @@
6161
{% endfor %}
6262
</tr>
6363
</thead>
6464
<tbody class="divide-y divide-gray-700 font-mono">
6565
{% for row in rows %}
66
- <tr class="hover:bg-gray-700/50">
66
+ <tr class="hover:bg-gray-700/40 transition-colors">
6767
{% for cell in row %}
6868
<td class="px-3 py-1.5 text-gray-300 whitespace-nowrap max-w-xs truncate">{{ cell|default:"NULL" }}</td>
6969
{% endfor %}
7070
</tr>
7171
{% endfor %}
7272
--- templates/fossil/partials/explorer_table.html
+++ templates/fossil/partials/explorer_table.html
@@ -1,6 +1,6 @@
1 <div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden">
2 <!-- Header -->
3 <div class="px-4 py-3 border-b border-gray-700 flex items-center justify-between">
4 <div>
5 <h3 class="text-base font-mono font-semibold text-gray-100">{{ table_name }}</h3>
6 <p class="text-xs text-gray-500 mt-0.5">{{ total|default:"0" }} row{{ total|pluralize }} &middot; {{ columns|length }} column{{ columns|length|pluralize }}</p>
@@ -61,11 +61,11 @@
61 {% endfor %}
62 </tr>
63 </thead>
64 <tbody class="divide-y divide-gray-700 font-mono">
65 {% for row in rows %}
66 <tr class="hover:bg-gray-700/50">
67 {% for cell in row %}
68 <td class="px-3 py-1.5 text-gray-300 whitespace-nowrap max-w-xs truncate">{{ cell|default:"NULL" }}</td>
69 {% endfor %}
70 </tr>
71 {% endfor %}
72
--- templates/fossil/partials/explorer_table.html
+++ templates/fossil/partials/explorer_table.html
@@ -1,6 +1,6 @@
1 <div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden shadow-sm">
2 <!-- Header -->
3 <div class="px-4 py-3 border-b border-gray-700 flex items-center justify-between">
4 <div>
5 <h3 class="text-base font-mono font-semibold text-gray-100">{{ table_name }}</h3>
6 <p class="text-xs text-gray-500 mt-0.5">{{ total|default:"0" }} row{{ total|pluralize }} &middot; {{ columns|length }} column{{ columns|length|pluralize }}</p>
@@ -61,11 +61,11 @@
61 {% endfor %}
62 </tr>
63 </thead>
64 <tbody class="divide-y divide-gray-700 font-mono">
65 {% for row in rows %}
66 <tr class="hover:bg-gray-700/40 transition-colors">
67 {% for cell in row %}
68 <td class="px-3 py-1.5 text-gray-300 whitespace-nowrap max-w-xs truncate">{{ cell|default:"NULL" }}</td>
69 {% endfor %}
70 </tr>
71 {% endfor %}
72
--- templates/fossil/partials/file_tree.html
+++ templates/fossil/partials/file_tree.html
@@ -1,11 +1,11 @@
11
<div id="file-tree" class="overflow-x-auto">
22
{% if tree %}
33
<table class="min-w-full">
44
<tbody class="divide-y divide-gray-700">
55
{% for entry in tree %}
6
- <tr class="hover:bg-gray-700/30">
6
+ <tr class="hover:bg-gray-700/30 transition-colors">
77
<td class="px-4 py-2 whitespace-nowrap" style="width: 35%;">
88
{% if entry.is_dir %}
99
<a href="{% url 'fossil:code_dir' slug=project.slug dirpath=entry.path %}" class="flex items-center gap-2 text-sm text-gray-200 hover:text-brand-light">
1010
<svg class="h-4 w-4 text-brand-light flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
1111
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" />
1212
--- templates/fossil/partials/file_tree.html
+++ templates/fossil/partials/file_tree.html
@@ -1,11 +1,11 @@
1 <div id="file-tree" class="overflow-x-auto">
2 {% if tree %}
3 <table class="min-w-full">
4 <tbody class="divide-y divide-gray-700">
5 {% for entry in tree %}
6 <tr class="hover:bg-gray-700/30">
7 <td class="px-4 py-2 whitespace-nowrap" style="width: 35%;">
8 {% if entry.is_dir %}
9 <a href="{% url 'fossil:code_dir' slug=project.slug dirpath=entry.path %}" class="flex items-center gap-2 text-sm text-gray-200 hover:text-brand-light">
10 <svg class="h-4 w-4 text-brand-light flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
11 <path stroke-linecap="round" stroke-linejoin="round" d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" />
12
--- templates/fossil/partials/file_tree.html
+++ templates/fossil/partials/file_tree.html
@@ -1,11 +1,11 @@
1 <div id="file-tree" class="overflow-x-auto">
2 {% if tree %}
3 <table class="min-w-full">
4 <tbody class="divide-y divide-gray-700">
5 {% for entry in tree %}
6 <tr class="hover:bg-gray-700/30 transition-colors">
7 <td class="px-4 py-2 whitespace-nowrap" style="width: 35%;">
8 {% if entry.is_dir %}
9 <a href="{% url 'fossil:code_dir' slug=project.slug dirpath=entry.path %}" class="flex items-center gap-2 text-sm text-gray-200 hover:text-brand-light">
10 <svg class="h-4 w-4 text-brand-light flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
11 <path stroke-linecap="round" stroke-linejoin="round" d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" />
12
--- templates/fossil/partials/ticket_table.html
+++ templates/fossil/partials/ticket_table.html
@@ -1,20 +1,20 @@
11
<div id="ticket-table">
22
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
33
<table class="min-w-full divide-y divide-gray-700">
4
- <thead class="bg-gray-900">
4
+ <thead class="bg-gray-900/80">
55
<tr>
6
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Title</th>
7
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400 w-24">Status</th>
8
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400 w-28">Type</th>
9
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400 w-20">Priority</th>
10
- <th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-400 w-36">Created</th>
6
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Title</th>
7
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400 w-24">Status</th>
8
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400 w-28">Type</th>
9
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400 w-20">Priority</th>
10
+ <th class="px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400 w-36">Created</th>
1111
</tr>
1212
</thead>
13
- <tbody class="divide-y divide-gray-700 bg-gray-800">
13
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
1414
{% for ticket in tickets %}
15
- <tr class="hover:bg-gray-700/50">
15
+ <tr class="hover:bg-gray-700/40 transition-colors">
1616
<td class="px-4 py-3">
1717
<a href="{% url 'fossil:ticket_detail' slug=project.slug ticket_uuid=ticket.uuid %}"
1818
class="text-brand-light hover:text-brand font-medium text-sm">
1919
{{ ticket.title|default:"(untitled)" }}
2020
</a>
2121
--- templates/fossil/partials/ticket_table.html
+++ templates/fossil/partials/ticket_table.html
@@ -1,20 +1,20 @@
1 <div id="ticket-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900">
5 <tr>
6 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Title</th>
7 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400 w-24">Status</th>
8 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400 w-28">Type</th>
9 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400 w-20">Priority</th>
10 <th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-400 w-36">Created</th>
11 </tr>
12 </thead>
13 <tbody class="divide-y divide-gray-700 bg-gray-800">
14 {% for ticket in tickets %}
15 <tr class="hover:bg-gray-700/50">
16 <td class="px-4 py-3">
17 <a href="{% url 'fossil:ticket_detail' slug=project.slug ticket_uuid=ticket.uuid %}"
18 class="text-brand-light hover:text-brand font-medium text-sm">
19 {{ ticket.title|default:"(untitled)" }}
20 </a>
21
--- templates/fossil/partials/ticket_table.html
+++ templates/fossil/partials/ticket_table.html
@@ -1,20 +1,20 @@
1 <div id="ticket-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900/80">
5 <tr>
6 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Title</th>
7 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400 w-24">Status</th>
8 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400 w-28">Type</th>
9 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400 w-20">Priority</th>
10 <th class="px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400 w-36">Created</th>
11 </tr>
12 </thead>
13 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
14 {% for ticket in tickets %}
15 <tr class="hover:bg-gray-700/40 transition-colors">
16 <td class="px-4 py-3">
17 <a href="{% url 'fossil:ticket_detail' slug=project.slug ticket_uuid=ticket.uuid %}"
18 class="text-brand-light hover:text-brand font-medium text-sm">
19 {{ ticket.title|default:"(untitled)" }}
20 </a>
21
--- templates/fossil/partials/timeline_entries.html
+++ templates/fossil/partials/timeline_entries.html
@@ -27,12 +27,12 @@
2727
top: 20%; border-radius: 4px 4px 0 0;
2828
border-top: 2px solid; border-left: 2px solid; border-right: 2px solid;
2929
border-bottom: none; height: 30%; opacity: 0.5;
3030
}
3131
.tl-date { font-size: 0.8rem; font-weight: 700; color: #d1d5db; padding: 8px 0 4px; border-bottom: 1px solid #374151; margin-bottom: 2px; }
32
- .tl-row { display: flex; min-height: 28px; align-items: center; flex-wrap: wrap; }
33
- .tl-row:hover { background: rgba(255,255,255,0.02); }
32
+ .tl-row { display: flex; min-height: 28px; align-items: center; flex-wrap: wrap; transition: background-color 150ms ease; border-radius: 4px; }
33
+ .tl-row:hover { background: rgba(255,255,255,0.04); }
3434
.tl-time { width: 42px; flex-shrink: 0; text-align: right; font-size: 0.75rem; color: #6b7280; font-variant-numeric: tabular-nums; }
3535
.tl-msg { flex: 1; min-width: 0; font-size: 0.8125rem; color: #e5e5e5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
3636
.tl-msg a { color: #e5e5e5; text-decoration: none; }
3737
.tl-msg a:hover { color: #e8677a; }
3838
.tl-meta { display: flex; align-items: center; gap: 8px; flex-shrink: 0; padding-left: 12px; flex-wrap: wrap; }
3939
--- templates/fossil/partials/timeline_entries.html
+++ templates/fossil/partials/timeline_entries.html
@@ -27,12 +27,12 @@
27 top: 20%; border-radius: 4px 4px 0 0;
28 border-top: 2px solid; border-left: 2px solid; border-right: 2px solid;
29 border-bottom: none; height: 30%; opacity: 0.5;
30 }
31 .tl-date { font-size: 0.8rem; font-weight: 700; color: #d1d5db; padding: 8px 0 4px; border-bottom: 1px solid #374151; margin-bottom: 2px; }
32 .tl-row { display: flex; min-height: 28px; align-items: center; flex-wrap: wrap; }
33 .tl-row:hover { background: rgba(255,255,255,0.02); }
34 .tl-time { width: 42px; flex-shrink: 0; text-align: right; font-size: 0.75rem; color: #6b7280; font-variant-numeric: tabular-nums; }
35 .tl-msg { flex: 1; min-width: 0; font-size: 0.8125rem; color: #e5e5e5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
36 .tl-msg a { color: #e5e5e5; text-decoration: none; }
37 .tl-msg a:hover { color: #e8677a; }
38 .tl-meta { display: flex; align-items: center; gap: 8px; flex-shrink: 0; padding-left: 12px; flex-wrap: wrap; }
39
--- templates/fossil/partials/timeline_entries.html
+++ templates/fossil/partials/timeline_entries.html
@@ -27,12 +27,12 @@
27 top: 20%; border-radius: 4px 4px 0 0;
28 border-top: 2px solid; border-left: 2px solid; border-right: 2px solid;
29 border-bottom: none; height: 30%; opacity: 0.5;
30 }
31 .tl-date { font-size: 0.8rem; font-weight: 700; color: #d1d5db; padding: 8px 0 4px; border-bottom: 1px solid #374151; margin-bottom: 2px; }
32 .tl-row { display: flex; min-height: 28px; align-items: center; flex-wrap: wrap; transition: background-color 150ms ease; border-radius: 4px; }
33 .tl-row:hover { background: rgba(255,255,255,0.04); }
34 .tl-time { width: 42px; flex-shrink: 0; text-align: right; font-size: 0.75rem; color: #6b7280; font-variant-numeric: tabular-nums; }
35 .tl-msg { flex: 1; min-width: 0; font-size: 0.8125rem; color: #e5e5e5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
36 .tl-msg a { color: #e5e5e5; text-decoration: none; }
37 .tl-msg a:hover { color: #e8677a; }
38 .tl-meta { display: flex; align-items: center; gap: 8px; flex-shrink: 0; padding-left: 12px; flex-wrap: wrap; }
39
--- templates/fossil/release_list.html
+++ templates/fossil/release_list.html
@@ -24,11 +24,11 @@
2424
hx-indicator="closest .search-wrap" />
2525
<svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
2626
</span>
2727
{% if has_write %}
2828
<a href="{% url 'fossil:release_create' slug=project.slug %}"
29
- class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
29
+ class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
3030
Create Release
3131
</a>
3232
{% endif %}
3333
</div>
3434
</div>
@@ -35,11 +35,11 @@
3535
3636
<div id="release-content">
3737
{% if releases %}
3838
<div class="space-y-4">
3939
{% for release in releases %}
40
- <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
40
+ <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700 hover:border-gray-600 transition-colors">
4141
<div class="px-6 py-4">
4242
<div class="flex items-start justify-between gap-4">
4343
<div class="flex-1 min-w-0">
4444
<div class="flex items-center gap-3 mb-1">
4545
<a href="{% url 'fossil:release_detail' slug=project.slug tag_name=release.tag_name %}"
4646
--- templates/fossil/release_list.html
+++ templates/fossil/release_list.html
@@ -24,11 +24,11 @@
24 hx-indicator="closest .search-wrap" />
25 <svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
26 </span>
27 {% if has_write %}
28 <a href="{% url 'fossil:release_create' slug=project.slug %}"
29 class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
30 Create Release
31 </a>
32 {% endif %}
33 </div>
34 </div>
@@ -35,11 +35,11 @@
35
36 <div id="release-content">
37 {% if releases %}
38 <div class="space-y-4">
39 {% for release in releases %}
40 <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
41 <div class="px-6 py-4">
42 <div class="flex items-start justify-between gap-4">
43 <div class="flex-1 min-w-0">
44 <div class="flex items-center gap-3 mb-1">
45 <a href="{% url 'fossil:release_detail' slug=project.slug tag_name=release.tag_name %}"
46
--- templates/fossil/release_list.html
+++ templates/fossil/release_list.html
@@ -24,11 +24,11 @@
24 hx-indicator="closest .search-wrap" />
25 <svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
26 </span>
27 {% if has_write %}
28 <a href="{% url 'fossil:release_create' slug=project.slug %}"
29 class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
30 Create Release
31 </a>
32 {% endif %}
33 </div>
34 </div>
@@ -35,11 +35,11 @@
35
36 <div id="release-content">
37 {% if releases %}
38 <div class="space-y-4">
39 {% for release in releases %}
40 <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700 hover:border-gray-600 transition-colors">
41 <div class="px-6 py-4">
42 <div class="flex items-start justify-between gap-4">
43 <div class="flex-1 min-w-0">
44 <div class="flex items-center gap-3 mb-1">
45 <a href="{% url 'fossil:release_detail' slug=project.slug tag_name=release.tag_name %}"
46
--- templates/fossil/tag_list.html
+++ templates/fossil/tag_list.html
@@ -27,21 +27,21 @@
2727
</div>
2828
2929
<div id="tag-content">
3030
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3131
<table class="min-w-full divide-y divide-gray-700">
32
- <thead class="bg-gray-900">
32
+ <thead class="bg-gray-900/80">
3333
<tr>
34
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Tag</th>
35
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Checkin</th>
36
- <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">By</th>
37
- <th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-400">Date</th>
34
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Tag</th>
35
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Checkin</th>
36
+ <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">By</th>
37
+ <th class="px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Date</th>
3838
</tr>
3939
</thead>
40
- <tbody class="divide-y divide-gray-700 bg-gray-800">
40
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
4141
{% for tag in tags %}
42
- <tr class="hover:bg-gray-700/50">
42
+ <tr class="hover:bg-gray-700/40 transition-colors">
4343
<td class="px-4 py-3">
4444
<span class="inline-flex items-center rounded-md bg-blue-900/20 border border-blue-800/30 px-2 py-0.5 text-sm text-blue-300">{{ tag.name }}</span>
4545
</td>
4646
<td class="px-4 py-3">
4747
<a href="{% url 'fossil:checkin_detail' slug=project.slug checkin_uuid=tag.uuid %}" class="font-mono text-xs text-brand-light hover:text-brand">{{ tag.uuid|truncatechars:10 }}</a>
4848
--- templates/fossil/tag_list.html
+++ templates/fossil/tag_list.html
@@ -27,21 +27,21 @@
27 </div>
28
29 <div id="tag-content">
30 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
31 <table class="min-w-full divide-y divide-gray-700">
32 <thead class="bg-gray-900">
33 <tr>
34 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Tag</th>
35 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">Checkin</th>
36 <th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-400">By</th>
37 <th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-400">Date</th>
38 </tr>
39 </thead>
40 <tbody class="divide-y divide-gray-700 bg-gray-800">
41 {% for tag in tags %}
42 <tr class="hover:bg-gray-700/50">
43 <td class="px-4 py-3">
44 <span class="inline-flex items-center rounded-md bg-blue-900/20 border border-blue-800/30 px-2 py-0.5 text-sm text-blue-300">{{ tag.name }}</span>
45 </td>
46 <td class="px-4 py-3">
47 <a href="{% url 'fossil:checkin_detail' slug=project.slug checkin_uuid=tag.uuid %}" class="font-mono text-xs text-brand-light hover:text-brand">{{ tag.uuid|truncatechars:10 }}</a>
48
--- templates/fossil/tag_list.html
+++ templates/fossil/tag_list.html
@@ -27,21 +27,21 @@
27 </div>
28
29 <div id="tag-content">
30 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
31 <table class="min-w-full divide-y divide-gray-700">
32 <thead class="bg-gray-900/80">
33 <tr>
34 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Tag</th>
35 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Checkin</th>
36 <th class="px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">By</th>
37 <th class="px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Date</th>
38 </tr>
39 </thead>
40 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
41 {% for tag in tags %}
42 <tr class="hover:bg-gray-700/40 transition-colors">
43 <td class="px-4 py-3">
44 <span class="inline-flex items-center rounded-md bg-blue-900/20 border border-blue-800/30 px-2 py-0.5 text-sm text-blue-300">{{ tag.name }}</span>
45 </td>
46 <td class="px-4 py-3">
47 <a href="{% url 'fossil:checkin_detail' slug=project.slug checkin_uuid=tag.uuid %}" class="font-mono text-xs text-brand-light hover:text-brand">{{ tag.uuid|truncatechars:10 }}</a>
48
--- templates/fossil/ticket_detail.html
+++ templates/fossil/ticket_detail.html
@@ -8,19 +8,19 @@
88
99
<div class="mb-4">
1010
<a href="{% url 'fossil:tickets' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">&larr; Back to Tickets</a>
1111
</div>
1212
13
-<div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
13
+<div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
1414
<div class="px-6 py-5 border-b border-gray-700">
1515
<div class="flex flex-wrap items-start justify-between gap-3">
1616
<div class="flex-1 min-w-0">
1717
<h2 class="text-xl font-bold text-gray-100 break-words">{{ ticket.title|default:"(untitled)" }}</h2>
1818
</div>
1919
<div class="flex items-center gap-2 flex-shrink-0">
2020
{% if perms.projects.change_project %}
21
- <a href="{% url 'fossil:ticket_edit' slug=project.slug ticket_uuid=ticket.uuid %}" class="rounded-md bg-gray-700 px-3 py-1.5 text-xs font-semibold text-gray-300 hover:bg-gray-600">Edit</a>
21
+ <a href="{% url 'fossil:ticket_edit' slug=project.slug ticket_uuid=ticket.uuid %}" class="rounded-md bg-gray-700 px-3 py-1.5 text-xs font-semibold text-gray-300 hover:bg-gray-600 border border-gray-600 transition-colors">Edit</a>
2222
{% endif %}
2323
{% if ticket.status == "Open" %}
2424
<span class="inline-flex rounded-full bg-green-900/50 px-3 py-1 text-xs font-semibold text-green-300">{{ ticket.status }}</span>
2525
{% elif ticket.status == "Closed" or ticket.status == "Fixed" %}
2626
<span class="inline-flex rounded-full bg-gray-700 px-3 py-1 text-xs font-semibold text-gray-300">{{ ticket.status }}</span>
@@ -78,11 +78,11 @@
7878
{% if comments %}
7979
<div class="mt-6">
8080
<h3 class="text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3">Comments ({{ comments|length }})</h3>
8181
<div class="space-y-3">
8282
{% for c in comments %}
83
- <div class="rounded-lg bg-gray-800 border border-gray-700">
83
+ <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm">
8484
<div class="px-5 py-3 border-b border-gray-700 flex items-center justify-between">
8585
{% if c.user %}<a href="{% url 'fossil:user_activity' slug=project.slug username=c.user %}" class="text-sm font-medium text-gray-200 hover:text-brand-light">{{ c.user|display_user }}</a>{% else %}<span class="text-sm font-medium text-gray-400">system</span>{% endif %}
8686
<span class="text-xs text-gray-500">{{ c.timestamp|timesince }} ago</span>
8787
</div>
8888
<div class="px-5 py-4">
@@ -97,17 +97,17 @@
9797
{% endif %}
9898
9999
{% if perms.projects.change_project %}
100100
<div class="mt-6">
101101
<h3 class="text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3">Add Comment</h3>
102
- <form method="post" action="{% url 'fossil:ticket_comment' slug=project.slug ticket_uuid=ticket.uuid %}" class="rounded-lg bg-gray-800 border border-gray-700 p-4">
102
+ <form method="post" action="{% url 'fossil:ticket_comment' slug=project.slug ticket_uuid=ticket.uuid %}" class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm">
103103
{% csrf_token %}
104104
<textarea name="comment" rows="4" required placeholder="Write a comment (Markdown supported)..."
105105
aria-label="Add a comment"
106
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm font-mono"></textarea>
106
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm font-mono transition-colors"></textarea>
107107
<div class="mt-3 flex justify-end">
108
- <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">Comment</button>
108
+ <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">Comment</button>
109109
</div>
110110
</form>
111111
</div>
112112
{% endif %}
113113
{% endblock %}
114114
--- templates/fossil/ticket_detail.html
+++ templates/fossil/ticket_detail.html
@@ -8,19 +8,19 @@
8
9 <div class="mb-4">
10 <a href="{% url 'fossil:tickets' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">&larr; Back to Tickets</a>
11 </div>
12
13 <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
14 <div class="px-6 py-5 border-b border-gray-700">
15 <div class="flex flex-wrap items-start justify-between gap-3">
16 <div class="flex-1 min-w-0">
17 <h2 class="text-xl font-bold text-gray-100 break-words">{{ ticket.title|default:"(untitled)" }}</h2>
18 </div>
19 <div class="flex items-center gap-2 flex-shrink-0">
20 {% if perms.projects.change_project %}
21 <a href="{% url 'fossil:ticket_edit' slug=project.slug ticket_uuid=ticket.uuid %}" class="rounded-md bg-gray-700 px-3 py-1.5 text-xs font-semibold text-gray-300 hover:bg-gray-600">Edit</a>
22 {% endif %}
23 {% if ticket.status == "Open" %}
24 <span class="inline-flex rounded-full bg-green-900/50 px-3 py-1 text-xs font-semibold text-green-300">{{ ticket.status }}</span>
25 {% elif ticket.status == "Closed" or ticket.status == "Fixed" %}
26 <span class="inline-flex rounded-full bg-gray-700 px-3 py-1 text-xs font-semibold text-gray-300">{{ ticket.status }}</span>
@@ -78,11 +78,11 @@
78 {% if comments %}
79 <div class="mt-6">
80 <h3 class="text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3">Comments ({{ comments|length }})</h3>
81 <div class="space-y-3">
82 {% for c in comments %}
83 <div class="rounded-lg bg-gray-800 border border-gray-700">
84 <div class="px-5 py-3 border-b border-gray-700 flex items-center justify-between">
85 {% if c.user %}<a href="{% url 'fossil:user_activity' slug=project.slug username=c.user %}" class="text-sm font-medium text-gray-200 hover:text-brand-light">{{ c.user|display_user }}</a>{% else %}<span class="text-sm font-medium text-gray-400">system</span>{% endif %}
86 <span class="text-xs text-gray-500">{{ c.timestamp|timesince }} ago</span>
87 </div>
88 <div class="px-5 py-4">
@@ -97,17 +97,17 @@
97 {% endif %}
98
99 {% if perms.projects.change_project %}
100 <div class="mt-6">
101 <h3 class="text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3">Add Comment</h3>
102 <form method="post" action="{% url 'fossil:ticket_comment' slug=project.slug ticket_uuid=ticket.uuid %}" class="rounded-lg bg-gray-800 border border-gray-700 p-4">
103 {% csrf_token %}
104 <textarea name="comment" rows="4" required placeholder="Write a comment (Markdown supported)..."
105 aria-label="Add a comment"
106 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm font-mono"></textarea>
107 <div class="mt-3 flex justify-end">
108 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">Comment</button>
109 </div>
110 </form>
111 </div>
112 {% endif %}
113 {% endblock %}
114
--- templates/fossil/ticket_detail.html
+++ templates/fossil/ticket_detail.html
@@ -8,19 +8,19 @@
8
9 <div class="mb-4">
10 <a href="{% url 'fossil:tickets' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">&larr; Back to Tickets</a>
11 </div>
12
13 <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
14 <div class="px-6 py-5 border-b border-gray-700">
15 <div class="flex flex-wrap items-start justify-between gap-3">
16 <div class="flex-1 min-w-0">
17 <h2 class="text-xl font-bold text-gray-100 break-words">{{ ticket.title|default:"(untitled)" }}</h2>
18 </div>
19 <div class="flex items-center gap-2 flex-shrink-0">
20 {% if perms.projects.change_project %}
21 <a href="{% url 'fossil:ticket_edit' slug=project.slug ticket_uuid=ticket.uuid %}" class="rounded-md bg-gray-700 px-3 py-1.5 text-xs font-semibold text-gray-300 hover:bg-gray-600 border border-gray-600 transition-colors">Edit</a>
22 {% endif %}
23 {% if ticket.status == "Open" %}
24 <span class="inline-flex rounded-full bg-green-900/50 px-3 py-1 text-xs font-semibold text-green-300">{{ ticket.status }}</span>
25 {% elif ticket.status == "Closed" or ticket.status == "Fixed" %}
26 <span class="inline-flex rounded-full bg-gray-700 px-3 py-1 text-xs font-semibold text-gray-300">{{ ticket.status }}</span>
@@ -78,11 +78,11 @@
78 {% if comments %}
79 <div class="mt-6">
80 <h3 class="text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3">Comments ({{ comments|length }})</h3>
81 <div class="space-y-3">
82 {% for c in comments %}
83 <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm">
84 <div class="px-5 py-3 border-b border-gray-700 flex items-center justify-between">
85 {% if c.user %}<a href="{% url 'fossil:user_activity' slug=project.slug username=c.user %}" class="text-sm font-medium text-gray-200 hover:text-brand-light">{{ c.user|display_user }}</a>{% else %}<span class="text-sm font-medium text-gray-400">system</span>{% endif %}
86 <span class="text-xs text-gray-500">{{ c.timestamp|timesince }} ago</span>
87 </div>
88 <div class="px-5 py-4">
@@ -97,17 +97,17 @@
97 {% endif %}
98
99 {% if perms.projects.change_project %}
100 <div class="mt-6">
101 <h3 class="text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3">Add Comment</h3>
102 <form method="post" action="{% url 'fossil:ticket_comment' slug=project.slug ticket_uuid=ticket.uuid %}" class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm">
103 {% csrf_token %}
104 <textarea name="comment" rows="4" required placeholder="Write a comment (Markdown supported)..."
105 aria-label="Add a comment"
106 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm font-mono transition-colors"></textarea>
107 <div class="mt-3 flex justify-end">
108 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">Comment</button>
109 </div>
110 </form>
111 </div>
112 {% endif %}
113 {% endblock %}
114
--- templates/fossil/ticket_edit.html
+++ templates/fossil/ticket_edit.html
@@ -10,52 +10,52 @@
1010
</div>
1111
1212
<div class="mx-auto max-w-2xl">
1313
<h2 class="text-xl font-bold text-gray-100 mb-4">Edit Ticket</h2>
1414
15
- <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
15
+ <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
1616
{% csrf_token %}
1717
1818
<div>
1919
<label class="block text-sm font-medium text-gray-300 mb-1">Title</label>
2020
<input type="text" name="title" value="{{ ticket.title }}"
21
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
21
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
2222
</div>
2323
2424
<div class="grid grid-cols-2 gap-4">
2525
<div>
2626
<label class="block text-sm font-medium text-gray-300 mb-1">Status</label>
27
- <select name="status" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
27
+ <select name="status" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
2828
<option value="Open" {% if ticket.status == "Open" %}selected{% endif %}>Open</option>
2929
<option value="Fixed" {% if ticket.status == "Fixed" %}selected{% endif %}>Fixed</option>
3030
<option value="Closed" {% if ticket.status == "Closed" %}selected{% endif %}>Closed</option>
3131
<option value="Review" {% if ticket.status == "Review" %}selected{% endif %}>Review</option>
3232
<option value="Deferred" {% if ticket.status == "Deferred" %}selected{% endif %}>Deferred</option>
3333
</select>
3434
</div>
3535
<div>
3636
<label class="block text-sm font-medium text-gray-300 mb-1">Type</label>
37
- <select name="type" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
37
+ <select name="type" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
3838
<option value="Code_Defect" {% if ticket.type == "Code_Defect" %}selected{% endif %}>Code Defect</option>
3939
<option value="Feature_Request" {% if ticket.type == "Feature_Request" %}selected{% endif %}>Feature Request</option>
4040
<option value="Documentation" {% if ticket.type == "Documentation" %}selected{% endif %}>Documentation</option>
4141
<option value="Incident" {% if ticket.type == "Incident" %}selected{% endif %}>Incident</option>
4242
</select>
4343
</div>
4444
<div>
4545
<label class="block text-sm font-medium text-gray-300 mb-1">Severity</label>
46
- <select name="severity" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
46
+ <select name="severity" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
4747
<option value="">—</option>
4848
<option value="Critical" {% if ticket.severity == "Critical" %}selected{% endif %}>Critical</option>
4949
<option value="Important" {% if ticket.severity == "Important" %}selected{% endif %}>Important</option>
5050
<option value="Minor" {% if ticket.severity == "Minor" %}selected{% endif %}>Minor</option>
5151
<option value="Cosmetic" {% if ticket.severity == "Cosmetic" %}selected{% endif %}>Cosmetic</option>
5252
</select>
5353
</div>
5454
<div>
5555
<label class="block text-sm font-medium text-gray-300 mb-1">Priority</label>
56
- <select name="priority" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
56
+ <select name="priority" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
5757
<option value="">—</option>
5858
<option value="Critical" {% if ticket.priority == "Critical" %}selected{% endif %}>Critical</option>
5959
<option value="Important" {% if ticket.priority == "Important" %}selected{% endif %}>Important</option>
6060
<option value="Minor" {% if ticket.priority == "Minor" %}selected{% endif %}>Minor</option>
6161
<option value="Zero" {% if ticket.priority == "Zero" %}selected{% endif %}>Zero</option>
@@ -63,11 +63,11 @@
6363
</div>
6464
</div>
6565
6666
<div>
6767
<label class="block text-sm font-medium text-gray-300 mb-1">Resolution</label>
68
- <select name="resolution" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
68
+ <select name="resolution" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
6969
<option value="">—</option>
7070
<option value="Fixed" {% if ticket.resolution == "Fixed" %}selected{% endif %}>Fixed</option>
7171
<option value="Rejected" {% if ticket.resolution == "Rejected" %}selected{% endif %}>Rejected</option>
7272
<option value="Overcome_By_Events" {% if ticket.resolution == "Overcome_By_Events" %}selected{% endif %}>Overcome By Events</option>
7373
<option value="Works_As_Designed" {% if ticket.resolution == "Works_As_Designed" %}selected{% endif %}>Works As Designed</option>
@@ -88,17 +88,17 @@
8888
{% if cf.is_required %}<span class="text-red-400">*</span>{% endif %}
8989
</label>
9090
{% if cf.field_type == "text" or cf.field_type == "url" or cf.field_type == "date" %}
9191
<input type="{% if cf.field_type == "url" %}url{% elif cf.field_type == "date" %}date{% else %}text{% endif %}"
9292
name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
93
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
93
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
9494
{% elif cf.field_type == "textarea" %}
9595
<textarea name="custom_{{ cf.name }}" rows="3" {% if cf.is_required %}required{% endif %}
96
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm"></textarea>
96
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors"></textarea>
9797
{% elif cf.field_type == "select" %}
9898
<select name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
99
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
99
+ class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
100100
<option value="">--</option>
101101
{% for choice in cf.choices_list %}
102102
<option value="{{ choice }}">{{ choice }}</option>
103103
{% endfor %}
104104
</select>
@@ -115,15 +115,15 @@
115115
</div>
116116
{% endif %}
117117
118118
<div class="flex justify-end gap-3 pt-2">
119119
<a href="{% url 'fossil:ticket_detail' slug=project.slug ticket_uuid=ticket.uuid %}"
120
- class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
120
+ class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
121121
Cancel
122122
</a>
123
- <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
123
+ <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
124124
Save Changes
125125
</button>
126126
</div>
127127
</form>
128128
</div>
129129
{% endblock %}
130130
--- templates/fossil/ticket_edit.html
+++ templates/fossil/ticket_edit.html
@@ -10,52 +10,52 @@
10 </div>
11
12 <div class="mx-auto max-w-2xl">
13 <h2 class="text-xl font-bold text-gray-100 mb-4">Edit Ticket</h2>
14
15 <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
16 {% csrf_token %}
17
18 <div>
19 <label class="block text-sm font-medium text-gray-300 mb-1">Title</label>
20 <input type="text" name="title" value="{{ ticket.title }}"
21 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
22 </div>
23
24 <div class="grid grid-cols-2 gap-4">
25 <div>
26 <label class="block text-sm font-medium text-gray-300 mb-1">Status</label>
27 <select name="status" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
28 <option value="Open" {% if ticket.status == "Open" %}selected{% endif %}>Open</option>
29 <option value="Fixed" {% if ticket.status == "Fixed" %}selected{% endif %}>Fixed</option>
30 <option value="Closed" {% if ticket.status == "Closed" %}selected{% endif %}>Closed</option>
31 <option value="Review" {% if ticket.status == "Review" %}selected{% endif %}>Review</option>
32 <option value="Deferred" {% if ticket.status == "Deferred" %}selected{% endif %}>Deferred</option>
33 </select>
34 </div>
35 <div>
36 <label class="block text-sm font-medium text-gray-300 mb-1">Type</label>
37 <select name="type" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
38 <option value="Code_Defect" {% if ticket.type == "Code_Defect" %}selected{% endif %}>Code Defect</option>
39 <option value="Feature_Request" {% if ticket.type == "Feature_Request" %}selected{% endif %}>Feature Request</option>
40 <option value="Documentation" {% if ticket.type == "Documentation" %}selected{% endif %}>Documentation</option>
41 <option value="Incident" {% if ticket.type == "Incident" %}selected{% endif %}>Incident</option>
42 </select>
43 </div>
44 <div>
45 <label class="block text-sm font-medium text-gray-300 mb-1">Severity</label>
46 <select name="severity" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
47 <option value="">—</option>
48 <option value="Critical" {% if ticket.severity == "Critical" %}selected{% endif %}>Critical</option>
49 <option value="Important" {% if ticket.severity == "Important" %}selected{% endif %}>Important</option>
50 <option value="Minor" {% if ticket.severity == "Minor" %}selected{% endif %}>Minor</option>
51 <option value="Cosmetic" {% if ticket.severity == "Cosmetic" %}selected{% endif %}>Cosmetic</option>
52 </select>
53 </div>
54 <div>
55 <label class="block text-sm font-medium text-gray-300 mb-1">Priority</label>
56 <select name="priority" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
57 <option value="">—</option>
58 <option value="Critical" {% if ticket.priority == "Critical" %}selected{% endif %}>Critical</option>
59 <option value="Important" {% if ticket.priority == "Important" %}selected{% endif %}>Important</option>
60 <option value="Minor" {% if ticket.priority == "Minor" %}selected{% endif %}>Minor</option>
61 <option value="Zero" {% if ticket.priority == "Zero" %}selected{% endif %}>Zero</option>
@@ -63,11 +63,11 @@
63 </div>
64 </div>
65
66 <div>
67 <label class="block text-sm font-medium text-gray-300 mb-1">Resolution</label>
68 <select name="resolution" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
69 <option value="">—</option>
70 <option value="Fixed" {% if ticket.resolution == "Fixed" %}selected{% endif %}>Fixed</option>
71 <option value="Rejected" {% if ticket.resolution == "Rejected" %}selected{% endif %}>Rejected</option>
72 <option value="Overcome_By_Events" {% if ticket.resolution == "Overcome_By_Events" %}selected{% endif %}>Overcome By Events</option>
73 <option value="Works_As_Designed" {% if ticket.resolution == "Works_As_Designed" %}selected{% endif %}>Works As Designed</option>
@@ -88,17 +88,17 @@
88 {% if cf.is_required %}<span class="text-red-400">*</span>{% endif %}
89 </label>
90 {% if cf.field_type == "text" or cf.field_type == "url" or cf.field_type == "date" %}
91 <input type="{% if cf.field_type == "url" %}url{% elif cf.field_type == "date" %}date{% else %}text{% endif %}"
92 name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
93 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
94 {% elif cf.field_type == "textarea" %}
95 <textarea name="custom_{{ cf.name }}" rows="3" {% if cf.is_required %}required{% endif %}
96 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm"></textarea>
97 {% elif cf.field_type == "select" %}
98 <select name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
99 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
100 <option value="">--</option>
101 {% for choice in cf.choices_list %}
102 <option value="{{ choice }}">{{ choice }}</option>
103 {% endfor %}
104 </select>
@@ -115,15 +115,15 @@
115 </div>
116 {% endif %}
117
118 <div class="flex justify-end gap-3 pt-2">
119 <a href="{% url 'fossil:ticket_detail' slug=project.slug ticket_uuid=ticket.uuid %}"
120 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
121 Cancel
122 </a>
123 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
124 Save Changes
125 </button>
126 </div>
127 </form>
128 </div>
129 {% endblock %}
130
--- templates/fossil/ticket_edit.html
+++ templates/fossil/ticket_edit.html
@@ -10,52 +10,52 @@
10 </div>
11
12 <div class="mx-auto max-w-2xl">
13 <h2 class="text-xl font-bold text-gray-100 mb-4">Edit Ticket</h2>
14
15 <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
16 {% csrf_token %}
17
18 <div>
19 <label class="block text-sm font-medium text-gray-300 mb-1">Title</label>
20 <input type="text" name="title" value="{{ ticket.title }}"
21 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
22 </div>
23
24 <div class="grid grid-cols-2 gap-4">
25 <div>
26 <label class="block text-sm font-medium text-gray-300 mb-1">Status</label>
27 <select name="status" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
28 <option value="Open" {% if ticket.status == "Open" %}selected{% endif %}>Open</option>
29 <option value="Fixed" {% if ticket.status == "Fixed" %}selected{% endif %}>Fixed</option>
30 <option value="Closed" {% if ticket.status == "Closed" %}selected{% endif %}>Closed</option>
31 <option value="Review" {% if ticket.status == "Review" %}selected{% endif %}>Review</option>
32 <option value="Deferred" {% if ticket.status == "Deferred" %}selected{% endif %}>Deferred</option>
33 </select>
34 </div>
35 <div>
36 <label class="block text-sm font-medium text-gray-300 mb-1">Type</label>
37 <select name="type" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
38 <option value="Code_Defect" {% if ticket.type == "Code_Defect" %}selected{% endif %}>Code Defect</option>
39 <option value="Feature_Request" {% if ticket.type == "Feature_Request" %}selected{% endif %}>Feature Request</option>
40 <option value="Documentation" {% if ticket.type == "Documentation" %}selected{% endif %}>Documentation</option>
41 <option value="Incident" {% if ticket.type == "Incident" %}selected{% endif %}>Incident</option>
42 </select>
43 </div>
44 <div>
45 <label class="block text-sm font-medium text-gray-300 mb-1">Severity</label>
46 <select name="severity" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
47 <option value="">—</option>
48 <option value="Critical" {% if ticket.severity == "Critical" %}selected{% endif %}>Critical</option>
49 <option value="Important" {% if ticket.severity == "Important" %}selected{% endif %}>Important</option>
50 <option value="Minor" {% if ticket.severity == "Minor" %}selected{% endif %}>Minor</option>
51 <option value="Cosmetic" {% if ticket.severity == "Cosmetic" %}selected{% endif %}>Cosmetic</option>
52 </select>
53 </div>
54 <div>
55 <label class="block text-sm font-medium text-gray-300 mb-1">Priority</label>
56 <select name="priority" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
57 <option value="">—</option>
58 <option value="Critical" {% if ticket.priority == "Critical" %}selected{% endif %}>Critical</option>
59 <option value="Important" {% if ticket.priority == "Important" %}selected{% endif %}>Important</option>
60 <option value="Minor" {% if ticket.priority == "Minor" %}selected{% endif %}>Minor</option>
61 <option value="Zero" {% if ticket.priority == "Zero" %}selected{% endif %}>Zero</option>
@@ -63,11 +63,11 @@
63 </div>
64 </div>
65
66 <div>
67 <label class="block text-sm font-medium text-gray-300 mb-1">Resolution</label>
68 <select name="resolution" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
69 <option value="">—</option>
70 <option value="Fixed" {% if ticket.resolution == "Fixed" %}selected{% endif %}>Fixed</option>
71 <option value="Rejected" {% if ticket.resolution == "Rejected" %}selected{% endif %}>Rejected</option>
72 <option value="Overcome_By_Events" {% if ticket.resolution == "Overcome_By_Events" %}selected{% endif %}>Overcome By Events</option>
73 <option value="Works_As_Designed" {% if ticket.resolution == "Works_As_Designed" %}selected{% endif %}>Works As Designed</option>
@@ -88,17 +88,17 @@
88 {% if cf.is_required %}<span class="text-red-400">*</span>{% endif %}
89 </label>
90 {% if cf.field_type == "text" or cf.field_type == "url" or cf.field_type == "date" %}
91 <input type="{% if cf.field_type == "url" %}url{% elif cf.field_type == "date" %}date{% else %}text{% endif %}"
92 name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
93 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
94 {% elif cf.field_type == "textarea" %}
95 <textarea name="custom_{{ cf.name }}" rows="3" {% if cf.is_required %}required{% endif %}
96 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors"></textarea>
97 {% elif cf.field_type == "select" %}
98 <select name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
99 class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
100 <option value="">--</option>
101 {% for choice in cf.choices_list %}
102 <option value="{{ choice }}">{{ choice }}</option>
103 {% endfor %}
104 </select>
@@ -115,15 +115,15 @@
115 </div>
116 {% endif %}
117
118 <div class="flex justify-end gap-3 pt-2">
119 <a href="{% url 'fossil:ticket_detail' slug=project.slug ticket_uuid=ticket.uuid %}"
120 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
121 Cancel
122 </a>
123 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
124 Save Changes
125 </button>
126 </div>
127 </form>
128 </div>
129 {% endblock %}
130
--- templates/fossil/ticket_form.html
+++ templates/fossil/ticket_form.html
@@ -10,33 +10,33 @@
1010
</div>
1111
1212
<div class="mx-auto max-w-2xl">
1313
<h2 class="text-xl font-bold text-gray-100 mb-4">{{ title }}</h2>
1414
15
- <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
15
+ <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
1616
{% csrf_token %}
1717
1818
<div>
1919
<label class="block text-sm font-medium text-gray-300 mb-1">Title <span class="text-red-400">*</span></label>
2020
<input type="text" name="title" required placeholder="Ticket title"
21
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
21
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
2222
</div>
2323
2424
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
2525
<div>
2626
<label class="block text-sm font-medium text-gray-300 mb-1">Type</label>
27
- <select name="type" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
27
+ <select name="type" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
2828
<option value="Code_Defect">Code Defect</option>
2929
<option value="Feature_Request">Feature Request</option>
3030
<option value="Documentation">Documentation</option>
3131
<option value="Incident">Incident</option>
3232
</select>
3333
</div>
3434
<div>
3535
<label class="block text-sm font-medium text-gray-300 mb-1">Severity</label>
36
- <select name="severity" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
37
- <option value="">—</option>
36
+ <select name="severity" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
37
+ <option value="">--</option>
3838
<option value="Critical">Critical</option>
3939
<option value="Important">Important</option>
4040
<option value="Minor">Minor</option>
4141
<option value="Cosmetic">Cosmetic</option>
4242
</select>
@@ -44,11 +44,11 @@
4444
</div>
4545
4646
<div>
4747
<label class="block text-sm font-medium text-gray-300 mb-1">Description</label>
4848
<textarea name="body" rows="10" placeholder="Describe the issue..."
49
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm"></textarea>
49
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors"></textarea>
5050
</div>
5151
5252
{% if custom_fields %}
5353
<div class="border-t border-gray-700 pt-4 mt-4">
5454
<h3 class="text-sm font-semibold text-gray-300 mb-3">Custom Fields</h3>
@@ -60,17 +60,17 @@
6060
{% if cf.is_required %}<span class="text-red-400">*</span>{% endif %}
6161
</label>
6262
{% if cf.field_type == "text" or cf.field_type == "url" or cf.field_type == "date" %}
6363
<input type="{% if cf.field_type == "url" %}url{% elif cf.field_type == "date" %}date{% else %}text{% endif %}"
6464
name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
65
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
65
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
6666
{% elif cf.field_type == "textarea" %}
6767
<textarea name="custom_{{ cf.name }}" rows="3" {% if cf.is_required %}required{% endif %}
68
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm"></textarea>
68
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors"></textarea>
6969
{% elif cf.field_type == "select" %}
7070
<select name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
71
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
71
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
7272
<option value="">--</option>
7373
{% for choice in cf.choices_list %}
7474
<option value="{{ choice }}">{{ choice }}</option>
7575
{% endfor %}
7676
</select>
@@ -87,15 +87,15 @@
8787
</div>
8888
{% endif %}
8989
9090
<div class="flex justify-end gap-3 pt-2">
9191
<a href="{% url 'fossil:tickets' slug=project.slug %}"
92
- class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
92
+ class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
9393
Cancel
9494
</a>
95
- <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
95
+ <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
9696
Create Ticket
9797
</button>
9898
</div>
9999
</form>
100100
</div>
101101
{% endblock %}
102102
--- templates/fossil/ticket_form.html
+++ templates/fossil/ticket_form.html
@@ -10,33 +10,33 @@
10 </div>
11
12 <div class="mx-auto max-w-2xl">
13 <h2 class="text-xl font-bold text-gray-100 mb-4">{{ title }}</h2>
14
15 <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
16 {% csrf_token %}
17
18 <div>
19 <label class="block text-sm font-medium text-gray-300 mb-1">Title <span class="text-red-400">*</span></label>
20 <input type="text" name="title" required placeholder="Ticket title"
21 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
22 </div>
23
24 <div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
25 <div>
26 <label class="block text-sm font-medium text-gray-300 mb-1">Type</label>
27 <select name="type" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
28 <option value="Code_Defect">Code Defect</option>
29 <option value="Feature_Request">Feature Request</option>
30 <option value="Documentation">Documentation</option>
31 <option value="Incident">Incident</option>
32 </select>
33 </div>
34 <div>
35 <label class="block text-sm font-medium text-gray-300 mb-1">Severity</label>
36 <select name="severity" class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
37 <option value="">—</option>
38 <option value="Critical">Critical</option>
39 <option value="Important">Important</option>
40 <option value="Minor">Minor</option>
41 <option value="Cosmetic">Cosmetic</option>
42 </select>
@@ -44,11 +44,11 @@
44 </div>
45
46 <div>
47 <label class="block text-sm font-medium text-gray-300 mb-1">Description</label>
48 <textarea name="body" rows="10" placeholder="Describe the issue..."
49 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm"></textarea>
50 </div>
51
52 {% if custom_fields %}
53 <div class="border-t border-gray-700 pt-4 mt-4">
54 <h3 class="text-sm font-semibold text-gray-300 mb-3">Custom Fields</h3>
@@ -60,17 +60,17 @@
60 {% if cf.is_required %}<span class="text-red-400">*</span>{% endif %}
61 </label>
62 {% if cf.field_type == "text" or cf.field_type == "url" or cf.field_type == "date" %}
63 <input type="{% if cf.field_type == "url" %}url{% elif cf.field_type == "date" %}date{% else %}text{% endif %}"
64 name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
65 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
66 {% elif cf.field_type == "textarea" %}
67 <textarea name="custom_{{ cf.name }}" rows="3" {% if cf.is_required %}required{% endif %}
68 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm"></textarea>
69 {% elif cf.field_type == "select" %}
70 <select name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
71 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
72 <option value="">--</option>
73 {% for choice in cf.choices_list %}
74 <option value="{{ choice }}">{{ choice }}</option>
75 {% endfor %}
76 </select>
@@ -87,15 +87,15 @@
87 </div>
88 {% endif %}
89
90 <div class="flex justify-end gap-3 pt-2">
91 <a href="{% url 'fossil:tickets' slug=project.slug %}"
92 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
93 Cancel
94 </a>
95 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
96 Create Ticket
97 </button>
98 </div>
99 </form>
100 </div>
101 {% endblock %}
102
--- templates/fossil/ticket_form.html
+++ templates/fossil/ticket_form.html
@@ -10,33 +10,33 @@
10 </div>
11
12 <div class="mx-auto max-w-2xl">
13 <h2 class="text-xl font-bold text-gray-100 mb-4">{{ title }}</h2>
14
15 <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
16 {% csrf_token %}
17
18 <div>
19 <label class="block text-sm font-medium text-gray-300 mb-1">Title <span class="text-red-400">*</span></label>
20 <input type="text" name="title" required placeholder="Ticket title"
21 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
22 </div>
23
24 <div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
25 <div>
26 <label class="block text-sm font-medium text-gray-300 mb-1">Type</label>
27 <select name="type" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
28 <option value="Code_Defect">Code Defect</option>
29 <option value="Feature_Request">Feature Request</option>
30 <option value="Documentation">Documentation</option>
31 <option value="Incident">Incident</option>
32 </select>
33 </div>
34 <div>
35 <label class="block text-sm font-medium text-gray-300 mb-1">Severity</label>
36 <select name="severity" class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
37 <option value="">--</option>
38 <option value="Critical">Critical</option>
39 <option value="Important">Important</option>
40 <option value="Minor">Minor</option>
41 <option value="Cosmetic">Cosmetic</option>
42 </select>
@@ -44,11 +44,11 @@
44 </div>
45
46 <div>
47 <label class="block text-sm font-medium text-gray-300 mb-1">Description</label>
48 <textarea name="body" rows="10" placeholder="Describe the issue..."
49 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors"></textarea>
50 </div>
51
52 {% if custom_fields %}
53 <div class="border-t border-gray-700 pt-4 mt-4">
54 <h3 class="text-sm font-semibold text-gray-300 mb-3">Custom Fields</h3>
@@ -60,17 +60,17 @@
60 {% if cf.is_required %}<span class="text-red-400">*</span>{% endif %}
61 </label>
62 {% if cf.field_type == "text" or cf.field_type == "url" or cf.field_type == "date" %}
63 <input type="{% if cf.field_type == "url" %}url{% elif cf.field_type == "date" %}date{% else %}text{% endif %}"
64 name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
65 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
66 {% elif cf.field_type == "textarea" %}
67 <textarea name="custom_{{ cf.name }}" rows="3" {% if cf.is_required %}required{% endif %}
68 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors"></textarea>
69 {% elif cf.field_type == "select" %}
70 <select name="custom_{{ cf.name }}" {% if cf.is_required %}required{% endif %}
71 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
72 <option value="">--</option>
73 {% for choice in cf.choices_list %}
74 <option value="{{ choice }}">{{ choice }}</option>
75 {% endfor %}
76 </select>
@@ -87,15 +87,15 @@
87 </div>
88 {% endif %}
89
90 <div class="flex justify-end gap-3 pt-2">
91 <a href="{% url 'fossil:tickets' slug=project.slug %}"
92 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
93 Cancel
94 </a>
95 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
96 Create Ticket
97 </button>
98 </div>
99 </form>
100 </div>
101 {% endblock %}
102
--- templates/fossil/ticket_list.html
+++ templates/fossil/ticket_list.html
@@ -18,11 +18,11 @@
1818
class="rounded-full px-2.5 py-1 {% if status_filter == 'Closed' %}bg-brand text-white{% else %}bg-gray-800 text-gray-400 hover:text-white border border-gray-700{% endif %}">Closed</a>
1919
</div>
2020
<div class="flex flex-wrap items-center gap-3">
2121
<a href="{% url 'fossil:tickets_csv' slug=project.slug %}" class="text-xs text-gray-500 hover:text-brand-light">Export CSV</a>
2222
{% if perms.projects.change_project %}
23
- <a href="{% url 'fossil:ticket_create' slug=project.slug %}" class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">New Ticket</a>
23
+ <a href="{% url 'fossil:ticket_create' slug=project.slug %}" class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">New Ticket</a>
2424
{% endif %}
2525
<span class="search-wrap">
2626
<input type="search"
2727
name="search"
2828
value="{{ search }}"
@@ -54,15 +54,15 @@
5454
</div>
5555
</div>
5656
<div class="flex items-center gap-2">
5757
{% if has_prev %}
5858
<a href="{% url 'fossil:tickets' slug=project.slug %}?page={{ page|add:"-1" }}&per_page={{ per_page }}{% if status_filter %}&status={{ status_filter }}{% endif %}"
59
- class="rounded-md bg-gray-800 px-3 py-1.5 text-gray-400 hover:text-white border border-gray-700">&larr;</a>
59
+ class="rounded-md bg-gray-800 px-3 py-1.5 text-gray-400 hover:text-white hover:bg-gray-700 border border-gray-700 transition-colors">&larr;</a>
6060
{% endif %}
6161
<span class="text-gray-500">{{ page }} / {{ total_pages }}</span>
6262
{% if has_next %}
6363
<a href="{% url 'fossil:tickets' slug=project.slug %}?page={{ page|add:"1" }}&per_page={{ per_page }}{% if status_filter %}&status={{ status_filter }}{% endif %}"
64
- class="rounded-md bg-gray-800 px-3 py-1.5 text-gray-400 hover:text-white border border-gray-700">&rarr;</a>
64
+ class="rounded-md bg-gray-800 px-3 py-1.5 text-gray-400 hover:text-white hover:bg-gray-700 border border-gray-700 transition-colors">&rarr;</a>
6565
{% endif %}
6666
</div>
6767
</div>
6868
{% endblock %}
6969
--- templates/fossil/ticket_list.html
+++ templates/fossil/ticket_list.html
@@ -18,11 +18,11 @@
18 class="rounded-full px-2.5 py-1 {% if status_filter == 'Closed' %}bg-brand text-white{% else %}bg-gray-800 text-gray-400 hover:text-white border border-gray-700{% endif %}">Closed</a>
19 </div>
20 <div class="flex flex-wrap items-center gap-3">
21 <a href="{% url 'fossil:tickets_csv' slug=project.slug %}" class="text-xs text-gray-500 hover:text-brand-light">Export CSV</a>
22 {% if perms.projects.change_project %}
23 <a href="{% url 'fossil:ticket_create' slug=project.slug %}" class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">New Ticket</a>
24 {% endif %}
25 <span class="search-wrap">
26 <input type="search"
27 name="search"
28 value="{{ search }}"
@@ -54,15 +54,15 @@
54 </div>
55 </div>
56 <div class="flex items-center gap-2">
57 {% if has_prev %}
58 <a href="{% url 'fossil:tickets' slug=project.slug %}?page={{ page|add:"-1" }}&per_page={{ per_page }}{% if status_filter %}&status={{ status_filter }}{% endif %}"
59 class="rounded-md bg-gray-800 px-3 py-1.5 text-gray-400 hover:text-white border border-gray-700">&larr;</a>
60 {% endif %}
61 <span class="text-gray-500">{{ page }} / {{ total_pages }}</span>
62 {% if has_next %}
63 <a href="{% url 'fossil:tickets' slug=project.slug %}?page={{ page|add:"1" }}&per_page={{ per_page }}{% if status_filter %}&status={{ status_filter }}{% endif %}"
64 class="rounded-md bg-gray-800 px-3 py-1.5 text-gray-400 hover:text-white border border-gray-700">&rarr;</a>
65 {% endif %}
66 </div>
67 </div>
68 {% endblock %}
69
--- templates/fossil/ticket_list.html
+++ templates/fossil/ticket_list.html
@@ -18,11 +18,11 @@
18 class="rounded-full px-2.5 py-1 {% if status_filter == 'Closed' %}bg-brand text-white{% else %}bg-gray-800 text-gray-400 hover:text-white border border-gray-700{% endif %}">Closed</a>
19 </div>
20 <div class="flex flex-wrap items-center gap-3">
21 <a href="{% url 'fossil:tickets_csv' slug=project.slug %}" class="text-xs text-gray-500 hover:text-brand-light">Export CSV</a>
22 {% if perms.projects.change_project %}
23 <a href="{% url 'fossil:ticket_create' slug=project.slug %}" class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">New Ticket</a>
24 {% endif %}
25 <span class="search-wrap">
26 <input type="search"
27 name="search"
28 value="{{ search }}"
@@ -54,15 +54,15 @@
54 </div>
55 </div>
56 <div class="flex items-center gap-2">
57 {% if has_prev %}
58 <a href="{% url 'fossil:tickets' slug=project.slug %}?page={{ page|add:"-1" }}&per_page={{ per_page }}{% if status_filter %}&status={{ status_filter }}{% endif %}"
59 class="rounded-md bg-gray-800 px-3 py-1.5 text-gray-400 hover:text-white hover:bg-gray-700 border border-gray-700 transition-colors">&larr;</a>
60 {% endif %}
61 <span class="text-gray-500">{{ page }} / {{ total_pages }}</span>
62 {% if has_next %}
63 <a href="{% url 'fossil:tickets' slug=project.slug %}?page={{ page|add:"1" }}&per_page={{ per_page }}{% if status_filter %}&status={{ status_filter }}{% endif %}"
64 class="rounded-md bg-gray-800 px-3 py-1.5 text-gray-400 hover:text-white hover:bg-gray-700 border border-gray-700 transition-colors">&rarr;</a>
65 {% endif %}
66 </div>
67 </div>
68 {% endblock %}
69
--- templates/fossil/unversioned_list.html
+++ templates/fossil/unversioned_list.html
@@ -26,23 +26,23 @@
2626
</div>
2727
</div>
2828
2929
<div id="unversioned-content">
3030
{% if files %}
31
-<div class="overflow-x-auto rounded-lg bg-gray-800 shadow border border-gray-700">
31
+<div class="overflow-x-auto rounded-lg bg-gray-800 shadow-sm border border-gray-700">
3232
<table class="min-w-full divide-y divide-gray-700">
33
- <thead class="bg-gray-900">
33
+ <thead class="bg-gray-900/80">
3434
<tr>
3535
<th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Name</th>
3636
<th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Size</th>
3737
<th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Modified</th>
3838
<th class="px-6 py-3 text-right text-xs font-medium text-gray-400 uppercase tracking-wider"></th>
3939
</tr>
4040
</thead>
41
- <tbody class="divide-y divide-gray-700">
41
+ <tbody class="divide-y divide-gray-700/70">
4242
{% for file in files %}
43
- <tr class="hover:bg-gray-700/30">
43
+ <tr class="hover:bg-gray-700/30 transition-colors">
4444
<td class="px-6 py-3 text-sm text-gray-200 font-mono">{{ file.name }}</td>
4545
<td class="px-6 py-3 text-sm text-gray-400">{{ file.size|filesizeformat }}</td>
4646
<td class="px-6 py-3 text-sm text-gray-400">{% if file.mtime %}{{ file.mtime|date:"Y-m-d H:i" }}{% else %}--{% endif %}</td>
4747
<td class="px-6 py-3 text-right">
4848
<a href="{% url 'fossil:unversioned_download' slug=project.slug filename=file.name %}"
@@ -66,21 +66,21 @@
6666
{% if has_admin %}
6767
<div class="mt-6">
6868
<form method="post"
6969
action="{% url 'fossil:unversioned_upload' slug=project.slug %}"
7070
enctype="multipart/form-data"
71
- class="rounded-lg bg-gray-800 border border-gray-700 p-4">
71
+ class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm">
7272
{% csrf_token %}
7373
<h4 class="text-sm font-medium text-gray-300 mb-3">Upload File</h4>
7474
<div class="flex items-center gap-3">
7575
<input type="file" name="file" required
7676
class="block w-full text-sm text-gray-400 file:mr-4 file:py-1.5 file:px-3 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-brand file:text-white hover:file:bg-brand-hover" />
7777
<button type="submit"
78
- class="rounded-md bg-brand px-4 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover whitespace-nowrap">
78
+ class="rounded-md bg-brand px-4 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors whitespace-nowrap">
7979
Upload
8080
</button>
8181
</div>
8282
<p class="mt-2 text-xs text-gray-500">Unversioned files do not preserve history. Only the latest version is kept.</p>
8383
</form>
8484
</div>
8585
{% endif %}
8686
{% endblock %}
8787
--- templates/fossil/unversioned_list.html
+++ templates/fossil/unversioned_list.html
@@ -26,23 +26,23 @@
26 </div>
27 </div>
28
29 <div id="unversioned-content">
30 {% if files %}
31 <div class="overflow-x-auto rounded-lg bg-gray-800 shadow border border-gray-700">
32 <table class="min-w-full divide-y divide-gray-700">
33 <thead class="bg-gray-900">
34 <tr>
35 <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Name</th>
36 <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Size</th>
37 <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Modified</th>
38 <th class="px-6 py-3 text-right text-xs font-medium text-gray-400 uppercase tracking-wider"></th>
39 </tr>
40 </thead>
41 <tbody class="divide-y divide-gray-700">
42 {% for file in files %}
43 <tr class="hover:bg-gray-700/30">
44 <td class="px-6 py-3 text-sm text-gray-200 font-mono">{{ file.name }}</td>
45 <td class="px-6 py-3 text-sm text-gray-400">{{ file.size|filesizeformat }}</td>
46 <td class="px-6 py-3 text-sm text-gray-400">{% if file.mtime %}{{ file.mtime|date:"Y-m-d H:i" }}{% else %}--{% endif %}</td>
47 <td class="px-6 py-3 text-right">
48 <a href="{% url 'fossil:unversioned_download' slug=project.slug filename=file.name %}"
@@ -66,21 +66,21 @@
66 {% if has_admin %}
67 <div class="mt-6">
68 <form method="post"
69 action="{% url 'fossil:unversioned_upload' slug=project.slug %}"
70 enctype="multipart/form-data"
71 class="rounded-lg bg-gray-800 border border-gray-700 p-4">
72 {% csrf_token %}
73 <h4 class="text-sm font-medium text-gray-300 mb-3">Upload File</h4>
74 <div class="flex items-center gap-3">
75 <input type="file" name="file" required
76 class="block w-full text-sm text-gray-400 file:mr-4 file:py-1.5 file:px-3 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-brand file:text-white hover:file:bg-brand-hover" />
77 <button type="submit"
78 class="rounded-md bg-brand px-4 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover whitespace-nowrap">
79 Upload
80 </button>
81 </div>
82 <p class="mt-2 text-xs text-gray-500">Unversioned files do not preserve history. Only the latest version is kept.</p>
83 </form>
84 </div>
85 {% endif %}
86 {% endblock %}
87
--- templates/fossil/unversioned_list.html
+++ templates/fossil/unversioned_list.html
@@ -26,23 +26,23 @@
26 </div>
27 </div>
28
29 <div id="unversioned-content">
30 {% if files %}
31 <div class="overflow-x-auto rounded-lg bg-gray-800 shadow-sm border border-gray-700">
32 <table class="min-w-full divide-y divide-gray-700">
33 <thead class="bg-gray-900/80">
34 <tr>
35 <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Name</th>
36 <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Size</th>
37 <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Modified</th>
38 <th class="px-6 py-3 text-right text-xs font-medium text-gray-400 uppercase tracking-wider"></th>
39 </tr>
40 </thead>
41 <tbody class="divide-y divide-gray-700/70">
42 {% for file in files %}
43 <tr class="hover:bg-gray-700/30 transition-colors">
44 <td class="px-6 py-3 text-sm text-gray-200 font-mono">{{ file.name }}</td>
45 <td class="px-6 py-3 text-sm text-gray-400">{{ file.size|filesizeformat }}</td>
46 <td class="px-6 py-3 text-sm text-gray-400">{% if file.mtime %}{{ file.mtime|date:"Y-m-d H:i" }}{% else %}--{% endif %}</td>
47 <td class="px-6 py-3 text-right">
48 <a href="{% url 'fossil:unversioned_download' slug=project.slug filename=file.name %}"
@@ -66,21 +66,21 @@
66 {% if has_admin %}
67 <div class="mt-6">
68 <form method="post"
69 action="{% url 'fossil:unversioned_upload' slug=project.slug %}"
70 enctype="multipart/form-data"
71 class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm">
72 {% csrf_token %}
73 <h4 class="text-sm font-medium text-gray-300 mb-3">Upload File</h4>
74 <div class="flex items-center gap-3">
75 <input type="file" name="file" required
76 class="block w-full text-sm text-gray-400 file:mr-4 file:py-1.5 file:px-3 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-brand file:text-white hover:file:bg-brand-hover" />
77 <button type="submit"
78 class="rounded-md bg-brand px-4 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors whitespace-nowrap">
79 Upload
80 </button>
81 </div>
82 <p class="mt-2 text-xs text-gray-500">Unversioned files do not preserve history. Only the latest version is kept.</p>
83 </form>
84 </div>
85 {% endif %}
86 {% endblock %}
87
--- templates/fossil/wiki_form.html
+++ templates/fossil/wiki_form.html
@@ -20,25 +20,25 @@
2020
<button @click="tab = 'write'" :class="tab === 'write' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Write</button>
2121
<button @click="tab = 'preview'; document.getElementById('preview-pane').innerHTML = DOMPurify.sanitize(marked.parse(document.getElementById('content-input').value))" :class="tab === 'preview' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Preview</button>
2222
</div>
2323
</div>
2424
25
- <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
25
+ <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
2626
{% csrf_token %}
2727
2828
{% if not page %}
2929
<div>
3030
<label class="block text-sm font-medium text-gray-300 mb-1">Page Name <span class="text-red-400">*</span></label>
3131
<input type="text" name="name" required placeholder="Page title"
32
- class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
32
+ class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
3333
</div>
3434
{% endif %}
3535
3636
<div x-show="tab === 'write'">
3737
<label class="block text-sm font-medium text-gray-300 mb-1">Content (Markdown)</label>
3838
<textarea id="content-input" name="content" rows="20" placeholder="Write in Markdown..."
39
- class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm font-mono">{% if page %}{{ page.content }}{% endif %}</textarea>
39
+ class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm font-mono transition-colors">{% if page %}{{ page.content }}{% endif %}</textarea>
4040
</div>
4141
4242
<div x-show="tab === 'preview'" style="display:none">
4343
<div id="preview-pane" class="prose prose-invert prose-gray max-w-none min-h-[20rem] p-4 rounded-md border border-gray-700 bg-gray-900">
4444
<p class="text-gray-500 italic">Click Preview to render...</p>
@@ -45,15 +45,15 @@
4545
</div>
4646
</div>
4747
4848
<div class="flex justify-end gap-3 pt-2">
4949
<a href="{% url 'fossil:wiki' slug=project.slug %}"
50
- class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
50
+ class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
5151
Cancel
5252
</a>
53
- <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
53
+ <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
5454
{% if page %}Update{% else %}Create{% endif %}
5555
</button>
5656
</div>
5757
</form>
5858
</div>
5959
{% endblock %}
6060
--- templates/fossil/wiki_form.html
+++ templates/fossil/wiki_form.html
@@ -20,25 +20,25 @@
20 <button @click="tab = 'write'" :class="tab === 'write' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Write</button>
21 <button @click="tab = 'preview'; document.getElementById('preview-pane').innerHTML = DOMPurify.sanitize(marked.parse(document.getElementById('content-input').value))" :class="tab === 'preview' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Preview</button>
22 </div>
23 </div>
24
25 <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
26 {% csrf_token %}
27
28 {% if not page %}
29 <div>
30 <label class="block text-sm font-medium text-gray-300 mb-1">Page Name <span class="text-red-400">*</span></label>
31 <input type="text" name="name" required placeholder="Page title"
32 class="w-full rounded-md border-gray-700 bg-gray-900 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm">
33 </div>
34 {% endif %}
35
36 <div x-show="tab === 'write'">
37 <label class="block text-sm font-medium text-gray-300 mb-1">Content (Markdown)</label>
38 <textarea id="content-input" name="content" rows="20" placeholder="Write in Markdown..."
39 class="w-full rounded-md border-gray-700 bg-gray-800 text-gray-100 shadow-sm focus:border-brand focus:ring-brand sm:text-sm font-mono">{% if page %}{{ page.content }}{% endif %}</textarea>
40 </div>
41
42 <div x-show="tab === 'preview'" style="display:none">
43 <div id="preview-pane" class="prose prose-invert prose-gray max-w-none min-h-[20rem] p-4 rounded-md border border-gray-700 bg-gray-900">
44 <p class="text-gray-500 italic">Click Preview to render...</p>
@@ -45,15 +45,15 @@
45 </div>
46 </div>
47
48 <div class="flex justify-end gap-3 pt-2">
49 <a href="{% url 'fossil:wiki' slug=project.slug %}"
50 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
51 Cancel
52 </a>
53 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
54 {% if page %}Update{% else %}Create{% endif %}
55 </button>
56 </div>
57 </form>
58 </div>
59 {% endblock %}
60
--- templates/fossil/wiki_form.html
+++ templates/fossil/wiki_form.html
@@ -20,25 +20,25 @@
20 <button @click="tab = 'write'" :class="tab === 'write' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Write</button>
21 <button @click="tab = 'preview'; document.getElementById('preview-pane').innerHTML = DOMPurify.sanitize(marked.parse(document.getElementById('content-input').value))" :class="tab === 'preview' ? 'bg-brand text-white' : 'text-gray-500 hover:text-white'" class="px-3 py-1 rounded">Preview</button>
22 </div>
23 </div>
24
25 <form method="post" class="space-y-4 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
26 {% csrf_token %}
27
28 {% if not page %}
29 <div>
30 <label class="block text-sm font-medium text-gray-300 mb-1">Page Name <span class="text-red-400">*</span></label>
31 <input type="text" name="name" required placeholder="Page title"
32 class="w-full rounded-md border-gray-600 bg-gray-900 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm transition-colors">
33 </div>
34 {% endif %}
35
36 <div x-show="tab === 'write'">
37 <label class="block text-sm font-medium text-gray-300 mb-1">Content (Markdown)</label>
38 <textarea id="content-input" name="content" rows="20" placeholder="Write in Markdown..."
39 class="w-full rounded-md border-gray-600 bg-gray-800 text-gray-100 shadow-inner focus:border-brand focus:ring-1 focus:ring-brand sm:text-sm font-mono transition-colors">{% if page %}{{ page.content }}{% endif %}</textarea>
40 </div>
41
42 <div x-show="tab === 'preview'" style="display:none">
43 <div id="preview-pane" class="prose prose-invert prose-gray max-w-none min-h-[20rem] p-4 rounded-md border border-gray-700 bg-gray-900">
44 <p class="text-gray-500 italic">Click Preview to render...</p>
@@ -45,15 +45,15 @@
45 </div>
46 </div>
47
48 <div class="flex justify-end gap-3 pt-2">
49 <a href="{% url 'fossil:wiki' slug=project.slug %}"
50 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
51 Cancel
52 </a>
53 <button type="submit" class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
54 {% if page %}Update{% else %}Create{% endif %}
55 </button>
56 </div>
57 </form>
58 </div>
59 {% endblock %}
60
--- templates/fossil/wiki_list.html
+++ templates/fossil/wiki_list.html
@@ -22,20 +22,20 @@
2222
hx-indicator="closest .search-wrap" />
2323
<svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
2424
</span>
2525
</div>
2626
{% if perms.projects.change_project %}
27
- <a href="{% url 'fossil:wiki_create' slug=project.slug %}" class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">New Page</a>
27
+ <a href="{% url 'fossil:wiki_create' slug=project.slug %}" class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">New Page</a>
2828
{% endif %}
2929
</div>
3030
3131
<div id="wiki-content">
3232
<div class="flex gap-6">
3333
<!-- Main content: home page or page index -->
3434
<div class="flex-1 min-w-0">
3535
{% if home_page and not search %}
36
- <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
36
+ <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
3737
<div class="px-6 py-4 border-b border-gray-700">
3838
<h2 class="text-lg font-semibold text-gray-100">{{ home_page.name }}</h2>
3939
</div>
4040
<div class="px-6 py-6">
4141
<div class="prose prose-invert prose-gray max-w-none">
4242
--- templates/fossil/wiki_list.html
+++ templates/fossil/wiki_list.html
@@ -22,20 +22,20 @@
22 hx-indicator="closest .search-wrap" />
23 <svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
24 </span>
25 </div>
26 {% if perms.projects.change_project %}
27 <a href="{% url 'fossil:wiki_create' slug=project.slug %}" class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">New Page</a>
28 {% endif %}
29 </div>
30
31 <div id="wiki-content">
32 <div class="flex gap-6">
33 <!-- Main content: home page or page index -->
34 <div class="flex-1 min-w-0">
35 {% if home_page and not search %}
36 <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
37 <div class="px-6 py-4 border-b border-gray-700">
38 <h2 class="text-lg font-semibold text-gray-100">{{ home_page.name }}</h2>
39 </div>
40 <div class="px-6 py-6">
41 <div class="prose prose-invert prose-gray max-w-none">
42
--- templates/fossil/wiki_list.html
+++ templates/fossil/wiki_list.html
@@ -22,20 +22,20 @@
22 hx-indicator="closest .search-wrap" />
23 <svg class="search-spinner animate-spin h-4 w-4" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>
24 </span>
25 </div>
26 {% if perms.projects.change_project %}
27 <a href="{% url 'fossil:wiki_create' slug=project.slug %}" class="inline-flex items-center rounded-md bg-brand px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">New Page</a>
28 {% endif %}
29 </div>
30
31 <div id="wiki-content">
32 <div class="flex gap-6">
33 <!-- Main content: home page or page index -->
34 <div class="flex-1 min-w-0">
35 {% if home_page and not search %}
36 <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
37 <div class="px-6 py-4 border-b border-gray-700">
38 <h2 class="text-lg font-semibold text-gray-100">{{ home_page.name }}</h2>
39 </div>
40 <div class="px-6 py-6">
41 <div class="prose prose-invert prose-gray max-w-none">
42
--- templates/fossil/wiki_page.html
+++ templates/fossil/wiki_page.html
@@ -7,17 +7,17 @@
77
{% include "fossil/_project_nav.html" %}
88
99
<div class="flex gap-6">
1010
<!-- Main wiki content -->
1111
<div class="flex-1 min-w-0">
12
- <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
12
+ <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
1313
<div class="px-6 py-4 border-b border-gray-700 flex items-center justify-between">
1414
<h2 class="text-lg font-semibold text-gray-100">{{ page.name }}</h2>
1515
<div class="flex items-center gap-3">
1616
<span class="text-xs text-gray-500">{{ page.last_modified|timesince }} ago by {{ page.user|display_user }}</span>
1717
{% if perms.projects.change_project %}
18
- <a href="{% url 'fossil:wiki_edit' slug=project.slug page_name=page.name %}" class="rounded-md bg-gray-700 px-2 py-1 text-xs font-semibold text-gray-300 hover:bg-gray-600">Edit</a>
18
+ <a href="{% url 'fossil:wiki_edit' slug=project.slug page_name=page.name %}" class="rounded-md bg-gray-700 px-2 py-1 text-xs font-semibold text-gray-300 hover:bg-gray-600 border border-gray-600 transition-colors">Edit</a>
1919
{% endif %}
2020
</div>
2121
</div>
2222
<div class="px-6 py-6">
2323
<div class="prose prose-invert prose-gray max-w-none">
2424
--- templates/fossil/wiki_page.html
+++ templates/fossil/wiki_page.html
@@ -7,17 +7,17 @@
7 {% include "fossil/_project_nav.html" %}
8
9 <div class="flex gap-6">
10 <!-- Main wiki content -->
11 <div class="flex-1 min-w-0">
12 <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700">
13 <div class="px-6 py-4 border-b border-gray-700 flex items-center justify-between">
14 <h2 class="text-lg font-semibold text-gray-100">{{ page.name }}</h2>
15 <div class="flex items-center gap-3">
16 <span class="text-xs text-gray-500">{{ page.last_modified|timesince }} ago by {{ page.user|display_user }}</span>
17 {% if perms.projects.change_project %}
18 <a href="{% url 'fossil:wiki_edit' slug=project.slug page_name=page.name %}" class="rounded-md bg-gray-700 px-2 py-1 text-xs font-semibold text-gray-300 hover:bg-gray-600">Edit</a>
19 {% endif %}
20 </div>
21 </div>
22 <div class="px-6 py-6">
23 <div class="prose prose-invert prose-gray max-w-none">
24
--- templates/fossil/wiki_page.html
+++ templates/fossil/wiki_page.html
@@ -7,17 +7,17 @@
7 {% include "fossil/_project_nav.html" %}
8
9 <div class="flex gap-6">
10 <!-- Main wiki content -->
11 <div class="flex-1 min-w-0">
12 <div class="overflow-hidden rounded-lg bg-gray-800 shadow-sm border border-gray-700">
13 <div class="px-6 py-4 border-b border-gray-700 flex items-center justify-between">
14 <h2 class="text-lg font-semibold text-gray-100">{{ page.name }}</h2>
15 <div class="flex items-center gap-3">
16 <span class="text-xs text-gray-500">{{ page.last_modified|timesince }} ago by {{ page.user|display_user }}</span>
17 {% if perms.projects.change_project %}
18 <a href="{% url 'fossil:wiki_edit' slug=project.slug page_name=page.name %}" class="rounded-md bg-gray-700 px-2 py-1 text-xs font-semibold text-gray-300 hover:bg-gray-600 border border-gray-600 transition-colors">Edit</a>
19 {% endif %}
20 </div>
21 </div>
22 <div class="px-6 py-6">
23 <div class="prose prose-invert prose-gray max-w-none">
24
--- templates/includes/_pagination.html
+++ templates/includes/_pagination.html
@@ -16,14 +16,14 @@
1616
{% endif %}
1717
</div>
1818
<div class="flex gap-1">
1919
{% if page_obj.has_previous %}
2020
<a href="?page={{ page_obj.previous_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
21
- class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700">Previous</a>
21
+ class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700 border border-gray-700 transition-colors">Previous</a>
2222
{% endif %}
2323
{% if page_obj.has_next %}
2424
<a href="?page={{ page_obj.next_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
25
- class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700">Next</a>
25
+ class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700 border border-gray-700 transition-colors">Next</a>
2626
{% endif %}
2727
</div>
2828
</nav>
2929
{% endif %}
3030
--- templates/includes/_pagination.html
+++ templates/includes/_pagination.html
@@ -16,14 +16,14 @@
16 {% endif %}
17 </div>
18 <div class="flex gap-1">
19 {% if page_obj.has_previous %}
20 <a href="?page={{ page_obj.previous_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
21 class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700">Previous</a>
22 {% endif %}
23 {% if page_obj.has_next %}
24 <a href="?page={{ page_obj.next_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
25 class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700">Next</a>
26 {% endif %}
27 </div>
28 </nav>
29 {% endif %}
30
--- templates/includes/_pagination.html
+++ templates/includes/_pagination.html
@@ -16,14 +16,14 @@
16 {% endif %}
17 </div>
18 <div class="flex gap-1">
19 {% if page_obj.has_previous %}
20 <a href="?page={{ page_obj.previous_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
21 class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700 border border-gray-700 transition-colors">Previous</a>
22 {% endif %}
23 {% if page_obj.has_next %}
24 <a href="?page={{ page_obj.next_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
25 class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700 border border-gray-700 transition-colors">Next</a>
26 {% endif %}
27 </div>
28 </nav>
29 {% endif %}
30
--- templates/includes/_pagination_manual.html
+++ templates/includes/_pagination_manual.html
@@ -16,14 +16,14 @@
1616
{% endif %}
1717
</div>
1818
<div class="flex gap-1">
1919
{% if pagination.has_previous %}
2020
<a href="?page={{ pagination.previous_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
21
- class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700">Previous</a>
21
+ class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700 border border-gray-700 transition-colors">Previous</a>
2222
{% endif %}
2323
{% if pagination.has_next %}
2424
<a href="?page={{ pagination.next_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
25
- class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700">Next</a>
25
+ class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700 border border-gray-700 transition-colors">Next</a>
2626
{% endif %}
2727
</div>
2828
</nav>
2929
{% endif %}
3030
--- templates/includes/_pagination_manual.html
+++ templates/includes/_pagination_manual.html
@@ -16,14 +16,14 @@
16 {% endif %}
17 </div>
18 <div class="flex gap-1">
19 {% if pagination.has_previous %}
20 <a href="?page={{ pagination.previous_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
21 class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700">Previous</a>
22 {% endif %}
23 {% if pagination.has_next %}
24 <a href="?page={{ pagination.next_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
25 class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700">Next</a>
26 {% endif %}
27 </div>
28 </nav>
29 {% endif %}
30
--- templates/includes/_pagination_manual.html
+++ templates/includes/_pagination_manual.html
@@ -16,14 +16,14 @@
16 {% endif %}
17 </div>
18 <div class="flex gap-1">
19 {% if pagination.has_previous %}
20 <a href="?page={{ pagination.previous_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
21 class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700 border border-gray-700 transition-colors">Previous</a>
22 {% endif %}
23 {% if pagination.has_next %}
24 <a href="?page={{ pagination.next_page_number }}{% if per_page %}&per_page={{ per_page }}{% endif %}{% if search %}&search={{ search|urlencode }}{% endif %}{% if extra_params %}{{ extra_params }}{% endif %}"
25 class="px-3 py-1 text-xs rounded-md bg-gray-800 text-gray-300 hover:bg-gray-700 border border-gray-700 transition-colors">Next</a>
26 {% endif %}
27 </div>
28 </nav>
29 {% endif %}
30
--- templates/organization/partials/member_table.html
+++ templates/organization/partials/member_table.html
@@ -1,21 +1,21 @@
11
<div id="member-table">
22
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
33
<table class="min-w-full divide-y divide-gray-700">
4
- <thead class="bg-gray-900">
4
+ <thead class="bg-gray-900/80">
55
<tr>
6
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Username</th>
7
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Email</th>
8
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Role</th>
9
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Status</th>
10
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Joined</th>
11
- <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
6
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Username</th>
7
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Email</th>
8
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Role</th>
9
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Status</th>
10
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Joined</th>
11
+ <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
1212
</tr>
1313
</thead>
14
- <tbody class="divide-y divide-gray-700 bg-gray-800">
14
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
1515
{% for membership in members %}
16
- <tr class="hover:bg-gray-700/50">
16
+ <tr class="hover:bg-gray-700/40 transition-colors">
1717
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
1818
<a href="{% url 'organization:user_detail' username=membership.member.username %}" class="text-brand-light hover:text-brand">{{ membership.member.username }}</a>
1919
</td>
2020
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400">{{ membership.member.email|default:"—" }}</td>
2121
<td class="px-6 py-4 whitespace-nowrap text-sm">
2222
--- templates/organization/partials/member_table.html
+++ templates/organization/partials/member_table.html
@@ -1,21 +1,21 @@
1 <div id="member-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Username</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Email</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Role</th>
9 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Status</th>
10 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Joined</th>
11 <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
12 </tr>
13 </thead>
14 <tbody class="divide-y divide-gray-700 bg-gray-800">
15 {% for membership in members %}
16 <tr class="hover:bg-gray-700/50">
17 <td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
18 <a href="{% url 'organization:user_detail' username=membership.member.username %}" class="text-brand-light hover:text-brand">{{ membership.member.username }}</a>
19 </td>
20 <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400">{{ membership.member.email|default:"—" }}</td>
21 <td class="px-6 py-4 whitespace-nowrap text-sm">
22
--- templates/organization/partials/member_table.html
+++ templates/organization/partials/member_table.html
@@ -1,21 +1,21 @@
1 <div id="member-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900/80">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Username</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Email</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Role</th>
9 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Status</th>
10 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Joined</th>
11 <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
12 </tr>
13 </thead>
14 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
15 {% for membership in members %}
16 <tr class="hover:bg-gray-700/40 transition-colors">
17 <td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
18 <a href="{% url 'organization:user_detail' username=membership.member.username %}" class="text-brand-light hover:text-brand">{{ membership.member.username }}</a>
19 </td>
20 <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400">{{ membership.member.email|default:"—" }}</td>
21 <td class="px-6 py-4 whitespace-nowrap text-sm">
22
--- templates/organization/partials/team_member_table.html
+++ templates/organization/partials/team_member_table.html
@@ -1,18 +1,18 @@
11
<div id="team-member-table">
22
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
33
<table class="min-w-full divide-y divide-gray-700">
4
- <thead class="bg-gray-900">
4
+ <thead class="bg-gray-900/80">
55
<tr>
6
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Username</th>
7
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Email</th>
8
- <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
6
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Username</th>
7
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Email</th>
8
+ <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
99
</tr>
1010
</thead>
11
- <tbody class="divide-y divide-gray-700 bg-gray-800">
11
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
1212
{% for member in team_members %}
13
- <tr class="hover:bg-gray-700/50">
13
+ <tr class="hover:bg-gray-700/40 transition-colors">
1414
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-100">{{ member.username }}</td>
1515
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400">{{ member.email|default:"—" }}</td>
1616
<td class="px-6 py-4 whitespace-nowrap text-right text-sm">
1717
{% if perms.organization.change_team %}
1818
<a href="{% url 'organization:team_member_remove' slug=team.slug username=member.username %}" class="text-red-400 hover:text-red-300">Remove</a>
1919
--- templates/organization/partials/team_member_table.html
+++ templates/organization/partials/team_member_table.html
@@ -1,18 +1,18 @@
1 <div id="team-member-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Username</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Email</th>
8 <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
9 </tr>
10 </thead>
11 <tbody class="divide-y divide-gray-700 bg-gray-800">
12 {% for member in team_members %}
13 <tr class="hover:bg-gray-700/50">
14 <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-100">{{ member.username }}</td>
15 <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400">{{ member.email|default:"—" }}</td>
16 <td class="px-6 py-4 whitespace-nowrap text-right text-sm">
17 {% if perms.organization.change_team %}
18 <a href="{% url 'organization:team_member_remove' slug=team.slug username=member.username %}" class="text-red-400 hover:text-red-300">Remove</a>
19
--- templates/organization/partials/team_member_table.html
+++ templates/organization/partials/team_member_table.html
@@ -1,18 +1,18 @@
1 <div id="team-member-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900/80">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Username</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Email</th>
8 <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
9 </tr>
10 </thead>
11 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
12 {% for member in team_members %}
13 <tr class="hover:bg-gray-700/40 transition-colors">
14 <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-100">{{ member.username }}</td>
15 <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400">{{ member.email|default:"—" }}</td>
16 <td class="px-6 py-4 whitespace-nowrap text-right text-sm">
17 {% if perms.organization.change_team %}
18 <a href="{% url 'organization:team_member_remove' slug=team.slug username=member.username %}" class="text-red-400 hover:text-red-300">Remove</a>
19
--- templates/organization/partials/team_table.html
+++ templates/organization/partials/team_table.html
@@ -1,19 +1,19 @@
11
<div id="team-table">
22
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
33
<table class="min-w-full divide-y divide-gray-700">
4
- <thead class="bg-gray-900">
4
+ <thead class="bg-gray-900/80">
55
<tr>
6
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Name</th>
7
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Members</th>
8
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Created</th>
9
- <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
6
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Name</th>
7
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Members</th>
8
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Created</th>
9
+ <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
1010
</tr>
1111
</thead>
12
- <tbody class="divide-y divide-gray-700 bg-gray-800">
12
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
1313
{% for team in teams %}
14
- <tr class="hover:bg-gray-700/50">
14
+ <tr class="hover:bg-gray-700/40 transition-colors">
1515
<td class="px-6 py-4 whitespace-nowrap">
1616
<a href="{% url 'organization:team_detail' slug=team.slug %}" class="text-brand-light hover:text-brand font-medium">
1717
{{ team.name }}
1818
</a>
1919
</td>
2020
--- templates/organization/partials/team_table.html
+++ templates/organization/partials/team_table.html
@@ -1,19 +1,19 @@
1 <div id="team-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Name</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Members</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Created</th>
9 <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
10 </tr>
11 </thead>
12 <tbody class="divide-y divide-gray-700 bg-gray-800">
13 {% for team in teams %}
14 <tr class="hover:bg-gray-700/50">
15 <td class="px-6 py-4 whitespace-nowrap">
16 <a href="{% url 'organization:team_detail' slug=team.slug %}" class="text-brand-light hover:text-brand font-medium">
17 {{ team.name }}
18 </a>
19 </td>
20
--- templates/organization/partials/team_table.html
+++ templates/organization/partials/team_table.html
@@ -1,19 +1,19 @@
1 <div id="team-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900/80">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Name</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Members</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Created</th>
9 <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
10 </tr>
11 </thead>
12 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
13 {% for team in teams %}
14 <tr class="hover:bg-gray-700/40 transition-colors">
15 <td class="px-6 py-4 whitespace-nowrap">
16 <a href="{% url 'organization:team_detail' slug=team.slug %}" class="text-brand-light hover:text-brand font-medium">
17 {{ team.name }}
18 </a>
19 </td>
20
--- templates/pages/partials/page_table.html
+++ templates/pages/partials/page_table.html
@@ -1,19 +1,19 @@
11
<div id="page-table">
22
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
33
<table class="min-w-full divide-y divide-gray-700">
4
- <thead class="bg-gray-900">
4
+ <thead class="bg-gray-900/80">
55
<tr>
6
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Title</th>
7
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Status</th>
8
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Updated</th>
9
- <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
6
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Title</th>
7
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Status</th>
8
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Updated</th>
9
+ <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
1010
</tr>
1111
</thead>
12
- <tbody class="divide-y divide-gray-700 bg-gray-800">
12
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
1313
{% for page in pages %}
14
- <tr class="hover:bg-gray-700/50">
14
+ <tr class="hover:bg-gray-700/40 transition-colors">
1515
<td class="px-6 py-4 whitespace-nowrap">
1616
<a href="{% url 'pages:detail' slug=page.slug %}" class="text-brand-light hover:text-brand font-medium">
1717
{{ page.name }}
1818
</a>
1919
</td>
2020
--- templates/pages/partials/page_table.html
+++ templates/pages/partials/page_table.html
@@ -1,19 +1,19 @@
1 <div id="page-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Title</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Status</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Updated</th>
9 <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
10 </tr>
11 </thead>
12 <tbody class="divide-y divide-gray-700 bg-gray-800">
13 {% for page in pages %}
14 <tr class="hover:bg-gray-700/50">
15 <td class="px-6 py-4 whitespace-nowrap">
16 <a href="{% url 'pages:detail' slug=page.slug %}" class="text-brand-light hover:text-brand font-medium">
17 {{ page.name }}
18 </a>
19 </td>
20
--- templates/pages/partials/page_table.html
+++ templates/pages/partials/page_table.html
@@ -1,19 +1,19 @@
1 <div id="page-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900/80">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Title</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Status</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Updated</th>
9 <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
10 </tr>
11 </thead>
12 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
13 {% for page in pages %}
14 <tr class="hover:bg-gray-700/40 transition-colors">
15 <td class="px-6 py-4 whitespace-nowrap">
16 <a href="{% url 'pages:detail' slug=page.slug %}" class="text-brand-light hover:text-brand font-medium">
17 {{ page.name }}
18 </a>
19 </td>
20
--- templates/projects/partials/group_table.html
+++ templates/projects/partials/group_table.html
@@ -1,20 +1,20 @@
11
<div id="group-table">
22
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
33
<table class="min-w-full divide-y divide-gray-700">
4
- <thead class="bg-gray-900">
4
+ <thead class="bg-gray-900/80">
55
<tr>
6
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Name</th>
7
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Description</th>
8
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Projects</th>
9
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Created</th>
10
- <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
6
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Name</th>
7
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Description</th>
8
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Projects</th>
9
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Created</th>
10
+ <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
1111
</tr>
1212
</thead>
13
- <tbody class="divide-y divide-gray-700 bg-gray-800">
13
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
1414
{% for group in groups %}
15
- <tr class="hover:bg-gray-700/50">
15
+ <tr class="hover:bg-gray-700/40 transition-colors">
1616
<td class="px-6 py-4 whitespace-nowrap">
1717
<a href="{% url 'projects:group_detail' slug=group.slug %}" class="text-brand-light hover:text-brand font-medium">
1818
{{ group.name }}
1919
</a>
2020
</td>
2121
--- templates/projects/partials/group_table.html
+++ templates/projects/partials/group_table.html
@@ -1,20 +1,20 @@
1 <div id="group-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Name</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Description</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Projects</th>
9 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Created</th>
10 <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
11 </tr>
12 </thead>
13 <tbody class="divide-y divide-gray-700 bg-gray-800">
14 {% for group in groups %}
15 <tr class="hover:bg-gray-700/50">
16 <td class="px-6 py-4 whitespace-nowrap">
17 <a href="{% url 'projects:group_detail' slug=group.slug %}" class="text-brand-light hover:text-brand font-medium">
18 {{ group.name }}
19 </a>
20 </td>
21
--- templates/projects/partials/group_table.html
+++ templates/projects/partials/group_table.html
@@ -1,20 +1,20 @@
1 <div id="group-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900/80">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Name</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Description</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Projects</th>
9 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Created</th>
10 <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
11 </tr>
12 </thead>
13 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
14 {% for group in groups %}
15 <tr class="hover:bg-gray-700/40 transition-colors">
16 <td class="px-6 py-4 whitespace-nowrap">
17 <a href="{% url 'projects:group_detail' slug=group.slug %}" class="text-brand-light hover:text-brand font-medium">
18 {{ group.name }}
19 </a>
20 </td>
21
--- templates/projects/partials/project_table.html
+++ templates/projects/partials/project_table.html
@@ -1,20 +1,20 @@
11
<div id="project-table">
22
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
33
<table class="min-w-full divide-y divide-gray-700">
4
- <thead class="bg-gray-900">
4
+ <thead class="bg-gray-900/80">
55
<tr>
6
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Name</th>
7
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Visibility</th>
8
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Teams</th>
9
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Created</th>
10
- <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
6
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Name</th>
7
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Visibility</th>
8
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Teams</th>
9
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Created</th>
10
+ <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
1111
</tr>
1212
</thead>
13
- <tbody class="divide-y divide-gray-700 bg-gray-800">
13
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
1414
{% for project in projects %}
15
- <tr class="hover:bg-gray-700/50">
15
+ <tr class="hover:bg-gray-700/40 transition-colors">
1616
<td class="px-6 py-4 whitespace-nowrap">
1717
<a href="{% url 'projects:detail' slug=project.slug %}" class="text-brand-light hover:text-brand font-medium">
1818
{{ project.name }}
1919
</a>
2020
</td>
2121
--- templates/projects/partials/project_table.html
+++ templates/projects/partials/project_table.html
@@ -1,20 +1,20 @@
1 <div id="project-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Name</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Visibility</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Teams</th>
9 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Created</th>
10 <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
11 </tr>
12 </thead>
13 <tbody class="divide-y divide-gray-700 bg-gray-800">
14 {% for project in projects %}
15 <tr class="hover:bg-gray-700/50">
16 <td class="px-6 py-4 whitespace-nowrap">
17 <a href="{% url 'projects:detail' slug=project.slug %}" class="text-brand-light hover:text-brand font-medium">
18 {{ project.name }}
19 </a>
20 </td>
21
--- templates/projects/partials/project_table.html
+++ templates/projects/partials/project_table.html
@@ -1,20 +1,20 @@
1 <div id="project-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900/80">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Name</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Visibility</th>
8 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Teams</th>
9 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Created</th>
10 <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
11 </tr>
12 </thead>
13 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
14 {% for project in projects %}
15 <tr class="hover:bg-gray-700/40 transition-colors">
16 <td class="px-6 py-4 whitespace-nowrap">
17 <a href="{% url 'projects:detail' slug=project.slug %}" class="text-brand-light hover:text-brand font-medium">
18 {{ project.name }}
19 </a>
20 </td>
21
--- templates/projects/partials/project_team_table.html
+++ templates/projects/partials/project_team_table.html
@@ -1,18 +1,18 @@
11
<div id="project-team-table">
22
<div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
33
<table class="min-w-full divide-y divide-gray-700">
4
- <thead class="bg-gray-900">
4
+ <thead class="bg-gray-900/80">
55
<tr>
6
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Team</th>
7
- <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Role</th>
8
- <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
6
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Team</th>
7
+ <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Role</th>
8
+ <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
99
</tr>
1010
</thead>
11
- <tbody class="divide-y divide-gray-700 bg-gray-800">
11
+ <tbody class="divide-y divide-gray-700/70 bg-gray-800">
1212
{% for pt in project_teams %}
13
- <tr class="hover:bg-gray-700/50">
13
+ <tr class="hover:bg-gray-700/40 transition-colors">
1414
<td class="px-6 py-4 whitespace-nowrap">
1515
<a href="{% url 'organization:team_detail' slug=pt.team.slug %}" class="text-brand-light hover:text-brand font-medium">
1616
{{ pt.team.name }}
1717
</a>
1818
</td>
1919
--- templates/projects/partials/project_team_table.html
+++ templates/projects/partials/project_team_table.html
@@ -1,18 +1,18 @@
1 <div id="project-team-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Team</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase text-gray-400">Role</th>
8 <th class="px-6 py-3 text-right text-xs font-medium uppercase text-gray-400">Actions</th>
9 </tr>
10 </thead>
11 <tbody class="divide-y divide-gray-700 bg-gray-800">
12 {% for pt in project_teams %}
13 <tr class="hover:bg-gray-700/50">
14 <td class="px-6 py-4 whitespace-nowrap">
15 <a href="{% url 'organization:team_detail' slug=pt.team.slug %}" class="text-brand-light hover:text-brand font-medium">
16 {{ pt.team.name }}
17 </a>
18 </td>
19
--- templates/projects/partials/project_team_table.html
+++ templates/projects/partials/project_team_table.html
@@ -1,18 +1,18 @@
1 <div id="project-team-table">
2 <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm">
3 <table class="min-w-full divide-y divide-gray-700">
4 <thead class="bg-gray-900/80">
5 <tr>
6 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Team</th>
7 <th class="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-400">Role</th>
8 <th class="px-6 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-400">Actions</th>
9 </tr>
10 </thead>
11 <tbody class="divide-y divide-gray-700/70 bg-gray-800">
12 {% for pt in project_teams %}
13 <tr class="hover:bg-gray-700/40 transition-colors">
14 <td class="px-6 py-4 whitespace-nowrap">
15 <a href="{% url 'organization:team_detail' slug=pt.team.slug %}" class="text-brand-light hover:text-brand font-medium">
16 {{ pt.team.name }}
17 </a>
18 </td>
19
--- templates/projects/project_form.html
+++ templates/projects/project_form.html
@@ -7,11 +7,11 @@
77
</div>
88
99
<div class="mx-auto max-w-2xl">
1010
<h1 class="text-2xl font-bold text-gray-100 mb-6">{{ title }}</h1>
1111
12
- <form method="post" class="space-y-6 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
12
+ <form method="post" class="space-y-6 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
1313
{% csrf_token %}
1414
1515
{% for field in form %}
1616
{% if field.name == "repo_source" or field.name == "clone_url" %}
1717
{# Rendered manually below #}
@@ -64,16 +64,16 @@
6464
</div>
6565
{% endif %}
6666
6767
<div class="flex justify-end gap-3 pt-4">
6868
<a href="{% url 'projects:list' %}"
69
- class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
69
+ class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
7070
Cancel
7171
</a>
7272
<button type="submit"
73
- class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
73
+ class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
7474
{% if project %}Update{% else %}Create{% endif %}
7575
</button>
7676
</div>
7777
</form>
7878
</div>
7979
{% endblock %}
8080
--- templates/projects/project_form.html
+++ templates/projects/project_form.html
@@ -7,11 +7,11 @@
7 </div>
8
9 <div class="mx-auto max-w-2xl">
10 <h1 class="text-2xl font-bold text-gray-100 mb-6">{{ title }}</h1>
11
12 <form method="post" class="space-y-6 rounded-lg bg-gray-800 p-6 shadow border border-gray-700">
13 {% csrf_token %}
14
15 {% for field in form %}
16 {% if field.name == "repo_source" or field.name == "clone_url" %}
17 {# Rendered manually below #}
@@ -64,16 +64,16 @@
64 </div>
65 {% endif %}
66
67 <div class="flex justify-end gap-3 pt-4">
68 <a href="{% url 'projects:list' %}"
69 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600">
70 Cancel
71 </a>
72 <button type="submit"
73 class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
74 {% if project %}Update{% else %}Create{% endif %}
75 </button>
76 </div>
77 </form>
78 </div>
79 {% endblock %}
80
--- templates/projects/project_form.html
+++ templates/projects/project_form.html
@@ -7,11 +7,11 @@
7 </div>
8
9 <div class="mx-auto max-w-2xl">
10 <h1 class="text-2xl font-bold text-gray-100 mb-6">{{ title }}</h1>
11
12 <form method="post" class="space-y-6 rounded-lg bg-gray-800 p-6 shadow-sm border border-gray-700">
13 {% csrf_token %}
14
15 {% for field in form %}
16 {% if field.name == "repo_source" or field.name == "clone_url" %}
17 {# Rendered manually below #}
@@ -64,16 +64,16 @@
64 </div>
65 {% endif %}
66
67 <div class="flex justify-end gap-3 pt-4">
68 <a href="{% url 'projects:list' %}"
69 class="rounded-md bg-gray-700 px-4 py-2 text-sm font-semibold text-gray-100 shadow-sm ring-1 ring-inset ring-gray-600 hover:bg-gray-600 transition-colors">
70 Cancel
71 </a>
72 <button type="submit"
73 class="rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
74 {% if project %}Update{% else %}Create{% endif %}
75 </button>
76 </div>
77 </form>
78 </div>
79 {% endblock %}
80
--- templates/projects/project_list.html
+++ templates/projects/project_list.html
@@ -4,11 +4,11 @@
44
{% block content %}
55
<div class="flex flex-wrap items-center justify-between gap-4 mb-6">
66
<h1 class="text-2xl font-bold text-gray-100">Projects</h1>
77
{% if perms.projects.add_project %}
88
<a href="{% url 'projects:create' %}"
9
- class="inline-flex items-center rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
9
+ class="inline-flex items-center rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
1010
New Project
1111
</a>
1212
{% endif %}
1313
</div>
1414
1515
--- templates/projects/project_list.html
+++ templates/projects/project_list.html
@@ -4,11 +4,11 @@
4 {% block content %}
5 <div class="flex flex-wrap items-center justify-between gap-4 mb-6">
6 <h1 class="text-2xl font-bold text-gray-100">Projects</h1>
7 {% if perms.projects.add_project %}
8 <a href="{% url 'projects:create' %}"
9 class="inline-flex items-center rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover">
10 New Project
11 </a>
12 {% endif %}
13 </div>
14
15
--- templates/projects/project_list.html
+++ templates/projects/project_list.html
@@ -4,11 +4,11 @@
4 {% block content %}
5 <div class="flex flex-wrap items-center justify-between gap-4 mb-6">
6 <h1 class="text-2xl font-bold text-gray-100">Projects</h1>
7 {% if perms.projects.add_project %}
8 <a href="{% url 'projects:create' %}"
9 class="inline-flex items-center rounded-md bg-brand px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-brand-hover focus:outline-none focus:ring-2 focus:ring-brand focus:ring-offset-2 focus:ring-offset-gray-950 transition-colors">
10 New Project
11 </a>
12 {% endif %}
13 </div>
14
15

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button