Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
242 changes: 239 additions & 3 deletions argus-frontend/src/main/resources/public/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,147 @@ main {
height: 180px;
}

/* Hotspots Section */
.hotspots-section {
background-color: var(--bg-secondary);
border: 1px solid var(--border-color);
border-radius: 8px;
margin-bottom: 1.5rem;
overflow: hidden;
}

.hotspots-section .section-header {
background-color: var(--bg-tertiary);
border-bottom: 1px solid var(--border-color);
justify-content: space-between;
}

.hotspots-section .section-header h2 {
color: var(--accent-orange);
}

.hotspots-summary {
display: flex;
gap: 2rem;
padding: 0.75rem 1.5rem;
background-color: var(--bg-tertiary);
border-bottom: 1px solid var(--border-color);
font-size: 0.875rem;
color: var(--text-secondary);
}

.hotspots-summary strong {
color: var(--text-primary);
}

.hotspots-list {
max-height: 400px;
overflow-y: auto;
padding: 0.5rem;
}

.hotspot-item {
background-color: var(--bg-tertiary);
border-radius: 6px;
padding: 1rem;
margin-bottom: 0.5rem;
border-left: 3px solid var(--accent-orange);
}

.hotspot-item:last-child {
margin-bottom: 0;
}

.hotspot-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 0.5rem;
}

.hotspot-rank {
display: flex;
align-items: center;
gap: 0.5rem;
}

.hotspot-rank-number {
background-color: var(--accent-orange);
color: var(--bg-primary);
width: 24px;
height: 24px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.75rem;
font-weight: 700;
}

.hotspot-count {
font-size: 0.875rem;
color: var(--text-secondary);
}

.hotspot-count strong {
color: var(--accent-orange);
font-size: 1rem;
}

.hotspot-percentage {
background-color: rgba(210, 153, 34, 0.2);
color: var(--accent-orange);
padding: 0.25rem 0.5rem;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 600;
}

.hotspot-frame {
font-family: 'SF Mono', SFMono-Regular, Consolas, monospace;
font-size: 0.8125rem;
color: var(--text-primary);
word-break: break-all;
margin-bottom: 0.5rem;
}

.hotspot-toggle {
background: none;
border: none;
color: var(--accent-blue);
font-size: 0.75rem;
cursor: pointer;
padding: 0;
}

.hotspot-toggle:hover {
text-decoration: underline;
}

.hotspot-stack {
display: none;
background-color: var(--bg-primary);
border-radius: 4px;
padding: 0.75rem;
margin-top: 0.5rem;
font-family: 'SF Mono', SFMono-Regular, Consolas, monospace;
font-size: 0.75rem;
color: var(--text-secondary);
white-space: pre-wrap;
word-break: break-all;
max-height: 200px;
overflow-y: auto;
}

.hotspot-stack.expanded {
display: block;
}

.btn-small {
padding: 0.25rem 0.75rem;
font-size: 0.75rem;
}

/* Pinned Section */
.pinned-section {
background-color: rgba(248, 81, 73, 0.1);
Expand Down Expand Up @@ -409,10 +550,105 @@ main {
min-height: 300px;
max-height: 500px;
overflow-y: auto;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
display: flex;
flex-direction: column;
gap: 1rem;
align-content: start;
}

/* Thread State Sections */
.thread-state-section {
background-color: var(--bg-tertiary);
border-radius: 8px;
overflow: hidden;
}

.thread-state-section.pinned {
border: 1px solid var(--accent-red);
background-color: rgba(248, 81, 73, 0.05);
}

.thread-state-section.running {
border: 1px solid var(--accent-green);
}

.thread-state-section.ended {
border: 1px solid var(--border-color);
opacity: 0.8;
}

.thread-state-header {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.75rem 1rem;
background-color: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
}

.state-indicator {
width: 10px;
height: 10px;
border-radius: 50%;
}

.state-indicator.running {
background-color: var(--accent-green);
box-shadow: 0 0 6px var(--accent-green);
}

.state-indicator.pinned {
background-color: var(--accent-red);
box-shadow: 0 0 6px var(--accent-red);
animation: pulse 1s infinite;
}

.state-indicator.ended {
background-color: var(--text-secondary);
}

.state-title {
font-weight: 600;
font-size: 0.875rem;
color: var(--text-primary);
}

.thread-state-section.pinned .state-title {
color: var(--accent-red);
}

.thread-state-section.running .state-title {
color: var(--accent-green);
}

.thread-state-section.ended .state-title {
color: var(--text-secondary);
}

.state-count {
font-size: 0.75rem;
color: var(--text-secondary);
background-color: var(--bg-tertiary);
padding: 0.125rem 0.5rem;
border-radius: 10px;
}

.thread-cards-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 0.75rem;
padding: 0.75rem;
}

.thread-duration-fill.running {
background-color: var(--accent-green);
}

.thread-duration-fill.pinned {
background-color: var(--accent-red);
}

.thread-duration-fill.ended {
background-color: var(--text-secondary);
}

.empty-state {
Expand Down
17 changes: 16 additions & 1 deletion argus-frontend/src/main/resources/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,21 @@ <h3>Thread Duration Distribution</h3>
</div>
</section>

<!-- Pinning Hotspots Section -->
<section id="hotspots-section" class="hotspots-section">
<div class="section-header">
<h2>Pinning Hotspots</h2>
<button id="refresh-hotspots" class="btn btn-small">Refresh</button>
</div>
<div class="hotspots-summary">
<span>Total Pinned: <strong id="hotspots-total">0</strong></span>
<span>Unique Locations: <strong id="hotspots-unique">0</strong></span>
</div>
<div id="hotspots-list" class="hotspots-list">
<div class="empty-state">No pinning events detected yet</div>
</div>
</section>

<!-- Pinned Alerts Section -->
<section id="pinned-section" class="pinned-section hidden">
<div class="section-header">
Expand Down Expand Up @@ -242,6 +257,6 @@ <h3>Pinned Alerts</h3>
<p>Argus Virtual Thread Profiler - Real-time JFR Event Monitoring</p>
</footer>

<script src="/js/app.js"></script>
<script type="module" src="/js/app.js"></script>
</body>
</html>
Loading
Loading