Files
Sovran_SystemsOS/app/sovran_systemsos_web/static/css/modals.css
T
naturallaw777andarena-agent aa4ffaa803 Rename NWC feature to Lightning Wallet Connections and split modal into tabs
Naming: user-facing 'Wallet Connections' -> 'Lightning Wallet Connections'
across the Hub, feature registry, tile, and NixOS modules. Internal ids
(nwc-wallets, albyhub.service, /api/nwc/*) are unchanged.

UX: the service-detail modal put status, domain diagnostics, router ports,
the enable/disable toggle, restart, the liquidity guide and the whole wallet
manager in one cramped scrolling column. For this feature the modal is now
980px wide and split into two tabs:

  - Wallets: wallet grid, create/share/verify flows, collapsible liquidity guide
  - Service & Setup: description, status, domain checklist, ports, enable, restart

A status dot and domain chip sit in the tab bar so state is visible from both
tabs, and the modal opens on Setup when the service is off or the Lightning
Address domain is unconfigured. Wallet cards gain a balance chip, pending
badge, a prominent address row, and separated destructive actions.

Non-NWC services keep the original single-column layout and width.

Co-authored-by: arena-agent <297053741+arena-agent@users.noreply.github.com>
2026-07-29 01:59:28 +00:00

1005 lines
19 KiB
CSS

/* ── Update modal ────────────────────────────────────────────────── */
.modal-overlay {
display: none;
position: fixed;
inset: 0;
background-color: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
z-index: 200;
align-items: center;
justify-content: center;
}
.modal-overlay.open {
display: flex;
}
.modal-dialog {
background-color: rgba(14, 16, 15, 0.8);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
width: 90vw;
max-width: 900px;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.6);
}
.modal-header {
display: flex;
align-items: center;
padding: 16px 20px;
border-bottom: 1px solid var(--border-color);
gap: 12px;
}
.modal-title {
font-size: 1rem;
font-weight: 700;
flex: 1;
}
.modal-status {
font-size: 0.85rem;
color: var(--text-secondary);
}
.modal-spinner {
width: 18px;
height: 18px;
border: 2.5px solid var(--border-color);
border-top-color: var(--accent-color);
border-radius: 50%;
animation: spin 0.75s linear infinite;
display: none;
}
.modal-spinner.spinning {
display: block;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.modal-log {
flex: 1;
overflow-y: auto;
padding: 12px 16px;
font-family: 'JetBrains Mono', 'Fira Code', 'Source Code Pro', monospace;
font-size: 0.78rem;
line-height: 1.6;
color: var(--text-primary);
background-color: #0c0f0e;
white-space: pre-wrap;
word-break: break-all;
min-height: 200px;
}
.modal-footer {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 10px;
padding: 12px 20px;
border-top: 1px solid var(--border-color);
}
/* Reboot = GREEN */
.modal-footer .btn-reboot,
button.btn-reboot {
background-color: #6DBF8B;
color: #fff;
}
.modal-footer .btn-reboot:hover:not(:disabled),
button.btn-reboot:hover:not(:disabled) {
background-color: #529E7E;
}
/* Restart = AMBER (manual restart action) */
.btn-restart-amber {
background-color: #b87d00;
color: #fff;
}
.btn-restart-amber:hover:not(:disabled) {
background-color: #9a6800;
}
/* Restart conflict warning box */
.restart-conflict-box {
background-color: rgba(180, 100, 0, 0.12);
border-left: 3px solid #c97a00;
border-radius: 6px;
padding: 12px 14px;
margin-bottom: 14px;
}
.restart-conflict-title {
font-size: 0.88rem;
font-weight: 700;
color: #e69000;
margin: 0 0 6px 0;
}
.restart-conflict-desc {
font-size: 0.83rem;
color: var(--text-secondary);
line-height: 1.5;
margin: 0;
}
/* Reboot error card actions row */
.reboot-error-actions {
display: flex;
gap: 12px;
justify-content: center;
flex-wrap: wrap;
margin-top: 20px;
}
.btn-save {
background-color: var(--yellow);
color: #0A1A10;
}
.btn-save:hover:not(:disabled) {
background-color: #c98d08;
}
.btn-close-modal {
background-color: var(--border-color);
color: var(--text-primary);
}
.btn-close-modal:hover:not(:disabled) {
background-color: #1c2a24;
}
/* ── Credentials info modal ──────────────────────────────────────── */
.creds-dialog {
background-color: rgba(14, 16, 15, 0.8);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
width: 90vw;
max-width: 700px;
max-height: 85vh;
display: flex;
flex-direction: column;
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.6);
animation: creds-fade-in 0.2s ease-out;
}
@keyframes creds-fade-in {
from { opacity: 0; transform: scale(0.95) translateY(8px); }
to { opacity: 1; transform: scale(1) translateY(0); }
}
.creds-header {
display: flex;
align-items: center;
padding: 20px 28px;
border-bottom: 1px solid var(--border-color);
}
.creds-title {
font-size: 1.15rem;
font-weight: 700;
flex: 1;
display: flex;
align-items: center;
gap: 10px;
}
.creds-title-icon {
width: 28px;
height: 28px;
vertical-align: middle;
border-radius: 6px;
flex-shrink: 0;
}
.creds-close-btn {
background: none;
color: var(--text-secondary);
font-size: 1.3rem;
padding: 4px 8px;
border-radius: 6px;
cursor: pointer;
border: none;
}
.creds-close-btn:hover {
background-color: var(--border-color);
color: var(--text-primary);
}
.creds-dialog--wide {
max-width: 980px;
}
.creds-body {
padding: 24px 28px;
overflow-y: auto;
}
.creds-loading {
color: var(--text-dim);
text-align: center;
padding: 24px 0;
}
.creds-row {
margin-bottom: 20px;
}
.creds-row:last-child {
margin-bottom: 0;
}
.creds-label {
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--text-dim);
margin-bottom: 6px;
}
.creds-value-wrap {
display: flex;
align-items: flex-start;
gap: 10px;
}
.creds-value {
flex: 1;
font-family: 'JetBrains Mono', 'Fira Code', 'Source Code Pro', monospace;
font-size: 0.92rem;
color: var(--text-primary);
background-color: #0c0f0e;
padding: 12px 16px;
border-radius: 8px;
word-break: break-all;
white-space: pre-wrap;
line-height: 1.6;
border: 1px solid var(--border-color);
}
.creds-copy-btn {
background-color: var(--border-color);
color: var(--text-primary);
font-size: 0.78rem;
font-weight: 600;
padding: 8px 14px;
border-radius: 6px;
cursor: pointer;
border: none;
white-space: nowrap;
flex-shrink: 0;
align-self: flex-start;
margin-top: 10px;
}
.creds-copy-btn:hover {
background-color: #1c2a24;
}
.creds-copy-btn.copied {
background-color: var(--green);
color: #fff;
}
.creds-empty {
color: var(--text-dim);
text-align: center;
padding: 24px 0;
font-size: 0.88rem;
}
/* ── Credential links ────────────────────────────────────────────── */
.creds-link {
color: #b8f0c0;
text-decoration: none;
word-break: break-all;
}
.creds-link:hover {
text-decoration: underline;
color: #defce6;
}
/* ── Matrix action buttons ───────────────────────────────────────── */
.matrix-actions-divider {
border: none;
border-top: 1px solid var(--border-color);
margin: 18px 0 14px;
}
.matrix-actions-row {
display: flex;
gap: 12px;
flex-wrap: wrap;
}
.matrix-action-btn {
background-color: var(--accent-color);
color: #0A1A10;
font-size: 0.88rem;
font-weight: 700;
padding: 10px 18px;
border-radius: 8px;
border: none;
cursor: pointer;
flex: 1;
min-width: 140px;
}
.matrix-action-btn:hover {
background-color: #7CC4A0;
}
.matrix-form-group {
margin-bottom: 14px;
}
.matrix-form-label {
display: block;
font-size: 0.82rem;
color: var(--text-secondary);
margin-bottom: 6px;
font-weight: 600;
}
.matrix-form-input {
width: 100%;
background-color: #0c0f0e;
color: var(--text-primary);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 10px 12px;
font-size: 0.9rem;
box-sizing: border-box;
}
.matrix-form-input:focus {
outline: none;
border-color: var(--accent-color);
}
.matrix-form-checkbox-row {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 14px;
}
.matrix-form-checkbox-row input[type="checkbox"] {
width: 16px;
height: 16px;
accent-color: var(--accent-color);
}
.matrix-form-actions {
display: flex;
gap: 10px;
margin-top: 18px;
}
.matrix-form-submit {
background-color: var(--accent-color);
color: #0A1A10;
font-size: 0.88rem;
font-weight: 700;
padding: 10px 20px;
border-radius: 8px;
border: none;
cursor: pointer;
flex: 1;
}
.matrix-form-submit:hover:not(:disabled) {
background-color: #7CC4A0;
}
.matrix-form-submit:disabled {
opacity: 0.6;
cursor: default;
}
.matrix-form-back {
background-color: var(--border-color);
color: var(--text-primary);
font-size: 0.88rem;
font-weight: 600;
padding: 10px 20px;
border-radius: 8px;
border: none;
cursor: pointer;
}
.matrix-form-back:hover {
background-color: #1c2a24;
}
.matrix-form-result {
margin-top: 14px;
padding: 12px 16px;
border-radius: 8px;
font-size: 0.88rem;
line-height: 1.5;
display: none;
}
.matrix-form-result.success {
background-color: rgba(109, 191, 139, 0.12);
border: 1px solid var(--green);
color: var(--green);
display: block;
}
.matrix-form-result.error {
background-color: rgba(239, 68, 68, 0.12);
border: 1px solid #ef4444;
color: #f87171;
display: block;
}
/* ── QR code in credentials modal ────────────────────────────────── */
.creds-qr-wrap {
display: flex;
flex-direction: column;
align-items: center;
padding: 20px 0;
margin-bottom: 10px;
}
.creds-qr-img {
width: 240px;
height: 240px;
border-radius: 12px;
border: 4px solid #fff;
background-color: #fff;
image-rendering: pixelated;
box-shadow: 0 4px 16px rgba(0,0,0,0.4);
}
.creds-qr-hint {
margin-top: 10px;
font-size: 0.82rem;
color: var(--text-secondary);
font-style: italic;
}
.nwc-secret-warning {
margin: 0 0 14px;
padding: 10px 12px;
border-radius: 8px;
border: 1px solid #f59e0b;
background: rgba(245, 158, 11, 0.12);
color: #fbbf24;
font-size: 0.86rem;
}
/* ── Lightning Wallet Connections: tabbed shell ─────────────────── */
.nwc-tabs-bar {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
margin: -6px 0 20px;
padding-bottom: 12px;
border-bottom: 1px solid var(--border-color);
}
.nwc-tabs-btns {
display: flex;
gap: 4px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--border-color);
border-radius: 10px;
padding: 4px;
}
.nwc-tab-btn {
background: none;
border: none;
color: var(--text-secondary);
font-size: 0.86rem;
font-weight: 600;
padding: 8px 16px;
border-radius: 7px;
cursor: pointer;
white-space: nowrap;
transition: background-color 0.15s ease, color 0.15s ease;
}
.nwc-tab-btn:hover:not(.active) {
color: var(--text-primary);
background: rgba(255, 255, 255, 0.04);
}
.nwc-tab-btn.active {
background: var(--accent-color);
color: #0A1A10;
}
.nwc-header-chips {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.nwc-header-chip {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 0.75rem;
color: var(--text-secondary);
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--border-color);
border-radius: 999px;
padding: 4px 10px;
max-width: 260px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.nwc-header-chip--domain {
font-family: 'JetBrains Mono', 'Fira Code', 'Source Code Pro', monospace;
font-size: 0.72rem;
}
.nwc-header-chip--warn {
border-color: rgba(245, 158, 11, 0.5);
color: #fbbf24;
}
.nwc-tab-panel {
display: none;
}
.nwc-tab-panel.active {
display: block;
animation: nwc-tab-fade 0.16s ease-out;
}
@keyframes nwc-tab-fade {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
/* Setup tab: first section shouldn't double up on top padding */
#nwc-tab-setup .svc-detail-section:first-child {
padding-top: 0;
margin-top: 0;
border-top: none;
}
.nwc-tab-intro {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
margin-bottom: 16px;
}
.nwc-tab-intro-title {
font-size: 1rem;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 4px;
}
.nwc-tab-intro-desc {
margin: 0;
font-size: 0.85rem;
line-height: 1.5;
color: var(--text-secondary);
max-width: 62ch;
}
/* ── Wallet toolbar ─────────────────────────────────────────────── */
.nwc-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 14px;
}
.nwc-toolbar-count {
font-size: 0.78rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--text-dim);
}
.nwc-toolbar-actions {
display: flex;
align-items: center;
gap: 8px;
}
.nwc-toolbar-actions .matrix-action-btn,
.nwc-toolbar-actions .matrix-form-back {
padding: 8px 14px;
font-size: 0.82rem;
}
/* ── Domain-required callout ────────────────────────────────────── */
.nwc-domain-required {
border: 1px solid rgba(245, 158, 11, 0.4);
background: rgba(245, 158, 11, 0.08);
border-radius: 10px;
padding: 14px 16px;
margin-bottom: 16px;
font-size: 0.86rem;
color: var(--text-primary);
}
.nwc-domain-required-body {
margin-top: 6px;
color: var(--text-secondary);
line-height: 1.5;
}
.nwc-domain-required-btn {
margin-top: 12px;
}
/* ── Empty / disabled states ────────────────────────────────────── */
.nwc-empty-state,
.nwc-disabled-state {
text-align: center;
padding: 36px 24px;
border: 1px dashed var(--border-color);
border-radius: 12px;
background: rgba(255, 255, 255, 0.015);
}
.nwc-empty-icon,
.nwc-disabled-icon {
font-size: 2rem;
margin-bottom: 10px;
}
.nwc-empty-title,
.nwc-disabled-title {
font-size: 1rem;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 6px;
}
.nwc-empty-desc,
.nwc-disabled-desc {
margin: 0 auto 14px;
max-width: 46ch;
font-size: 0.86rem;
line-height: 1.55;
color: var(--text-secondary);
}
/* ── Wallet cards ───────────────────────────────────────────────── */
.nwc-wallet-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 12px;
margin-top: 12px;
}
.nwc-wallet-card {
border: 1px solid var(--border-color);
border-radius: 12px;
padding: 14px 16px;
background: rgba(255, 255, 255, 0.02);
display: flex;
flex-direction: column;
transition: border-color 0.15s ease;
}
.nwc-wallet-card:hover {
border-color: rgba(255, 255, 255, 0.16);
}
.nwc-wallet-card-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 10px;
margin-bottom: 12px;
}
.nwc-wallet-card-title {
font-weight: 700;
font-size: 0.95rem;
color: var(--text-primary);
word-break: break-word;
}
.nwc-wallet-chips {
display: flex;
gap: 6px;
flex-wrap: wrap;
justify-content: flex-end;
flex-shrink: 0;
}
.nwc-wallet-chip {
display: inline-flex;
align-items: center;
font-size: 0.72rem;
font-weight: 700;
border-radius: 999px;
padding: 4px 10px;
white-space: nowrap;
}
.nwc-wallet-chip--balance {
background: rgba(109, 191, 139, 0.14);
color: var(--green);
font-family: 'JetBrains Mono', 'Fira Code', 'Source Code Pro', monospace;
}
.nwc-wallet-chip--pending {
background: rgba(245, 158, 11, 0.14);
color: #fbbf24;
}
.nwc-wallet-address {
margin-bottom: 4px;
}
.nwc-wallet-address .creds-value {
font-size: 0.82rem;
padding: 9px 12px;
}
.nwc-wallet-address .creds-copy-btn {
margin-top: 5px;
padding: 7px 12px;
}
.nwc-wallet-actions {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
margin-top: 12px;
padding-top: 12px;
border-top: 1px solid var(--border-color);
}
.nwc-wallet-actions-spacer {
flex: 1;
min-width: 0;
}
.nwc-wallet-actions .matrix-form-back,
.nwc-wallet-actions .btn-close-modal,
.nwc-wallet-actions .matrix-action-btn {
padding: 7px 12px;
font-size: 0.8rem;
}
.nwc-wallet-danger-btn {
color: #f08a8a;
}
.nwc-wallet-danger-btn:hover:not(:disabled) {
background-color: rgba(220, 80, 80, 0.14);
color: #ff9d9d;
}
/* ── NWC LNURL share / download view ───────────────────────────── */
.nwc-share-actions {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-top: 14px;
}
.nwc-share-actions .matrix-form-back,
.nwc-share-actions .matrix-form-submit {
padding: 8px 12px;
font-size: 0.82rem;
}
.nwc-lnurl-value {
font-size: 0.72rem;
word-break: break-all;
}
.nwc-share-formats-hint {
text-align: center;
}
/* ── NWC Liquidity Guide (collapsible) ──────────────────────────── */
.nwc-liquidity-details {
margin-top: 20px;
border: 1px solid var(--border-color);
border-radius: 12px;
background: rgba(255, 255, 255, 0.015);
}
.nwc-liquidity-summary {
display: flex;
align-items: center;
gap: 12px;
padding: 14px 16px;
cursor: pointer;
list-style: none;
color: var(--text-primary);
font-size: 0.9rem;
}
.nwc-liquidity-summary::-webkit-details-marker {
display: none;
}
.nwc-liquidity-summary::after {
content: "▸";
margin-left: auto;
color: var(--text-dim);
transition: transform 0.15s ease;
}
.nwc-liquidity-details[open] .nwc-liquidity-summary::after {
transform: rotate(90deg);
}
.nwc-liquidity-summary:hover {
background: rgba(255, 255, 255, 0.02);
border-radius: 12px;
}
.nwc-liquidity-icon {
font-size: 22px;
}
.nwc-liquidity-subtitle {
display: block;
margin-top: 2px;
font-size: 0.75rem;
font-weight: 400;
color: var(--text-secondary);
}
.nwc-liquidity-guide-card {
padding: 0 16px 16px;
color: var(--text-primary);
}
.nwc-liquidity-body {
font-size: 0.82rem;
line-height: 1.55;
margin: 0 0 12px;
color: var(--text-secondary);
}
.nwc-liquidity-steps {
display: flex;
flex-direction: column;
gap: 10px;
margin-bottom: 14px;
}
.nwc-liquidity-step {
display: flex;
gap: 10px;
align-items: flex-start;
font-size: 0.85rem;
}
.nwc-liquidity-step-desc {
margin: 2px 0 0;
color: var(--text-secondary);
font-size: 0.78rem;
line-height: 1.5;
}
.step-num {
background: var(--accent-color);
color: #0A1A10;
width: 20px;
height: 20px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 0.75rem;
flex-shrink: 0;
margin-top: 1px;
}
.nwc-liquidity-action {
background: rgba(109, 191, 139, 0.08);
border-left: 3px solid var(--green);
padding: 10px 12px;
border-radius: 0 8px 8px 0;
font-size: 0.82rem;
}
.nwc-liquidity-analogy {
margin: 0 0 10px;
font-size: 0.8rem;
line-height: 1.45;
}
.nwc-rtl-btn {
display: inline-flex;
align-items: center;
gap: 6px;
background: var(--border-color);
color: var(--text-primary);
border: none;
padding: 8px 14px;
border-radius: 8px;
font-size: 0.8rem;
cursor: pointer;
}
.nwc-rtl-btn:hover {
background: #1c2a24;
}
/* ── Narrow screens ─────────────────────────────────────────────── */
@media (max-width: 720px) {
.nwc-tabs-bar {
align-items: stretch;
flex-direction: column;
}
.nwc-tabs-btns {
justify-content: stretch;
}
.nwc-tab-btn {
flex: 1;
padding: 8px 10px;
}
.nwc-wallet-list {
grid-template-columns: 1fr;
}
.nwc-wallet-card-head {
flex-direction: column;
}
.nwc-wallet-chips {
justify-content: flex-start;
}
.nwc-wallet-actions-spacer {
display: none;
}
}