code.pablomurad.com

Private-Trackers-Spreadsheet

Sortable, searchable table of private BitTorrent tracker stats

update: add data color coding back
author
HDVinnie
date
commit
0f3a701294fe4e40677e7aeff42af72cda48836b
parent
93cbe733f045fbf560c5abf476799118013aead6
changes
2 files +392 −32
@@ -22,6 +22,7 @@ --gradient-gray: linear-gradient(135deg, rgba(149, 165, 166, 0.1) 0%, rgba(149, 165, 166, 0.05) 100%);   --gradient-header: linear-gradient(135deg, rgba(231, 76, 60, 0.1) 0%, rgba(231, 76, 60, 0.05) 100%);
   --scrollbar-track: rgba(255, 255, 255, 0.05);
   --scrollbar-thumb: rgba(231, 76, 60, 0.3);
+  --text-glow: 0 0 10px rgba(231, 76, 60, 0.5);
 }
 
 :root[data-theme="light"] {
@@ -47,6 +48,7 @@ --gradient-gray: linear-gradient(135deg, rgba(108, 117, 125, 0.1) 0%, rgba(108, 117, 125, 0.05) 100%);   --gradient-header: linear-gradient(135deg, rgba(220, 53, 69, 0.1) 0%, rgba(220, 53, 69, 0.05) 100%);
   --scrollbar-track: rgba(0, 0, 0, 0.05);
   --scrollbar-thumb: rgba(220, 53, 69, 0.3);
+  --text-glow: 0 0 10px rgba(220, 53, 69, 0.5);
 }
 
 * {
@@ -448,11 +450,337 @@ font-weight: 600;   color: var(--text-primary);
 }
 
-.tracker-jackett__cell--description {
-  max-width: 300px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
+/* Yes/No value styling */
+.tracker-table__cell--yes {
+  position: relative;
+}
+
+.tracker-table__cell--yes::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  background-color: rgba(46, 204, 113, 0.1);
+  color: #2ecc71;
+  border: 1px solid #2ecc71;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--no {
+  position: relative;
+}
+
+.tracker-table__cell--no::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  background-color: rgba(231, 76, 60, 0.1);
+  color: #e74c3c;
+  border: 1px solid #e74c3c;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+/* Difficulty level styling */
+.tracker-table__cell--easy {
+  position: relative;
+}
+
+.tracker-table__cell--easy::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  background-color: rgba(46, 204, 113, 0.1);
+  color: #2ecc71;
+  border: 1px solid #2ecc71;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 50px;
+}
+
+.tracker-table__cell--moderate {
+  position: relative;
+}
+
+.tracker-table__cell--moderate::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  background-color: rgba(255, 193, 7, 0.1);
+  color: #ffc107;
+  border: 1px solid #ffc107;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 50px;
+}
+
+.tracker-table__cell--tough {
+  position: relative;
+}
+
+.tracker-table__cell--tough::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  background-color: rgba(231, 76, 60, 0.1);
+  color: #e74c3c;
+  border: 1px solid #e74c3c;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 50px;
+}
+
+/* Mozilla Observatory Grade styling */
+.tracker-table__cell--grade-a-plus {
+  position: relative;
+}
+
+.tracker-table__cell--grade-a-plus::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #22c55e;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-a {
+  position: relative;
+}
+
+.tracker-table__cell--grade-a::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #2ecc71;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-a-minus {
+  position: relative;
+}
+
+.tracker-table__cell--grade-a-minus::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #65a30d;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-b-plus {
+  position: relative;
+}
+
+.tracker-table__cell--grade-b-plus::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #84cc16;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-b {
+  position: relative;
+}
+
+.tracker-table__cell--grade-b::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #a3e635;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-b-minus {
+  position: relative;
+}
+
+.tracker-table__cell--grade-b-minus::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #ffc107;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-c-plus {
+  position: relative;
+}
+
+.tracker-table__cell--grade-c-plus::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #fb923c;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-c {
+  position: relative;
+}
+
+.tracker-table__cell--grade-c::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #f97316;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-c-minus {
+  position: relative;
+}
+
+.tracker-table__cell--grade-c-minus::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #ea580c;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-d-plus {
+  position: relative;
+}
+
+.tracker-table__cell--grade-d-plus::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #ef4444;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-d {
+  position: relative;
+}
+
+.tracker-table__cell--grade-d::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #dc2626;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-d-minus {
+  position: relative;
+}
+
+.tracker-table__cell--grade-d-minus::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #b91c1c;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+.tracker-table__cell--grade-f {
+  position: relative;
+}
+
+.tracker-table__cell--grade-f::after {
+  content: attr(data-value);
+  display: inline-block;
+  padding: 1px;
+  color: #991b1b;
+  border-radius: 5px;
+  font-weight: 600;
+  font-size: 0.8rem;
+  text-align: center;
+  min-width: 40px;
+}
+
+/* Light theme adjustments for yes/no values */
+:root[data-theme="light"] .tracker-table__cell--yes::after {
+  background-color: rgba(39, 174, 96, 0.08);
+  color: #27ae60;
+  border-color: #27ae60;
+}
+
+:root[data-theme="light"] .tracker-table__cell--no::after {
+  background-color: rgba(220, 53, 69, 0.08);
+  color: #dc3545;
+  border-color: #dc3545;
+}
+
+/* Light theme adjustments for difficulty levels */
+:root[data-theme="light"] .tracker-table__cell--easy::after {
+  background-color: rgba(39, 174, 96, 0.08);
+  color: #27ae60;
+  border-color: #27ae60;
+}
+
+:root[data-theme="light"] .tracker-table__cell--moderate::after {
+  background-color: rgba(255, 193, 7, 0.1);
+  color: #e6ac00;
+  border-color: #e6ac00;
+}
+
+:root[data-theme="light"] .tracker-table__cell--tough::after {
+  background-color: rgba(220, 53, 69, 0.08);
+  color: #dc3545;
+  border-color: #dc3545;
 }
 
 /* Jackett Section */
