FossilRepo
Polish UI: add definition to cards, inputs, tables, buttons across 38 templates
Commit
2f13242692d36cf68bf3174396dd4e8a278c2f90d092d4d590a779beeb0aab49
Parent
61e8e0a167e7114…
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
+1
-1
| --- templates/accounts/login.html | ||
| +++ templates/accounts/login.html | ||
| @@ -41,11 +41,11 @@ | ||
| 41 | 41 | </div> |
| 42 | 42 | {% if turnstile_enabled %} |
| 43 | 43 | <div class="cf-turnstile" data-sitekey="{{ turnstile_site_key }}" data-theme="dark"></div> |
| 44 | 44 | {% endif %} |
| 45 | 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"> | |
| 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 | 47 | Sign in |
| 48 | 48 | </button> |
| 49 | 49 | </form> |
| 50 | 50 | </div> |
| 51 | 51 | </div> |
| 52 | 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-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 |
+7
-7
| --- templates/accounts/profile.html | ||
| +++ templates/accounts/profile.html | ||
| @@ -20,22 +20,22 @@ | ||
| 20 | 20 | </div> |
| 21 | 21 | </div> |
| 22 | 22 | </div> |
| 23 | 23 | <div class="flex flex-wrap items-center gap-2 mt-4 sm:mt-0"> |
| 24 | 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"> | |
| 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 | 26 | Edit Profile |
| 27 | 27 | </a> |
| 28 | 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"> | |
| 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 | 30 | Change Password |
| 31 | 31 | </a> |
| 32 | 32 | </div> |
| 33 | 33 | </div> |
| 34 | 34 | |
| 35 | 35 | <!-- 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"> | |
| 37 | 37 | <h2 class="text-lg font-semibold text-gray-200 mb-4">Profile Info</h2> |
| 38 | 38 | <dl class="grid grid-cols-1 sm:grid-cols-2 gap-x-6 gap-y-3 text-sm"> |
| 39 | 39 | <div> |
| 40 | 40 | <dt class="text-gray-500">Full Name</dt> |
| 41 | 41 | <dd class="text-gray-200 mt-0.5">{{ user.get_full_name|default:"Not set" }}</dd> |
| @@ -66,11 +66,11 @@ | ||
| 66 | 66 | </div> |
| 67 | 67 | </dl> |
| 68 | 68 | </div> |
| 69 | 69 | |
| 70 | 70 | <!-- 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"> | |
| 72 | 72 | <div class="p-4 border-b border-gray-700 flex items-center justify-between"> |
| 73 | 73 | <h2 class="text-lg font-semibold text-gray-200">SSH Keys</h2> |
| 74 | 74 | <a href="{% url 'accounts:ssh_keys' %}" class="text-sm text-brand-light hover:text-brand">Manage Keys</a> |
| 75 | 75 | </div> |
| 76 | 76 | {% if ssh_keys %} |
| @@ -94,11 +94,11 @@ | ||
| 94 | 94 | </div> |
| 95 | 95 | {% endif %} |
| 96 | 96 | </div> |
| 97 | 97 | |
| 98 | 98 | <!-- 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"> | |
| 100 | 100 | <div class="p-4 border-b border-gray-700 flex items-center justify-between"> |
| 101 | 101 | <h2 class="text-lg font-semibold text-gray-200">Notification Preferences</h2> |
| 102 | 102 | <a href="{% url 'accounts:notification_prefs' %}" class="text-sm text-brand-light hover:text-brand">Edit Preferences</a> |
| 103 | 103 | </div> |
| 104 | 104 | <div class="p-4"> |
| @@ -121,15 +121,15 @@ | ||
| 121 | 121 | </dl> |
| 122 | 122 | </div> |
| 123 | 123 | </div> |
| 124 | 124 | |
| 125 | 125 | <!-- 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"> | |
| 127 | 127 | <div class="p-4 border-b border-gray-700 flex items-center justify-between"> |
| 128 | 128 | <h2 class="text-lg font-semibold text-gray-200">Personal Access Tokens</h2> |
| 129 | 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"> | |
| 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 | 131 | Generate Token |
| 132 | 132 | </a> |
| 133 | 133 | </div> |
| 134 | 134 | {% if tokens %} |
| 135 | 135 | <div class="divide-y divide-gray-700"> |
| 136 | 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"> |
| 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 @@ | ||
| 13 | 13 | </div> |
| 14 | 14 | |
| 15 | 15 | <form method="post" class="space-y-6"> |
| 16 | 16 | {% csrf_token %} |
| 17 | 17 | |
| 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"> | |
| 19 | 19 | <div class="grid grid-cols-1 sm:grid-cols-2 gap-4"> |
| 20 | 20 | <div> |
| 21 | 21 | <label for="first_name" class="block text-sm font-medium text-gray-300 mb-1">First Name</label> |
| 22 | 22 | <input type="text" name="first_name" id="first_name" value="{{ user.first_name }}" maxlength="30" |
| 23 | 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 | 68 | </div> |
| 69 | 69 | </div> |
| 70 | 70 | </div> |
| 71 | 71 | |
| 72 | 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"> | |
| 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 | 74 | Save Changes |
| 75 | 75 | </button> |
| 76 | 76 | <a href="{% url 'accounts:profile' %}" class="text-sm text-gray-400 hover:text-white">Cancel</a> |
| 77 | 77 | </div> |
| 78 | 78 | </form> |
| 79 | 79 | </div> |
| 80 | 80 | {% endblock %} |
| 81 | 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"> |
| 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 |
+7
-3
| --- templates/base.html | ||
| +++ templates/base.html | ||
| @@ -38,13 +38,17 @@ | ||
| 38 | 38 | <style type="text/tailwindcss"> |
| 39 | 39 | @layer base { |
| 40 | 40 | input[type="text"], input[type="number"], input[type="email"], |
| 41 | 41 | input[type="password"], input[type="search"], input[type="url"], |
| 42 | 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; | |
| 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; | |
| 46 | 50 | } |
| 47 | 51 | } |
| 48 | 52 | </style> |
| 49 | 53 | <style> |
| 50 | 54 | /* Hide scrollbar on horizontal-scroll navs (tabs, filter pills) */ |
| 51 | 55 |
| --- 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 |
+13
-13
| --- templates/dashboard.html | ||
| +++ templates/dashboard.html | ||
| @@ -12,31 +12,31 @@ | ||
| 12 | 12 | <p class="mt-1 text-sm text-gray-400">Welcome back, {{ user.get_full_name|default:user.username }}</p> |
| 13 | 13 | </div> |
| 14 | 14 | |
| 15 | 15 | <!-- Stats cards --> |
| 16 | 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"> | |
| 17 | + <div class="rounded-lg bg-gray-800 border border-gray-700 p-4 shadow-sm hover:border-gray-600 transition-colors"> | |
| 18 | 18 | <div class="text-2xl font-bold text-gray-100">{{ total_projects }}</div> |
| 19 | 19 | <div class="text-xs text-gray-500 mt-1">Projects</div> |
| 20 | 20 | </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"> | |
| 22 | 22 | <div class="text-2xl font-bold text-gray-100">{{ total_checkins|default:"0" }}</div> |
| 23 | 23 | <div class="text-xs text-gray-500 mt-1">Total Checkins</div> |
| 24 | 24 | </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"> | |
| 26 | 26 | <div class="text-2xl font-bold text-gray-100">{{ total_tickets|default:"0" }}</div> |
| 27 | 27 | <div class="text-xs text-gray-500 mt-1">Tickets</div> |
| 28 | 28 | </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"> | |
| 30 | 30 | <div class="text-2xl font-bold text-gray-100">{{ total_wiki|default:"0" }}</div> |
| 31 | 31 | <div class="text-xs text-gray-500 mt-1">Wiki Pages</div> |
| 32 | 32 | </div> |
| 33 | 33 | </div> |
| 34 | 34 | |
| 35 | 35 | <!-- Activity heatmap (all projects, last year) --> |
| 36 | 36 | {% 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"> | |
| 38 | 38 | <h3 class="text-sm font-medium text-gray-300 mb-3">Activity (last year)</h3> |
| 39 | 39 | <div id="heatmap" class="overflow-x-auto"></div> |
| 40 | 40 | <div class="flex items-center justify-end gap-1 mt-2 text-xs text-gray-500"> |
| 41 | 41 | <span>Less</span> |
| 42 | 42 | <span class="inline-block w-3 h-3 rounded-sm bg-gray-700"></span> |
| @@ -52,27 +52,27 @@ | ||
| 52 | 52 | <div class="grid grid-cols-1 gap-6 lg:grid-cols-3"> |
| 53 | 53 | <!-- Main column --> |
| 54 | 54 | <div class="lg:col-span-2 space-y-6"> |
| 55 | 55 | {% if system_activity_json and system_activity_json != "[]" %} |
| 56 | 56 | <!-- 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"> | |
| 58 | 58 | <h3 class="text-sm font-medium text-gray-300 mb-3">System Activity (26 weeks)</h3> |
| 59 | 59 | <div style="height: 140px;"> |
| 60 | 60 | <canvas id="systemChart"></canvas> |
| 61 | 61 | </div> |
| 62 | 62 | </div> |
| 63 | 63 | {% endif %} |
| 64 | 64 | |
| 65 | 65 | {% if recent_across_all %} |
| 66 | 66 | <!-- 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"> | |
| 68 | 68 | <div class="px-4 py-3 border-b border-gray-700"> |
| 69 | 69 | <h3 class="text-sm font-medium text-gray-300">Recent Activity</h3> |
| 70 | 70 | </div> |
| 71 | 71 | <div class="divide-y divide-gray-700"> |
| 72 | 72 | {% 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"> | |
| 74 | 74 | <div class="flex-shrink-0 mt-1"> |
| 75 | 75 | <div class="w-2.5 h-2.5 rounded-full bg-brand"></div> |
| 76 | 76 | </div> |
| 77 | 77 | <div class="flex-1 min-w-0"> |
| 78 | 78 | <a href="{% url 'fossil:checkin_detail' slug=item.project.slug checkin_uuid=item.entry.uuid %}" |
| @@ -102,35 +102,35 @@ | ||
| 102 | 102 | |
| 103 | 103 | <!-- Sidebar --> |
| 104 | 104 | <div class="space-y-4"> |
| 105 | 105 | <!-- Quick links --> |
| 106 | 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"> | |
| 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 | 108 | <h3 class="text-sm font-semibold text-gray-100">Projects</h3> |
| 109 | 109 | <p class="mt-1 text-xs text-gray-500">Manage projects and team access</p> |
| 110 | 110 | </a> |
| 111 | 111 | {% endif %} |
| 112 | 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"> | |
| 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 | 114 | <h3 class="text-sm font-semibold text-gray-100">Teams</h3> |
| 115 | 115 | <p class="mt-1 text-xs text-gray-500">Organize members into teams</p> |
| 116 | 116 | </a> |
| 117 | 117 | {% endif %} |
| 118 | 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"> | |
| 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 | 120 | <h3 class="text-sm font-semibold text-gray-100">FossilRepo Docs</h3> |
| 121 | 121 | <p class="mt-1 text-xs text-gray-500">Guides, runbooks, documentation</p> |
| 122 | 122 | </a> |
| 123 | 123 | {% endif %} |
| 124 | 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"> | |
| 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 | 126 | <h3 class="text-sm font-semibold text-gray-100">Settings</h3> |
| 127 | 127 | <p class="mt-1 text-xs text-gray-500">Organization configuration</p> |
| 128 | 128 | </a> |
| 129 | 129 | {% endif %} |
| 130 | 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"> | |
| 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 | 132 | <h3 class="text-sm font-semibold text-gray-100">Admin</h3> |
| 133 | 133 | <p class="mt-1 text-xs text-gray-500">Users, groups, permissions</p> |
| 134 | 134 | </a> |
| 135 | 135 | {% endif %} |
| 136 | 136 | </div> |
| 137 | 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"> |
| 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 |
+12
-12
| --- templates/fossil/_project_nav.html | ||
| +++ templates/fossil/_project_nav.html | ||
| @@ -1,52 +1,52 @@ | ||
| 1 | 1 | <nav aria-label="Project sections" class="flex space-x-1 border-b border-gray-700 mb-6 overflow-x-auto scrollbar-hide"> |
| 2 | 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 %}"> | |
| 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 | 4 | Overview |
| 5 | 5 | </a> |
| 6 | 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 %}"> | |
| 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 | 8 | Code |
| 9 | 9 | </a> |
| 10 | 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 %}"> | |
| 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 | 12 | Branches |
| 13 | 13 | </a> |
| 14 | 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 %}"> | |
| 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 | 16 | Timeline |
| 17 | 17 | </a> |
| 18 | 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 %}"> | |
| 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 | 20 | Tickets |
| 21 | 21 | </a> |
| 22 | 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 %}"> | |
| 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 | 24 | Wiki |
| 25 | 25 | </a> |
| 26 | 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 %}"> | |
| 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 | 28 | Forum |
| 29 | 29 | </a> |
| 30 | 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 %}"> | |
| 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 | 32 | Releases |
| 33 | 33 | </a> |
| 34 | 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 %}"> | |
| 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 | 36 | Files |
| 37 | 37 | </a> |
| 38 | 38 | {% if perms.projects.change_project %} |
| 39 | 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 %}"> | |
| 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 | 41 | {% if fossil_repo.remote_url %}Sync{% else %}Setup Sync{% endif %} |
| 42 | 42 | </a> |
| 43 | 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 %}"> | |
| 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 | 45 | Settings |
| 46 | 46 | </a> |
| 47 | 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 %}"> | |
| 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 | 49 | Explorer |
| 50 | 50 | </a> |
| 51 | 51 | {% endif %} |
| 52 | 52 | </nav> |
| 53 | 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{% 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 @@ | ||
| 27 | 27 | </div> |
| 28 | 28 | |
| 29 | 29 | <div id="branch-content"> |
| 30 | 30 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 31 | 31 | <table class="min-w-full divide-y divide-gray-700"> |
| 32 | - <thead class="bg-gray-900"> | |
| 32 | + <thead class="bg-gray-900/80"> | |
| 33 | 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> | |
| 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 | 39 | </tr> |
| 40 | 40 | </thead> |
| 41 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 41 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 42 | 42 | {% for branch in branches %} |
| 43 | - <tr class="hover:bg-gray-700/50"> | |
| 43 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 44 | 44 | <td class="px-4 py-3"> |
| 45 | 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 | 46 | {{ branch.name }} |
| 47 | 47 | </a> |
| 48 | 48 | </td> |
| 49 | 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"> |
| 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 @@ | ||
| 56 | 56 | <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1> |
| 57 | 57 | {% include "fossil/_project_nav.html" %} |
| 58 | 58 | |
| 59 | 59 | <div class="space-y-4"> |
| 60 | 60 | <!-- 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"> | |
| 62 | 62 | <div class="px-6 py-5"> |
| 63 | 63 | <p class="text-lg text-gray-100 leading-relaxed">{{ checkin.comment }}</p> |
| 64 | 64 | <div class="mt-3 flex items-center gap-x-4 gap-y-1 flex-wrap text-sm"> |
| 65 | 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 | 66 | <span class="text-gray-500">{{ checkin.timestamp|date:"Y-m-d H:i" }}</span> |
| @@ -123,11 +123,11 @@ | ||
| 123 | 123 | </div> |
| 124 | 124 | </div> |
| 125 | 125 | |
| 126 | 126 | <!-- File summary bar --> |
| 127 | 127 | {% 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"> | |
| 129 | 129 | <div class="flex items-center gap-4 text-sm"> |
| 130 | 130 | <span class="text-gray-300 font-medium">{{ file_diffs|length }} file{{ file_diffs|length|pluralize }} changed</span> |
| 131 | 131 | {% with total_add=0 total_del=0 %} |
| 132 | 132 | {% for fd in file_diffs %} |
| 133 | 133 | {% if fd.additions %} |
| @@ -155,18 +155,18 @@ | ||
| 155 | 155 | </div> |
| 156 | 156 | </div> |
| 157 | 157 | |
| 158 | 158 | <!-- Diff mode toggle --> |
| 159 | 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> | |
| 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 | 163 | </div> |
| 164 | 164 | |
| 165 | 165 | <!-- Diffs --> |
| 166 | 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 }}"> | |
| 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 | 168 | <div class="px-4 py-2.5 border-b border-gray-700 flex items-center justify-between bg-gray-900/50"> |
| 169 | 169 | <div class="flex items-center gap-3"> |
| 170 | 170 | {% if fd.change_type == "added" %} |
| 171 | 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 | 172 | {% elif fd.change_type == "deleted" %} |
| 173 | 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"> |
| 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 @@ | ||
| 5 | 5 | |
| 6 | 6 | {% block content %} |
| 7 | 7 | <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1> |
| 8 | 8 | {% include "fossil/_project_nav.html" %} |
| 9 | 9 | |
| 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"> | |
| 11 | 11 | <!-- Breadcrumb + commit bar --> |
| 12 | 12 | <div class="px-4 py-3 border-b border-gray-700"> |
| 13 | 13 | <!-- Breadcrumbs --> |
| 14 | 14 | <div class="flex flex-wrap items-center justify-between gap-2"> |
| 15 | 15 | <div class="flex items-center gap-1 text-sm min-w-0"> |
| @@ -47,15 +47,15 @@ | ||
| 47 | 47 | <!-- File table --> |
| 48 | 48 | {% include "fossil/partials/file_tree.html" %} |
| 49 | 49 | </div> |
| 50 | 50 | |
| 51 | 51 | {% 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"> | |
| 53 | 53 | <div class="px-4 py-3 border-b border-gray-700 text-sm font-medium text-gray-300">README</div> |
| 54 | 54 | <div class="px-6 py-5"> |
| 55 | 55 | <div class="prose prose-invert prose-gray max-w-none"> |
| 56 | 56 | {{ readme_html }} |
| 57 | 57 | </div> |
| 58 | 58 | </div> |
| 59 | 59 | </div> |
| 60 | 60 | {% endif %} |
| 61 | 61 | {% endblock %} |
| 62 | 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 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 |
+1
-1
| --- templates/fossil/code_file.html | ||
| +++ templates/fossil/code_file.html | ||
| @@ -41,11 +41,11 @@ | ||
| 41 | 41 | |
| 42 | 42 | {% block content %} |
| 43 | 43 | <h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1> |
| 44 | 44 | {% include "fossil/_project_nav.html" %} |
| 45 | 45 | |
| 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"> | |
| 47 | 47 | <!-- File path breadcrumb + stats --> |
| 48 | 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 | 49 | <div class="flex flex-wrap items-center gap-1 text-sm font-mono min-w-0"> |
| 50 | 50 | <a href="{% url 'fossil:code' slug=project.slug %}" class="text-brand-light hover:text-brand">{{ project.slug }}</a> |
| 51 | 51 | {% for crumb in file_breadcrumbs %} |
| 52 | 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 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 |
+5
-5
| --- templates/fossil/forum_form.html | ||
| +++ templates/fossil/forum_form.html | ||
| @@ -20,25 +20,25 @@ | ||
| 20 | 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 | 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 | 22 | </div> |
| 23 | 23 | </div> |
| 24 | 24 | |
| 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"> | |
| 26 | 26 | {% csrf_token %} |
| 27 | 27 | |
| 28 | 28 | {% if not parent %} |
| 29 | 29 | <div> |
| 30 | 30 | <label class="block text-sm font-medium text-gray-300 mb-1">Title <span class="text-red-400">*</span></label> |
| 31 | 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"> | |
| 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 | 33 | </div> |
| 34 | 34 | {% endif %} |
| 35 | 35 | |
| 36 | 36 | <div x-show="tab === 'write'"> |
| 37 | 37 | <label class="block text-sm font-medium text-gray-300 mb-1">Body (Markdown) <span class="text-red-400">*</span></label> |
| 38 | 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> | |
| 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 | 40 | </div> |
| 41 | 41 | |
| 42 | 42 | <div x-show="tab === 'preview'" style="display:none"> |
| 43 | 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 | 44 | <p class="text-gray-500 italic">Click Preview to render...</p> |
| @@ -45,15 +45,15 @@ | ||
| 45 | 45 | </div> |
| 46 | 46 | </div> |
| 47 | 47 | |
| 48 | 48 | <div class="flex justify-end gap-3 pt-2"> |
| 49 | 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"> | |
| 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 | 51 | Cancel |
| 52 | 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"> | |
| 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 | 54 | {% if parent %}Post Reply{% else %}Create Thread{% endif %} |
| 55 | 55 | </button> |
| 56 | 56 | </div> |
| 57 | 57 | </form> |
| 58 | 58 | </div> |
| 59 | 59 | {% endblock %} |
| 60 | 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 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 |
+2
-2
| --- templates/fossil/forum_list.html | ||
| +++ templates/fossil/forum_list.html | ||
| @@ -24,21 +24,21 @@ | ||
| 24 | 24 | hx-indicator="closest .search-wrap" /> |
| 25 | 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 | 26 | </span> |
| 27 | 27 | {% if has_write %} |
| 28 | 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"> | |
| 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 | 30 | New Thread |
| 31 | 31 | </a> |
| 32 | 32 | {% endif %} |
| 33 | 33 | </div> |
| 34 | 34 | </div> |
| 35 | 35 | |
| 36 | 36 | <div id="forum-content"> |
| 37 | 37 | <div class="space-y-3"> |
| 38 | 38 | {% 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"> | |
| 40 | 40 | <div class="px-5 py-4"> |
| 41 | 41 | {% if post.source == "django" %} |
| 42 | 42 | <a href="{% url 'fossil:forum_thread' slug=project.slug thread_uuid=post.uuid %}" |
| 43 | 43 | class="text-base font-medium text-brand-light hover:text-brand"> |
| 44 | 44 | {{ post.title|default:"(untitled)" }} |
| 45 | 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"> |
| 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 @@ | ||
| 10 | 10 | <a href="{% url 'fossil:forum' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">← Back to forum</a> |
| 11 | 11 | </div> |
| 12 | 12 | |
| 13 | 13 | <div class="space-y-3"> |
| 14 | 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 %}"> | |
| 15 | + <div class="rounded-lg bg-gray-800 border border-gray-700 shadow-sm {% if item.post.in_reply_to %}ml-8{% endif %}"> | |
| 16 | 16 | <div class="px-5 py-4"> |
| 17 | 17 | <div class="flex items-center justify-between mb-2"> |
| 18 | 18 | {% if is_django_thread %} |
| 19 | 19 | <span class="text-sm font-medium text-gray-200">{{ item.post.user|display_user }}</span> |
| 20 | 20 | {% else %} |
| @@ -40,19 +40,19 @@ | ||
| 40 | 40 | </div> |
| 41 | 41 | |
| 42 | 42 | {% if has_write and is_django_thread %} |
| 43 | 43 | <div class="mt-6"> |
| 44 | 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"> | |
| 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 | 46 | {% csrf_token %} |
| 47 | 47 | <textarea name="body" rows="6" required placeholder="Write your reply in Markdown..." |
| 48 | 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> | |
| 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 | 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"> | |
| 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 | 52 | Post Reply |
| 53 | 53 | </button> |
| 54 | 54 | </div> |
| 55 | 55 | </form> |
| 56 | 56 | </div> |
| 57 | 57 | {% endif %} |
| 58 | 58 | {% endblock %} |
| 59 | 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">← 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">← 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"> | |
| 2 | 2 | <!-- Header --> |
| 3 | 3 | <div class="px-4 py-3 border-b border-gray-700 flex items-center justify-between"> |
| 4 | 4 | <div> |
| 5 | 5 | <h3 class="text-base font-mono font-semibold text-gray-100">{{ table_name }}</h3> |
| 6 | 6 | <p class="text-xs text-gray-500 mt-0.5">{{ total|default:"0" }} row{{ total|pluralize }} · {{ columns|length }} column{{ columns|length|pluralize }}</p> |
| @@ -61,11 +61,11 @@ | ||
| 61 | 61 | {% endfor %} |
| 62 | 62 | </tr> |
| 63 | 63 | </thead> |
| 64 | 64 | <tbody class="divide-y divide-gray-700 font-mono"> |
| 65 | 65 | {% for row in rows %} |
| 66 | - <tr class="hover:bg-gray-700/50"> | |
| 66 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 67 | 67 | {% for cell in row %} |
| 68 | 68 | <td class="px-3 py-1.5 text-gray-300 whitespace-nowrap max-w-xs truncate">{{ cell|default:"NULL" }}</td> |
| 69 | 69 | {% endfor %} |
| 70 | 70 | </tr> |
| 71 | 71 | {% endfor %} |
| 72 | 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"> |
| 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 }} · {{ 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 }} · {{ 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 @@ | ||
| 1 | 1 | <div id="file-tree" class="overflow-x-auto"> |
| 2 | 2 | {% if tree %} |
| 3 | 3 | <table class="min-w-full"> |
| 4 | 4 | <tbody class="divide-y divide-gray-700"> |
| 5 | 5 | {% for entry in tree %} |
| 6 | - <tr class="hover:bg-gray-700/30"> | |
| 6 | + <tr class="hover:bg-gray-700/30 transition-colors"> | |
| 7 | 7 | <td class="px-4 py-2 whitespace-nowrap" style="width: 35%;"> |
| 8 | 8 | {% if entry.is_dir %} |
| 9 | 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 | 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 | 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 | 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"> |
| 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 @@ | ||
| 1 | 1 | <div id="ticket-table"> |
| 2 | 2 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 3 | 3 | <table class="min-w-full divide-y divide-gray-700"> |
| 4 | - <thead class="bg-gray-900"> | |
| 4 | + <thead class="bg-gray-900/80"> | |
| 5 | 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> | |
| 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 | 11 | </tr> |
| 12 | 12 | </thead> |
| 13 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 13 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 14 | 14 | {% for ticket in tickets %} |
| 15 | - <tr class="hover:bg-gray-700/50"> | |
| 15 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 16 | 16 | <td class="px-4 py-3"> |
| 17 | 17 | <a href="{% url 'fossil:ticket_detail' slug=project.slug ticket_uuid=ticket.uuid %}" |
| 18 | 18 | class="text-brand-light hover:text-brand font-medium text-sm"> |
| 19 | 19 | {{ ticket.title|default:"(untitled)" }} |
| 20 | 20 | </a> |
| 21 | 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"> |
| 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 @@ | ||
| 27 | 27 | top: 20%; border-radius: 4px 4px 0 0; |
| 28 | 28 | border-top: 2px solid; border-left: 2px solid; border-right: 2px solid; |
| 29 | 29 | border-bottom: none; height: 30%; opacity: 0.5; |
| 30 | 30 | } |
| 31 | 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); } | |
| 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 | 34 | .tl-time { width: 42px; flex-shrink: 0; text-align: right; font-size: 0.75rem; color: #6b7280; font-variant-numeric: tabular-nums; } |
| 35 | 35 | .tl-msg { flex: 1; min-width: 0; font-size: 0.8125rem; color: #e5e5e5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } |
| 36 | 36 | .tl-msg a { color: #e5e5e5; text-decoration: none; } |
| 37 | 37 | .tl-msg a:hover { color: #e8677a; } |
| 38 | 38 | .tl-meta { display: flex; align-items: center; gap: 8px; flex-shrink: 0; padding-left: 12px; flex-wrap: wrap; } |
| 39 | 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; } |
| 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 @@ | ||
| 24 | 24 | hx-indicator="closest .search-wrap" /> |
| 25 | 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 | 26 | </span> |
| 27 | 27 | {% if has_write %} |
| 28 | 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"> | |
| 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 | 30 | Create Release |
| 31 | 31 | </a> |
| 32 | 32 | {% endif %} |
| 33 | 33 | </div> |
| 34 | 34 | </div> |
| @@ -35,11 +35,11 @@ | ||
| 35 | 35 | |
| 36 | 36 | <div id="release-content"> |
| 37 | 37 | {% if releases %} |
| 38 | 38 | <div class="space-y-4"> |
| 39 | 39 | {% 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"> | |
| 41 | 41 | <div class="px-6 py-4"> |
| 42 | 42 | <div class="flex items-start justify-between gap-4"> |
| 43 | 43 | <div class="flex-1 min-w-0"> |
| 44 | 44 | <div class="flex items-center gap-3 mb-1"> |
| 45 | 45 | <a href="{% url 'fossil:release_detail' slug=project.slug tag_name=release.tag_name %}" |
| 46 | 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"> |
| 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 |
+7
-7
| --- templates/fossil/tag_list.html | ||
| +++ templates/fossil/tag_list.html | ||
| @@ -27,21 +27,21 @@ | ||
| 27 | 27 | </div> |
| 28 | 28 | |
| 29 | 29 | <div id="tag-content"> |
| 30 | 30 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 31 | 31 | <table class="min-w-full divide-y divide-gray-700"> |
| 32 | - <thead class="bg-gray-900"> | |
| 32 | + <thead class="bg-gray-900/80"> | |
| 33 | 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> | |
| 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 | 38 | </tr> |
| 39 | 39 | </thead> |
| 40 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 40 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 41 | 41 | {% for tag in tags %} |
| 42 | - <tr class="hover:bg-gray-700/50"> | |
| 42 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 43 | 43 | <td class="px-4 py-3"> |
| 44 | 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 | 45 | </td> |
| 46 | 46 | <td class="px-4 py-3"> |
| 47 | 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 | 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"> |
| 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 @@ | ||
| 8 | 8 | |
| 9 | 9 | <div class="mb-4"> |
| 10 | 10 | <a href="{% url 'fossil:tickets' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">← Back to Tickets</a> |
| 11 | 11 | </div> |
| 12 | 12 | |
| 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"> | |
| 14 | 14 | <div class="px-6 py-5 border-b border-gray-700"> |
| 15 | 15 | <div class="flex flex-wrap items-start justify-between gap-3"> |
| 16 | 16 | <div class="flex-1 min-w-0"> |
| 17 | 17 | <h2 class="text-xl font-bold text-gray-100 break-words">{{ ticket.title|default:"(untitled)" }}</h2> |
| 18 | 18 | </div> |
| 19 | 19 | <div class="flex items-center gap-2 flex-shrink-0"> |
| 20 | 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> | |
| 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 | 22 | {% endif %} |
| 23 | 23 | {% if ticket.status == "Open" %} |
| 24 | 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 | 25 | {% elif ticket.status == "Closed" or ticket.status == "Fixed" %} |
| 26 | 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 | 78 | {% if comments %} |
| 79 | 79 | <div class="mt-6"> |
| 80 | 80 | <h3 class="text-sm font-semibold text-gray-300 uppercase tracking-wider mb-3">Comments ({{ comments|length }})</h3> |
| 81 | 81 | <div class="space-y-3"> |
| 82 | 82 | {% 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"> | |
| 84 | 84 | <div class="px-5 py-3 border-b border-gray-700 flex items-center justify-between"> |
| 85 | 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 | 86 | <span class="text-xs text-gray-500">{{ c.timestamp|timesince }} ago</span> |
| 87 | 87 | </div> |
| 88 | 88 | <div class="px-5 py-4"> |
| @@ -97,17 +97,17 @@ | ||
| 97 | 97 | {% endif %} |
| 98 | 98 | |
| 99 | 99 | {% if perms.projects.change_project %} |
| 100 | 100 | <div class="mt-6"> |
| 101 | 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"> | |
| 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 | 103 | {% csrf_token %} |
| 104 | 104 | <textarea name="comment" rows="4" required placeholder="Write a comment (Markdown supported)..." |
| 105 | 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> | |
| 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 | 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> | |
| 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 | 109 | </div> |
| 110 | 110 | </form> |
| 111 | 111 | </div> |
| 112 | 112 | {% endif %} |
| 113 | 113 | {% endblock %} |
| 114 | 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">← 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">← 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 |
+12
-12
| --- templates/fossil/ticket_edit.html | ||
| +++ templates/fossil/ticket_edit.html | ||
| @@ -10,52 +10,52 @@ | ||
| 10 | 10 | </div> |
| 11 | 11 | |
| 12 | 12 | <div class="mx-auto max-w-2xl"> |
| 13 | 13 | <h2 class="text-xl font-bold text-gray-100 mb-4">Edit Ticket</h2> |
| 14 | 14 | |
| 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"> | |
| 16 | 16 | {% csrf_token %} |
| 17 | 17 | |
| 18 | 18 | <div> |
| 19 | 19 | <label class="block text-sm font-medium text-gray-300 mb-1">Title</label> |
| 20 | 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"> | |
| 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 | 22 | </div> |
| 23 | 23 | |
| 24 | 24 | <div class="grid grid-cols-2 gap-4"> |
| 25 | 25 | <div> |
| 26 | 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"> | |
| 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 | 28 | <option value="Open" {% if ticket.status == "Open" %}selected{% endif %}>Open</option> |
| 29 | 29 | <option value="Fixed" {% if ticket.status == "Fixed" %}selected{% endif %}>Fixed</option> |
| 30 | 30 | <option value="Closed" {% if ticket.status == "Closed" %}selected{% endif %}>Closed</option> |
| 31 | 31 | <option value="Review" {% if ticket.status == "Review" %}selected{% endif %}>Review</option> |
| 32 | 32 | <option value="Deferred" {% if ticket.status == "Deferred" %}selected{% endif %}>Deferred</option> |
| 33 | 33 | </select> |
| 34 | 34 | </div> |
| 35 | 35 | <div> |
| 36 | 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"> | |
| 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 | 38 | <option value="Code_Defect" {% if ticket.type == "Code_Defect" %}selected{% endif %}>Code Defect</option> |
| 39 | 39 | <option value="Feature_Request" {% if ticket.type == "Feature_Request" %}selected{% endif %}>Feature Request</option> |
| 40 | 40 | <option value="Documentation" {% if ticket.type == "Documentation" %}selected{% endif %}>Documentation</option> |
| 41 | 41 | <option value="Incident" {% if ticket.type == "Incident" %}selected{% endif %}>Incident</option> |
| 42 | 42 | </select> |
| 43 | 43 | </div> |
| 44 | 44 | <div> |
| 45 | 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"> | |
| 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 | 47 | <option value="">—</option> |
| 48 | 48 | <option value="Critical" {% if ticket.severity == "Critical" %}selected{% endif %}>Critical</option> |
| 49 | 49 | <option value="Important" {% if ticket.severity == "Important" %}selected{% endif %}>Important</option> |
| 50 | 50 | <option value="Minor" {% if ticket.severity == "Minor" %}selected{% endif %}>Minor</option> |
| 51 | 51 | <option value="Cosmetic" {% if ticket.severity == "Cosmetic" %}selected{% endif %}>Cosmetic</option> |
| 52 | 52 | </select> |
| 53 | 53 | </div> |
| 54 | 54 | <div> |
| 55 | 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"> | |
| 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 | 57 | <option value="">—</option> |
| 58 | 58 | <option value="Critical" {% if ticket.priority == "Critical" %}selected{% endif %}>Critical</option> |
| 59 | 59 | <option value="Important" {% if ticket.priority == "Important" %}selected{% endif %}>Important</option> |
| 60 | 60 | <option value="Minor" {% if ticket.priority == "Minor" %}selected{% endif %}>Minor</option> |
| 61 | 61 | <option value="Zero" {% if ticket.priority == "Zero" %}selected{% endif %}>Zero</option> |
| @@ -63,11 +63,11 @@ | ||
| 63 | 63 | </div> |
| 64 | 64 | </div> |
| 65 | 65 | |
| 66 | 66 | <div> |
| 67 | 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"> | |
| 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 | 69 | <option value="">—</option> |
| 70 | 70 | <option value="Fixed" {% if ticket.resolution == "Fixed" %}selected{% endif %}>Fixed</option> |
| 71 | 71 | <option value="Rejected" {% if ticket.resolution == "Rejected" %}selected{% endif %}>Rejected</option> |
| 72 | 72 | <option value="Overcome_By_Events" {% if ticket.resolution == "Overcome_By_Events" %}selected{% endif %}>Overcome By Events</option> |
| 73 | 73 | <option value="Works_As_Designed" {% if ticket.resolution == "Works_As_Designed" %}selected{% endif %}>Works As Designed</option> |
| @@ -88,17 +88,17 @@ | ||
| 88 | 88 | {% if cf.is_required %}<span class="text-red-400">*</span>{% endif %} |
| 89 | 89 | </label> |
| 90 | 90 | {% if cf.field_type == "text" or cf.field_type == "url" or cf.field_type == "date" %} |
| 91 | 91 | <input type="{% if cf.field_type == "url" %}url{% elif cf.field_type == "date" %}date{% else %}text{% endif %}" |
| 92 | 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"> | |
| 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 | 94 | {% elif cf.field_type == "textarea" %} |
| 95 | 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> | |
| 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 | 97 | {% elif cf.field_type == "select" %} |
| 98 | 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"> | |
| 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 | 100 | <option value="">--</option> |
| 101 | 101 | {% for choice in cf.choices_list %} |
| 102 | 102 | <option value="{{ choice }}">{{ choice }}</option> |
| 103 | 103 | {% endfor %} |
| 104 | 104 | </select> |
| @@ -115,15 +115,15 @@ | ||
| 115 | 115 | </div> |
| 116 | 116 | {% endif %} |
| 117 | 117 | |
| 118 | 118 | <div class="flex justify-end gap-3 pt-2"> |
| 119 | 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"> | |
| 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 | 121 | Cancel |
| 122 | 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"> | |
| 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 | 124 | Save Changes |
| 125 | 125 | </button> |
| 126 | 126 | </div> |
| 127 | 127 | </form> |
| 128 | 128 | </div> |
| 129 | 129 | {% endblock %} |
| 130 | 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 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 |
+11
-11
| --- templates/fossil/ticket_form.html | ||
| +++ templates/fossil/ticket_form.html | ||
| @@ -10,33 +10,33 @@ | ||
| 10 | 10 | </div> |
| 11 | 11 | |
| 12 | 12 | <div class="mx-auto max-w-2xl"> |
| 13 | 13 | <h2 class="text-xl font-bold text-gray-100 mb-4">{{ title }}</h2> |
| 14 | 14 | |
| 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"> | |
| 16 | 16 | {% csrf_token %} |
| 17 | 17 | |
| 18 | 18 | <div> |
| 19 | 19 | <label class="block text-sm font-medium text-gray-300 mb-1">Title <span class="text-red-400">*</span></label> |
| 20 | 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"> | |
| 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 | 22 | </div> |
| 23 | 23 | |
| 24 | 24 | <div class="grid grid-cols-1 sm:grid-cols-2 gap-4"> |
| 25 | 25 | <div> |
| 26 | 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"> | |
| 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 | 28 | <option value="Code_Defect">Code Defect</option> |
| 29 | 29 | <option value="Feature_Request">Feature Request</option> |
| 30 | 30 | <option value="Documentation">Documentation</option> |
| 31 | 31 | <option value="Incident">Incident</option> |
| 32 | 32 | </select> |
| 33 | 33 | </div> |
| 34 | 34 | <div> |
| 35 | 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> | |
| 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 | 38 | <option value="Critical">Critical</option> |
| 39 | 39 | <option value="Important">Important</option> |
| 40 | 40 | <option value="Minor">Minor</option> |
| 41 | 41 | <option value="Cosmetic">Cosmetic</option> |
| 42 | 42 | </select> |
| @@ -44,11 +44,11 @@ | ||
| 44 | 44 | </div> |
| 45 | 45 | |
| 46 | 46 | <div> |
| 47 | 47 | <label class="block text-sm font-medium text-gray-300 mb-1">Description</label> |
| 48 | 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> | |
| 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 | 50 | </div> |
| 51 | 51 | |
| 52 | 52 | {% if custom_fields %} |
| 53 | 53 | <div class="border-t border-gray-700 pt-4 mt-4"> |
| 54 | 54 | <h3 class="text-sm font-semibold text-gray-300 mb-3">Custom Fields</h3> |
| @@ -60,17 +60,17 @@ | ||
| 60 | 60 | {% if cf.is_required %}<span class="text-red-400">*</span>{% endif %} |
| 61 | 61 | </label> |
| 62 | 62 | {% if cf.field_type == "text" or cf.field_type == "url" or cf.field_type == "date" %} |
| 63 | 63 | <input type="{% if cf.field_type == "url" %}url{% elif cf.field_type == "date" %}date{% else %}text{% endif %}" |
| 64 | 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"> | |
| 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 | 66 | {% elif cf.field_type == "textarea" %} |
| 67 | 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> | |
| 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 | 69 | {% elif cf.field_type == "select" %} |
| 70 | 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"> | |
| 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 | 72 | <option value="">--</option> |
| 73 | 73 | {% for choice in cf.choices_list %} |
| 74 | 74 | <option value="{{ choice }}">{{ choice }}</option> |
| 75 | 75 | {% endfor %} |
| 76 | 76 | </select> |
| @@ -87,15 +87,15 @@ | ||
| 87 | 87 | </div> |
| 88 | 88 | {% endif %} |
| 89 | 89 | |
| 90 | 90 | <div class="flex justify-end gap-3 pt-2"> |
| 91 | 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"> | |
| 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 | 93 | Cancel |
| 94 | 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"> | |
| 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 | 96 | Create Ticket |
| 97 | 97 | </button> |
| 98 | 98 | </div> |
| 99 | 99 | </form> |
| 100 | 100 | </div> |
| 101 | 101 | {% endblock %} |
| 102 | 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 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 @@ | ||
| 18 | 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 | 19 | </div> |
| 20 | 20 | <div class="flex flex-wrap items-center gap-3"> |
| 21 | 21 | <a href="{% url 'fossil:tickets_csv' slug=project.slug %}" class="text-xs text-gray-500 hover:text-brand-light">Export CSV</a> |
| 22 | 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> | |
| 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 | 24 | {% endif %} |
| 25 | 25 | <span class="search-wrap"> |
| 26 | 26 | <input type="search" |
| 27 | 27 | name="search" |
| 28 | 28 | value="{{ search }}" |
| @@ -54,15 +54,15 @@ | ||
| 54 | 54 | </div> |
| 55 | 55 | </div> |
| 56 | 56 | <div class="flex items-center gap-2"> |
| 57 | 57 | {% if has_prev %} |
| 58 | 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">←</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">←</a> | |
| 60 | 60 | {% endif %} |
| 61 | 61 | <span class="text-gray-500">{{ page }} / {{ total_pages }}</span> |
| 62 | 62 | {% if has_next %} |
| 63 | 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">→</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">→</a> | |
| 65 | 65 | {% endif %} |
| 66 | 66 | </div> |
| 67 | 67 | </div> |
| 68 | 68 | {% endblock %} |
| 69 | 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">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">←</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">→</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">←</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">→</a> |
| 65 | {% endif %} |
| 66 | </div> |
| 67 | </div> |
| 68 | {% endblock %} |
| 69 |
| --- templates/fossil/unversioned_list.html | ||
| +++ templates/fossil/unversioned_list.html | ||
| @@ -26,23 +26,23 @@ | ||
| 26 | 26 | </div> |
| 27 | 27 | </div> |
| 28 | 28 | |
| 29 | 29 | <div id="unversioned-content"> |
| 30 | 30 | {% 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"> | |
| 32 | 32 | <table class="min-w-full divide-y divide-gray-700"> |
| 33 | - <thead class="bg-gray-900"> | |
| 33 | + <thead class="bg-gray-900/80"> | |
| 34 | 34 | <tr> |
| 35 | 35 | <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Name</th> |
| 36 | 36 | <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Size</th> |
| 37 | 37 | <th class="px-6 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Modified</th> |
| 38 | 38 | <th class="px-6 py-3 text-right text-xs font-medium text-gray-400 uppercase tracking-wider"></th> |
| 39 | 39 | </tr> |
| 40 | 40 | </thead> |
| 41 | - <tbody class="divide-y divide-gray-700"> | |
| 41 | + <tbody class="divide-y divide-gray-700/70"> | |
| 42 | 42 | {% for file in files %} |
| 43 | - <tr class="hover:bg-gray-700/30"> | |
| 43 | + <tr class="hover:bg-gray-700/30 transition-colors"> | |
| 44 | 44 | <td class="px-6 py-3 text-sm text-gray-200 font-mono">{{ file.name }}</td> |
| 45 | 45 | <td class="px-6 py-3 text-sm text-gray-400">{{ file.size|filesizeformat }}</td> |
| 46 | 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 | 47 | <td class="px-6 py-3 text-right"> |
| 48 | 48 | <a href="{% url 'fossil:unversioned_download' slug=project.slug filename=file.name %}" |
| @@ -66,21 +66,21 @@ | ||
| 66 | 66 | {% if has_admin %} |
| 67 | 67 | <div class="mt-6"> |
| 68 | 68 | <form method="post" |
| 69 | 69 | action="{% url 'fossil:unversioned_upload' slug=project.slug %}" |
| 70 | 70 | 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"> | |
| 72 | 72 | {% csrf_token %} |
| 73 | 73 | <h4 class="text-sm font-medium text-gray-300 mb-3">Upload File</h4> |
| 74 | 74 | <div class="flex items-center gap-3"> |
| 75 | 75 | <input type="file" name="file" required |
| 76 | 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 | 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"> | |
| 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 | 79 | Upload |
| 80 | 80 | </button> |
| 81 | 81 | </div> |
| 82 | 82 | <p class="mt-2 text-xs text-gray-500">Unversioned files do not preserve history. Only the latest version is kept.</p> |
| 83 | 83 | </form> |
| 84 | 84 | </div> |
| 85 | 85 | {% endif %} |
| 86 | 86 | {% endblock %} |
| 87 | 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 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 |
+5
-5
| --- templates/fossil/wiki_form.html | ||
| +++ templates/fossil/wiki_form.html | ||
| @@ -20,25 +20,25 @@ | ||
| 20 | 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 | 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 | 22 | </div> |
| 23 | 23 | </div> |
| 24 | 24 | |
| 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"> | |
| 26 | 26 | {% csrf_token %} |
| 27 | 27 | |
| 28 | 28 | {% if not page %} |
| 29 | 29 | <div> |
| 30 | 30 | <label class="block text-sm font-medium text-gray-300 mb-1">Page Name <span class="text-red-400">*</span></label> |
| 31 | 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"> | |
| 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 | 33 | </div> |
| 34 | 34 | {% endif %} |
| 35 | 35 | |
| 36 | 36 | <div x-show="tab === 'write'"> |
| 37 | 37 | <label class="block text-sm font-medium text-gray-300 mb-1">Content (Markdown)</label> |
| 38 | 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> | |
| 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 | 40 | </div> |
| 41 | 41 | |
| 42 | 42 | <div x-show="tab === 'preview'" style="display:none"> |
| 43 | 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 | 44 | <p class="text-gray-500 italic">Click Preview to render...</p> |
| @@ -45,15 +45,15 @@ | ||
| 45 | 45 | </div> |
| 46 | 46 | </div> |
| 47 | 47 | |
| 48 | 48 | <div class="flex justify-end gap-3 pt-2"> |
| 49 | 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"> | |
| 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 | 51 | Cancel |
| 52 | 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"> | |
| 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 | 54 | {% if page %}Update{% else %}Create{% endif %} |
| 55 | 55 | </button> |
| 56 | 56 | </div> |
| 57 | 57 | </form> |
| 58 | 58 | </div> |
| 59 | 59 | {% endblock %} |
| 60 | 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 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 |
+2
-2
| --- templates/fossil/wiki_list.html | ||
| +++ templates/fossil/wiki_list.html | ||
| @@ -22,20 +22,20 @@ | ||
| 22 | 22 | hx-indicator="closest .search-wrap" /> |
| 23 | 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 | 24 | </span> |
| 25 | 25 | </div> |
| 26 | 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> | |
| 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 | 28 | {% endif %} |
| 29 | 29 | </div> |
| 30 | 30 | |
| 31 | 31 | <div id="wiki-content"> |
| 32 | 32 | <div class="flex gap-6"> |
| 33 | 33 | <!-- Main content: home page or page index --> |
| 34 | 34 | <div class="flex-1 min-w-0"> |
| 35 | 35 | {% 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"> | |
| 37 | 37 | <div class="px-6 py-4 border-b border-gray-700"> |
| 38 | 38 | <h2 class="text-lg font-semibold text-gray-100">{{ home_page.name }}</h2> |
| 39 | 39 | </div> |
| 40 | 40 | <div class="px-6 py-6"> |
| 41 | 41 | <div class="prose prose-invert prose-gray max-w-none"> |
| 42 | 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">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 |
+2
-2
| --- templates/fossil/wiki_page.html | ||
| +++ templates/fossil/wiki_page.html | ||
| @@ -7,17 +7,17 @@ | ||
| 7 | 7 | {% include "fossil/_project_nav.html" %} |
| 8 | 8 | |
| 9 | 9 | <div class="flex gap-6"> |
| 10 | 10 | <!-- Main wiki content --> |
| 11 | 11 | <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"> | |
| 13 | 13 | <div class="px-6 py-4 border-b border-gray-700 flex items-center justify-between"> |
| 14 | 14 | <h2 class="text-lg font-semibold text-gray-100">{{ page.name }}</h2> |
| 15 | 15 | <div class="flex items-center gap-3"> |
| 16 | 16 | <span class="text-xs text-gray-500">{{ page.last_modified|timesince }} ago by {{ page.user|display_user }}</span> |
| 17 | 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> | |
| 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 | 19 | {% endif %} |
| 20 | 20 | </div> |
| 21 | 21 | </div> |
| 22 | 22 | <div class="px-6 py-6"> |
| 23 | 23 | <div class="prose prose-invert prose-gray max-w-none"> |
| 24 | 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 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 @@ | ||
| 16 | 16 | {% endif %} |
| 17 | 17 | </div> |
| 18 | 18 | <div class="flex gap-1"> |
| 19 | 19 | {% if page_obj.has_previous %} |
| 20 | 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> | |
| 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 | 22 | {% endif %} |
| 23 | 23 | {% if page_obj.has_next %} |
| 24 | 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> | |
| 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 | 26 | {% endif %} |
| 27 | 27 | </div> |
| 28 | 28 | </nav> |
| 29 | 29 | {% endif %} |
| 30 | 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">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 @@ | ||
| 16 | 16 | {% endif %} |
| 17 | 17 | </div> |
| 18 | 18 | <div class="flex gap-1"> |
| 19 | 19 | {% if pagination.has_previous %} |
| 20 | 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> | |
| 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 | 22 | {% endif %} |
| 23 | 23 | {% if pagination.has_next %} |
| 24 | 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> | |
| 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 | 26 | {% endif %} |
| 27 | 27 | </div> |
| 28 | 28 | </nav> |
| 29 | 29 | {% endif %} |
| 30 | 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">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 @@ | ||
| 1 | 1 | <div id="member-table"> |
| 2 | 2 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 3 | 3 | <table class="min-w-full divide-y divide-gray-700"> |
| 4 | - <thead class="bg-gray-900"> | |
| 4 | + <thead class="bg-gray-900/80"> | |
| 5 | 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> | |
| 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 | 12 | </tr> |
| 13 | 13 | </thead> |
| 14 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 14 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 15 | 15 | {% for membership in members %} |
| 16 | - <tr class="hover:bg-gray-700/50"> | |
| 16 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 17 | 17 | <td class="px-6 py-4 whitespace-nowrap text-sm font-medium"> |
| 18 | 18 | <a href="{% url 'organization:user_detail' username=membership.member.username %}" class="text-brand-light hover:text-brand">{{ membership.member.username }}</a> |
| 19 | 19 | </td> |
| 20 | 20 | <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400">{{ membership.member.email|default:"—" }}</td> |
| 21 | 21 | <td class="px-6 py-4 whitespace-nowrap text-sm"> |
| 22 | 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"> |
| 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 @@ | ||
| 1 | 1 | <div id="team-member-table"> |
| 2 | 2 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 3 | 3 | <table class="min-w-full divide-y divide-gray-700"> |
| 4 | - <thead class="bg-gray-900"> | |
| 4 | + <thead class="bg-gray-900/80"> | |
| 5 | 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> | |
| 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 | 9 | </tr> |
| 10 | 10 | </thead> |
| 11 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 11 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 12 | 12 | {% for member in team_members %} |
| 13 | - <tr class="hover:bg-gray-700/50"> | |
| 13 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 14 | 14 | <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-100">{{ member.username }}</td> |
| 15 | 15 | <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-400">{{ member.email|default:"—" }}</td> |
| 16 | 16 | <td class="px-6 py-4 whitespace-nowrap text-right text-sm"> |
| 17 | 17 | {% if perms.organization.change_team %} |
| 18 | 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 | 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"> |
| 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 @@ | ||
| 1 | 1 | <div id="team-table"> |
| 2 | 2 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 3 | 3 | <table class="min-w-full divide-y divide-gray-700"> |
| 4 | - <thead class="bg-gray-900"> | |
| 4 | + <thead class="bg-gray-900/80"> | |
| 5 | 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> | |
| 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 | 10 | </tr> |
| 11 | 11 | </thead> |
| 12 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 12 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 13 | 13 | {% for team in teams %} |
| 14 | - <tr class="hover:bg-gray-700/50"> | |
| 14 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 15 | 15 | <td class="px-6 py-4 whitespace-nowrap"> |
| 16 | 16 | <a href="{% url 'organization:team_detail' slug=team.slug %}" class="text-brand-light hover:text-brand font-medium"> |
| 17 | 17 | {{ team.name }} |
| 18 | 18 | </a> |
| 19 | 19 | </td> |
| 20 | 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"> |
| 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 @@ | ||
| 1 | 1 | <div id="page-table"> |
| 2 | 2 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 3 | 3 | <table class="min-w-full divide-y divide-gray-700"> |
| 4 | - <thead class="bg-gray-900"> | |
| 4 | + <thead class="bg-gray-900/80"> | |
| 5 | 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> | |
| 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 | 10 | </tr> |
| 11 | 11 | </thead> |
| 12 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 12 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 13 | 13 | {% for page in pages %} |
| 14 | - <tr class="hover:bg-gray-700/50"> | |
| 14 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 15 | 15 | <td class="px-6 py-4 whitespace-nowrap"> |
| 16 | 16 | <a href="{% url 'pages:detail' slug=page.slug %}" class="text-brand-light hover:text-brand font-medium"> |
| 17 | 17 | {{ page.name }} |
| 18 | 18 | </a> |
| 19 | 19 | </td> |
| 20 | 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"> |
| 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 @@ | ||
| 1 | 1 | <div id="group-table"> |
| 2 | 2 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 3 | 3 | <table class="min-w-full divide-y divide-gray-700"> |
| 4 | - <thead class="bg-gray-900"> | |
| 4 | + <thead class="bg-gray-900/80"> | |
| 5 | 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> | |
| 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 | 11 | </tr> |
| 12 | 12 | </thead> |
| 13 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 13 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 14 | 14 | {% for group in groups %} |
| 15 | - <tr class="hover:bg-gray-700/50"> | |
| 15 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 16 | 16 | <td class="px-6 py-4 whitespace-nowrap"> |
| 17 | 17 | <a href="{% url 'projects:group_detail' slug=group.slug %}" class="text-brand-light hover:text-brand font-medium"> |
| 18 | 18 | {{ group.name }} |
| 19 | 19 | </a> |
| 20 | 20 | </td> |
| 21 | 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"> |
| 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 @@ | ||
| 1 | 1 | <div id="project-table"> |
| 2 | 2 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 3 | 3 | <table class="min-w-full divide-y divide-gray-700"> |
| 4 | - <thead class="bg-gray-900"> | |
| 4 | + <thead class="bg-gray-900/80"> | |
| 5 | 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> | |
| 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 | 11 | </tr> |
| 12 | 12 | </thead> |
| 13 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 13 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 14 | 14 | {% for project in projects %} |
| 15 | - <tr class="hover:bg-gray-700/50"> | |
| 15 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 16 | 16 | <td class="px-6 py-4 whitespace-nowrap"> |
| 17 | 17 | <a href="{% url 'projects:detail' slug=project.slug %}" class="text-brand-light hover:text-brand font-medium"> |
| 18 | 18 | {{ project.name }} |
| 19 | 19 | </a> |
| 20 | 20 | </td> |
| 21 | 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"> |
| 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 @@ | ||
| 1 | 1 | <div id="project-team-table"> |
| 2 | 2 | <div class="overflow-x-auto rounded-lg border border-gray-700 bg-gray-800 shadow-sm"> |
| 3 | 3 | <table class="min-w-full divide-y divide-gray-700"> |
| 4 | - <thead class="bg-gray-900"> | |
| 4 | + <thead class="bg-gray-900/80"> | |
| 5 | 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> | |
| 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 | 9 | </tr> |
| 10 | 10 | </thead> |
| 11 | - <tbody class="divide-y divide-gray-700 bg-gray-800"> | |
| 11 | + <tbody class="divide-y divide-gray-700/70 bg-gray-800"> | |
| 12 | 12 | {% for pt in project_teams %} |
| 13 | - <tr class="hover:bg-gray-700/50"> | |
| 13 | + <tr class="hover:bg-gray-700/40 transition-colors"> | |
| 14 | 14 | <td class="px-6 py-4 whitespace-nowrap"> |
| 15 | 15 | <a href="{% url 'organization:team_detail' slug=pt.team.slug %}" class="text-brand-light hover:text-brand font-medium"> |
| 16 | 16 | {{ pt.team.name }} |
| 17 | 17 | </a> |
| 18 | 18 | </td> |
| 19 | 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"> |
| 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 @@ | ||
| 7 | 7 | </div> |
| 8 | 8 | |
| 9 | 9 | <div class="mx-auto max-w-2xl"> |
| 10 | 10 | <h1 class="text-2xl font-bold text-gray-100 mb-6">{{ title }}</h1> |
| 11 | 11 | |
| 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"> | |
| 13 | 13 | {% csrf_token %} |
| 14 | 14 | |
| 15 | 15 | {% for field in form %} |
| 16 | 16 | {% if field.name == "repo_source" or field.name == "clone_url" %} |
| 17 | 17 | {# Rendered manually below #} |
| @@ -64,16 +64,16 @@ | ||
| 64 | 64 | </div> |
| 65 | 65 | {% endif %} |
| 66 | 66 | |
| 67 | 67 | <div class="flex justify-end gap-3 pt-4"> |
| 68 | 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"> | |
| 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 | 70 | Cancel |
| 71 | 71 | </a> |
| 72 | 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"> | |
| 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 | 74 | {% if project %}Update{% else %}Create{% endif %} |
| 75 | 75 | </button> |
| 76 | 76 | </div> |
| 77 | 77 | </form> |
| 78 | 78 | </div> |
| 79 | 79 | {% endblock %} |
| 80 | 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 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 @@ | ||
| 4 | 4 | {% block content %} |
| 5 | 5 | <div class="flex flex-wrap items-center justify-between gap-4 mb-6"> |
| 6 | 6 | <h1 class="text-2xl font-bold text-gray-100">Projects</h1> |
| 7 | 7 | {% if perms.projects.add_project %} |
| 8 | 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"> | |
| 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 | 10 | New Project |
| 11 | 11 | </a> |
| 12 | 12 | {% endif %} |
| 13 | 13 | </div> |
| 14 | 14 | |
| 15 | 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"> |
| 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 |