fix: Windows path handling, light theme default, file viewer in editor, first-user admin logic
Config: - Fixed SQLite path parsing on Windows (handle drive letters without prepending /) - Changed default theme from dark to light - Updated OAuth test credentials (gitea_oauth_client_id/secret) Auth: - First real user (excluding default admin with no password) becomes admin - Changed user count query to exclude users without password_hash File viewer: - Removed separate _render_file_viewer() —
This commit is contained in:
+507
-184
@@ -1,35 +1,41 @@
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
FlowDeck Notion UI — Design System
|
||||
Référence: Notion Dark Mode (analysé 2026-07-08)
|
||||
Couleurs: #191919 fond, #222 sidebar, #333 actif, #FFF texte
|
||||
Référence: Notion Light Mode (par défaut)
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
|
||||
|
||||
/* ===== LIGHT THEME (default) ===== */
|
||||
:root {
|
||||
/* ===== Couleurs Notion Dark Mode ===== */
|
||||
--bg-primary: #191919;
|
||||
--bg-secondary: #1f1f1f;
|
||||
--bg-sidebar: #222222;
|
||||
--bg-tertiary: #333333;
|
||||
--bg-hover: #2a2a2a;
|
||||
--bg-active: #2F2E2E;
|
||||
--bg-modal: #252525;
|
||||
--bg-primary: #FFFFFF;
|
||||
--bg-secondary: #FBFBFA;
|
||||
--bg-sidebar: #F7F6F3;
|
||||
--bg-tertiary: #EDEDEC;
|
||||
--bg-hover: #EFEFED;
|
||||
--bg-active: #E8E7E4;
|
||||
--bg-modal: #FFFFFF;
|
||||
|
||||
--text-primary: #FFFFFF;
|
||||
--text-secondary: #A0A0A0;
|
||||
--text-dim: #6B6B6B;
|
||||
--text-muted: #4A4A4A;
|
||||
--text-primary: #37352F;
|
||||
--text-secondary: #6B6B6B;
|
||||
--text-dim: #9B9A97;
|
||||
--text-muted: #B0B0B0;
|
||||
--text: #37352F;
|
||||
|
||||
--border: #333333;
|
||||
--border-color: rgba(255,255,255,0.06);
|
||||
--border-light: #3a3a3a;
|
||||
--border: #EDEDED;
|
||||
--border-color: rgba(0,0,0,0.06);
|
||||
--border-light: #EDEDEC;
|
||||
--border-strong: #D3D3D0;
|
||||
|
||||
/* ===== Couleurs d'accent Notion ===== */
|
||||
--accent: #2383E2;
|
||||
--accent-hover: #1a6bc0;
|
||||
--danger: #E03E3E;
|
||||
--danger-hover: #C93535;
|
||||
|
||||
--blue: #3366CC;
|
||||
--blue-bg: #1a2744;
|
||||
--blue-bg: #E8F0FE;
|
||||
--green: #00CC66;
|
||||
--green-bg: #1a332a;
|
||||
--green-bg: #E6F4EA;
|
||||
--yellow: #FFD700;
|
||||
--orange: #D9730D;
|
||||
--red: #E03E3E;
|
||||
@@ -42,13 +48,21 @@
|
||||
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||
--font-mono: 'SF Mono', 'Fira Code', monospace;
|
||||
|
||||
--font-h1: 40px;
|
||||
--font-h2: 30px;
|
||||
--font-h3: 24px;
|
||||
--font-body: 16px;
|
||||
--font-small: 14px;
|
||||
--font-tiny: 12px;
|
||||
|
||||
/* ===== Dimensions ===== */
|
||||
--sidebar-width: 240px;
|
||||
--sidebar-collapsed: 0px;
|
||||
--topbar-height: 40px;
|
||||
--radius-sm: 4px;
|
||||
--radius-md: 6px;
|
||||
--radius-lg: 8px;
|
||||
--topbar-height: 45px;
|
||||
--radius-sm: 3px;
|
||||
--radius-md: 4px;
|
||||
--radius-lg: 6px;
|
||||
--radius: 6px;
|
||||
|
||||
/* ===== Espacements ===== */
|
||||
--space-xs: 4px;
|
||||
@@ -57,27 +71,47 @@
|
||||
--space-lg: 16px;
|
||||
--space-xl: 24px;
|
||||
|
||||
/* ===== Ombres ===== */
|
||||
--shadow-popover: 0 1px 2px rgba(0,0,0,0.08), 0 4px 12px rgba(0,0,0,0.08);
|
||||
--shadow-modal: 0 12px 32px rgba(0,0,0,0.12);
|
||||
--shadow-drag: 0 8px 24px rgba(0,0,0,0.12);
|
||||
|
||||
/* ===== Transitions ===== */
|
||||
--transition: 0.15s ease;
|
||||
--transition: 0.1s ease;
|
||||
--transition-slow: 0.2s ease;
|
||||
|
||||
/* ===== Toast colors ===== */
|
||||
--toast-success-bg: #0F7B6C;
|
||||
--toast-success-text: #FFFFFF;
|
||||
--toast-error-bg: #E03E3E;
|
||||
--toast-error-text: #FFFFFF;
|
||||
--toast-info-bg: #2383E2;
|
||||
--toast-info-text: #FFFFFF;
|
||||
}
|
||||
|
||||
[data-theme="light"] {
|
||||
--bg-primary: #FFFFFF;
|
||||
--bg-secondary: #FBFBFA;
|
||||
--bg-sidebar: #F7F6F3;
|
||||
--bg-tertiary: #EDEDEC;
|
||||
--bg-hover: #EFEFEE;
|
||||
--bg-active: #E8E7E4;
|
||||
--bg-modal: #FFFFFF;
|
||||
--text-primary: #1A1A1A;
|
||||
--text-secondary: #6B6B6B;
|
||||
--text-dim: #9B9B9B;
|
||||
--text-muted: #B0B0B0;
|
||||
--border: #E0E0E0;
|
||||
--border-color: rgba(0,0,0,0.06);
|
||||
--border-light: #EDEDEC;
|
||||
--blue-bg: #E8F0FE;
|
||||
--green-bg: #E6F4EA;
|
||||
/* ===== DARK THEME ===== */
|
||||
[data-theme="dark"] {
|
||||
--bg-primary: #191919;
|
||||
--bg-secondary: #1F1F1F;
|
||||
--bg-sidebar: #202020;
|
||||
--bg-tertiary: #2D2D2D;
|
||||
--bg-hover: #2A2A2A;
|
||||
--bg-active: #2F2E2E;
|
||||
--bg-modal: #252525;
|
||||
|
||||
--text-primary: #FFFFFF;
|
||||
--text-secondary: #A0A0A0;
|
||||
--text-dim: #6B6B6B;
|
||||
--text-muted: #4A4A4A;
|
||||
--text: #FFFFFF;
|
||||
|
||||
--border: #333333;
|
||||
--border-color: rgba(255,255,255,0.06);
|
||||
--border-light: #3a3a3a;
|
||||
--border-strong: #4A4A4A;
|
||||
|
||||
--blue-bg: #1a2744;
|
||||
--green-bg: #1a332a;
|
||||
}
|
||||
|
||||
/* ===== Reset & Base ===== */
|
||||
@@ -217,7 +251,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
background: var(--bg-primary);
|
||||
border: 1px solid var(--border-strong);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 12px 32px rgba(0,0,0,.6);
|
||||
box-shadow: var(--shadow-modal);
|
||||
z-index: 400;
|
||||
padding: 4px 0;
|
||||
overflow: hidden;
|
||||
@@ -424,8 +458,6 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
|
||||
.sidebar-item.active {
|
||||
background: var(--bg-active);
|
||||
border-left: 2px solid var(--accent);
|
||||
padding-left: 2px !important;
|
||||
}
|
||||
|
||||
/* Tree toggle button (▶/▼ chevron) */
|
||||
@@ -869,14 +901,16 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
/* ── Dropdown panel (reusable) ── */
|
||||
.dropdown-panel {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
display: none;
|
||||
background: var(--bg-secondary);
|
||||
border: 1px solid var(--border-strong);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 8px 24px rgba(0,0,0,.4);
|
||||
background: var(--bg-modal);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: var(--shadow-popover);
|
||||
z-index: 1000;
|
||||
padding: 4px;
|
||||
min-width: 160px;
|
||||
padding: 4px 0;
|
||||
min-width: 180px;
|
||||
}
|
||||
|
||||
.dropdown-panel.visible {
|
||||
@@ -886,13 +920,13 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
.dropdown-option {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 6px 10px;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
gap: var(--space-sm);
|
||||
padding: 6px 12px;
|
||||
font-size: 13px;
|
||||
color: var(--text-primary);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
transition: background var(--transition);
|
||||
}
|
||||
|
||||
.dropdown-option:hover {
|
||||
@@ -925,7 +959,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
.page-cover {
|
||||
width: 100%;
|
||||
height: 160px;
|
||||
background: linear-gradient(135deg, #2a2a2a, #333333);
|
||||
background: linear-gradient(135deg, var(--bg-tertiary), var(--border-strong));
|
||||
border-radius: 0;
|
||||
position: relative;
|
||||
margin-bottom: 0;
|
||||
@@ -1528,24 +1562,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
color: var(--red);
|
||||
}
|
||||
|
||||
/* Panel dropdown */
|
||||
.dropdown-panel {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
background: var(--bg-modal);
|
||||
border: 1px solid var(--border-light);
|
||||
border-radius: var(--radius-md);
|
||||
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
|
||||
min-width: 220px;
|
||||
z-index: 100;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dropdown-panel.visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Panel dropdown helpers */
|
||||
.dropdown-search {
|
||||
padding: var(--space-sm);
|
||||
}
|
||||
@@ -1680,7 +1697,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
.modal-overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0,0,0,0.6);
|
||||
background: rgba(0,0,0,0.4);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@@ -1689,8 +1706,9 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
|
||||
.modal-container {
|
||||
background: var(--bg-modal);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: 0 16px 48px rgba(0,0,0,0.5);
|
||||
box-shadow: var(--shadow-modal);
|
||||
max-width: 600px;
|
||||
width: 90%;
|
||||
max-height: 80vh;
|
||||
@@ -1775,7 +1793,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
background: var(--bg-tertiary); transition: background 0.15s;
|
||||
}
|
||||
.trash-filter:hover { background: var(--bg-hover); }
|
||||
.trash-filter.active { color: #5b9bd5; background: rgba(91,155,213,0.1); }
|
||||
.trash-filter.active { color: var(--accent); background: rgba(35,131,226,0.1); }
|
||||
.trash-item {
|
||||
display: flex; align-items: center; gap: 12px;
|
||||
padding: 10px 12px; border-radius: 6px; transition: background 0.15s;
|
||||
@@ -1802,7 +1820,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
|
||||
/* Sortable ghost */
|
||||
.sortable-ghost { opacity: 0.4; }
|
||||
.sortable-drag { box-shadow: 0 8px 24px rgba(0,0,0,0.4) !important; }
|
||||
.sortable-drag { box-shadow: var(--shadow-drag) !important; }
|
||||
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
NOTION-STYLE BLOCK EDITOR
|
||||
@@ -1885,7 +1903,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
transition: background 0.1s ease;
|
||||
}
|
||||
.block-wrapper:hover {
|
||||
background: rgba(255,255,255,0.02);
|
||||
background: rgba(0,0,0,0.02);
|
||||
}
|
||||
|
||||
/* 6-dot drag handle */
|
||||
@@ -1976,7 +1994,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
}
|
||||
.block-content.empty::before {
|
||||
content: attr(data-placeholder);
|
||||
color: #9B9A97;
|
||||
color: var(--text-dim);
|
||||
pointer-events: none;
|
||||
font-style: normal;
|
||||
}
|
||||
@@ -2054,12 +2072,6 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
min-height: 26px;
|
||||
word-break: break-word;
|
||||
}
|
||||
.block-content.empty::before {
|
||||
content: attr(data-placeholder);
|
||||
color: #9B9A97;
|
||||
pointer-events: none;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* Toggle */
|
||||
.block-toggle {
|
||||
@@ -2095,12 +2107,6 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
min-height: 26px;
|
||||
word-break: break-word;
|
||||
}
|
||||
.block-content.empty::before {
|
||||
content: attr(data-placeholder);
|
||||
color: #9B9A97;
|
||||
pointer-events: none;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* Quote */
|
||||
.block-quote {
|
||||
@@ -2142,7 +2148,7 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
}
|
||||
.block-code code:empty::before {
|
||||
content: 'Type code...';
|
||||
color: #9B9A97;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
@@ -2173,12 +2179,6 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
line-height: 1.6;
|
||||
min-height: 24px;
|
||||
}
|
||||
.block-content.empty::before {
|
||||
content: attr(data-placeholder);
|
||||
color: #9B9A97;
|
||||
pointer-events: none;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* Image block */
|
||||
.block-image-wrapper {
|
||||
@@ -2445,44 +2445,44 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
.share-btn { font-weight: 500; }
|
||||
.page-action-btn .chevron-down { font-size: 9px; opacity: 0.5; margin-left: 2px; }
|
||||
.star-btn { font-size: 16px; padding: 4px 8px; }
|
||||
.star-btn .starred { color: #f5c542; }
|
||||
.star-btn .starred { color: var(--yellow); }
|
||||
|
||||
/* ═══════════ Share / Publish Dialog ═══════════ */
|
||||
.share-dialog {
|
||||
position: absolute; top: calc(100% + 8px); right: 72px;
|
||||
width: 440px; max-height: 65vh; overflow-y: auto;
|
||||
background: #1F1F1F; border: 1px solid rgba(255,255,255,.08);
|
||||
border-radius: 18px; box-shadow: 0 12px 48px rgba(0,0,0,0.7);
|
||||
background: var(--bg-modal); border: 1px solid var(--border);
|
||||
border-radius: var(--radius-lg); box-shadow: var(--shadow-modal);
|
||||
z-index: 999;
|
||||
}
|
||||
/* Header with tabs */
|
||||
.sd-header {
|
||||
display: flex; align-items: center; height: 56px;
|
||||
padding: 0 8px; border-bottom: 1px solid rgba(255,255,255,.06);
|
||||
padding: 0 8px; border-bottom: 1px solid var(--border);
|
||||
}
|
||||
.sd-tab {
|
||||
height: 56px; padding: 0 14px; display: flex; align-items: center; gap: 6px;
|
||||
font-size: 14px; font-weight: 500; cursor: pointer;
|
||||
background: none; border: none;
|
||||
color: rgba(255,255,255,.5); position: relative;
|
||||
transition: color 150ms ease;
|
||||
color: var(--text-dim); position: relative;
|
||||
transition: color var(--transition);
|
||||
}
|
||||
.sd-tab.active { color: #fff; }
|
||||
.sd-tab.active { color: var(--text-primary); }
|
||||
.sd-tab.active::after {
|
||||
content: ''; position: absolute; bottom: 0; left: 14px; right: 14px;
|
||||
height: 2px; background: #fff; transition: 200ms ease;
|
||||
height: 2px; background: var(--text-primary); transition: var(--transition);
|
||||
}
|
||||
.sd-tab:hover { color: rgba(255,255,255,.8); }
|
||||
.sd-tab:hover { color: var(--text-secondary); }
|
||||
.sd-badge {
|
||||
width: 6px; height: 6px; border-radius: 999px; background: #2383E2;
|
||||
width: 6px; height: 6px; border-radius: 999px; background: var(--accent);
|
||||
display: inline-block;
|
||||
}
|
||||
.sd-close {
|
||||
margin-left: auto; background: none; border: none;
|
||||
color: rgba(255,255,255,.5); font-size: 16px; cursor: pointer;
|
||||
padding: 8px; border-radius: 6px;
|
||||
color: var(--text-dim); font-size: 16px; cursor: pointer;
|
||||
padding: 8px; border-radius: var(--radius-sm);
|
||||
}
|
||||
.sd-close:hover { background: rgba(255,255,255,.06); color: #fff; }
|
||||
.sd-close:hover { background: var(--bg-hover); color: var(--text-primary); }
|
||||
|
||||
/* Body */
|
||||
.sd-body { padding: 16px 20px; }
|
||||
@@ -2491,60 +2491,60 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
.sd-invite-row { display: flex; gap: 8px; margin-bottom: 12px; }
|
||||
.sd-input {
|
||||
flex: 1; height: 40px; padding: 0 14px;
|
||||
background: #262626; border: 1px solid rgba(255,255,255,.06);
|
||||
border-radius: 10px; color: #fff; font-size: 13px; outline: none;
|
||||
transition: border-color 150ms, box-shadow 150ms;
|
||||
background: var(--bg-secondary); border: 1px solid var(--border);
|
||||
border-radius: var(--radius-md); color: var(--text-primary); font-size: 13px; outline: none;
|
||||
transition: border-color var(--transition), box-shadow var(--transition);
|
||||
}
|
||||
.sd-input::placeholder { color: rgba(255,255,255,.45); }
|
||||
.sd-input:focus { border-color: #2383E2; box-shadow: 0 0 0 1px #2383E2; }
|
||||
.sd-input::placeholder { color: var(--text-dim); }
|
||||
.sd-input:focus { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent); }
|
||||
.sd-btn-primary {
|
||||
height: 40px; padding: 0 16px; background: #2383E2; color: #fff;
|
||||
border: none; border-radius: 10px; font-size: 13px; font-weight: 500;
|
||||
cursor: pointer; transition: background 150ms ease; white-space: nowrap;
|
||||
height: 40px; padding: 0 16px; background: var(--accent); color: #fff;
|
||||
border: none; border-radius: var(--radius-md); font-size: 13px; font-weight: 500;
|
||||
cursor: pointer; transition: background var(--transition); white-space: nowrap;
|
||||
}
|
||||
.sd-btn-primary:hover { background: #2C8CEB; }
|
||||
.sd-btn-primary:hover { background: var(--accent-hover); }
|
||||
.sd-btn-full { width: 100%; height: 46px; font-size: 14px; }
|
||||
|
||||
/* Context card */
|
||||
.sd-context-card {
|
||||
background: #2B2B2B; border-radius: 12px;
|
||||
padding: 12px; font-size: 13px; color: rgba(255,255,255,.55);
|
||||
background: var(--bg-secondary); border-radius: var(--radius-md);
|
||||
padding: 12px; font-size: 13px; color: var(--text-secondary);
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Section */
|
||||
.sd-section { margin: 8px 0; }
|
||||
.sd-section-title {
|
||||
font-size: 12px; color: rgba(255,255,255,.55); margin-bottom: 6px;
|
||||
font-size: 12px; color: var(--text-secondary); margin-bottom: 6px;
|
||||
}
|
||||
.sd-sep { height: 1px; background: rgba(255,255,255,.06); margin: 12px 0; }
|
||||
.sd-sep { height: 1px; background: var(--border); margin: 12px 0; }
|
||||
|
||||
/* Access button */
|
||||
.sd-access-btn {
|
||||
width: 100%; display: flex; align-items: center; justify-content: space-between;
|
||||
padding: 10px 14px; background: rgba(255,255,255,.04);
|
||||
border: 1px solid rgba(255,255,255,.06); border-radius: 10px;
|
||||
color: #fff; font-size: 13px; cursor: pointer;
|
||||
padding: 10px 14px; background: var(--bg-secondary);
|
||||
border: 1px solid var(--border); border-radius: var(--radius-md);
|
||||
color: var(--text-primary); font-size: 13px; cursor: pointer;
|
||||
}
|
||||
.sd-access-btn:hover { background: rgba(255,255,255,.08); }
|
||||
.sd-access-btn:hover { background: var(--bg-hover); }
|
||||
.sd-access-menu {
|
||||
position: absolute; top: calc(100% + 2px); left: 0; right: 0;
|
||||
background: #2A2A2A !important; border: 1px solid rgba(255,255,255,.12);
|
||||
border-radius: 14px; box-shadow: 0 8px 24px rgba(0,0,0,0.6);
|
||||
background: var(--bg-modal) !important; border: 1px solid var(--border);
|
||||
border-radius: var(--radius-lg); box-shadow: var(--shadow-popover);
|
||||
z-index: 999; padding: 4px 0;
|
||||
}
|
||||
.sd-access-option {
|
||||
padding: 8px 14px; font-size: 13px; color: #fff;
|
||||
padding: 8px 14px; font-size: 13px; color: var(--text-primary);
|
||||
cursor: pointer; display: flex; align-items: center; gap: 8px;
|
||||
}
|
||||
.sd-access-option:hover { background: rgba(255,255,255,.08); }
|
||||
.sd-access-option:hover { background: var(--bg-hover); }
|
||||
.sd-access-option.active { background: rgba(35,131,226,.15); }
|
||||
|
||||
/* Permissions */
|
||||
.sd-select-sm {
|
||||
padding: 4px 8px; background: rgba(255,255,255,.04);
|
||||
border: 1px solid rgba(255,255,255,.06); border-radius: 6px;
|
||||
color: #fff; font-size: 12px; outline: none;
|
||||
padding: 4px 8px; background: var(--bg-secondary);
|
||||
border: 1px solid var(--border); border-radius: var(--radius-sm);
|
||||
color: var(--text-primary); font-size: 12px; outline: none;
|
||||
}
|
||||
|
||||
/* Participants */
|
||||
@@ -2556,49 +2556,49 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
.sd-participant-info { display: flex; align-items: center; gap: 10px; }
|
||||
.sd-avatar {
|
||||
width: 32px; height: 32px; border-radius: 50%;
|
||||
background: #2383E2; color: #fff;
|
||||
background: var(--accent); color: #fff;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
font-size: 13px; font-weight: 600;
|
||||
}
|
||||
.sd-participant-name { font-size: 14px; font-weight: 500; color: #fff; }
|
||||
.sd-participant-email { font-size: 13px; color: rgba(255,255,255,.6); }
|
||||
.sd-participant-name { font-size: 14px; font-weight: 500; color: var(--text-primary); }
|
||||
.sd-participant-email { font-size: 13px; color: var(--text-secondary); }
|
||||
.sd-perm-btn {
|
||||
padding: 4px 10px; background: rgba(255,255,255,.04);
|
||||
border: 1px solid rgba(255,255,255,.06); border-radius: 6px;
|
||||
color: rgba(255,255,255,.6); font-size: 12px; cursor: pointer;
|
||||
padding: 4px 10px; background: var(--bg-secondary);
|
||||
border: 1px solid var(--border); border-radius: var(--radius-sm);
|
||||
color: var(--text-secondary); font-size: 12px; cursor: pointer;
|
||||
}
|
||||
.sd-perm-btn:hover { background: rgba(255,255,255,.08); }
|
||||
.sd-perm-btn:hover { background: var(--bg-hover); }
|
||||
.sd-perm-menu {
|
||||
position: absolute; top: 100%; right: 0; width: 280px;
|
||||
background: #2A2A2A; border: 1px solid rgba(255,255,255,.08);
|
||||
border-radius: 14px; box-shadow: 0 8px 24px rgba(0,0,0,0.5);
|
||||
background: var(--bg-modal); border: 1px solid var(--border);
|
||||
border-radius: var(--radius-lg); box-shadow: var(--shadow-popover);
|
||||
z-index: 211; padding: 4px 0;
|
||||
}
|
||||
.sd-perm-option {
|
||||
padding: 10px 16px; cursor: pointer;
|
||||
display: flex; flex-direction: column;
|
||||
}
|
||||
.sd-perm-option span:first-child { font-size: 14px; color: #fff; }
|
||||
.sd-perm-option:hover { background: #343434; }
|
||||
.sd-perm-option span:first-child { font-size: 14px; color: var(--text-primary); }
|
||||
.sd-perm-option:hover { background: var(--bg-hover); }
|
||||
.sd-perm-option.active { background: rgba(35,131,226,.15); }
|
||||
.sd-perm-option.danger:hover { background: rgba(224,62,62,.15); }
|
||||
.sd-perm-option.danger span:first-child { color: #e03e3e; }
|
||||
.sd-perm-desc { font-size: 12px !important; color: rgba(255,255,255,.45) !important; margin-top: 2px; }
|
||||
.sd-perm-sep { height: 1px; background: rgba(255,255,255,.06); margin: 4px 0; }
|
||||
.sd-perm-option.danger span:first-child { color: var(--danger); }
|
||||
.sd-perm-desc { font-size: 12px !important; color: var(--text-dim) !important; margin-top: 2px; }
|
||||
.sd-perm-sep { height: 1px; background: var(--border); margin: 4px 0; }
|
||||
|
||||
/* Footer */
|
||||
.sd-footer {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.sd-footer-link { font-size: 13px; color: rgba(255,255,255,.55); text-decoration: none; }
|
||||
.sd-footer-link:hover { color: #fff; }
|
||||
.sd-footer-link { font-size: 13px; color: var(--text-secondary); text-decoration: none; }
|
||||
.sd-footer-link:hover { color: var(--text-primary); }
|
||||
.sd-footer-action {
|
||||
padding: 6px 14px; background: rgba(255,255,255,.06);
|
||||
border: 1px solid rgba(255,255,255,.06); border-radius: 10px;
|
||||
color: #fff; font-size: 13px; cursor: pointer;
|
||||
padding: 6px 14px; background: var(--bg-secondary);
|
||||
border: 1px solid var(--border); border-radius: var(--radius-md);
|
||||
color: var(--text-primary); font-size: 13px; cursor: pointer;
|
||||
display: flex; align-items: center; gap: 6px;
|
||||
}
|
||||
.sd-footer-action:hover { background: rgba(255,255,255,.1); }
|
||||
.sd-footer-action:hover { background: var(--bg-hover); }
|
||||
|
||||
/* Publish tab */
|
||||
.sd-publish-hero {
|
||||
@@ -2606,30 +2606,30 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
text-align: center; padding: 16px 0;
|
||||
}
|
||||
.sd-publish-preview {
|
||||
width: 100%; height: 200px; background: #262626;
|
||||
border-radius: 12px; margin-bottom: 20px;
|
||||
width: 100%; height: 200px; background: var(--bg-secondary);
|
||||
border-radius: var(--radius-md); margin-bottom: 20px;
|
||||
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
||||
}
|
||||
.sd-preview-bar {
|
||||
width: 100%; height: 32px; background: rgba(255,255,255,.04);
|
||||
border-radius: 12px 12px 0 0; display: flex; align-items: center; padding: 0 12px;
|
||||
width: 100%; height: 32px; background: var(--bg-tertiary);
|
||||
border-radius: var(--radius-md) var(--radius-md) 0 0; display: flex; align-items: center; padding: 0 12px;
|
||||
gap: 6px;
|
||||
}
|
||||
.sd-preview-title { font-size: 16px; color: rgba(255,255,255,.6); margin-top: 20px; }
|
||||
.sd-publish-heading { font-size: 18px; font-weight: 600; color: #fff; margin: 0 0 8px; }
|
||||
.sd-publish-desc { font-size: 13px; color: rgba(255,255,255,.55); margin: 0 0 16px; line-height: 1.5; }
|
||||
.sd-publish-note { font-size: 12px; color: rgba(255,255,255,.35); margin-top: 12px; }
|
||||
.sd-preview-title { font-size: 16px; color: var(--text-secondary); margin-top: 20px; }
|
||||
.sd-publish-heading { font-size: 18px; font-weight: 600; color: var(--text-primary); margin: 0 0 8px; }
|
||||
.sd-publish-desc { font-size: 13px; color: var(--text-secondary); margin: 0 0 16px; line-height: 1.5; }
|
||||
.sd-publish-note { font-size: 12px; color: var(--text-dim); margin-top: 12px; }
|
||||
|
||||
/* URL bar (after publish) */
|
||||
.sd-url-bar {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
padding: 8px; background: rgba(255,255,255,.04);
|
||||
border-radius: 10px;
|
||||
padding: 8px; background: var(--bg-secondary);
|
||||
border-radius: var(--radius-md);
|
||||
}
|
||||
.sd-url-input {
|
||||
flex: 1; height: 32px; padding: 0 10px;
|
||||
background: transparent; border: none;
|
||||
color: rgba(255,255,255,.6); font-size: 13px; outline: none;
|
||||
color: var(--text-secondary); font-size: 13px; outline: none;
|
||||
}
|
||||
|
||||
/* Settings rows */
|
||||
@@ -2637,38 +2637,38 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
.sd-setting-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
height: 40px; padding: 0 4px;
|
||||
font-size: 14px; color: #fff; cursor: pointer;
|
||||
border-radius: 6px;
|
||||
font-size: 14px; color: var(--text-primary); cursor: pointer;
|
||||
border-radius: var(--radius-sm);
|
||||
}
|
||||
.sd-setting-row:hover { background: #2F2F2F; }
|
||||
.sd-setting-row:hover { background: var(--bg-hover); }
|
||||
.sd-danger-btn {
|
||||
width: 100%; padding: 10px; background: none;
|
||||
border: 1px solid rgba(255,255,255,.08); border-radius: 10px;
|
||||
color: rgba(255,255,255,.55); font-size: 13px; cursor: pointer;
|
||||
border: 1px solid var(--border); border-radius: var(--radius-md);
|
||||
color: var(--text-secondary); font-size: 13px; cursor: pointer;
|
||||
}
|
||||
.sd-danger-btn:hover { background: rgba(224,62,62,.1); color: #e03e3e; }
|
||||
.sd-danger-btn:hover { background: rgba(224,62,62,.1); color: var(--danger); }
|
||||
|
||||
/* Toast */
|
||||
.sd-toast {
|
||||
position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%);
|
||||
background: #111; color: #fff; padding: 10px 18px;
|
||||
border-radius: 10px; font-size: 13px; z-index: 300;
|
||||
background: var(--bg-secondary); color: var(--text-primary); padding: 10px 18px;
|
||||
border-radius: var(--radius-md); font-size: 13px; z-index: 300;
|
||||
}
|
||||
|
||||
/* ── More menu dropdown ── */
|
||||
.more-menu {
|
||||
position: absolute; top: calc(100% + 4px); right: 0;
|
||||
background: #2A2A2A; border: 1px solid rgba(255,255,255,.08);
|
||||
border-radius: 10px; box-shadow: 0 8px 24px rgba(0,0,0,0.4);
|
||||
background: var(--bg-modal); border: 1px solid var(--border);
|
||||
border-radius: var(--radius-md); box-shadow: var(--shadow-popover);
|
||||
min-width: 200px; z-index: 100; padding: 4px 0;
|
||||
}
|
||||
.more-menu-item {
|
||||
padding: 8px 14px; font-size: 13px; color: #fff;
|
||||
padding: 8px 14px; font-size: 13px; color: var(--text-primary);
|
||||
cursor: pointer; display: flex; align-items: center; gap: 8px;
|
||||
}
|
||||
.more-menu-item:hover { background: rgba(255,255,255,.06); }
|
||||
.more-menu-item.danger { color: #e03e3e; }
|
||||
.more-menu-sep { height: 1px; background: rgba(255,255,255,.06); margin: 4px 0; }
|
||||
.more-menu-item:hover { background: var(--bg-hover); }
|
||||
.more-menu-item.danger { color: var(--danger); }
|
||||
.more-menu-sep { height: 1px; background: var(--border); margin: 4px 0; }
|
||||
|
||||
/* ── Toggle switch ── */
|
||||
.toggle-switch { position: relative; display: inline-block; width: 36px; height: 20px; }
|
||||
@@ -2676,15 +2676,15 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
.toggle-switch input { opacity: 0; width: 0; height: 0; }
|
||||
.toggle-slider {
|
||||
position: absolute; inset: 0; cursor: pointer;
|
||||
background: #555; border-radius: 20px;
|
||||
transition: background 150ms ease;
|
||||
background: var(--text-dim); border-radius: 20px;
|
||||
transition: background var(--transition);
|
||||
}
|
||||
.toggle-slider:before {
|
||||
content: ''; position: absolute; height: 16px; width: 16px;
|
||||
left: 2px; bottom: 2px; background: #fff;
|
||||
border-radius: 50%; transition: transform 150ms ease;
|
||||
border-radius: 50%; transition: transform var(--transition);
|
||||
}
|
||||
.toggle-switch input:checked + .toggle-slider { background: #2383E2; }
|
||||
.toggle-switch input:checked + .toggle-slider { background: var(--accent); }
|
||||
.toggle-switch input:checked + .toggle-slider:before { transform: translateX(16px); }
|
||||
.toggle-switch.sm { width: 32px; height: 18px; }
|
||||
.toggle-switch.sm .toggle-slider:before { height: 14px; width: 14px; }
|
||||
@@ -2980,3 +2980,326 @@ input, select, textarea { font-family: inherit; color: inherit; }
|
||||
border-radius: 8px; color: var(--text-secondary); cursor: pointer;
|
||||
}
|
||||
.sidebar-uncollapse-btn:hover { background: var(--bg-hover); color: var(--text); }
|
||||
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
SHARED COMPONENTS (migrated from design-tokens.css)
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
[x-cloak] { display: none !important; }
|
||||
|
||||
/* Skeleton */
|
||||
.skeleton {
|
||||
background: var(--bg-tertiary);
|
||||
animation: skeleton-pulse 1.5s ease-in-out infinite;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
@keyframes skeleton-pulse {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: .5; }
|
||||
}
|
||||
|
||||
.skeleton-card {
|
||||
background: var(--bg-secondary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
padding: 20px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.skeleton-card .skeleton-line {
|
||||
height: 14px;
|
||||
margin-bottom: 10px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.skeleton-card .skeleton-line:last-child { margin-bottom: 0; }
|
||||
|
||||
.skeleton-file {
|
||||
padding: 16px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
background: var(--bg-secondary);
|
||||
max-height: 70vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.skeleton-line {
|
||||
background: var(--bg-tertiary);
|
||||
animation: skeleton-pulse 1.5s ease-in-out infinite;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.skeleton-table { overflow: hidden; }
|
||||
|
||||
.skeleton-table .skeleton-line {
|
||||
height: 40px;
|
||||
margin-bottom: 2px;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
/* Toast */
|
||||
.toast-container {
|
||||
position: fixed;
|
||||
bottom: 24px;
|
||||
right: 24px;
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.toast {
|
||||
padding: 12px 20px;
|
||||
border-radius: 8px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
font-family: var(--font-sans);
|
||||
max-width: 400px;
|
||||
box-shadow: 0 8px 24px rgba(0,0,0,.4);
|
||||
pointer-events: auto;
|
||||
animation: toast-slide-in 0.25s ease-out;
|
||||
backdrop-filter: blur(4px);
|
||||
}
|
||||
|
||||
.toast-success {
|
||||
background: var(--toast-success-bg);
|
||||
color: var(--toast-success-text);
|
||||
}
|
||||
|
||||
.toast-error {
|
||||
background: var(--toast-error-bg);
|
||||
color: var(--toast-error-text);
|
||||
}
|
||||
|
||||
.toast-info {
|
||||
background: var(--toast-info-bg);
|
||||
color: var(--toast-info-text);
|
||||
}
|
||||
|
||||
@keyframes toast-slide-in {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(12px) scale(0.96);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0) scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.btn {
|
||||
padding: 8px 16px;
|
||||
border-radius: var(--radius-md);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
border: 1px solid var(--border);
|
||||
background: transparent;
|
||||
color: var(--text-dim);
|
||||
font-family: var(--font-sans);
|
||||
transition: background var(--transition), color var(--transition);
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
background: var(--bg-hover);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
padding: 8px 16px;
|
||||
border-radius: var(--radius-md);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
font-weight: 500;
|
||||
font-family: var(--font-sans);
|
||||
background: var(--accent);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-primary:hover { background: var(--accent-hover); }
|
||||
|
||||
.btn-primary:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.btn-danger {
|
||||
background: rgba(255,80,80,.15);
|
||||
color: var(--danger);
|
||||
border: none;
|
||||
padding: 8px 16px;
|
||||
border-radius: var(--radius-md);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.btn-danger:hover { background: rgba(255,80,80,.25); }
|
||||
|
||||
.btn-secondary {
|
||||
background: var(--bg-tertiary);
|
||||
color: var(--text-primary);
|
||||
border: 1px solid var(--border);
|
||||
padding: 8px 16px;
|
||||
border-radius: var(--radius-md);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
font-family: var(--font-sans);
|
||||
transition: background var(--transition);
|
||||
}
|
||||
|
||||
.btn-secondary:hover { background: var(--bg-hover); }
|
||||
|
||||
.btn-sm {
|
||||
padding: 4px 8px;
|
||||
font-size: 11px;
|
||||
border-radius: var(--radius-sm);
|
||||
border: 1px solid var(--border);
|
||||
background: transparent;
|
||||
color: var(--text-dim);
|
||||
cursor: pointer;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.btn-sm:hover {
|
||||
background: var(--bg-hover);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.btn-sm-danger {
|
||||
color: var(--danger);
|
||||
border-color: rgba(255,80,80,.3);
|
||||
}
|
||||
|
||||
/* Forms */
|
||||
.settings-input {
|
||||
background: var(--bg-secondary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-md);
|
||||
color: var(--text-primary);
|
||||
font-size: 13px;
|
||||
padding: 6px 10px;
|
||||
outline: none;
|
||||
width: 100%;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.settings-input:focus {
|
||||
border-color: var(--accent);
|
||||
box-shadow: 0 0 0 2px rgba(35,131,226,.15);
|
||||
}
|
||||
|
||||
.settings-select {
|
||||
background: var(--bg-secondary);
|
||||
color: var(--text-primary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-md);
|
||||
padding: 6px 10px;
|
||||
font-size: 13px;
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
min-width: 140px;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.settings-select:focus { border-color: var(--accent); }
|
||||
|
||||
/* Dialog */
|
||||
.dialog-overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0,0,0,.4);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 500;
|
||||
}
|
||||
|
||||
.dialog-box {
|
||||
background: var(--bg-modal);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: 24px;
|
||||
width: 400px;
|
||||
max-width: 90vw;
|
||||
box-shadow: var(--shadow-modal);
|
||||
}
|
||||
|
||||
.dialog-box h3 {
|
||||
margin-bottom: 16px;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.dialog-input {
|
||||
width: 100%;
|
||||
padding: 10px 12px;
|
||||
background: var(--bg-secondary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-md);
|
||||
color: var(--text-primary);
|
||||
font-size: 14px;
|
||||
margin-bottom: 12px;
|
||||
outline: none;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.dialog-input:focus { border-color: var(--accent); }
|
||||
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.modal-box {
|
||||
background: var(--bg-modal);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: 24px;
|
||||
min-width: 320px;
|
||||
max-width: 90vw;
|
||||
box-shadow: var(--shadow-modal);
|
||||
}
|
||||
|
||||
/* Empty state */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 60px 20px;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
.empty-state h2 {
|
||||
font-size: 18px;
|
||||
margin-bottom: 8px;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* Text utilities */
|
||||
.text-dim { color: var(--text-dim); }
|
||||
.text-xs { font-size: 12px; }
|
||||
.text-secondary { color: var(--text-secondary); }
|
||||
|
||||
/* Password toggle */
|
||||
.pw-wrapper {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.pw-toggle {
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
background: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 16px;
|
||||
padding: 4px;
|
||||
color: var(--text-dim);
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
@@ -1,500 +0,0 @@
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
FlowDeck — Design Tokens & System
|
||||
Theme variables, light/dark mode, skeletons, toasts, shared UI
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
|
||||
|
||||
/* ═══════════ THEME VARIABLES (Dark — default) ═══════════ */
|
||||
:root {
|
||||
/* ===== Background ===== */
|
||||
--bg-primary: #191919;
|
||||
--bg-secondary: #1f1f1f;
|
||||
--bg-sidebar: #222222;
|
||||
--bg-tertiary: #333333;
|
||||
--bg-hover: #2a2a2a;
|
||||
--bg-active: #2F2E2E;
|
||||
--bg-modal: #252525;
|
||||
|
||||
/* ===== Text ===== */
|
||||
--text-primary: #FFFFFF;
|
||||
--text-secondary: #A0A0A0;
|
||||
--text-dim: #6B6B6B;
|
||||
--text-muted: #4A4A4A;
|
||||
--text: #FFFFFF;
|
||||
|
||||
/* ===== Borders ===== */
|
||||
--border: #333333;
|
||||
--border-color: rgba(255,255,255,0.06);
|
||||
--border-light: #3a3a3a;
|
||||
--border-strong: #4a4a4a;
|
||||
|
||||
/* ===== Accent Colors ===== */
|
||||
--blue: #3366CC;
|
||||
--blue-bg: #1a2744;
|
||||
--green: #00CC66;
|
||||
--green-bg: #1a332a;
|
||||
--yellow: #FFD700;
|
||||
--orange: #D9730D;
|
||||
--red: #E03E3E;
|
||||
--purple: #9B72F0;
|
||||
--pink: #E255A1;
|
||||
--gray: #787774;
|
||||
--brown: #9D6E4A;
|
||||
|
||||
--accent: #2383E2;
|
||||
--accent-hover: #1a6bc0;
|
||||
--danger: #E03E3E;
|
||||
--danger-hover: #C93535;
|
||||
|
||||
/* ===== Typography ===== */
|
||||
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||
--font-mono: 'SF Mono', 'Fira Code', monospace;
|
||||
|
||||
/* ===== Dimensions ===== */
|
||||
--sidebar-width: 240px;
|
||||
--sidebar-collapsed: 0px;
|
||||
--topbar-height: 40px;
|
||||
--radius-sm: 4px;
|
||||
--radius-md: 6px;
|
||||
--radius-lg: 8px;
|
||||
--radius: 8px;
|
||||
|
||||
/* ===== Spacing ===== */
|
||||
--space-xs: 4px;
|
||||
--space-sm: 8px;
|
||||
--space-md: 12px;
|
||||
--space-lg: 16px;
|
||||
--space-xl: 24px;
|
||||
|
||||
/* ===== Transitions ===== */
|
||||
--transition: 0.15s ease;
|
||||
|
||||
/* ===== Toast colors ===== */
|
||||
--toast-success-bg: #0F7B6C;
|
||||
--toast-success-text: #FFFFFF;
|
||||
--toast-error-bg: #E03E3E;
|
||||
--toast-error-text: #FFFFFF;
|
||||
--toast-info-bg: #2383E2;
|
||||
--toast-info-text: #FFFFFF;
|
||||
}
|
||||
|
||||
/* ═══════════ LIGHT THEME ═══════════ */
|
||||
[data-theme="light"] {
|
||||
--bg-primary: #FFFFFF;
|
||||
--bg-secondary: #FBFBFA;
|
||||
--bg-sidebar: #F7F6F3;
|
||||
--bg-tertiary: #EDEDEC;
|
||||
--bg-hover: #EFEFEE;
|
||||
--bg-active: #E8E7E4;
|
||||
--bg-modal: #FFFFFF;
|
||||
|
||||
--text-primary: #1A1A1A;
|
||||
--text-secondary: #6B6B6B;
|
||||
--text-dim: #9B9B9B;
|
||||
--text-muted: #B0B0B0;
|
||||
--text: #37352F;
|
||||
|
||||
--border: #E0E0E0;
|
||||
--border-color: rgba(0,0,0,0.06);
|
||||
--border-light: #EDEDEC;
|
||||
--border-strong: #CCCBC8;
|
||||
|
||||
--blue-bg: #E8F0FE;
|
||||
--green-bg: #E6F4EA;
|
||||
}
|
||||
|
||||
/* ═══════════ RESET ADDITIONS ═══════════ */
|
||||
[x-cloak] { display: none !important; }
|
||||
|
||||
/* ═══════════ SKELETON LOADING ═══════════ */
|
||||
.skeleton {
|
||||
background: var(--bg-tertiary);
|
||||
animation: skeleton-pulse 1.5s ease-in-out infinite;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
@keyframes skeleton-pulse {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: .5; }
|
||||
}
|
||||
|
||||
/* Skeleton variants for different contexts */
|
||||
.skeleton-card {
|
||||
background: var(--bg-secondary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
padding: 20px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.skeleton-card .skeleton-line {
|
||||
height: 14px;
|
||||
margin-bottom: 10px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.skeleton-card .skeleton-line:last-child { margin-bottom: 0; }
|
||||
|
||||
.skeleton-file {
|
||||
padding: 16px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
background: var(--bg-secondary);
|
||||
max-height: 70vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.skeleton-line {
|
||||
background: var(--bg-tertiary);
|
||||
animation: skeleton-pulse 1.5s ease-in-out infinite;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.skeleton-table {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.skeleton-table .skeleton-line {
|
||||
height: 40px;
|
||||
margin-bottom: 2px;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
/* ═══════════ TOAST NOTIFICATIONS ═══════════ */
|
||||
.toast-container {
|
||||
position: fixed;
|
||||
bottom: 24px;
|
||||
right: 24px;
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.toast {
|
||||
padding: 12px 20px;
|
||||
border-radius: 8px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
font-family: var(--font-sans);
|
||||
max-width: 400px;
|
||||
box-shadow: 0 8px 24px rgba(0,0,0,.4);
|
||||
pointer-events: auto;
|
||||
animation: toast-slide-in 0.25s ease-out;
|
||||
backdrop-filter: blur(4px);
|
||||
}
|
||||
|
||||
.toast-success {
|
||||
background: var(--toast-success-bg);
|
||||
color: var(--toast-success-text);
|
||||
}
|
||||
|
||||
.toast-error {
|
||||
background: var(--toast-error-bg);
|
||||
color: var(--toast-error-text);
|
||||
}
|
||||
|
||||
.toast-info {
|
||||
background: var(--toast-info-bg);
|
||||
color: var(--toast-info-text);
|
||||
}
|
||||
|
||||
@keyframes toast-slide-in {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(12px) scale(0.96);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0) scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* ═══════════ SHARED BUTTONS ═══════════ */
|
||||
.btn {
|
||||
padding: 8px 16px;
|
||||
border-radius: 8px;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
border: 1px solid var(--border);
|
||||
background: transparent;
|
||||
color: var(--text-dim);
|
||||
font-family: var(--font-sans);
|
||||
transition: background var(--transition), color var(--transition);
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
background: var(--bg-tertiary);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
padding: 8px 16px;
|
||||
border-radius: 8px;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
font-weight: 500;
|
||||
font-family: var(--font-sans);
|
||||
background: var(--accent);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: var(--accent-hover);
|
||||
}
|
||||
|
||||
.btn-primary:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.btn-danger {
|
||||
background: rgba(255,80,80,.15);
|
||||
color: var(--danger);
|
||||
border: none;
|
||||
padding: 8px 16px;
|
||||
border-radius: 8px;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.btn-danger:hover {
|
||||
background: rgba(255,80,80,.25);
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: var(--bg-tertiary);
|
||||
color: var(--text);
|
||||
border: 1px solid var(--border);
|
||||
padding: 8px 16px;
|
||||
border-radius: 8px;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
font-family: var(--font-sans);
|
||||
transition: background var(--transition);
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background: var(--bg-hover);
|
||||
}
|
||||
|
||||
.btn-sm {
|
||||
padding: 4px 8px;
|
||||
font-size: 11px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid var(--border);
|
||||
background: transparent;
|
||||
color: var(--text-dim);
|
||||
cursor: pointer;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.btn-sm:hover {
|
||||
background: var(--bg-tertiary);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.btn-sm-danger {
|
||||
color: var(--danger);
|
||||
border-color: rgba(255,80,80,.3);
|
||||
}
|
||||
|
||||
.btn-new {
|
||||
border: 1px dashed var(--border-strong);
|
||||
background: transparent;
|
||||
color: var(--text-secondary);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
.btn-new:hover {
|
||||
background: var(--bg-tertiary);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
/* ═══════════ SHARED FORMS ═══════════ */
|
||||
.settings-input {
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
color: var(--text);
|
||||
font-size: 13px;
|
||||
padding: 6px 10px;
|
||||
outline: none;
|
||||
width: 100%;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.settings-input:focus {
|
||||
border-color: var(--accent);
|
||||
box-shadow: 0 0 0 2px rgba(35,131,226,.25);
|
||||
}
|
||||
|
||||
.settings-select {
|
||||
background: var(--bg-tertiary);
|
||||
color: var(--text);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 6px;
|
||||
padding: 6px 10px;
|
||||
font-size: 13px;
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
min-width: 140px;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.settings-select:focus {
|
||||
border-color: var(--accent);
|
||||
}
|
||||
|
||||
/* ═══════════ SHARED DIALOGS ═══════════ */
|
||||
.dialog-overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0,0,0,.6);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 500;
|
||||
}
|
||||
|
||||
.dialog-box {
|
||||
background: var(--bg-primary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 18px;
|
||||
padding: 24px;
|
||||
width: 400px;
|
||||
max-width: 90vw;
|
||||
}
|
||||
|
||||
.dialog-box h3 {
|
||||
margin-bottom: 16px;
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.dialog-input {
|
||||
width: 100%;
|
||||
padding: 10px 12px;
|
||||
background: var(--bg-tertiary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
color: var(--text);
|
||||
font-size: 14px;
|
||||
margin-bottom: 12px;
|
||||
outline: none;
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
|
||||
.dialog-input:focus {
|
||||
border-color: var(--accent);
|
||||
}
|
||||
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
/* ═══════════ MODAL ═══════════ */
|
||||
.modal-overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0,0,0,.85);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.modal-box {
|
||||
background: var(--bg-primary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
padding: 24px;
|
||||
min-width: 320px;
|
||||
box-shadow: 0 12px 40px rgba(0,0,0,.8);
|
||||
}
|
||||
|
||||
.modal-box h3 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
/* ═══════════ DROPDOWN ═══════════ */
|
||||
.dropdown-panel {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background: var(--bg-primary);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 8px 24px rgba(0,0,0,.5);
|
||||
z-index: 300;
|
||||
min-width: 180px;
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
||||
.dropdown-panel.visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.dropdown-option {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 6px 12px;
|
||||
font-size: 13px;
|
||||
color: var(--text);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.dropdown-option:hover {
|
||||
background: var(--bg-hover);
|
||||
}
|
||||
|
||||
/* ═══════════ EMPTY STATE ═══════════ */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 60px 20px;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
.empty-state h2 {
|
||||
font-size: 18px;
|
||||
margin-bottom: 8px;
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
/* ═══════════ TEXT UTILITIES ═══════════ */
|
||||
.text-dim { color: var(--text-dim); }
|
||||
.text-xs { font-size: 12px; }
|
||||
.text-secondary { color: var(--text-secondary); }
|
||||
|
||||
/* ═══════════ PASSWORD TOGGLE ═══════════ */
|
||||
.pw-wrapper {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.pw-toggle {
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
background: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-size: 16px;
|
||||
padding: 4px;
|
||||
color: var(--text-dim);
|
||||
font-family: var(--font-sans);
|
||||
}
|
||||
Reference in New Issue
Block a user