@@ -232,34 +232,19 @@ @mouseleave="hideTooltip()"                             class="tracker-table__sortable">
                             Points <span class="icon icon-sort"></span>
                         </th>
-                        <th @click="sortBy('Hit & Run')"
-                            @mouseenter="showTooltip($event, 'Whether the tracker enforces hit and run rules (must seed for minimum time/ratio)')"
-                            @mouseleave="hideTooltip()"
-                            class="tracker-table__sortable">
+                        <th @click="sortBy('Hit & Run')" class="tracker-table__sortable">
                             H&R <span class="icon icon-sort"></span>
                         </th>
-                        <th @click="sortBy('Birthdate')"
-                            @mouseenter="showTooltip($event, 'Year the tracker was founded or launched')"
-                            @mouseleave="hideTooltip()"
-                            class="tracker-table__sortable">
+                        <th @click="sortBy('Birthdate')" class="tracker-table__sortable">
                             B-Day <span class="icon icon-sort"></span>
                         </th>
-                        <th @click="sortBy('Join')"
-                            @mouseenter="showTooltip($event, 'How users can join the tracker (Invite, Application, Open, etc.)')"
-                            @mouseleave="hideTooltip()"
-                            class="tracker-table__sortable">
+                        <th @click="sortBy('Join')" class="tracker-table__sortable">
                             Join <span class="icon icon-sort"></span>
                         </th>
-                        <th @click="sortBy('Join Diff')"
-                            @mouseenter="showTooltip($event, 'How difficult it is to join the tracker (Easy, Moderate, Tough)')"
-                            @mouseleave="hideTooltip()"
-                            class="tracker-table__sortable">
+                        <th @click="sortBy('Join Diff')" class="tracker-table__sortable">
                             Join Diff <span class="icon icon-sort"></span>
                         </th>
-                        <th @click="sortBy('Updated')"
-                            @mouseenter="showTooltip($event, 'Date when the tracker\'s information was last updated in this database')"
-                            @mouseleave="hideTooltip()"
-                            class="tracker-table__sortable">
+                        <th @click="sortBy('Updated')" class="tracker-table__sortable">
                             Updated <span class="icon icon-sort"></span>
                         </th>
                     </tr>
