feat: supported dark mode

This commit is contained in:
Leyla Becker 2026-02-19 11:44:11 -06:00
parent 46c631ba65
commit 3701dbe3db
9 changed files with 314 additions and 245 deletions

View file

@ -1,4 +1,3 @@
## Your internet traffic is being tracked
When you open up your phone and click on or share links though websites and applications websites are secretly injecting tracking information into the pages.
@ -19,17 +18,17 @@ TODO: explain why that is a bad thing for privacy, and personal life
<style>
.url-container {
margin: 1em 0;
margin: var(--space-element) 0;
}
.url-example {
font-family: monospace;
font-size: 1.2em;
padding: 1em;
background: var(--code-background, #f5f5f5);
border: 1px solid var(--border-color, #ddd);
border-radius: 8px;
margin-bottom: 1em;
padding: var(--space-element);
background: var(--color-bg-surface);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-card);
margin-bottom: var(--space-element);
overflow-x: auto;
white-space: nowrap;
}
@ -44,60 +43,60 @@ TODO: explain why that is a bad thing for privacy, and personal life
display: flex;
flex-direction: column;
gap: 0.75em;
padding: 1em;
background: var(--code-background, #f5f5f5);
border: 1px solid var(--border-color, #ddd);
border-radius: 8px;
padding: var(--space-element);
background: var(--color-bg-surface);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-card);
}
.url-legend-item {
display: flex;
align-items: flex-start;
gap: 0.5em;
gap: var(--space-tight);
}
.url-legend-item .url-legend-label {
font-weight: 600;
font-weight: var(--font-weight-semibold, 600);
min-width: 8em;
}
.url-legend-item .url-legend-desc {
color: #666;
font-size: 0.9em;
color: var(--color-text-muted);
font-size: var(--font-size-small);
}
.url-required {
color: #dc2626;
color: var(--color-legend-5);
font-size: 0.7em;
vertical-align: super;
font-weight: bold;
font-weight: var(--font-weight-bold);
}
.url-legend-color {
width: 1em;
height: 1em;
border-radius: 3px;
border-radius: var(--radius-inline);
flex-shrink: 0;
margin-top: 0.2em;
}
.url-part-protocol { color: #db2777; }
.url-legend-protocol { background: #db2777; }
.url-part-protocol { color: var(--color-legend-1); }
.url-legend-protocol { background: var(--color-legend-1); }
.url-part-hostname { color: #2563eb; }
.url-legend-hostname { background: #2563eb; }
.url-part-hostname { color: var(--color-legend-2); }
.url-legend-hostname { background: var(--color-legend-2); }
.url-part-port { color: #0891b2; }
.url-legend-port { background: #0891b2; }
.url-part-port { color: var(--color-legend-3); }
.url-legend-port { background: var(--color-legend-3); }
.url-part-path { color: #16a34a; }
.url-legend-path { background: #16a34a; }
.url-part-path { color: var(--color-legend-4); }
.url-legend-path { background: var(--color-legend-4); }
.url-part-query { color: #dc2626; }
.url-legend-query { background: #dc2626; }
.url-part-query { color: var(--color-legend-5); }
.url-legend-query { background: var(--color-legend-5); }
.url-part-fragment { color: #9333ea; }
.url-legend-fragment { background: #9333ea; }
.url-part-fragment { color: var(--color-legend-6); }
.url-legend-fragment { background: var(--color-legend-6); }
/* Cross-highlighting using :has() - no JavaScript needed */
.url-container:has([data-part]:hover) [data-part] { opacity: 0.4; }
@ -121,9 +120,9 @@ TODO: explain why that is a bad thing for privacy, and personal life
.url-container:has(.url-example [data-part="query"]:hover) .url-legend [data-part="query"],
.url-container:has(.url-example [data-part="fragment"]:hover) .url-legend [data-part="fragment"] {
opacity: 1 !important;
padding: 0.5em 0.75em;
margin: -0.5em -0.75em;
border-radius: 0.5em;
padding: var(--space-tight) 0.75em;
margin: calc(-1 * var(--space-tight)) -0.75em;
border-radius: var(--radius-block);
box-shadow:
inset 0 0 0.5em 0.25em rgba(0, 0, 0, 0.06),
0 0 0.75rem 0.5rem rgba(0, 0, 0, 0.06),
@ -139,7 +138,7 @@ TODO: explain why that is a bad thing for privacy, and personal life
.url-container:has(.url-legend [data-part="query"]:hover) .url-example [data-part="query"],
.url-container:has(.url-legend [data-part="fragment"]:hover) .url-example [data-part="fragment"] {
opacity: 1 !important;
border-radius: 0.25em;
border-radius: var(--radius-micro, 0.25em);
box-shadow:
inset 0 0 0.5em 0.25em rgba(0, 0, 0, 0.06),
0 0 0.75rem 0.5rem rgba(0, 0, 0, 0.06),
@ -222,17 +221,17 @@ Query parameters are a part of a URL that are used to encode some data about a p
<style>
.query-container {
margin: 1em 0;
margin: var(--space-element) 0;
}
.query-example {
font-family: monospace;
font-size: 1.2em;
padding: 1em;
background: var(--code-background, #f5f5f5);
border: 1px solid var(--border-color, #ddd);
border-radius: 8px;
margin-bottom: 1em;
padding: var(--space-element);
background: var(--color-bg-surface);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-card);
margin-bottom: var(--space-element);
overflow-x: auto;
white-space: nowrap;
}
@ -247,20 +246,20 @@ Query parameters are a part of a URL that are used to encode some data about a p
display: flex;
flex-direction: column;
gap: 0.75em;
padding: 1em;
background: var(--code-background, #f5f5f5);
border: 1px solid var(--border-color, #ddd);
border-radius: 8px;
padding: var(--space-element);
background: var(--color-bg-surface);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-card);
}
.query-legend-item {
display: flex;
align-items: flex-start;
gap: 0.5em;
gap: var(--space-tight);
}
.query-legend-item .query-legend-label {
font-weight: 600;
font-weight: var(--font-weight-semibold, 600);
min-width: 8em;
}
@ -269,38 +268,38 @@ Query parameters are a part of a URL that are used to encode some data about a p
}
.query-legend-item .query-legend-desc {
color: #666;
font-size: 0.9em;
color: var(--color-text-muted);
font-size: var(--font-size-small);
}
.query-legend-color {
width: 1em;
height: 1em;
border-radius: 3px;
border-radius: var(--radius-inline);
flex-shrink: 0;
margin-top: 0.2em;
}
/* Structure colors - each UNIQUE */
.query-part-delimiter { color: #db2777; }
.query-legend-delimiter { background: #db2777; }
/* Structure colors - using legend color system */
.query-part-delimiter { color: var(--color-legend-1); }
.query-legend-delimiter { background: var(--color-legend-1); }
.query-part-key { color: #2563eb; }
.query-legend-key { background: #2563eb; }
.query-part-key { color: var(--color-legend-2); }
.query-legend-key { background: var(--color-legend-2); }
.query-part-equals { color: #ca8a04; }
.query-legend-equals { background: #ca8a04; }
.query-part-equals { color: var(--color-legend-7); }
.query-legend-equals { background: var(--color-legend-7); }
.query-part-value { color: #16a34a; }
.query-legend-value { background: #16a34a; }
.query-part-value { color: var(--color-legend-4); }
.query-legend-value { background: var(--color-legend-4); }
.query-part-separator { color: #9333ea; }
.query-legend-separator { background: #9333ea; }
.query-part-separator { color: var(--color-legend-6); }
.query-legend-separator { background: var(--color-legend-6); }
/* Parameter group highlighting in URL */
.query-param-group {
display: inline;
border-radius: 0.25em;
border-radius: var(--radius-micro, 0.25em);
transition: box-shadow 0.2s, background 0.2s;
}
@ -326,9 +325,9 @@ Query parameters are a part of a URL that are used to encode some data about a p
.query-container:has(.query-example [data-qpart="value"]:hover) .query-legend [data-qpart="value"],
.query-container:has(.query-example [data-qpart="separator"]:hover) .query-legend [data-qpart="separator"] {
opacity: 1 !important;
padding: 0.5em 0.75em;
margin: -0.5em -0.75em;
border-radius: 0.5em;
padding: var(--space-tight) 0.75em;
margin: calc(-1 * var(--space-tight)) -0.75em;
border-radius: var(--radius-block);
box-shadow:
inset 0 0 0.5em 0.25em rgba(0, 0, 0, 0.06),
0 0 0.75rem 0.5rem rgba(0, 0, 0, 0.06),
@ -341,9 +340,9 @@ Query parameters are a part of a URL that are used to encode some data about a p
.query-container:has(.query-example [data-qparam="color"]:hover) .query-legend [data-qparam="color"],
.query-container:has(.query-example [data-qparam="utm"]:hover) .query-legend [data-qparam="utm"] {
opacity: 1 !important;
padding: 0.5em 0.75em;
margin: -0.5em -0.75em;
border-radius: 0.5em;
padding: var(--space-tight) 0.75em;
margin: calc(-1 * var(--space-tight)) -0.75em;
border-radius: var(--radius-block);
box-shadow:
inset 0 0 0.5em 0.25em rgba(0, 0, 0, 0.06),
0 0 0.75rem 0.5rem rgba(0, 0, 0, 0.06),
@ -358,7 +357,7 @@ Query parameters are a part of a URL that are used to encode some data about a p
.query-container:has(.query-legend [data-qpart="value"]:hover) .query-example [data-qpart="value"],
.query-container:has(.query-legend [data-qpart="separator"]:hover) .query-example [data-qpart="separator"] {
opacity: 1 !important;
border-radius: 0.25em;
border-radius: var(--radius-micro, 0.25em);
box-shadow:
inset 0 0 0.5em 0.25em rgba(0, 0, 0, 0.06),
0 0 0.75rem 0.5rem rgba(0, 0, 0, 0.06),
@ -370,7 +369,7 @@ Query parameters are a part of a URL that are used to encode some data about a p
.query-container:has(.query-legend [data-qparam="size"]:hover) .query-example .query-param-group[data-qparam="size"],
.query-container:has(.query-legend [data-qparam="color"]:hover) .query-example .query-param-group[data-qparam="color"],
.query-container:has(.query-legend [data-qparam="utm"]:hover) .query-example .query-param-group[data-qparam="utm"] {
border-radius: 0.25em;
border-radius: var(--radius-micro, 0.25em);
box-shadow:
inset 0 0 0.5em 0.25em rgba(0, 0, 0, 0.06),
0 0 0.75rem 0.5rem rgba(0, 0, 0, 0.06),
@ -386,26 +385,26 @@ Query parameters are a part of a URL that are used to encode some data about a p
}
.query-legend-section {
margin-top: 1em;
margin-top: var(--space-element);
padding-top: 0.75em;
border-top: 1px solid var(--border-color, #ddd);
border-top: 1px solid var(--color-border-default);
}
.query-legend-section-title {
font-weight: 600;
font-weight: var(--font-weight-semibold, 600);
font-size: 0.85em;
color: #666;
margin-bottom: 0.5em;
color: var(--color-text-muted);
margin-bottom: var(--space-tight);
}
/* Parameter legend labels - styled as code blocks */
.query-param-label {
font-family: monospace;
font-size: 0.9em;
background: var(--inline-code-background, rgba(0, 0, 0, 0.06));
font-size: var(--font-size-small);
background: var(--color-bg-surface);
padding: 0.15em 0.4em;
border-radius: 4px;
border: 1px solid var(--border-color, rgba(0, 0, 0, 0.1));
border-radius: var(--radius-inline);
border: 1px solid var(--color-border-default);
min-width: auto;
}
</style>
@ -524,7 +523,7 @@ The most basic low tech way to remove the trackers is to just delete them yourse
<style>
/* Browser/Platform Detection Styles */
.protect-section {
margin: 1.5em 0;
margin: var(--space-block) 0;
}
.protect-section h3 {
@ -535,11 +534,11 @@ The most basic low tech way to remove the trackers is to just delete them yourse
.extension-card {
display: flex;
align-items: flex-start;
gap: 1em;
padding: 1em;
background: var(--code-background, #f5f5f5);
border: 1px solid var(--border-color, #ddd);
border-radius: 8px;
gap: var(--space-element);
padding: var(--space-element);
background: var(--color-bg-surface);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-card);
margin-bottom: 0.75em;
text-decoration: none;
color: inherit;
@ -547,8 +546,8 @@ The most basic low tech way to remove the trackers is to just delete them yourse
}
.extension-card:hover {
border-color: var(--secondary-color, #3498db);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border-color: var(--color-border-focus);
box-shadow: var(--shadow-card);
}
.extension-info {
@ -556,25 +555,25 @@ The most basic low tech way to remove the trackers is to just delete them yourse
}
.extension-name {
font-weight: 600;
color: var(--primary-color, #2c3e50);
margin-bottom: 0.25em;
font-weight: var(--font-weight-semibold, 600);
color: var(--color-text-heading);
margin-bottom: var(--space-micro);
}
.extension-desc {
font-size: 0.9em;
color: #666;
font-size: var(--font-size-small);
color: var(--color-text-muted);
margin: 0;
}
.extension-badge {
display: inline-block;
font-size: 0.75em;
padding: 0.2em 0.5em;
border-radius: 4px;
background: var(--secondary-color, #3498db);
padding: 0.2em var(--space-tight);
border-radius: var(--radius-inline);
background: var(--color-text-link);
color: white;
margin-left: 0.5em;
margin-left: var(--space-tight);
vertical-align: middle;
}
@ -603,14 +602,14 @@ The most basic low tech way to remove the trackers is to just delete them yourse
.browser-dropdown-container .expandable summary,
.platform-dropdown-container .expandable summary {
background: none;
padding: 0.5em 0;
padding: var(--space-tight) 0;
border-bottom: none;
}
.browser-dropdown-container .expandable[open] summary,
.platform-dropdown-container .expandable[open] summary {
border-bottom: none;
margin-bottom: 0.5em;
margin-bottom: var(--space-tight);
}
/* Firefox detection using -moz prefixed properties */
@ -667,11 +666,11 @@ The most basic low tech way to remove the trackers is to just delete them yourse
.app-card {
display: flex;
align-items: flex-start;
gap: 1em;
padding: 1em;
background: var(--code-background, #f5f5f5);
border: 1px solid var(--border-color, #ddd);
border-radius: 8px;
gap: var(--space-element);
padding: var(--space-element);
background: var(--color-bg-surface);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-card);
margin-bottom: 0.75em;
text-decoration: none;
color: inherit;
@ -679,8 +678,8 @@ The most basic low tech way to remove the trackers is to just delete them yourse
}
.app-card:hover {
border-color: var(--secondary-color, #3498db);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border-color: var(--color-border-focus);
box-shadow: var(--shadow-card);
}
.app-info {
@ -688,36 +687,36 @@ The most basic low tech way to remove the trackers is to just delete them yourse
}
.app-name {
font-weight: 600;
color: var(--primary-color, #2c3e50);
margin-bottom: 0.25em;
font-weight: var(--font-weight-semibold, 600);
color: var(--color-text-heading);
margin-bottom: var(--space-micro);
}
.app-desc {
font-size: 0.9em;
color: #666;
font-size: var(--font-size-small);
color: var(--color-text-muted);
margin: 0;
}
.app-platforms {
display: flex;
gap: 0.5em;
margin-top: 0.5em;
gap: var(--space-tight);
margin-top: var(--space-tight);
}
.platform-tag {
font-size: 0.75em;
padding: 0.2em 0.5em;
border-radius: 4px;
background: #e0e0e0;
color: #444;
padding: 0.2em var(--space-tight);
border-radius: var(--radius-inline);
background: var(--color-border-default);
color: var(--color-text-primary);
}
/* Section dividers */
.protect-divider {
margin: 2em 0;
margin: var(--space-section) 0;
border: none;
border-top: 1px solid var(--border-color, #ddd);
border-top: 1px solid var(--color-border-default);
}
</style>