diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index 2679791..5dc9eba 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -3,11 +3,18 @@
import {
GnBadge,
GnButton,
+ GnCard,
GnCheckbox,
+ GnEmptyState,
+ GnIconButton,
GnInput,
+ GnMetricCard,
GnModal,
+ GnPageHeader,
+ GnSearchField,
GnTabs,
- GnTextarea
+ GnTextarea,
+ GnToolbar
} from "gnexus-ui-kit/vue";
import { api } from "./api";
@@ -434,14 +441,21 @@
-
- Total
- {{ total }}
-
-
- Active
- {{ activeSecrets }}
-
-
- MCP
- {{ mcpSecrets }}
-
-
-
Search
+
+
+
+
-
- Search
+
+ Search
-
+
+
-
- No secrets yet
- Create the first record using the Create button.
-
+
{{ selected?.title || "No secret selected" }}
-
+
{{ selected.status }}
Edit
@@ -606,10 +607,13 @@
-
- Select a secret
- Metadata is shown by default. Values are available through reveal.
-
+
@@ -742,13 +746,13 @@
/health
-
+
{{ diagnostics.health }}
/ready
-
+
{{ diagnostics.ready }}
@@ -765,10 +769,10 @@
{{ user.email }}
{{ user.display_name || user.id }}
-
+
{{ user.status }}
-
+
{{ user.role }}
{{ user.last_seen_at || "never" }}
@@ -780,123 +784,133 @@
-
+
-
-
Fields
-
-
-
+
+
+
Add field
-
-
-
-
+
+
+
+
Add one row per secret value. Enable encryption for passwords, tokens, PINs, and keys.
-
-
- Name copied into API and MCP responses, for example username.
-
-
-
- Actual value stored for this field.
-
+
+
- Encrypted fields cannot be searched by value.
- Encrypted fields cannot be searched by value.
+
-
-
- Remove
-
-
+ />
+
-
Available from the web interface after login.
+
Available from the web interface after login.
-
Available to external clients using API tokens.
+
Available to external clients using API tokens.
-
Available to MCP clients when token scopes allow it.
+
Available to MCP clients when token scopes allow it.
-
- Cancel
-
-
-
- Create
-
+
+ Cancel
+
+ Create
-
+
This permanently removes all secrets and versions. Audit records remain.
-
- Cancel
+
+ Cancel
Delete
-
+
This permanently deletes
{{ pendingDeleteSecret?.title }}
and all its versions. Audit records remain.
-
- Cancel
+
+ Cancel
Delete
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
index f061074..41d6df7 100644
--- a/frontend/src/styles.css
+++ b/frontend/src/styles.css
@@ -7,24 +7,7 @@
}
body {
- margin: 0;
min-width: 320px;
- background: #101018;
- color: #d6ddff;
- font-family:
- "IBM Plex Mono",
- ui-monospace,
- SFMono-Regular,
- Menlo,
- Consolas,
- monospace;
-}
-
-button,
-input,
-textarea,
-select {
- font: inherit;
}
input[type="file"] {
@@ -43,33 +26,15 @@
}
.app-header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: 24px;
- padding: 18px 20px;
- border: 1px solid #3e4665;
- background: #171824;
+ margin-bottom: 14px;
}
-.app-header h1,
.panel h2 {
margin: 0;
line-height: 1.15;
letter-spacing: 0;
}
-.app-header h1 {
- font-size: 24px;
-}
-
-.eyebrow {
- margin: 0 0 6px;
- color: #8ea2e8;
- font-size: 12px;
- text-transform: uppercase;
-}
-
.session-box {
display: flex;
align-items: center;
@@ -91,35 +56,21 @@
.metrics-row {
display: grid;
grid-template-columns: repeat(3, minmax(120px, 160px)) minmax(420px, 1fr);
- gap: 12px;
- margin-bottom: 14px;
+ gap: 15px;
+ margin-bottom: 15px;
}
-.metric,
.panel {
border: 1px solid #3e4665;
background: #1a1b28;
}
-.metric {
- display: grid;
- gap: 6px;
- min-height: 76px;
- padding: 14px 16px;
-}
-
-.metric span,
.muted,
small {
color: #9ba7cb;
}
-.metric strong {
- font-size: 24px;
- line-height: 1;
-}
-
-.metric.wide {
+.search-card {
min-width: 0;
}
@@ -303,32 +254,6 @@
grid-template-columns: repeat(2, minmax(0, 1fr));
}
-.form-field {
- display: grid;
- gap: 6px;
- min-width: 0;
-}
-
-.field-help,
-.section-help {
- margin: 0;
- color: #9ba7cb;
- line-height: 1.45;
-}
-
-.button-content {
- display: inline-flex;
- gap: 7px;
- align-items: center;
- justify-content: center;
- min-width: 0;
-}
-
-.button-content .ph {
- font-size: 1.05em;
- line-height: 1;
-}
-
.create-modal-body {
display: grid;
gap: 16px;
@@ -336,6 +261,10 @@
max-width: 100%;
}
+.modal-help {
+ margin: 0;
+}
+
.modal-section {
display: grid;
gap: 12px;