Files
TallerCiCd/frontend/src/styles/app.css
2025-12-18 11:53:44 +01:00

823 lines
15 KiB
CSS

/*
CI/CD Workshop
Copyright (C) 2025 OpenBokeron
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap');
body {
margin: 0;
font-family: 'Space Grotesk', 'Helvetica Neue', system-ui, sans-serif;
background: radial-gradient(circle at 20% 20%, #0f172a 0, #0f172a 35%, #0a1325);
color: #e2e8f0;
}
main {
max-width: 1100px;
margin: 0 auto;
padding: 2.4rem 1.6rem 2.8rem;
}
.hero {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 1rem;
background: linear-gradient(125deg, #111827, #111b34 45%, #162146);
border: 1px solid rgba(255, 255, 255, 0.06);
color: #f8fafc;
padding: 1.8rem;
border-radius: 22px;
box-shadow: 0 25px 45px rgba(0, 0, 0, 0.35);
margin-bottom: 1.6rem;
position: relative;
overflow: hidden;
}
.hero::after {
content: '';
position: absolute;
right: -40px;
top: -40px;
width: 200px;
height: 200px;
background: radial-gradient(circle, rgba(99, 102, 241, 0.28), transparent 60%);
filter: blur(2px);
}
.hero-copy h1 {
margin: 0.3rem 0 0.6rem;
font-size: clamp(2.1rem, 4vw, 2.8rem);
}
.hero .lede {
max-width: 720px;
opacity: 0.92;
line-height: 1.5;
color: #e2e8f0;
margin: 0 0 0.6rem;
}
.eyebrow {
letter-spacing: 0.14em;
text-transform: uppercase;
font-size: 0.78rem;
color: #a5b4fc;
margin: 0;
}
.actions {
display: flex;
gap: 0.6rem;
margin: 1rem 0;
flex-wrap: wrap;
}
button {
border: none;
background: #eab308;
color: #0f172a;
padding: 0.75rem 1.1rem;
border-radius: 12px;
font-weight: 700;
cursor: pointer;
box-shadow: 0 12px 30px rgba(0, 0, 0, 0.22);
transition:
transform 120ms ease,
box-shadow 120ms ease;
}
button:hover {
transform: translateY(-1px);
box-shadow: 0 14px 32px rgba(0, 0, 0, 0.28);
}
button.ghost {
background: rgba(255, 255, 255, 0.12);
color: #f8fafc;
border: 1px solid rgba(255, 255, 255, 0.16);
box-shadow: none;
}
button.outline {
background: transparent;
color: #eab308;
border: 1px dashed rgba(234, 179, 8, 0.5);
box-shadow: none;
}
.meta {
color: #cbd5f5;
font-size: 0.92rem;
}
.price-hero {
background: linear-gradient(145deg, #0ea5e9, #22d3ee);
color: #03263b;
border-radius: 16px;
padding: 1rem 1.2rem;
box-shadow:
inset 0 0 0 1px rgba(255, 255, 255, 0.22),
0 14px 36px rgba(14, 165, 233, 0.35);
display: flex;
flex-direction: column;
justify-content: center;
gap: 0.1rem;
position: relative;
overflow: hidden;
}
.price-hero::after {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(circle at 15% 15%, rgba(255, 255, 255, 0.3), transparent 40%);
pointer-events: none;
}
.price-stack {
display: flex;
align-items: baseline;
gap: 0.6rem;
margin: 0.4rem 0;
}
.old {
text-decoration: line-through;
opacity: 0.7;
font-weight: 600;
}
.new {
font-size: 1.8rem;
font-weight: 800;
}
.pill {
display: inline-block;
padding: 0.2rem 0.5rem;
border-radius: 999px;
background: rgba(255, 255, 255, 0.22);
color: #03263b;
font-weight: 700;
width: fit-content;
}
.availability {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
font-weight: 700;
}
.tiny {
margin: 0;
font-size: 0.85rem;
opacity: 0.9;
}
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 1rem;
}
.card {
background: #0b1224;
border-radius: 16px;
padding: 1.25rem;
box-shadow: 0 10px 26px rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.05);
}
.openbokeron-card {
background:
radial-gradient(circle at 12% 18%, rgba(34, 211, 238, 0.22), transparent 26%),
radial-gradient(circle at 85% -5%, rgba(124, 58, 237, 0.2), transparent 28%),
linear-gradient(180deg, #0b1224, #0e1530);
position: relative;
overflow: hidden;
}
.openbokeron-card::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.02), transparent 55%);
pointer-events: none;
}
.card-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.75rem;
}
.label {
font-weight: 800;
color: #f8fafc;
margin: 0;
}
.sub {
margin: 0;
color: #cbd5f5;
font-size: 0.95rem;
}
.tag {
background: rgba(99, 102, 241, 0.12);
color: #a5b4fc;
border-radius: 12px;
padding: 0.25rem 0.6rem;
font-size: 0.85rem;
}
.tag.link-tag {
text-decoration: none;
border: 1px solid rgba(165, 180, 252, 0.4);
transition:
border-color 120ms ease,
color 120ms ease,
background 120ms ease;
}
.tag.link-tag:hover {
border-color: rgba(165, 180, 252, 0.8);
background: rgba(165, 180, 252, 0.16);
color: #c7d2fe;
}
.menu-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
}
.menu-layout {
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
.menu-layout.with-alternative {
grid-template-columns: minmax(0, 1.9fr) minmax(260px, 1.1fr);
align-items: stretch;
}
.menu-primary {
display: flex;
flex-direction: column;
gap: 0.8rem;
}
.menu-alternative {
max-height: fit-content;
align-self: flex-start;
border-radius: 14px;
padding: 1rem 1.1rem;
border: 1px dashed rgba(234, 179, 8, 0.45);
background: linear-gradient(160deg, rgba(234, 179, 8, 0.08), rgba(234, 179, 8, 0.015));
box-shadow:
inset 0 0 0 1px rgba(255, 255, 255, 0.03),
0 16px 32px rgba(0, 0, 0, 0.22);
color: #fef9c3;
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.alt-label {
color: #fde68a;
}
.alt-price {
margin: 0.15rem 0 0.2rem;
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.35rem;
}
.alt-price-value {
font-size: 1.5rem;
font-weight: 800;
}
.alt-price-meta {
color: #fef3c7;
font-size: 0.9rem;
}
.alt-items {
list-style: none;
padding-left: 0;
margin: 0.2rem 0 0.1rem;
}
.alt-items li {
position: relative;
padding-left: 1rem;
margin: 0.15rem 0;
}
.alt-items li::before {
content: '•';
position: absolute;
left: 0;
color: #facc15;
opacity: 0.85;
}
.alt-note {
margin: 0.2rem 0;
color: #fefce8;
opacity: 0.9;
}
ul {
padding-left: 1.2rem;
margin: 0.4rem 0 0;
}
li {
margin-bottom: 0.2rem;
}
.section-title {
margin: 0;
font-weight: 700;
color: #e2e8f0;
}
.notes {
display: flex;
gap: 0.6rem;
flex-wrap: wrap;
margin-top: 0.8rem;
}
.notes span {
background: rgba(255, 255, 255, 0.06);
padding: 0.35rem 0.6rem;
border-radius: 10px;
font-size: 0.9rem;
}
.deal {
display: flex;
gap: 0.8rem;
flex-wrap: wrap;
align-items: flex-start;
margin-top: 0.8rem;
justify-content: space-between;
}
.price-line {
display: flex;
gap: 0.6rem;
align-items: baseline;
}
.fish {
font-weight: 800;
color: #34d399;
}
.chip {
display: inline-block;
padding: 0.4rem 0.8rem;
border-radius: 999px;
background: rgba(56, 189, 248, 0.16);
color: #cffafe;
font-size: 0.9rem;
}
.chip.subtle {
background: rgba(148, 163, 184, 0.16);
color: #cbd5e1;
}
.cta {
display: flex;
flex-direction: column;
gap: 0.4rem;
align-items: flex-end;
}
.openbokeron-body {
display: grid;
grid-template-columns: minmax(0, 1.4fr) minmax(180px, 0.6fr);
gap: 1rem;
align-items: flex-start;
}
.openbokeron-copy {
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.openbokeron-copy > * + * {
margin-top: 0.3rem;
}
.openbokeron-text {
margin: 0;
color: #e2e8f0;
line-height: 1.5;
font-size: 0.95rem;
}
.openbokeron-text.subtle {
opacity: 0.75;
font-size: 0.9rem;
}
.openbokeron-list {
margin: 0.2rem 0 0;
padding-left: 1.1rem;
color: #cbd5f5;
font-size: 0.88rem;
opacity: 0.85;
display: flex;
flex-direction: column;
gap: 0.3rem;
}
.openbokeron-actions {
display: flex;
gap: 0.6rem;
align-items: center;
flex-wrap: wrap;
}
.button-link {
display: inline-flex;
align-items: center;
gap: 0.35rem;
background: linear-gradient(120deg, #22d3ee, #38bdf8);
color: #0b1224;
text-decoration: none;
font-weight: 800;
padding: 0.65rem 1rem;
border-radius: 12px;
box-shadow: 0 12px 26px rgba(34, 211, 238, 0.25);
transition:
transform 120ms ease,
box-shadow 120ms ease;
}
.button-link:hover {
transform: translateY(-1px);
box-shadow: 0 14px 28px rgba(56, 189, 248, 0.3);
}
.button-link.subtle {
background: rgba(255, 255, 255, 0.08);
color: #e2e8f0;
box-shadow: none;
font-weight: 700;
}
.button-link.subtle:hover {
background: rgba(255, 255, 255, 0.14);
}
.openbokeron-logo {
display: flex;
align-items: center;
justify-content: center;
}
.logo-bubble {
min-height: 120px;
border-radius: 14px;
border: 1px dashed rgba(148, 163, 184, 0.35);
background: rgba(255, 255, 255, 0.04);
display: flex;
align-items: center;
justify-content: center;
padding: 0.8rem;
}
.logo-bubble img {
max-width: 120px;
width: 100%;
height: auto;
opacity: 0.9;
}
.price-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 0.8rem;
}
.price-card {
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
padding: 0.7rem 0.9rem;
background: linear-gradient(145deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02));
}
.item {
margin: 0;
font-weight: 700;
color: #f8fafc;
}
.value {
margin: 0.2rem 0;
font-size: 1.1rem;
font-weight: 800;
color: #38bdf8;
}
.timestamp {
margin: 0;
color: #cbd5f5;
font-size: 0.85rem;
}
.banner {
border-radius: 12px;
padding: 0.75rem 1rem;
margin: 0 0 1rem;
}
.banner.error {
background: #fef2f2;
color: #991b1b;
border: 1px solid #fecdd3;
}
.caption {
margin: 0;
color: #cbd5f5;
font-size: 0.9rem;
}
.highlight {
margin: 0.2rem 0 0.4rem;
font-size: 1.1rem;
font-weight: 700;
color: #f8fafc;
}
.menu-card {
background: linear-gradient(180deg, #0b1224, #0b1224 40%, #0e1530);
}
@media (max-width: 860px) {
.hero {
grid-template-columns: 1fr;
}
.price-hero {
grid-row: 2;
}
}
@media (max-width: 640px) {
main {
padding: 1.5rem 1.1rem 2rem;
}
.hero {
padding: 1.4rem;
}
}
@media (max-width: 960px) {
.menu-layout.with-alternative {
grid-template-columns: 1fr;
}
}
@media (max-width: 780px) {
.openbokeron-body {
grid-template-columns: 1fr;
}
.openbokeron-actions {
justify-content: flex-start;
}
}
@media (min-width: 980px) {
.menu-card {
grid-column: span 2;
}
}
.ci-card {
background: linear-gradient(180deg, #0f172a, #0b1224);
}
.ci-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
gap: 0.8rem;
}
.ci-item {
padding: 0.7rem 0.8rem;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
background: rgba(255, 255, 255, 0.03);
}
.mono {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}
.history-card {
background: linear-gradient(180deg, #0f172a, #0c1228);
}
.history-list {
display: flex;
flex-direction: column;
gap: 0.6rem;
}
.history-item {
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
background: rgba(255, 255, 255, 0.02);
overflow: hidden;
transition:
border-color 160ms ease,
box-shadow 160ms ease;
}
.history-item summary {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.8rem;
padding: 0.75rem 0.9rem;
list-style: none;
cursor: pointer;
}
.history-item summary::-webkit-details-marker {
display: none;
}
.summary-left {
display: flex;
align-items: center;
gap: 0.55rem;
flex-wrap: wrap;
}
.summary-title {
font-weight: 800;
color: #f8fafc;
}
.summary-commit {
color: #a5b4fc;
font-weight: 700;
font-size: 0.95rem;
}
.summary-meta {
display: flex;
gap: 0.6rem;
flex-wrap: wrap;
color: #cbd5f5;
font-size: 0.9rem;
justify-content: flex-end;
}
.status-dot {
width: 10px;
height: 10px;
border-radius: 50%;
display: inline-block;
}
.status-dot.success {
background: #22c55e;
box-shadow: 0 0 8px rgba(34, 197, 94, 0.6);
}
.status-dot.failure {
background: #f87171;
box-shadow: 0 0 8px rgba(248, 113, 113, 0.5);
}
.history-body {
padding: 0.75rem 0.9rem 0.9rem;
border-top: 1px solid rgba(255, 255, 255, 0.05);
display: flex;
flex-direction: column;
gap: 0.35rem;
}
.history-row {
margin: 0;
display: flex;
justify-content: space-between;
font-weight: 700;
color: #e2e8f0;
}
.history-row span:last-child {
color: #cbd5f5;
}
.history-message {
margin: 0.2rem 0 0;
background: rgba(248, 113, 113, 0.12);
border: 1px dashed rgba(248, 113, 113, 0.5);
padding: 0.5rem 0.75rem;
border-radius: 10px;
color: #fecaca;
}
.history-message.success {
background: rgba(34, 197, 94, 0.12);
border-color: rgba(34, 197, 94, 0.4);
color: #bbf7d0;
}
.history-item[open] {
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.28);
}
.history-item.success {
border-color: rgba(34, 197, 94, 0.3);
}
.history-item.failure {
border-color: rgba(248, 113, 113, 0.35);
}
.chip.danger {
background: rgba(248, 113, 113, 0.2);
color: #fecdd3;
border: 1px solid rgba(248, 113, 113, 0.4);
}
.fish {
cursor: pointer;
position: relative;
}
.toast {
position: fixed;
bottom: 1.5rem;
right: 1.5rem;
display: flex;
align-items: center;
gap: 0.75rem;
background: linear-gradient(135deg, #1f1f1f, #2a2a2a);
color: #fff;
padding: 0.75rem 1rem;
border-radius: 10px;
box-shadow:
0 10px 30px rgba(0, 0, 0, 0.35),
inset 0 0 0 1px rgba(255, 255, 255, 0.05);
z-index: 1000;
max-width: 260px;
backdrop-filter: blur(6px);
}
.toast-icon {
font-size: 1.4rem;
line-height: 1;
}
.toast-title {
font-weight: 600;
font-size: 0.9rem;
}
.toast-text {
font-size: 0.8rem;
opacity: 0.85;
}