Files
sundynix-pets/pets-be/web/admin/src/index.css
T
Blizzard 9d7cf720a5
ci-cd / verify (push) Successful in 1m59s
ci-cd / deploy (push) Skipped
feat: add multi-source breed encyclopedia and two-hour refresh sessions
2026-10-05 13:38:24 +08:00

1118 lines
20 KiB
CSS

@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
--background: 30 100% 98%;
--foreground: 20 20% 30%;
--card: 0 0% 100%;
--card-foreground: 20 20% 30%;
--primary: 15 54% 47%;
--primary-foreground: 0 0% 100%;
--secondary: 30 100% 94%;
--secondary-foreground: 20 20% 30%;
--muted: 30 38% 96%;
--muted-foreground: 23 16% 46%;
--accent: 30 100% 94%;
--accent-foreground: 20 20% 30%;
--destructive: 0 60% 48%;
--destructive-foreground: 0 0% 100%;
--border: 27 36% 88%;
--input: 27 36% 85%;
--ring: 15 54% 47%;
--radius: 0.85rem;
}
* {
box-sizing: border-box;
border-color: hsl(var(--border));
}
body {
margin: 0;
background: #fff9f3;
color: #604a40;
font-family:
ui-rounded, "Hiragino Maru Gothic ProN", "PingFang SC", system-ui,
sans-serif;
font-size: 14px;
}
button,
input,
select {
font: inherit;
}
button:focus-visible,
a:focus-visible,
select:focus-visible {
outline: 2px solid #b95738;
outline-offset: 3px;
}
h1,
h2,
h3,
p {
margin: 0;
}
button {
cursor: pointer;
}
button:disabled {
cursor: default;
}
strong {
font-weight: 600;
}
.app-shell {
min-height: 100vh;
}
.sidebar {
width: 238px;
position: fixed;
inset: 0 auto 0 0;
background: #fffefd;
border-right: 1px solid #ece2d8;
padding: 28px 16px;
display: flex;
flex-direction: column;
z-index: 20;
}
.brand {
display: flex;
align-items: center;
gap: 12px;
padding: 0 12px 32px;
}
.brand img {
width: 48px;
height: 48px;
border-radius: 50%;
border: 3px solid #fffaf4;
box-shadow: 0 0 0 1px #ead8ca;
}
.brand strong {
display: block;
font-size: 20px;
letter-spacing: 1px;
}
.brand small {
display: block;
color: #9d8779;
font-size: 9px;
letter-spacing: 2px;
margin-top: 4px;
}
.side-caption {
padding: 0 15px;
color: #9d8779;
font-size: 11px;
margin-bottom: 14px;
letter-spacing: 1px;
}
.sidebar nav {
display: grid;
gap: 7px;
}
.nav-item {
background: none;
border: none;
border-radius: 13px;
min-height: 46px;
display: flex;
align-items: center;
gap: 12px;
padding: 13px 15px;
color: #886c5f;
text-align: left;
}
.nav-item:hover {
background: #fff5eb;
}
.nav-item.active {
color: #b95738;
background: #ffeadc;
font-weight: 600;
}
.nav-dot {
width: 5px;
height: 5px;
border-radius: 50%;
background: #b95738;
margin-left: auto;
}
.side-note {
margin-top: auto;
margin-bottom: 24px;
padding: 22px 18px;
border-radius: 18px;
background: #fff6ed;
color: #9b7057;
font-size: 12px;
line-height: 1.9;
}
.side-note svg {
margin-bottom: 8px;
color: #d9956e;
}
.side-bottom {
display: flex;
align-items: center;
justify-content: space-between;
border-top: 1px solid #f0e8e0;
padding-top: 20px;
}
.admin-indicator {
font-size: 12px;
color: #886c5f;
padding-left: 9px;
}
.content {
margin-left: 238px;
padding: 32px 38px 24px;
max-width: 1780px;
}
.topbar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 26px;
gap: 16px;
}
.eyebrow {
color: #9d7965;
font-size: 10px;
letter-spacing: 1.8px;
font-weight: 600;
margin-bottom: 9px;
}
.topbar h1 {
font-size: 27px;
letter-spacing: 1px;
font-weight: 600;
}
.topbar-actions {
display: flex;
gap: 14px;
align-items: center;
}
.today-date {
font-size: 12px;
color: #9d8779;
}
.mobile-logout {
display: none;
}
.welcome {
min-height: 180px;
background: linear-gradient(110deg, #fff0dd, #ffdec7);
border: 1px solid #ffeadb;
border-radius: 24px;
padding: 32px 36px;
display: flex;
align-items: center;
justify-content: space-between;
overflow: hidden;
}
.welcome h2 {
font-size: 25px;
font-weight: 600;
color: #694c3f;
margin: 10px 0 13px;
}
.welcome p:not(.eyebrow) {
color: #98745d;
font-size: 13px;
}
.welcome img {
width: 116px;
height: 116px;
border-radius: 50%;
border: 5px solid #fffaf4;
transform: rotate(-8deg);
box-shadow: 0 8px 30px #a5623615;
}
.stat-grid {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 14px;
margin: 22px 0;
}
.stat-card,
.panel {
border: 1px solid #ece2d8;
background: white;
border-radius: 19px;
box-shadow: 0 6px 28px #604a4004;
}
.stat-card {
text-align: left;
padding: 18px;
transition:
transform 0.2s,
border-color 0.2s;
}
.stat-card:hover {
transform: translateY(-3px);
border-color: #ddb699;
}
.stat-top {
display: flex;
align-items: center;
justify-content: space-between;
color: #bca89c;
margin-bottom: 15px;
}
.stat-icon {
display: grid;
place-items: center;
width: 38px;
height: 38px;
background: #fff0e2;
color: #b95738;
border-radius: 12px;
}
.tint-pets .stat-icon,
.tint-tasks .stat-icon {
background: #f1eaf8;
color: #977eae;
}
.tint-walks .stat-icon,
.tint-files .stat-icon {
background: #edf2fb;
color: #7d96b6;
}
.stat-card > span {
color: #886c5f;
font-size: 12px;
}
.stat-card strong {
font-size: 30px;
display: block;
margin: 6px 0;
}
.stat-card small {
font-size: 10px;
color: #a48d7e;
white-space: nowrap;
}
.overview-grid {
display: grid;
grid-template-columns: 1.6fr 1fr;
gap: 20px;
}
.panel-heading {
padding: 24px 25px 0;
display: flex;
align-items: center;
justify-content: space-between;
}
.panel-heading h2,
.records-heading h2 {
font-size: 17px;
font-weight: 600;
}
.panel-heading p,
.records-heading p {
color: #a18a7c;
font-size: 12px;
margin-top: 7px;
}
.panel-heading > svg {
color: #c6a28c;
}
.bar-chart {
height: 232px;
display: flex;
align-items: flex-end;
gap: 18px;
padding: 28px 26px;
}
.chart-column {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
flex: 1;
height: 100%;
min-width: 0;
}
.chart-column > span {
font-size: 12px;
color: #9d7965;
}
.bar-space {
flex: 1;
width: 100%;
display: flex;
align-items: flex-end;
max-width: 42px;
}
.chart-bar {
width: 100%;
background: linear-gradient(#f2bc94, #d88760);
border-radius: 7px 7px 2px 2px;
transition: height 0.3s;
}
.chart-column small {
font-size: 11px;
color: #a48d7e;
}
.today dl {
padding: 12px 25px 20px;
margin: 0;
}
.today dl > div {
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid #f2eae4;
padding: 14px 0;
}
.today dl > div:last-child {
border: 0;
}
.today dt {
font-size: 12px;
color: #886c5f;
}
.today dd {
font-size: 21px;
margin: 0;
}
.today dd small {
font-size: 11px;
margin-left: 5px;
color: #a48d7e;
}
.summary-strip {
margin-top: 20px;
display: flex;
gap: 28px;
padding: 18px 22px;
border: 1px dashed #e6d2c2;
border-radius: 15px;
background: #fff5eb;
}
.summary-strip > div {
display: flex;
align-items: center;
gap: 9px;
font-size: 12px;
color: #9d7965;
}
.summary-strip strong {
color: #604a40;
margin-left: 8px;
}
.records {
overflow: hidden;
}
.records-heading {
padding: 24px 26px 16px;
display: flex;
align-items: center;
justify-content: space-between;
}
.per-page {
background: #fff6ed;
border: 1px solid #f4e6d8;
padding: 5px 10px;
border-radius: 8px;
font-size: 11px;
color: #9d7965;
}
.toolbar {
display: flex;
align-items: center;
gap: 12px;
padding: 0 26px 22px;
flex-wrap: wrap;
}
.search-form {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
max-width: 490px;
position: relative;
}
.search-form > svg {
position: absolute;
left: 12px;
pointer-events: none;
color: #a48d7e;
}
.search-form input {
padding-left: 36px;
min-width: 140px;
border-radius: 10px;
}
.toolbar select {
background: white;
color: #886c5f;
border: 1px solid #e6d9cf;
border-radius: 10px;
padding: 8px 30px 8px 12px;
height: 36px;
font-size: 12px;
}
table {
min-width: 760px;
}
thead {
background: #fffaf6;
}
th {
white-space: nowrap;
font-size: 12px !important;
padding: 13px 18px !important;
}
td {
padding: 15px 18px !important;
font-size: 12px;
max-width: 360px;
}
td small {
display: block;
color: #a48d7e;
font-size: 10px;
margin-top: 5px;
}
td strong {
display: block;
}
.identity {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
}
.identity strong {
font-size: 13px;
color: #604a40;
}
.identity small {
max-width: 185px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #a48d7e;
font-size: 10px;
margin-top: 5px;
display: block;
}
.avatar {
width: 38px;
height: 38px;
display: grid;
place-items: center;
flex: none;
color: #c58d6a;
border-radius: 12px;
background: #fff1e4;
overflow: hidden;
}
.avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.mono {
font-family: ui-monospace, SFMono-Regular, monospace;
}
.pet-tags {
display: flex;
flex-wrap: wrap;
gap: 5px;
max-width: 250px;
}
.pet-tags > span {
background: #fff3e8;
color: #9d6a4e;
padding: 4px 7px;
border-radius: 7px;
display: flex;
align-items: center;
gap: 4px;
font-size: 11px;
}
.row-actions {
display: flex;
align-items: center;
gap: 5px;
white-space: nowrap;
}
.tree-toggle {
width: 28px;
height: 28px;
display: grid;
place-items: center;
border: 1px solid #f0e4da;
border-radius: 8px;
color: #ad826b;
background: #fffaf6;
}
.text-action {
border: none;
background: none;
color: #b95738;
padding: 0;
}
.tree-row td {
padding: 0 20px 16px 56px !important;
background: #fffcf9;
}
.pet-tree {
border-left: 2px solid #ecd8c8;
padding: 14px 18px 5px;
}
.tree-heading {
display: flex;
align-items: center;
gap: 7px;
font-size: 12px;
color: #9d7965;
margin-bottom: 14px;
}
.tree-heading strong {
display: inline;
}
.tree-heading > span {
font-size: 10px;
margin-left: auto;
color: #b29a89;
}
.pet-tree-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 10px;
}
.pet-tree-card {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 13px 14px;
border: 1px solid #f0e2d6;
border-radius: 12px;
background: white;
text-align: left;
}
.pet-tree-card:hover {
border-color: #deb697;
background: #fffaf6;
}
.pet-tree-card .identity {
flex: 1;
}
.pet-tree-card > svg {
color: #bfa390;
}
.pet-tree-card .identity small {
font-family: inherit;
}
.tree-message {
display: flex;
align-items: center;
gap: 10px;
color: #a48d7e;
font-size: 12px;
padding: 12px 0;
}
.pagination {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
padding: 18px 25px;
border-top: 1px solid #f0e7df;
font-size: 12px;
color: #9d8779;
}
.pagination > div {
display: flex;
align-items: center;
gap: 15px;
}
.pagination button {
border-radius: 9px;
}
.empty {
min-height: 230px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 12px;
padding: 35px 20px;
color: #a48d7e;
text-align: center;
}
.empty svg {
color: #c9ae9a;
}
.empty h3 {
font-size: 15px;
font-weight: 500;
color: #8e7160;
}
.empty p {
font-size: 12px;
line-height: 1.8;
}
.empty.compact {
min-height: 150px;
}
.error-banner,
.notice {
display: flex;
align-items: center;
justify-content: space-between;
border: 1px solid #f0d7c9;
background: #fff0e7;
border-radius: 12px;
padding: 12px 15px;
color: #a04b31;
margin-bottom: 18px;
font-size: 12px;
gap: 12px;
}
.notice {
background: #f5f0fb;
border-color: #e6dcef;
color: #806499;
justify-content: flex-start;
}
.notice button {
border: none;
background: none;
color: inherit;
margin-left: auto;
}
.error-text {
color: #a04b31;
}
.page-footer {
text-align: center;
color: #b49c8b;
font-size: 10px;
padding: 24px 0 5px;
letter-spacing: 1px;
}
.detail-dialog {
max-width: 700px;
width: calc(100% - 32px);
max-height: 85vh;
overflow: auto;
border-radius: 22px !important;
padding: 26px !important;
}
.detail-summary {
display: flex;
justify-content: space-between;
align-items: center;
padding: 14px 0;
border-bottom: 1px solid #f0e7df;
gap: 10px;
}
.detail-summary .identity small {
max-width: 330px;
}
.detail-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
margin: 7px 0;
}
.detail-grid > div {
min-width: 0;
}
.detail-grid dt {
color: #a48d7e;
font-size: 11px;
margin-bottom: 7px;
}
.detail-grid dd {
font-size: 13px;
margin: 0;
line-height: 1.8;
overflow-wrap: anywhere;
white-space: pre-wrap;
}
.dialog-actions {
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 10px;
}
.confirm-copy {
font-size: 13px;
line-height: 1.9;
color: #886c5f;
}
.track {
padding: 14px;
background: #fffaf5;
border: 1px solid #eee0d4;
border-radius: 16px;
}
.track svg {
width: 100%;
display: block;
border-radius: 10px;
}
.track p {
font-size: 10px;
color: #a48d7e;
padding-top: 10px;
text-align: center;
}
.file-preview {
width: 100%;
max-height: 260px;
object-fit: contain;
background: #fff8f0;
border-radius: 12px;
}
.file-link {
display: flex;
gap: 5px;
align-items: center;
color: #b95738;
font-size: 12px;
}
.file-name {
max-width: 220px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.login-page {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
gap: 100px;
padding: 40px;
background:
radial-gradient(ellipse at 15% 20%, #ffead4, transparent 50%),
radial-gradient(ellipse at 95% 90%, #f1eaf8, transparent 45%), #fff9f3;
}
.login-story {
max-width: 480px;
}
.login-story > img {
width: 94px;
height: 94px;
border-radius: 50%;
border: 4px solid #fffaf4;
box-shadow: 0 12px 40px #aa683219;
margin-bottom: 30px;
transform: rotate(-6deg);
}
.login-story h1 {
font-size: 42px;
font-weight: 600;
line-height: 1.55;
letter-spacing: 2px;
}
.login-story > p:not(.eyebrow) {
color: #a0816a;
line-height: 1.9;
font-size: 14px;
margin-top: 20px;
}
.story-tags {
display: flex;
gap: 20px;
margin-top: 40px;
}
.story-tags > span {
display: flex;
align-items: center;
gap: 7px;
color: #b28d72;
font-size: 12px;
}
.login-card {
width: 400px;
background: white;
border: 1px solid #eee1d6;
border-radius: 27px;
padding: 35px;
box-shadow: 0 20px 80px #98694b0b;
}
.login-mark {
width: 48px;
height: 48px;
background: #fff0e2;
color: #c07851;
display: grid;
place-items: center;
border-radius: 16px;
margin-bottom: 24px;
}
.login-card h2 {
font-size: 26px;
font-weight: 600;
}
.muted {
color: #a18a7c;
font-size: 12px;
line-height: 1.8;
margin: 10px 0 28px;
}
.login-card label {
display: block;
color: #8e7160;
font-size: 12px;
margin: 17px 0 8px;
}
.login-card input {
height: 42px;
border-radius: 11px;
}
.login-submit {
margin-top: 25px;
border-radius: 11px;
height: 42px;
}
.login-footnote {
display: block;
text-align: center;
font-size: 10px;
color: #baa392;
margin-top: 25px;
}
.login-card .error-banner {
margin-top: 16px;
margin-bottom: 0;
line-height: 1.7;
}
@media (min-width: 1550px) {
.content {
padding-left: 52px;
padding-right: 52px;
}
}
@media (max-width: 1240px) {
.stat-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.sidebar {
width: 210px;
}
.content {
margin-left: 210px;
padding: 26px;
}
.today-date {
display: none;
}
.overview-grid {
grid-template-columns: 1.4fr 1fr;
}
.login-page {
gap: 55px;
}
.login-story h1 {
font-size: 35px;
}
}
@media (max-width: 880px) {
.sidebar {
width: 76px;
padding: 22px 9px;
}
.content {
margin-left: 76px;
padding: 24px 20px;
}
.brand {
padding: 0 3px 28px;
}
.brand img {
width: 45px;
height: 45px;
}
.brand > div,
.side-caption,
.nav-item > span,
.side-note,
.side-bottom {
display: none;
}
.nav-item {
justify-content: center;
padding: 13px 0;
}
.mobile-logout {
display: inline-flex;
}
.overview-grid {
grid-template-columns: 1fr;
}
.summary-strip {
flex-wrap: wrap;
gap: 15px;
}
.welcome {
padding: 26px;
min-height: 170px;
}
.welcome h2 {
font-size: 22px;
}
.welcome img {
width: 85px;
height: 85px;
}
.login-page {
gap: 35px;
}
.login-story h1 {
font-size: 28px;
}
.story-tags {
gap: 12px;
flex-wrap: wrap;
}
.login-card {
width: 360px;
padding: 28px;
}
}
@media (max-width: 620px) {
.sidebar {
width: 60px;
padding: 20px 6px;
}
.brand {
padding: 0 0 22px;
}
.brand img {
width: 40px;
height: 40px;
}
.content {
margin-left: 60px;
padding: 20px 12px;
}
.topbar h1 {
font-size: 22px;
}
.topbar-actions {
gap: 5px;
}
.topbar-actions > button {
font-size: 11px;
padding: 8px;
}
.eyebrow {
letter-spacing: 1px;
font-size: 9px;
}
.welcome {
padding: 22px;
}
.welcome img {
display: none;
}
.welcome h2 {
font-size: 20px;
}
.stat-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.stat-card {
padding: 15px;
}
.toolbar {
padding: 0 14px 18px;
}
.records-heading {
padding: 22px 15px 18px;
}
.records-heading p {
max-width: 170px;
line-height: 1.8;
}
.search-form {
flex-basis: 100%;
max-width: none;
}
.pagination {
padding: 16px 12px;
flex-direction: column;
align-items: flex-start;
gap: 13px;
}
.pagination > div {
width: 100%;
justify-content: space-between;
}
.detail-grid {
grid-template-columns: 1fr;
}
.detail-summary .identity small {
max-width: 190px;
}
.login-page {
padding: 25px;
flex-direction: column;
gap: 22px;
}
.login-story {
width: min(400px, 100%);
}
.login-story > img {
width: 54px;
height: 54px;
border-radius: 50%;
margin: 0 0 10px;
}
.login-story h1 {
font-size: 25px;
line-height: 1.7;
}
.login-story h1 br {
display: none;
}
.login-story > p:not(.eyebrow),
.story-tags {
display: none;
}
.login-card {
width: min(400px, 100%);
padding: 28px;
}
.bar-chart {
gap: 10px;
padding-left: 20px;
padding-right: 20px;
}
}
.nav-item { text-decoration: none; }
.breed-alphabet { display:flex; flex-wrap:wrap; gap:6px; padding:0 24px 24px; }
.breed-alphabet button { min-width:30px; height:30px; border-radius:9px; border:1px solid #eeded1; padding:0 8px; color:#927766; }
.breed-alphabet button.active { background:#ffeadc; border-color:#dfa080; color:#b85837; }
.breed-aliases { max-width:240px; white-space:normal; }
.breed-form { display:grid; gap:18px; }
.breed-form label { display:grid; gap:8px; }
.breed-form .breed-enabled { display:flex; align-items:center; gap:10px; }
.breed-dialog {max-height:85vh;overflow-y:auto;}
.breed-fact-fields {display:grid;grid-template-columns:1fr 1fr;gap:16px;}
.breed-form textarea {width:100%;border:1px solid #eadacb;border-radius:12px;padding:12px;resize:vertical;}
.breed-source-badges{display:flex;flex-wrap:wrap;gap:6px;max-width:280px}
.breed-source-badges a{text-decoration:none}
.breed-editor-tabs{display:flex;gap:10px;margin-bottom:8px}
.breed-source-list{display:grid;gap:16px}
.breed-source-card{border:1px solid #ead9cc;background:#fffbf7;padding:18px;border-radius:16px}
.breed-source-card header{display:flex;align-items:center;justify-content:space-between;gap:12px}
.breed-source-card small{display:block;margin-top:8px;color:#a28a78}
.breed-source-card dl{display:grid;gap:12px;margin-top:18px}
.breed-source-card dl>div{display:grid;grid-template-columns:90px 1fr;gap:12px}
.breed-source-card dt{color:#a28a78;font-size:13px}
.breed-source-card dd{margin:0;font-size:14px;overflow-wrap:anywhere}
.breed-form select{width:100%;min-height:40px;border:1px solid #ead9cc;border-radius:10px;padding:8px;background:white}