@@ -271,18 +256,65 @@ <td class="tracker-table__cell tracker-table__cell--name" x-text="tracker.Name"></td>                             <td class="tracker-table__cell" x-text="tracker.Abbreviation"></td>
                             <td class="tracker-table__cell" x-text="tracker.Type"></td>
                             <td class="tracker-table__cell" x-text="tracker.Codebase"></td>
-                            <td class="tracker-table__cell" x-text="tracker['Observatory Grade']"></td>
+                            <td class="tracker-table__cell"
+                                :class="tracker['Observatory Grade'] === 'A+' || tracker['Observatory Grade'] === 'A +' ? 'tracker-table__cell--grade-a-plus' :
+                                        tracker['Observatory Grade'] === 'A' ? 'tracker-table__cell--grade-a' :
+                                        tracker['Observatory Grade'] === 'A-' || tracker['Observatory Grade'] === 'A -' ? 'tracker-table__cell--grade-a-minus' :
+                                        tracker['Observatory Grade'] === 'B+' || tracker['Observatory Grade'] === 'B +' ? 'tracker-table__cell--grade-b-plus' :
+                                        tracker['Observatory Grade'] === 'B' ? 'tracker-table__cell--grade-b' :
+                                        tracker['Observatory Grade'] === 'B-' || tracker['Observatory Grade'] === 'B -' ? 'tracker-table__cell--grade-b-minus' :
+                                        tracker['Observatory Grade'] === 'C+' || tracker['Observatory Grade'] === 'C +' ? 'tracker-table__cell--grade-c-plus' :
+                                        tracker['Observatory Grade'] === 'C' ? 'tracker-table__cell--grade-c' :
+                                        tracker['Observatory Grade'] === 'C-' || tracker['Observatory Grade'] === 'C -' ? 'tracker-table__cell--grade-c-minus' :
+                                        tracker['Observatory Grade'] === 'D+' || tracker['Observatory Grade'] === 'D +' ? 'tracker-table__cell--grade-d-plus' :
+                                        tracker['Observatory Grade'] === 'D' ? 'tracker-table__cell--grade-d' :
+                                        tracker['Observatory Grade'] === 'D-' || tracker['Observatory Grade'] === 'D -' ? 'tracker-table__cell--grade-d-minus' :
+                                        tracker['Observatory Grade'] === 'F' ? 'tracker-table__cell--grade-f' : ''"
+                                :data-value="tracker['Observatory Grade']"
+                                :style="(tracker['Observatory Grade'] && tracker['Observatory Grade'] !== '-' && tracker['Observatory Grade'].trim() !== '') ? 'color: transparent;' : ''">
+                                <span x-show="!tracker['Observatory Grade'] || tracker['Observatory Grade'] === '-' || tracker['Observatory Grade'].trim() === ''" x-text="tracker['Observatory Grade']"></span>
+                            </td>
                             <td class="tracker-table__cell" x-text="tracker.Users"></td>
                             <td class="tracker-table__cell" x-text="tracker.Torrents"></td>
                             <td class="tracker-table__cell" x-text="tracker.Peers"></td>
