feat(dashboard): added dashboard content and features (#7)
All checks were successful
CI / Format (push) Successful in 2s
CI / Clippy (push) Successful in 2m18s
CI / Security Audit (push) Successful in 1m40s
CI / Tests (push) Successful in 2m51s
CI / Deploy (push) Successful in 2s

Co-authored-by: Sharang Parnerkar <parnerkarsharang@gmail.com>
Reviewed-on: #7
This commit was merged in pull request #7.
This commit is contained in:
2026-02-19 19:23:06 +00:00
parent a588be306a
commit 5399afd748
20 changed files with 3111 additions and 131 deletions

View File

@@ -7,7 +7,12 @@ body {
padding: 0;
}
h1, h2, h3, h4, h5, h6 {
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'Space Grotesk', sans-serif;
}
@@ -509,11 +514,9 @@ h1, h2, h3, h4, h5, h6 {
margin: 0 auto 80px;
padding: 64px 48px;
text-align: center;
background: linear-gradient(
135deg,
rgba(145, 164, 210, 0.08),
rgba(109, 133, 198, 0.04)
);
background: linear-gradient(135deg,
rgba(145, 164, 210, 0.08),
rgba(109, 133, 198, 0.04));
border: 1px solid rgba(145, 164, 210, 0.15);
border-radius: 20px;
}
@@ -995,6 +998,8 @@ h1, h2, h3, h4, h5, h6 {
border-radius: 12px;
overflow: hidden;
transition: border-color 0.2s ease, transform 0.2s ease;
display: flex;
flex-direction: column;
}
.news-card:hover {
@@ -1002,14 +1007,26 @@ h1, h2, h3, h4, h5, h6 {
transform: translateY(-2px);
}
.news-card-thumb {
overflow: hidden;
height: 140px;
flex-shrink: 0;
}
.news-card-thumb img {
width: 100%;
height: 140px;
height: 100%;
object-fit: cover;
/* Hide alt text on broken images */
color: transparent;
font-size: 0;
}
.news-card-body {
padding: 20px;
flex: 1;
display: flex;
flex-direction: column;
}
.news-card-meta {
@@ -1027,13 +1044,35 @@ h1, h2, h3, h4, h5, h6 {
border-radius: 4px;
text-transform: uppercase;
letter-spacing: 0.05em;
/* Default badge color for any topic */
background-color: rgba(99, 132, 210, 0.15);
color: #91a4d2;
}
.news-badge--llm { background-color: rgba(99, 102, 241, 0.15); color: #818cf8; }
.news-badge--agents { background-color: rgba(168, 85, 247, 0.15); color: #c084fc; }
.news-badge--privacy { background-color: rgba(34, 197, 94, 0.15); color: #4ade80; }
.news-badge--infrastructure { background-color: rgba(234, 179, 8, 0.15); color: #facc15; }
.news-badge--open-source { background-color: rgba(236, 72, 153, 0.15); color: #f472b6; }
.news-badge--llm {
background-color: rgba(99, 102, 241, 0.15);
color: #818cf8;
}
.news-badge--agents {
background-color: rgba(168, 85, 247, 0.15);
color: #c084fc;
}
.news-badge--privacy {
background-color: rgba(34, 197, 94, 0.15);
color: #4ade80;
}
.news-badge--infrastructure {
background-color: rgba(234, 179, 8, 0.15);
color: #facc15;
}
.news-badge--open-source {
background-color: rgba(236, 72, 153, 0.15);
color: #f472b6;
}
.news-card-source {
font-size: 12px;
@@ -1069,6 +1108,487 @@ h1, h2, h3, h4, h5, h6 {
margin: 0;
}
.news-card--selected {
border-color: #91a4d2;
background-color: rgba(145, 164, 210, 0.08);
}
.news-card--no-thumb {
min-height: 200px;
}
.news-card--no-thumb .news-card-body {
text-align: center;
justify-content: center;
}
.news-card--no-thumb .news-card-meta {
justify-content: center;
}
.news-card {
cursor: pointer;
}
/* ===== Dashboard Split View ===== */
.dashboard-split {
display: flex;
gap: 24px;
min-height: 60vh;
}
.dashboard-full {
display: block;
}
/* ===== Dashboard With Sidebar ===== */
.dashboard-with-sidebar {
display: flex;
gap: 24px;
min-height: 60vh;
}
.dashboard-full-grid {
width: 100%;
}
.dashboard-left {
width: 40%;
min-width: 0;
overflow-y: auto;
max-height: 80vh;
}
.dashboard-right {
width: 60%;
min-width: 0;
position: sticky;
top: 24px;
align-self: flex-start;
max-height: 80vh;
overflow-y: auto;
}
.news-grid--compact {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
}
.dashboard-loading {
text-align: center;
padding: 24px;
color: #8892a8;
font-size: 14px;
}
/* ===== Topic Tabs ===== */
.topic-tab-wrapper {
display: inline-flex;
align-items: center;
gap: 2px;
}
.topic-remove {
background: none;
border: none;
color: #5a6478;
font-size: 12px;
cursor: pointer;
padding: 2px 4px;
border-radius: 4px;
transition: color 0.15s ease;
}
.topic-remove:hover {
color: #f87171;
}
.topic-add-btn {
padding: 6px 14px;
border-radius: 20px;
border: 1px dashed #2a2f3d;
background-color: transparent;
color: #5a6478;
font-size: 16px;
cursor: pointer;
transition: all 0.15s ease;
font-family: 'Inter', sans-serif;
line-height: 1;
}
.topic-add-btn:hover {
border-color: #91a4d2;
color: #91a4d2;
}
.topic-input-wrapper {
display: inline-flex;
align-items: center;
gap: 8px;
}
.topic-input {
padding: 5px 12px;
border-radius: 20px;
border: 1px solid #2a2f3d;
background-color: #1a1d26;
color: #e2e8f0;
font-size: 13px;
font-family: 'Inter', sans-serif;
outline: none;
width: 140px;
}
.topic-input:focus {
border-color: #91a4d2;
}
.topic-cancel-btn {
background: none;
border: none;
color: #5a6478;
font-size: 12px;
cursor: pointer;
}
.topic-cancel-btn:hover {
color: #e2e8f0;
}
/* ===== Settings Panel ===== */
.settings-toggle {
margin-left: auto;
}
.settings-panel {
background-color: #1a1d26;
border: 1px solid #2a2f3d;
border-radius: 12px;
padding: 20px;
margin-bottom: 24px;
}
.settings-panel-title {
font-size: 15px;
font-weight: 600;
color: #e2e8f0;
margin: 0 0 16px;
}
.settings-field {
margin-bottom: 12px;
}
.settings-field label {
display: block;
font-size: 12px;
color: #8892a8;
margin-bottom: 4px;
font-weight: 500;
}
.settings-input {
width: 100%;
max-width: 400px;
padding: 8px 12px;
border-radius: 8px;
border: 1px solid #2a2f3d;
background-color: #0f1116;
color: #e2e8f0;
font-size: 13px;
font-family: 'Inter', sans-serif;
outline: none;
}
.settings-input:focus {
border-color: #91a4d2;
}
.settings-hint {
background-color: rgba(234, 179, 8, 0.1);
border: 1px solid rgba(234, 179, 8, 0.3);
border-radius: 8px;
padding: 12px 16px;
margin-bottom: 16px;
font-size: 13px;
color: #facc15;
}
/* ===== Article Detail Panel ===== */
.article-detail-panel {
background-color: #1a1d26;
border: 1px solid #2a2f3d;
border-radius: 12px;
padding: 24px;
position: relative;
}
.article-detail-close {
position: absolute;
top: 16px;
right: 16px;
background: none;
border: 1px solid #2a2f3d;
color: #8892a8;
width: 32px;
height: 32px;
border-radius: 8px;
cursor: pointer;
font-size: 14px;
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s ease;
}
.article-detail-close:hover {
border-color: #f87171;
color: #f87171;
}
.article-detail-content {
padding-right: 40px;
}
.article-detail-title {
font-size: 22px;
font-weight: 700;
color: #f1f5f9;
margin: 0 0 12px;
line-height: 1.3;
}
.article-detail-meta {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 20px;
flex-wrap: wrap;
}
.article-detail-source {
font-size: 13px;
color: #8892a8;
display: inline-flex;
align-items: center;
gap: 6px;
}
.source-favicon {
width: 16px;
height: 16px;
border-radius: 2px;
flex-shrink: 0;
}
.article-detail-date {
font-size: 13px;
color: #5a6478;
}
.article-detail-body {
margin-bottom: 20px;
}
.article-detail-body p {
font-size: 14px;
line-height: 1.7;
color: #c8d0e0;
margin: 0;
}
.article-detail-link {
display: inline-block;
font-size: 13px;
color: #91a4d2;
text-decoration: none;
margin-bottom: 20px;
transition: color 0.15s ease;
}
.article-detail-link:hover {
color: #b4c4e8;
}
/* ---- AI Summary Bubble ---- */
.ai-summary-bubble {
margin-top: 20px;
background-color: rgba(145, 164, 210, 0.08);
border: 1px solid rgba(145, 164, 210, 0.18);
border-radius: 12px;
padding: 16px 18px;
position: relative;
}
.ai-summary-bubble-text {
font-size: 14px;
line-height: 1.65;
color: #c8d0e0;
margin: 0;
white-space: pre-wrap;
}
.ai-summary-bubble-label {
display: block;
font-size: 11px;
font-weight: 600;
color: #91a4d2;
margin-top: 12px;
text-transform: uppercase;
letter-spacing: 0.05em;
opacity: 0.6;
}
.ai-summary-bubble-loading {
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
color: #91a4d2;
font-style: italic;
}
/* Pulsing dots animation for loading states */
.ai-summary-dot-pulse {
display: flex;
gap: 4px;
}
.ai-summary-dot-pulse::before,
.ai-summary-dot-pulse::after,
.ai-summary-dot-pulse {
position: relative;
}
.ai-summary-dot-pulse::before,
.ai-summary-dot-pulse::after {
content: "";
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
background: #91a4d2;
animation: dotPulse 1.2s infinite ease-in-out;
}
.ai-summary-dot-pulse::after {
animation-delay: 0.4s;
}
@keyframes dotPulse {
0%,
80%,
100% {
opacity: 0.3;
transform: scale(0.8);
}
40% {
opacity: 1;
transform: scale(1);
}
}
/* ---- Follow-up Chat ---- */
.article-chat {
margin-top: 16px;
border-top: 1px solid #2a2f3d;
padding-top: 16px;
}
.article-chat-messages {
max-height: 300px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 10px;
margin-bottom: 12px;
padding-right: 4px;
}
.chat-msg {
max-width: 85%;
padding: 10px 14px;
border-radius: 12px;
font-size: 14px;
line-height: 1.55;
}
.chat-msg p {
margin: 0;
white-space: pre-wrap;
}
.chat-msg--user {
align-self: flex-end;
background: rgba(99, 132, 210, 0.2);
border: 1px solid rgba(99, 132, 210, 0.3);
color: #d0d8ee;
border-bottom-right-radius: 4px;
}
.chat-msg--assistant {
align-self: flex-start;
background: rgba(145, 164, 210, 0.08);
border: 1px solid rgba(145, 164, 210, 0.15);
color: #c8d0e0;
border-bottom-left-radius: 4px;
}
.chat-msg--typing {
padding: 12px 16px;
}
.article-chat-input {
display: flex;
gap: 8px;
}
.article-chat-textbox {
flex: 1;
background: #1a1e2e;
border: 1px solid #2a2f3d;
border-radius: 8px;
padding: 10px 14px;
font-size: 14px;
color: #c8d0e0;
outline: none;
transition: border-color 0.2s;
}
.article-chat-textbox:focus {
border-color: #6384d2;
}
.article-chat-textbox:disabled {
opacity: 0.5;
}
.article-chat-send {
background: #6384d2;
color: #fff;
border: none;
border-radius: 8px;
padding: 10px 18px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s;
white-space: nowrap;
}
.article-chat-send:hover:not(:disabled) {
background: #5270b8;
}
.article-chat-send:disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* ===== Providers Page ===== */
.providers-page {
max-width: 960px;
@@ -1367,9 +1887,17 @@ h1, h2, h3, h4, h5, h6 {
border-radius: 50%;
}
.tool-status--active { background-color: #4ade80; }
.tool-status--inactive { background-color: #5a6478; }
.tool-status--error { background-color: #f87171; }
.tool-status--active {
background-color: #4ade80;
}
.tool-status--inactive {
background-color: #5a6478;
}
.tool-status--error {
background-color: #f87171;
}
.tool-card-name {
font-size: 16px;
@@ -1571,8 +2099,13 @@ h1, h2, h3, h4, h5, h6 {
font-weight: 500;
}
.analytics-stat-change--up { color: #4ade80; }
.analytics-stat-change--down { color: #f87171; }
.analytics-stat-change--up {
color: #4ade80;
}
.analytics-stat-change--down {
color: #f87171;
}
/* ===== Pricing Page ===== */
.pricing-page {
@@ -1790,8 +2323,107 @@ h1, h2, h3, h4, h5, h6 {
margin-top: 24px;
}
/* ===== Dashboard Sidebar ===== */
.dashboard-sidebar {
width: 30%;
min-width: 240px;
max-width: 320px;
position: sticky;
top: 24px;
align-self: flex-start;
max-height: 80vh;
overflow-y: auto;
border-left: 1px solid #1e222d;
padding-left: 24px;
display: flex;
flex-direction: column;
gap: 24px;
}
.sidebar-section {
display: flex;
flex-direction: column;
gap: 10px;
}
.sidebar-section-title {
font-size: 12px;
font-weight: 600;
color: #5a6478;
text-transform: uppercase;
letter-spacing: 0.05em;
margin: 0;
}
.sidebar-status-row {
display: flex;
align-items: center;
gap: 8px;
}
.sidebar-status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.sidebar-status-dot--online {
background-color: #4ade80;
box-shadow: 0 0 6px rgba(74, 222, 128, 0.4);
}
.sidebar-status-dot--offline {
background-color: #f87171;
box-shadow: 0 0 6px rgba(248, 113, 113, 0.4);
}
.sidebar-status-label {
font-size: 13px;
color: #e2e8f0;
font-weight: 500;
}
.sidebar-model-list {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.sidebar-model-tag {
display: inline-block;
font-size: 11px;
font-weight: 500;
padding: 3px 10px;
border-radius: 12px;
background-color: rgba(145, 164, 210, 0.1);
color: #91a4d2;
border: 1px solid rgba(145, 164, 210, 0.2);
}
.sidebar-topic-link {
display: block;
width: 100%;
text-align: left;
background: none;
border: none;
padding: 6px 10px;
border-radius: 6px;
font-size: 13px;
font-family: 'Inter', sans-serif;
color: #8892a8;
cursor: pointer;
transition: background-color 0.15s ease, color 0.15s ease;
}
.sidebar-topic-link:hover {
background-color: rgba(145, 164, 210, 0.08);
color: #e2e8f0;
}
/* ===== Responsive: Dashboard Pages ===== */
@media (max-width: 1024px) {
.news-grid,
.tools-grid,
.pricing-grid {
@@ -1809,15 +2441,48 @@ h1, h2, h3, h4, h5, h6 {
.org-stats-bar {
flex-wrap: wrap;
}
.dashboard-sidebar {
display: none;
}
.dashboard-with-sidebar {
display: block;
}
.dashboard-split {
flex-direction: column;
}
.dashboard-left {
width: 100%;
max-height: none;
overflow-y: visible;
}
.dashboard-right {
width: 100%;
position: static;
max-height: none;
}
.news-grid--compact {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.news-grid,
.tools-grid,
.pricing-grid {
grid-template-columns: 1fr;
}
.news-grid--compact {
grid-template-columns: 1fr;
}
.chat-page {
flex-direction: column;
height: auto;
@@ -1848,4 +2513,4 @@ h1, h2, h3, h4, h5, h6 {
min-width: unset;
margin: 16px;
}
}
}