Files
cameleer-server/ui/src/pages/AppsTab/AppDeploymentPage/AppDeploymentPage.module.css

399 lines
7.1 KiB
CSS

.container {
display: flex;
flex-direction: column;
gap: 16px;
padding: 16px 24px;
min-height: 100%;
}
/* Tabs + content grouped together with no internal gap */
.tabGroup {
display: flex;
flex-direction: column;
flex: 1 1 auto;
min-height: 0;
}
/* The tab-content card sits flush against the Tabs strip — no gap */
.tabContent {
border: 1px solid var(--border);
border-top: none;
border-radius: 0 0 6px 6px;
padding: 16px;
background: var(--bg-surface);
flex: 1 1 auto;
min-height: 0;
}
.section {
border: 1px solid var(--border);
border-radius: 6px;
padding: 16px;
background: var(--bg-surface);
}
.configGrid {
display: grid;
grid-template-columns: 180px 1fr;
gap: 10px 16px;
align-items: center;
margin-top: 8px;
}
.configLabel {
color: var(--text-muted);
font-size: 13px;
}
.readOnlyValue {
color: var(--text-primary);
font-size: 14px;
}
.fileRow {
display: flex;
align-items: center;
gap: 10px;
}
.stagedJar {
color: var(--amber);
font-size: 13px;
}
.visuallyHidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.checkpointsTable tr.checkpointArchived {
opacity: 0.55;
}
/* Config tab shared */
.configInline {
display: flex;
align-items: center;
gap: 6px;
}
.configHint {
font-size: 12px;
color: var(--text-muted);
font-style: italic;
margin-top: 2px;
}
.cellMeta {
font-size: 12px;
color: var(--text-muted);
}
.toggleEnabled {
font-size: 12px;
color: var(--success);
}
.toggleDisabled {
font-size: 12px;
color: var(--text-muted);
}
/* Fixed-width inputs */
.inputXs {
width: 50px;
}
.inputSm {
width: 60px;
}
.inputMd {
width: 70px;
}
.inputLg {
width: 80px;
}
.inputXl {
width: 90px;
}
/* Port pills */
.portPills {
display: flex;
flex-wrap: wrap;
gap: 6px;
align-items: center;
}
.portPill {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 3px 8px;
border-radius: 12px;
font-size: 12px;
font-family: var(--font-mono);
background: var(--bg-raised);
color: var(--text-primary);
border: 1px solid var(--border-subtle);
}
.portPillDelete {
background: none;
border: none;
color: var(--text-muted);
cursor: pointer;
font-size: 13px;
line-height: 1;
padding: 0;
}
.portPillDelete:hover {
color: var(--error);
}
.portPillDelete:disabled {
opacity: 0.3;
cursor: default;
}
.portAddInput {
width: 70px;
padding: 3px 6px;
border: 1px dashed var(--border-subtle);
border-radius: 12px;
background: transparent;
color: var(--text-primary);
font-size: 12px;
font-family: var(--font-mono);
text-align: center;
}
.portAddInput::placeholder {
color: var(--text-muted);
}
.portAddInput:disabled {
opacity: 0.3;
cursor: default;
}
.liveBanner {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 12px;
margin-bottom: 12px;
background: var(--warning-bg);
border: 1px solid var(--warning-border);
border-radius: 6px;
color: var(--text-primary);
font-size: 13px;
}
/* StatusCard */
.statusCard {
border: 1px solid var(--border);
border-radius: 6px;
padding: 14px;
background: var(--bg-surface);
display: flex;
flex-direction: column;
gap: 12px;
}
.statusCardHeader { display: flex; align-items: center; gap: 8px; }
.statusCardGrid { display: grid; grid-template-columns: 100px 1fr; gap: 6px 12px; font-size: 13px; }
.statusCardActions { display: flex; gap: 8px; }
.statusCardError {
padding: 10px 12px;
background: var(--error-bg);
border: 1px solid var(--error-border);
border-radius: 6px;
color: var(--text-primary);
font-size: 13px;
font-family: var(--font-mono);
white-space: pre-wrap;
word-break: break-word;
}
.statusCardErrorLabel {
font-family: var(--font-sans);
color: var(--error);
font-weight: 600;
display: block;
margin-bottom: 4px;
}
/* DeploymentTab */
.deploymentTab {
display: flex;
flex-direction: column;
gap: 12px;
flex: 1 1 auto;
min-height: 0;
}
.logFill { flex: 1 1 auto; min-height: 200px; }
/* Environment pill (Identity section) */
.envPill {
display: inline-block;
padding: 2px 10px;
border-radius: 10px;
font-size: 12px;
font-weight: 500;
color: var(--text-inverse, white);
width: max-content;
}
/* Env vars list */
.envVarsList {
display: flex;
flex-direction: column;
gap: 8px;
}
.envVarRow {
display: grid;
grid-template-columns: 1fr 2fr auto;
gap: 8px;
align-items: center;
}
/* CheckpointsTable */
.checkpointsTable {
margin-top: 8px;
}
.checkpointsTable table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.checkpointsTable th {
text-align: left;
padding: 10px 12px;
font-weight: 600;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.04em;
color: var(--text-muted);
background: var(--bg-inset);
border-bottom: 1px solid var(--border);
}
.checkpointsTable td {
padding: 12px;
border-top: 1px solid var(--border);
vertical-align: top;
}
.checkpointsTable tbody tr {
cursor: pointer;
}
.checkpointsTable tbody tr:hover {
background: var(--bg-inset);
}
.jarCell { font-family: monospace; font-size: 12px; }
.jarName { font-family: monospace; }
.jarStrike { text-decoration: line-through; }
.archivedHint { font-size: 11px; color: var(--amber, #f59e0b); }
.isoSubline { font-size: 11px; color: var(--text-muted); }
.muted { color: var(--text-muted); }
.strategyPill,
.outcomePill {
display: inline-block;
padding: 2px 8px;
border-radius: 3px;
font-size: 11px;
background: var(--bg-inset);
}
/* outcome status colors */
.outcome-STOPPED { color: var(--text-muted); }
.outcome-DEGRADED {
background: var(--amber-bg, rgba(245, 158, 11, 0.18));
color: var(--amber, #f59e0b);
}
.chevron { color: var(--text-muted); font-size: 14px; text-align: right; }
.showOlderBtn {
width: 100%;
padding: 10px;
background: transparent;
border: 0;
color: var(--text-muted);
cursor: pointer;
font-size: 12px;
}
.showOlderBtn:hover {
background: var(--bg-inset);
color: var(--text-primary);
}
/* Primary-button upload progress overlay
* Wraps the DS Button so the inner Button can retain its own background
* while we overlay a tinted progress fill and label on top. */
.uploadBtnWrap {
display: inline-block;
}
.uploadBtnWrap button {
position: relative;
overflow: hidden;
}
.uploadBtnFill {
position: absolute;
inset: 0 auto 0 0;
background: color-mix(in srgb, var(--primary) 35%, transparent);
transition: width 120ms linear;
pointer-events: none;
z-index: 0;
}
.uploadBtnLabel {
position: relative;
z-index: 1;
}
/* Checkpoints row — lives inside .configGrid */
.checkpointsTriggerCell {
display: flex;
align-items: center;
}
.checkpointsTrigger {
display: inline-flex;
align-items: center;
gap: 6px;
background: none;
border: none;
padding: 0;
color: var(--text-primary);
cursor: pointer;
font: inherit;
text-align: left;
}
.checkpointsTrigger:hover {
color: var(--amber);
}
.checkpointsTableFullRow {
grid-column: 1 / -1;
margin-top: 4px;
}
.checkpointsChevron {
color: var(--text-muted);
font-size: 11px;
width: 12px;
text-align: center;
}