feat: add interfaces for secondary menu items with various types and functionalities

This commit is contained in:
2026-01-03 01:24:36 +00:00
parent c41268cd4e
commit 57b323b53c
23 changed files with 1069 additions and 240 deletions

View File

@@ -39,23 +39,28 @@ export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI
themeDefaultStyles,
cssManager.defaultStyles,
css`
/* TODO: Migrate hardcoded values to --dees-* CSS variables */
:host {
color: ${cssManager.bdTheme('#09090b', '#fafafa')};
/* CSS Variables aligned with secondary menu */
--activitylog-bg: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
--activitylog-fg: ${cssManager.bdTheme('#525252', '#a3a3a3')};
--activitylog-fg-muted: ${cssManager.bdTheme('#737373', '#737373')};
--activitylog-fg-active: ${cssManager.bdTheme('#0a0a0a', '#fafafa')};
--activitylog-border: ${cssManager.bdTheme('#e5e5e5', '#1a1a1a')};
--activitylog-hover: ${cssManager.bdTheme('rgba(0, 0, 0, 0.04)', 'rgba(255, 255, 255, 0.06)')};
--activitylog-accent: ${cssManager.bdTheme('#78716c', '#b5a99a')};
color: var(--activitylog-fg);
position: relative;
display: block;
width: 100%;
max-width: 320px;
height: 100%;
background: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
font-family: 'Geist Mono', monospace;
border-left: 1px solid ${cssManager.bdTheme('#e5e7eb', '#27272a')};
background: var(--activitylog-bg);
font-family: 'Geist Sans', -apple-system, BlinkMacSystemFont, sans-serif;
border-left: 1px solid var(--activitylog-border);
cursor: default;
box-shadow: ${cssManager.bdTheme(
'-4px 0 12px rgba(0, 0, 0, 0.02)',
'-4px 0 12px rgba(0, 0, 0, 0.2)'
)};
}
.maincontainer {
position: absolute;
top: 0px;
@@ -64,35 +69,61 @@ export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI
width: 100%;
}
/* Header with streaming indicator */
.topbar {
position: absolute;
top: 0px;
height: 48px;
width: 100%;
padding: 0px 16px;
background: ${cssManager.bdTheme('#ffffff', '#09090b')};
border-bottom: 1px solid ${cssManager.bdTheme('#e5e7eb', '#27272a')};
padding: 0px 12px;
background: var(--activitylog-bg);
border-bottom: 1px solid var(--activitylog-border);
display: flex;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
}
.topbar .heading {
font-weight: 600;
font-size: 14px;
font-family: 'Geist Sans', sans-serif;
color: ${cssManager.bdTheme('#09090b', '#fafafa')};
color: var(--activitylog-fg-active);
}
.live-indicator {
display: flex;
align-items: center;
gap: 6px;
font-size: 10px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--activitylog-fg-muted);
}
.live-indicator .dot {
width: 6px;
height: 6px;
background: ${cssManager.bdTheme('#22c55e', '#22c55e')};
border-radius: 50%;
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { opacity: 0.5; transform: scale(0.9); }
50% { opacity: 1; transform: scale(1.1); }
}
/* Activity container */
.activityContainer {
position: absolute;
top: 48px;
bottom: 48px;
width: 100%;
padding: 12px 0px;
padding: 8px 0;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: ${cssManager.bdTheme('#e5e7eb', '#27272a')} transparent;
scrollbar-color: ${cssManager.bdTheme('#d4d4d4', '#333333')} transparent;
}
.activityContainer::-webkit-scrollbar {
@@ -104,82 +135,53 @@ export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI
}
.activityContainer::-webkit-scrollbar-thumb {
background: ${cssManager.bdTheme('#e5e7eb', '#27272a')};
background: ${cssManager.bdTheme('#d4d4d4', '#333333')};
border-radius: 3px;
}
.activityContainer::-webkit-scrollbar-thumb:hover {
background: ${cssManager.bdTheme('#d4d4d8', '#3f3f46')};
background: ${cssManager.bdTheme('#a3a3a3', '#525252')};
}
.empty-state {
font-size: 13px;
text-align: center;
padding: 32px 16px;
color: ${cssManager.bdTheme('#71717a', '#71717a')};
font-family: 'Geist Sans', sans-serif;
}
.streamingIndicator {
font-size: 11px;
text-align: center;
padding: 16px;
color: ${cssManager.bdTheme('#71717a', '#71717a')};
font-family: 'Geist Sans', sans-serif;
text-transform: uppercase;
letter-spacing: 0.05em;
font-weight: 500;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.streamingIndicator::before {
content: '';
width: 6px;
height: 6px;
background: ${cssManager.bdTheme('#3b82f6', '#3b82f6')};
border-radius: 50%;
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { opacity: 0.4; transform: scale(0.8); }
50% { opacity: 1; transform: scale(1.2); }
padding: 40px 16px;
color: var(--activitylog-fg-muted);
}
/* Date separator - warm taupe styling */
.date-separator {
padding: 12px 16px 8px;
font-size: 11px;
padding: 12px 12px 6px;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: ${cssManager.bdTheme('#71717a', '#71717a')};
background: ${cssManager.bdTheme('#f9fafb', '#09090b')};
border-bottom: 1px solid ${cssManager.bdTheme('#f4f4f5', '#18181b')};
letter-spacing: 0.5px;
color: var(--activitylog-accent);
position: sticky;
top: 0;
z-index: 1;
background: var(--activitylog-bg);
}
/* Activity entry - modern stacked layout */
.activityentry {
min-height: 36px;
font-size: 13px;
padding: 10px 16px;
border-bottom: 1px solid ${cssManager.bdTheme('#f4f4f5', '#18181b')};
transition: all 0.15s ease;
font-size: 12px;
padding: 8px 12px;
margin: 2px 4px;
border-radius: 6px;
transition: background 0.15s ease;
display: flex;
align-items: center;
gap: 8px;
align-items: flex-start;
gap: 10px;
line-height: 1.4;
animation: fadeIn 0.3s ease-out;
animation: fadeIn 0.2s ease-out;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(-4px);
transform: translateY(-2px);
}
to {
opacity: 1;
@@ -187,88 +189,109 @@ export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI
}
}
.activityentry:last-of-type {
border-bottom: none;
}
.activityentry:hover {
background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
}
.timestamp {
color: ${cssManager.bdTheme('#71717a', '#71717a')};
font-weight: 500;
font-size: 12px;
font-variant-numeric: tabular-nums;
flex-shrink: 0;
min-width: 45px;
background: var(--activitylog-hover);
}
.activity-icon {
width: 28px;
height: 28px;
border-radius: 6px;
background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.04)', 'rgba(255, 255, 255, 0.06)')};
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
font-size: 14px;
font-size: 13px;
color: var(--activitylog-fg-muted);
margin-top: 1px;
}
.activity-icon.login {
background: ${cssManager.bdTheme('rgba(34, 197, 94, 0.1)', 'rgba(34, 197, 94, 0.1)')};
color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
background: ${cssManager.bdTheme('rgba(34, 197, 94, 0.08)', 'rgba(34, 197, 94, 0.12)')};
color: ${cssManager.bdTheme('#16a34a', '#4ade80')};
}
.activity-icon.logout {
background: ${cssManager.bdTheme('rgba(239, 68, 68, 0.1)', 'rgba(239, 68, 68, 0.1)')};
color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
background: ${cssManager.bdTheme('rgba(239, 68, 68, 0.08)', 'rgba(239, 68, 68, 0.12)')};
color: ${cssManager.bdTheme('#dc2626', '#f87171')};
}
.activity-icon.view {
background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.1)', 'rgba(59, 130, 246, 0.1)')};
color: ${cssManager.bdTheme('#2563eb', '#3b82f6')};
background: ${cssManager.bdTheme('rgba(59, 130, 246, 0.08)', 'rgba(59, 130, 246, 0.12)')};
color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
}
.activity-icon.create {
background: ${cssManager.bdTheme('rgba(168, 85, 247, 0.1)', 'rgba(168, 85, 247, 0.1)')};
color: ${cssManager.bdTheme('#9333ea', '#a855f7')};
background: ${cssManager.bdTheme('rgba(168, 85, 247, 0.08)', 'rgba(168, 85, 247, 0.12)')};
color: ${cssManager.bdTheme('#9333ea', '#c084fc')};
}
.activity-icon.update {
background: ${cssManager.bdTheme('rgba(251, 146, 60, 0.1)', 'rgba(251, 146, 60, 0.1)')};
background: ${cssManager.bdTheme('rgba(251, 146, 60, 0.08)', 'rgba(251, 146, 60, 0.12)')};
color: ${cssManager.bdTheme('#ea580c', '#fb923c')};
}
.activity-icon.delete {
background: ${cssManager.bdTheme('rgba(239, 68, 68, 0.1)', 'rgba(239, 68, 68, 0.1)')};
color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
background: ${cssManager.bdTheme('rgba(239, 68, 68, 0.08)', 'rgba(239, 68, 68, 0.12)')};
color: ${cssManager.bdTheme('#dc2626', '#f87171')};
}
.activity-icon.custom {
background: ${cssManager.bdTheme('rgba(100, 116, 139, 0.1)', 'rgba(100, 116, 139, 0.1)')};
background: ${cssManager.bdTheme('rgba(100, 116, 139, 0.08)', 'rgba(100, 116, 139, 0.12)')};
color: ${cssManager.bdTheme('#475569', '#94a3b8')};
}
.activity-text {
.activity-content {
flex: 1;
color: ${cssManager.bdTheme('#18181b', '#e4e4e7')};
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.activity-header {
display: flex;
align-items: center;
gap: 6px;
}
.activity-user {
font-weight: 600;
color: ${cssManager.bdTheme('#09090b', '#fafafa')};
font-size: 12px;
color: var(--activitylog-fg-active);
}
.activity-separator {
color: var(--activitylog-fg-muted);
font-size: 10px;
}
.timestamp {
color: var(--activitylog-fg-muted);
font-weight: 400;
font-size: 11px;
font-variant-numeric: tabular-nums;
font-family: 'Geist Mono', monospace;
}
.activity-message {
color: var(--activitylog-fg);
font-size: 12px;
line-height: 1.5;
word-break: break-word;
}
/* Search box - refined styling */
.searchbox {
position: absolute;
bottom: 0px;
width: 100%;
height: 48px;
background: ${cssManager.bdTheme('#ffffff', '#09090b')};
border-top: 1px solid ${cssManager.bdTheme('#e5e7eb', '#27272a')};
padding: 8px;
background: var(--activitylog-bg);
border-top: 1px solid var(--activitylog-border);
padding: 8px 12px;
box-sizing: border-box;
}
.search-wrapper {
@@ -282,64 +305,37 @@ export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI
left: 10px;
top: 50%;
transform: translateY(-50%);
color: ${cssManager.bdTheme('#71717a', '#71717a')};
font-size: 14px;
color: var(--activitylog-fg-muted);
font-size: 13px;
pointer-events: none;
transition: color 0.15s ease;
}
.searchbox input {
color: ${cssManager.bdTheme('#09090b', '#fafafa')};
background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
color: var(--activitylog-fg-active);
background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.03)', 'rgba(255, 255, 255, 0.04)')};
width: 100%;
height: 100%;
border: 1px solid ${cssManager.bdTheme('#e5e7eb', '#27272a')};
border: 1px solid ${cssManager.bdTheme('rgba(0, 0, 0, 0.08)', 'rgba(255, 255, 255, 0.08)')};
border-radius: 6px;
padding: 0 12px 0 36px;
padding: 0 12px 0 34px;
font-family: 'Geist Sans', sans-serif;
font-size: 13px;
font-size: 12px;
transition: all 0.15s ease;
}
.searchbox input::placeholder {
color: ${cssManager.bdTheme('#71717a', '#71717a')};
color: var(--activitylog-fg-muted);
}
.searchbox input:focus {
outline: none;
border-color: ${cssManager.bdTheme('#3b82f6', '#3b82f6')};
box-shadow: 0 0 0 3px ${cssManager.bdTheme('rgba(59, 130, 246, 0.1)', 'rgba(59, 130, 246, 0.1)')};
border-color: ${cssManager.bdTheme('rgba(0, 0, 0, 0.15)', 'rgba(255, 255, 255, 0.15)')};
background: ${cssManager.bdTheme('rgba(0, 0, 0, 0.02)', 'rgba(255, 255, 255, 0.06)')};
}
.searchbox input:focus ~ .search-icon,
.search-wrapper:has(input:focus) .search-icon {
color: ${cssManager.bdTheme('#3b82f6', '#3b82f6')};
}
.bottomShadow {
position: absolute;
width: 100%;
height: 24px;
bottom: 48px;
background: ${cssManager.bdTheme(
'linear-gradient(180deg, transparent 0%, #fafafa 100%)',
'linear-gradient(180deg, transparent 0%, #0a0a0a 100%)'
)};
pointer-events: none;
opacity: 0.8;
}
.topShadow {
position: absolute;
width: 100%;
height: 24px;
top: 48px;
background: ${cssManager.bdTheme(
'linear-gradient(0deg, transparent 0%, #fafafa 100%)',
'linear-gradient(0deg, transparent 0%, #0a0a0a 100%)'
)};
pointer-events: none;
opacity: 0.8;
color: var(--activitylog-fg);
}
`,
];
@@ -355,12 +351,11 @@ export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI
<div class="maincontainer">
<div class="topbar">
<div class="heading">Activity Log</div>
${filteredEntries.length > 0
? html`<div class="live-indicator"><span class="dot"></span>Live</div>`
: ''}
</div>
<div class="activityContainer">
${filteredEntries.length > 0
? html`<div class="streamingIndicator">Live Updates</div>`
: ''}
${filteredEntries.length === 0
? html`<div class="empty-state">No activity entries</div>`
: groupedEntries.map(
@@ -381,8 +376,6 @@ export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI
/>
</div>
</div>
<div class="topShadow"></div>
<div class="bottomShadow"></div>
</div>
`;
}
@@ -397,12 +390,16 @@ export class DeesAppuiActivitylog extends DeesElement implements IActivityLogAPI
class="activityentry"
@contextmenu=${(e: MouseEvent) => this.handleContextMenu(e, entry)}
>
<span class="timestamp">${timeStr}</span>
<div class="activity-icon ${entry.type}">
<dees-icon .icon=${iconName}></dees-icon>
</div>
<div class="activity-text">
<span class="activity-user">${entry.user}</span> ${entry.message}
<div class="activity-content">
<div class="activity-header">
<span class="activity-user">${entry.user}</span>
<span class="activity-separator">·</span>
<span class="timestamp">${timeStr}</span>
</div>
<div class="activity-message">${entry.message}</div>
</div>
</div>
`;