Frontend Features and refactor
This commit is contained in:
+167
-27
@@ -1,47 +1,95 @@
|
||||
/* Shared Page Styling for Simple Pages */
|
||||
/* Shared Page Styling for Simple Pages (index, forms, static articles) */
|
||||
|
||||
:root {
|
||||
color-scheme: dark light;
|
||||
|
||||
--color-bg-primary: #1a1a1a;
|
||||
--color-bg-secondary: #252525;
|
||||
--color-bg-tertiary: #2f2f2f;
|
||||
--color-text-primary: #e8e8e8;
|
||||
--color-text-secondary: #b8b8b8;
|
||||
--color-text-muted: #888888;
|
||||
--color-accent-primary: #6b9bd1;
|
||||
--color-accent-hover: #85aede;
|
||||
--color-on-accent: #121212;
|
||||
--color-link: #6b9bd1;
|
||||
--color-link-hover: #85aede;
|
||||
--color-border: #3a3a3a;
|
||||
--color-shadow: rgba(0, 0, 0, 0.3);
|
||||
|
||||
--font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
--border-radius-sm: 4px;
|
||||
--font-scripture: Georgia, "Crimson Text", "Times New Roman", serif;
|
||||
--font-mono: "SF Mono", Monaco, "Cascadia Code", "Courier New", monospace;
|
||||
|
||||
--space-xs: 0.25rem;
|
||||
--space-sm: 0.5rem;
|
||||
--space-md: 1rem;
|
||||
--space-lg: 1.5rem;
|
||||
--space-xl: 2rem;
|
||||
--space-2xl: 3rem;
|
||||
|
||||
--content-max-width: 820px;
|
||||
--border-radius: 8px;
|
||||
--border-radius-sm: 4px;
|
||||
--transition-fast: 150ms ease;
|
||||
--transition-normal: 250ms ease;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
--color-bg-primary: #f7f5f0;
|
||||
--color-bg-secondary: #ffffff;
|
||||
--color-bg-tertiary: #ece9e1;
|
||||
--color-text-primary: #1f1f1f;
|
||||
--color-text-secondary: #4a4a4a;
|
||||
--color-text-muted: #6b6b6b;
|
||||
--color-accent-primary: #2b5c94;
|
||||
--color-accent-hover: #1d4574;
|
||||
--color-on-accent: #ffffff;
|
||||
--color-link: #2b5c94;
|
||||
--color-link-hover: #1d4574;
|
||||
--color-border: #d6d1c4;
|
||||
--color-shadow: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html, body {
|
||||
background-color: var(--color-bg-primary);
|
||||
color: var(--color-text-primary);
|
||||
margin: 0;
|
||||
padding: 1.5rem;
|
||||
font-family: var(--font-ui);
|
||||
line-height: 1.6;
|
||||
font-size: 16px;
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
html {
|
||||
-webkit-text-size-adjust: 100%;
|
||||
text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
max-width: 820px;
|
||||
background-color: var(--color-bg-primary);
|
||||
color: var(--color-text-primary);
|
||||
margin: 0 auto;
|
||||
padding: var(--space-md) max(var(--space-md), env(safe-area-inset-right)) var(--space-2xl) max(var(--space-md), env(safe-area-inset-left));
|
||||
max-width: calc(var(--content-max-width) + 2 * var(--space-md));
|
||||
font-family: var(--font-ui);
|
||||
line-height: 1.6;
|
||||
font-size: 16px;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
color: var(--color-text-primary);
|
||||
margin-top: 1.5rem;
|
||||
margin-bottom: 1rem;
|
||||
line-height: 1.25;
|
||||
margin: 1.5rem 0 1rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: clamp(1.6rem, 5vw + 0.5rem, 2.4rem);
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
font-size: clamp(1.4rem, 4vw + 0.4rem, 2rem);
|
||||
border-bottom: 2px solid var(--color-border);
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
@@ -49,7 +97,7 @@ h2 {
|
||||
a {
|
||||
color: var(--color-link);
|
||||
text-decoration: none;
|
||||
transition: color 150ms ease;
|
||||
transition: color var(--transition-fast);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
@@ -57,18 +105,41 @@ a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
:focus-visible {
|
||||
outline: 2px solid var(--color-accent-primary);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
/* Top navigation: a wrapping row of pill links */
|
||||
header {
|
||||
margin-bottom: 2rem;
|
||||
padding-bottom: 1rem;
|
||||
margin-left: -0.75rem; /* pill padding lines the text up with the page edge */
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-xs) var(--space-sm);
|
||||
margin-bottom: var(--space-lg);
|
||||
padding-bottom: var(--space-md);
|
||||
border-bottom: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
header a {
|
||||
padding: 0.35rem 0.75rem;
|
||||
border-radius: 999px;
|
||||
font-weight: 500;
|
||||
font-size: 0.95rem;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
header a:hover {
|
||||
background-color: var(--color-bg-tertiary);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
form {
|
||||
background-color: var(--color-bg-secondary);
|
||||
padding: 1.5rem;
|
||||
padding: var(--space-lg);
|
||||
border-radius: var(--border-radius);
|
||||
border: 1px solid var(--color-border);
|
||||
margin: 1.5rem 0;
|
||||
margin: var(--space-lg) 0;
|
||||
}
|
||||
|
||||
label {
|
||||
@@ -80,15 +151,16 @@ label {
|
||||
|
||||
input[type=text] {
|
||||
width: 100%;
|
||||
padding: 0.75rem;
|
||||
min-height: 44px;
|
||||
padding: 0.6rem 0.75rem;
|
||||
margin: 0.5rem 0 1rem 0;
|
||||
font-size: 1rem;
|
||||
font-size: 1rem; /* 16px minimum stops iOS zooming into the field */
|
||||
font-family: var(--font-ui);
|
||||
background-color: var(--color-bg-primary);
|
||||
color: var(--color-text-primary);
|
||||
border: 2px solid var(--color-border);
|
||||
border-radius: var(--border-radius-sm);
|
||||
transition: border-color 150ms ease;
|
||||
transition: border-color var(--transition-fast);
|
||||
}
|
||||
|
||||
input[type=text]:focus {
|
||||
@@ -96,20 +168,40 @@ input[type=text]:focus {
|
||||
border-color: var(--color-accent-primary);
|
||||
}
|
||||
|
||||
/* Radio + text wrapped in a label so the whole pill is the tap target */
|
||||
.choice {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.4rem;
|
||||
min-height: 44px;
|
||||
margin: 0 var(--space-md) 0 0;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
input[type=radio] {
|
||||
margin-right: 0.5rem;
|
||||
margin: 0;
|
||||
width: 1.1rem;
|
||||
height: 1.1rem;
|
||||
accent-color: var(--color-accent-primary);
|
||||
}
|
||||
|
||||
.form-row {
|
||||
margin-bottom: var(--space-md);
|
||||
}
|
||||
|
||||
input[type=submit], button {
|
||||
background-color: var(--color-accent-primary);
|
||||
color: var(--color-bg-primary);
|
||||
color: var(--color-on-accent);
|
||||
border: none;
|
||||
padding: 0.75rem 1.5rem;
|
||||
min-height: 44px;
|
||||
padding: 0.6rem 1.5rem;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
font-family: var(--font-ui);
|
||||
border-radius: var(--border-radius-sm);
|
||||
cursor: pointer;
|
||||
transition: background-color 150ms ease, transform 150ms ease;
|
||||
transition: background-color var(--transition-fast), transform var(--transition-fast);
|
||||
}
|
||||
|
||||
input[type=submit]:hover, button:hover {
|
||||
@@ -120,7 +212,7 @@ input[type=submit]:hover, button:hover {
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 1px solid var(--color-border);
|
||||
margin: 2rem 0;
|
||||
margin: var(--space-xl) 0;
|
||||
}
|
||||
|
||||
p {
|
||||
@@ -131,3 +223,51 @@ p {
|
||||
b, strong {
|
||||
color: var(--color-text-primary);
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: var(--color-bg-secondary);
|
||||
border: 1px solid var(--color-border);
|
||||
border-radius: var(--border-radius-sm);
|
||||
padding: var(--space-md);
|
||||
overflow-x: auto; /* scroll the code block, never the page */
|
||||
-webkit-overflow-scrolling: touch;
|
||||
font-size: 0.85rem;
|
||||
line-height: 1.5;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: var(--font-mono);
|
||||
}
|
||||
|
||||
/* wide tables scroll inside their own box instead of widening the page */
|
||||
.table-wrap {
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td, th {
|
||||
text-align: left;
|
||||
padding: 0.5rem 0.75rem;
|
||||
border-bottom: 1px solid var(--color-border);
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
form {
|
||||
padding: var(--space-md);
|
||||
}
|
||||
|
||||
/* full-width submit buttons are easier to hit with a thumb */
|
||||
input[type=submit] {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
pre {
|
||||
font-size: 0.78rem;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user