-                            <td class="tracker-table__cell" x-text="tracker.Ratio"></td>
-                            <td class="tracker-table__cell" x-text="tracker['Ratio Diff']"></td>
-                            <td class="tracker-table__cell" x-text="tracker.Freeleech"></td>
-                            <td class="tracker-table__cell" x-text="tracker.Points"></td>
-                            <td class="tracker-table__cell" x-text="tracker['Hit & Run']"></td>
+                            <td class="tracker-table__cell"
+                                :class="tracker.Ratio === 'Yes' ? 'tracker-table__cell--yes' : tracker.Ratio === 'No' ? 'tracker-table__cell--no' : ''"
+                                :data-value="tracker.Ratio"
+                                :style="(tracker.Ratio === 'Yes' || tracker.Ratio === 'No') ? 'color: transparent;' : ''">
+                                <span x-show="tracker.Ratio !== 'Yes' && tracker.Ratio !== 'No'" x-text="tracker.Ratio"></span>
+                            </td>
+                            <td class="tracker-table__cell"
+                                :class="tracker['Ratio Diff'] === 'Easy' ? 'tracker-table__cell--easy' : tracker['Ratio Diff'] === 'Moderate' ? 'tracker-table__cell--moderate' : tracker['Ratio Diff'] === 'Tough' ? 'tracker-table__cell--tough' : ''"
+                                :data-value="tracker['Ratio Diff']"
+                                :style="(tracker['Ratio Diff'] === 'Easy' || tracker['Ratio Diff'] === 'Moderate' || tracker['Ratio Diff'] === 'Tough') ? 'color: transparent;' : ''">
+                                <span x-show="tracker['Ratio Diff'] !== 'Easy' && tracker['Ratio Diff'] !== 'Moderate' && tracker['Ratio Diff'] !== 'Tough'" x-text="tracker['Ratio Diff']"></span>
+                            </td>
+                            <td class="tracker-table__cell"
+                                :class="tracker.Freeleech === 'Yes' ? 'tracker-table__cell--yes' : tracker.Freeleech === 'No' ? 'tracker-table__cell--no' : ''"
+                                :data-value="tracker.Freeleech"
+                                :style="(tracker.Freeleech === 'Yes' || tracker.Freeleech === 'No') ? 'color: transparent;' : ''">
+                                <span x-show="tracker.Freeleech !== 'Yes' && tracker.Freeleech !== 'No'" x-text="tracker.Freeleech"></span>
+                            </td>
+                            <td class="tracker-table__cell"
+                                :class="tracker.Points === 'Yes' ? 'tracker-table__cell--yes' : tracker.Points === 'No' ? 'tracker-table__cell--no' : ''"
+                                :data-value="tracker.Points"
+                                :style="(tracker.Points === 'Yes' || tracker.Points === 'No') ? 'color: transparent;' : ''">
+                                <span x-show="tracker.Points !== 'Yes' && tracker.Points !== 'No'" x-text="tracker.Points"></span>
+                            </td>
+                            <td class="tracker-table__cell"
+                                :class="tracker['Hit & Run'] === 'Yes' ? 'tracker-table__cell--yes' : tracker['Hit & Run'] === 'No' ? 'tracker-table__cell--no' : ''"
+                                :data-value="tracker['Hit & Run']"
+                                :style="(tracker['Hit & Run'] === 'Yes' || tracker['Hit & Run'] === 'No') ? 'color: transparent;' : ''">
+                                <span x-show="tracker['Hit & Run'] !== 'Yes' && tracker['Hit & Run'] !== 'No'" x-text="tracker['Hit & Run']"></span>
+                            </td>
                             <td class="tracker-table__cell" x-text="tracker.Birthdate"></td>
                             <td class="tracker-table__cell" x-text="tracker.Join"></td>
-                            <td class="tracker-table__cell" x-text="tracker['Join Diff']"></td>
+                            <td class="tracker-table__cell"
+                                :class="tracker['Join Diff'] === 'Easy' ? 'tracker-table__cell--easy' : tracker['Join Diff'] === 'Moderate' ? 'tracker-table__cell--moderate' : tracker['Join Diff'] === 'Tough' ? 'tracker-table__cell--tough' : ''"
+                                :data-value="tracker['Join Diff']"
+                                :style="(tracker['Join Diff'] === 'Easy' || tracker['Join Diff'] === 'Moderate' || tracker['Join Diff'] === 'Tough') ? 'color: transparent;' : ''">
+                                <span x-show="tracker['Join Diff'] !== 'Easy' && tracker['Join Diff'] !== 'Moderate' && tracker['Join Diff'] !== 'Tough'" x-text="tracker['Join Diff']"></span>
+                            </td>
                             <td class="tracker-table__cell" x-text="tracker.Updated"></td>
                         </tr>
                     </template>