diff --git a/frontend/src/components/DevicePosture.svelte b/frontend/src/components/DevicePosture.svelte index 4757833..efee1d3 100644 --- a/frontend/src/components/DevicePosture.svelte +++ b/frontend/src/components/DevicePosture.svelte @@ -489,6 +489,8 @@ flex-direction: column; overflow: hidden; min-height: 0; + padding: 0.65rem; + gap: 0.5rem; } .content-frame { @@ -499,8 +501,9 @@ display: flex; flex-direction: column; min-height: 0; - margin-top: 8px; background: white; + padding: 1rem; + gap: 0.75rem; } /* Filter sidebar — canonical from template */ @@ -543,7 +546,8 @@ /* Active filter chips */ .active-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; - margin-bottom: 8px; padding: 0.5rem 0.75rem; flex-shrink: 0; + margin-bottom: 1rem; padding: 0.6rem 1rem; + background: #f0f4ff; border: 1px solid #d0d9f0; border-radius: 8px; flex-shrink: 0; } .active-filters-label { font-size: var(--font-size-tiny); font-weight: 600; color: #555; margin-right: 0.25rem; } .filter-tag { @@ -563,10 +567,10 @@ /* Toolbar */ .page-main { - flex: 1; overflow-y: auto; padding: 16px 24px 24px; + flex: 1; overflow-y: auto; min-width: 0; display: flex; flex-direction: column; } - .toolbar { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; flex-shrink: 0; } + .toolbar { display: flex; align-items: center; justify-content: space-between; flex-shrink: 0; } .toolbar-count { font-size: var(--font-size-body-sm); color: #6b7280; } .header-controls { display: flex; align-items: center; gap: 0.5rem; flex-shrink: 0; } .btn-manual-refresh { diff --git a/frontend/src/components/IocManagement.svelte b/frontend/src/components/IocManagement.svelte index 20a4f67..aabf27d 100644 --- a/frontend/src/components/IocManagement.svelte +++ b/frontend/src/components/IocManagement.svelte @@ -223,7 +223,7 @@
- {filteredIocs.length} IOC{filteredIocs.length !== 1 ? 's' : ''} + {filteredIocs.length} IOC{filteredIocs.length !== 1 ? 's' : ''}
@@ -371,14 +371,16 @@ .page-right { flex: 1; display: flex; flex-direction: column; overflow: hidden; min-height: 0; + padding: 0.65rem; gap: 0.5rem; } .content-frame { flex: 1; border: 1px solid #e5e7eb; border-radius: 8px; overflow: hidden; display: flex; flex-direction: column; - min-height: 0; margin-top: 8px; background: white; + min-height: 0; background: white; + padding: 1rem; gap: 0.75rem; } .page-main { - flex: 1; overflow-y: auto; padding: 16px 24px 24px; + flex: 1; overflow-y: auto; min-width: 0; display: flex; flex-direction: column; } @@ -435,7 +437,8 @@ /* Active filter chips */ .active-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; - margin-bottom: 0; padding: 0.5rem 0.75rem; flex-shrink: 0; + margin-bottom: 1rem; padding: 0.6rem 1rem; + background: #f0f4ff; border: 1px solid #d0d9f0; border-radius: 8px; flex-shrink: 0; } .active-filters-label { font-size: var(--font-size-tiny); font-weight: 600; color: #555; margin-right: 0.25rem; } .filter-tag { @@ -454,9 +457,9 @@ .filter-tag-remove:hover { background: #f44336; color: white; } /* Toolbar */ - .toolbar { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; flex-shrink: 0; } + .toolbar { display: flex; align-items: center; justify-content: space-between; flex-shrink: 0; } .toolbar-right { display: flex; gap: 0.5rem; } - .count { color: #6b7280; font-size: var(--font-size-body-sm); } + .toolbar-count { color: #6b7280; font-size: var(--font-size-body-sm); } /* Table */ .table-card { @@ -552,7 +555,7 @@ :global(.dark-mode) .filter-tag { background: #1f2937; border-color: #374151; border-left-color: #3b82f6; color: #e5e5e5; } :global(.dark-mode) .filter-tag-remove { background: #374151; color: #e5e7eb; } - :global(.dark-mode) .count { color: #9ca3af; } + :global(.dark-mode) .toolbar-count { color: #9ca3af; } :global(.dark-mode) .table-card { background: #1f2937; } :global(.dark-mode) thead { background: #111827; } :global(.dark-mode) th { background: #111827; color: #9ca3af; border-bottom-color: #374151; } diff --git a/frontend/src/components/PrecursorAlerts.svelte b/frontend/src/components/PrecursorAlerts.svelte index c29c2e3..bfdb60d 100644 --- a/frontend/src/components/PrecursorAlerts.svelte +++ b/frontend/src/components/PrecursorAlerts.svelte @@ -467,6 +467,8 @@ flex-direction: column; overflow: hidden; min-height: 0; + padding: 0.65rem; + gap: 0.5rem; } .content-frame { @@ -477,8 +479,9 @@ display: flex; flex-direction: column; min-height: 0; - margin-top: 8px; background: white; + padding: 1rem; + gap: 0.75rem; } /* Filter sidebar — canonical from template */ @@ -523,7 +526,8 @@ /* Active filter chips */ .active-filters { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; - margin-bottom: 8px; padding: 0.5rem 0.75rem; flex-shrink: 0; + margin-bottom: 1rem; padding: 0.6rem 1rem; + background: #f0f4ff; border: 1px solid #d0d9f0; border-radius: 8px; flex-shrink: 0; } .active-filters-label { font-size: var(--font-size-tiny); font-weight: 600; color: #555; margin-right: 0.25rem; } .filter-tag { @@ -543,10 +547,10 @@ /* Toolbar */ .page-main { - flex: 1; overflow-y: auto; padding: 16px 24px 24px; + flex: 1; overflow-y: auto; min-width: 0; display: flex; flex-direction: column; } - .toolbar { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; flex-shrink: 0; } + .toolbar { display: flex; align-items: center; justify-content: space-between; flex-shrink: 0; } .toolbar-count { font-size: var(--font-size-body-sm); color: #6b7280; } .header-controls { display: flex; align-items: center; gap: 0.5rem; flex-shrink: 0; } diff --git a/frontend/src/components/ThreatEvents.svelte b/frontend/src/components/ThreatEvents.svelte index 5d94acf..19d8ed0 100644 --- a/frontend/src/components/ThreatEvents.svelte +++ b/frontend/src/components/ThreatEvents.svelte @@ -121,7 +121,7 @@ onDestroy(() => clearInterval(tickInterval)); -
+

Threat Events

@@ -203,19 +203,19 @@
-
+
{#if hasActiveFilters}
Filters: {#if severityFilter} - + Severity: {severityFilter} {/if} {#if deviceSearch} - + Device: {deviceSearch} @@ -224,52 +224,58 @@
{/if} -
- { page = e.detail.page; load(); }} - on:pageSizeChange={e => { size = e.detail.size; page = 0; load(); }} /> -
- {#if loading} -
Loading…
- {:else if events.length === 0} -
No threat events found{hasActiveFilters ? ' matching current filters' : ''}.
- {:else} - - - - - - - - - - - - - {#each events as ev (ev.id)} +
+
+ {totalElements} event{totalElements !== 1 ? 's' : ''} +
+
+
+ { page = e.detail.page; load(); }} + on:pageSizeChange={e => { size = e.detail.size; page = 0; load(); }} /> +
+ {#if loading} +
Loading…
+ {:else if events.length === 0} +
No threat events found{hasActiveFilters ? ' matching current filters' : ''}.
+ {:else} +
SeveritySignalDeviceAttack PhaseIOC MatchDetected
+ - - - - - - + + + + + + - {/each} - -
- - {ev.severity} - - {fmtSignal(ev.signalKey)}{ev.deviceAgentId ?? '—'}{ev.attackPhase ? PHASE_LABEL[ev.attackPhase] ?? ev.attackPhase : '—'} - {#if ev.matchedIoc} - {ev.matchedIoc.iocType} - {ev.matchedIoc.value} - {:else} - - {/if} - {fmt(ev.detectedAt)}SeveritySignalDeviceAttack PhaseIOC MatchDetected
- {/if} + + + {#each events as ev (ev.id)} + + + + {ev.severity} + + + {fmtSignal(ev.signalKey)} + {ev.deviceAgentId ?? '—'} + {ev.attackPhase ? PHASE_LABEL[ev.attackPhase] ?? ev.attackPhase : '—'} + + {#if ev.matchedIoc} + {ev.matchedIoc.iocType} + {ev.matchedIoc.value} + {:else} + + {/if} + + {fmt(ev.detectedAt)} + + {/each} + + + {/if} +
@@ -277,7 +283,7 @@