fix(security): lock down admin + add bulk cleanup UI

This commit is contained in:
Young Lee
2026-02-05 23:18:25 -08:00
parent 59cbbd0428
commit 223560e874
12 changed files with 2100 additions and 765 deletions
+181 -2
View File
@@ -413,7 +413,7 @@ export const componentStyles = `
.email-raw pre {
margin: 0;
font-family: 'Menlo', monospace;
font-family: var(--font-family-mono);
font-size: 14px;
white-space: pre-wrap;
word-break: break-word;
@@ -482,6 +482,185 @@ export const componentStyles = `
border-radius: var(--radius-md);
overflow: hidden;
}
/* Toolbar + segmented control (Apple-ish) */
.toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--spacing-sm);
flex-wrap: wrap;
margin-bottom: var(--spacing-md);
}
.toolbar-group {
display: inline-flex;
align-items: center;
gap: var(--spacing-sm);
flex-wrap: wrap;
}
.toolbar-group-fill {
width: 100%;
}
input.search {
min-width: 280px;
flex: 1;
}
.actions-row {
display: flex;
justify-content: flex-end;
margin-top: var(--spacing-md);
}
.pill {
display: inline-flex;
align-items: center;
height: 28px;
padding: 0 10px;
border-radius: var(--radius-pill);
border: 1px solid var(--color-border);
background-color: rgba(60, 60, 67, 0.12);
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
backdrop-filter: blur(var(--blur-sm));
-webkit-backdrop-filter: blur(var(--blur-sm));
}
.segmented {
display: inline-flex;
border-radius: var(--radius-pill);
padding: 2px;
border: 1px solid var(--color-border);
background-color: rgba(60, 60, 67, 0.12);
backdrop-filter: blur(var(--blur-sm));
-webkit-backdrop-filter: blur(var(--blur-sm));
box-shadow: var(--shadow-sm);
}
.segmented-item {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 8px 12px;
border-radius: var(--radius-pill);
text-decoration: none;
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
user-select: none;
transition: all var(--transition-fast);
}
.segmented-item:hover {
color: var(--color-text-primary);
}
.segmented-item.is-active {
color: var(--color-text-primary);
background-color: rgba(255, 255, 255, 0.12);
box-shadow: var(--shadow-sm);
}
@media (prefers-color-scheme: light) {
.segmented-item.is-active {
background-color: rgba(255, 255, 255, 0.85);
}
}
/* Tables */
.table-wrap {
overflow-x: auto;
border-radius: var(--radius-lg);
border: 1px solid var(--color-border);
background-color: rgba(60, 60, 67, 0.05);
}
@media (prefers-color-scheme: light) {
.table-wrap {
background-color: rgba(255, 255, 255, 0.6);
}
}
table.table {
width: 100%;
border-collapse: collapse;
}
table.table.table-feeds {
min-width: 860px;
}
table.table.table-emails {
min-width: 760px;
}
table.table th,
table.table td {
padding: 10px 12px;
border-bottom: 1px solid var(--color-border);
text-align: left;
vertical-align: top;
}
table.table thead th {
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
color: var(--color-text-secondary);
background-color: rgba(44, 44, 46, 0.35);
backdrop-filter: blur(var(--blur-sm));
-webkit-backdrop-filter: blur(var(--blur-sm));
}
@media (prefers-color-scheme: light) {
table.table thead th {
background-color: rgba(255, 255, 255, 0.55);
}
}
table.table tbody tr:hover {
background-color: rgba(255, 255, 255, 0.04);
}
@media (prefers-color-scheme: light) {
table.table tbody tr:hover {
background-color: rgba(0, 0, 0, 0.03);
}
}
table.table tbody tr:last-child td {
border-bottom: none;
}
table.table code {
font-family: var(--font-family-mono);
font-size: 13px;
}
/* Compact copy-to-clipboard for table cells */
.copyable.copyable-inline {
margin-bottom: 0;
padding: 0;
background-color: transparent;
border: none;
}
.copyable.copyable-inline .copyable-content {
padding: 6px 8px;
border-radius: var(--radius-sm);
}
.copyable.copyable-inline .copyable-value {
margin-right: var(--spacing-xs);
}
.row-actions {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
/* Feed and Email Lists */
.feed-list,
@@ -490,4 +669,4 @@ export const componentStyles = `
padding: 0;
margin: 0;
}
`;
`;
+10 -6
View File
@@ -15,18 +15,22 @@ export const layoutStyles = `
overflow-x: hidden;
margin: 0;
padding: 0;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
/* Add subtle gradient background */
background-image: linear-gradient(135deg,
rgba(0, 0, 0, 0.02) 0%,
rgba(255, 255, 255, 0.02) 100%);
/* Liquid-glass-ish background (subtle, non-distracting) */
background-image:
radial-gradient(1200px circle at 20% 10%, rgba(10, 132, 255, 0.18), transparent 55%),
radial-gradient(900px circle at 80% 20%, rgba(94, 92, 230, 0.14), transparent 60%),
radial-gradient(700px circle at 50% 100%, rgba(48, 209, 88, 0.10), transparent 60%),
linear-gradient(135deg, rgba(255, 255, 255, 0.03) 0%, rgba(0, 0, 0, 0.03) 100%);
background-attachment: fixed;
}
/* Main Container */
.container {
width: 100%;
max-width: 800px;
max-width: 980px;
margin: 0 auto;
padding: var(--spacing-xl);
box-sizing: border-box;
@@ -168,4 +172,4 @@ export const layoutStyles = `
margin-bottom: var(--spacing-md);
color: var(--color-text-primary);
}
`;
`;
+16 -1
View File
@@ -11,6 +11,21 @@ export const utilityStyles = `
.fade-in {
animation: fadeIn 0.5s ease-out;
}
.muted {
color: var(--color-text-secondary);
}
@media (prefers-reduced-motion: reduce) {
.fade-in {
animation: none;
}
* {
scroll-behavior: auto !important;
transition-duration: 0.01ms !important;
}
}
/* Copyable content styling */
.copyable {
@@ -105,4 +120,4 @@ export const utilityStyles = `
opacity: 1;
transform: translate(-50%, -50%) scale(1);
}
`;
`;
+6 -5
View File
@@ -3,8 +3,10 @@
export const variables = `
:root {
/* Typography - Using Inter font */
--font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Arial, sans-serif;
/* Typography - Prefer system UI fonts (Apple HIG-ish) */
--font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "Helvetica Neue", Arial, sans-serif;
--font-family-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
color-scheme: light dark;
--font-size-xs: 12px;
--font-size-sm: 14px;
--font-size-md: 16px;
@@ -103,6 +105,5 @@ export const lightModeTheme = `
// Inter font import
export const fontImport = `
/* Inter Font Import */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
`;
/* No external font imports. */
`;