hyapp-h5/common/theme.css
2026-07-09 13:25:54 +08:00

335 lines
8.9 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

:root {
--hy-theme-bg: #fbf8ff;
--hy-theme-surface: rgba(255, 255, 255, 0.96);
--hy-theme-surface-soft: #fdfaff;
--hy-theme-text: #282333;
--hy-theme-muted: #8d879a;
--hy-theme-line: #f0e8fb;
--hy-theme-primary: #dbc8ff;
--hy-theme-primary-strong: #c5a6f6;
--hy-theme-primary-deep: #7d57c7;
--hy-theme-primary-soft: #f4ebff;
--hy-theme-accent: #cfb8fb;
--hy-theme-success: #31c6a8;
--hy-theme-danger: #d95d72;
--hy-theme-shadow: 0 10px 24px rgba(132, 90, 212, 0.075);
--hy-theme-button: #7d57c7;
--hy-theme-button-disabled: #eadffc;
--hy-theme-button-disabled-text: #9a8faa;
--hy-theme-button-shadow: 0 8px 18px rgba(125, 87, 199, 0.18);
--hy-theme-button-disabled-shadow: none;
--hy-theme-focus-ring: rgba(197, 166, 246, 0.18);
--hy-theme-role-shadow: 0 6px 16px rgba(91, 62, 142, 0.08);
--hy-theme-modal-shadow: 0 22px 54px rgba(40, 25, 72, 0.26);
--hy-theme-checkout-shadow: 0 -10px 28px rgba(40, 25, 72, 0.12);
--hy-theme-radius-tiny: 3px;
--hy-theme-radius-icon: 11px;
--hy-theme-radius-small: 12px;
--hy-theme-radius-control: 14px;
--hy-theme-radius-card: 16px;
--hy-theme-radius-language: 17px;
--hy-theme-radius-modal: 22px;
--hy-theme-radius-pill: 999px;
--hy-theme-radius-circle: 50%;
--hy-theme-hero: linear-gradient(
151deg,
#f0e6ff 0%,
#fffbff 58%,
rgba(251, 248, 255, 0.88) 100%
);
}
:root[data-hy-app-code='yumi'] {
--hy-theme-bg: #f5faf6;
--hy-theme-surface: rgba(255, 255, 255, 0.86);
--hy-theme-surface-soft: rgba(248, 253, 250, 0.78);
--hy-theme-text: #1d1d1f;
--hy-theme-muted: #6e746f;
--hy-theme-line: rgba(52, 199, 89, 0.18);
--hy-theme-primary: #34c759;
--hy-theme-primary-strong: #28a84d;
--hy-theme-primary-deep: #1f7a3d;
--hy-theme-primary-soft: rgba(52, 199, 89, 0.13);
--hy-theme-accent: #8fd8a8;
--hy-theme-success: #34c759;
--hy-theme-shadow: 0 18px 44px rgba(24, 95, 50, 0.08);
--hy-theme-button: #248a45;
--hy-theme-button-disabled: rgba(52, 199, 89, 0.2);
--hy-theme-button-disabled-text: rgba(31, 122, 61, 0.58);
--hy-theme-button-shadow: 0 12px 28px rgba(36, 138, 69, 0.2);
--hy-theme-focus-ring: rgba(52, 199, 89, 0.18);
--hy-theme-role-shadow: 0 10px 24px rgba(24, 95, 50, 0.1);
--hy-theme-modal-shadow: 0 24px 70px rgba(16, 76, 40, 0.18);
--hy-theme-checkout-shadow: 0 -14px 34px rgba(16, 76, 40, 0.1);
--hy-theme-radius-tiny: 4px;
--hy-theme-radius-icon: 13px;
--hy-theme-radius-small: 14px;
--hy-theme-radius-control: 16px;
--hy-theme-radius-card: 22px;
--hy-theme-radius-language: 999px;
--hy-theme-radius-modal: 28px;
--hy-theme-radius-pill: 999px;
--hy-theme-radius-circle: 50%;
--hy-theme-hero: linear-gradient(180deg, #fbfffc 0%, #eef9f2 100%);
}
:root[data-hy-app-code='aslan'] {
--hy-theme-bg: #fffdf3;
--hy-theme-surface: rgba(255, 255, 255, 0.98);
--hy-theme-surface-soft: #fffbf0;
--hy-theme-line: #efdc9f;
--hy-theme-primary: #ffe071;
--hy-theme-primary-strong: #f1bd2d;
--hy-theme-primary-deep: #8a5a00;
--hy-theme-primary-soft: #fff2bd;
--hy-theme-accent: #f6c43c;
--hy-theme-success: #2aa875;
--hy-theme-shadow: 0 10px 24px rgba(138, 90, 0, 0.08);
--hy-theme-button: #9b6500;
--hy-theme-button-disabled: #f0dfa9;
--hy-theme-button-disabled-text: #8f7b4c;
--hy-theme-button-shadow: 0 8px 18px rgba(138, 90, 0, 0.18);
--hy-theme-focus-ring: rgba(155, 101, 0, 0.18);
--hy-theme-role-shadow: 0 6px 16px rgba(138, 90, 0, 0.08);
--hy-theme-modal-shadow: 0 22px 54px rgba(92, 60, 0, 0.22);
--hy-theme-checkout-shadow: 0 -10px 28px rgba(92, 60, 0, 0.1);
--hy-theme-radius-tiny: 0;
--hy-theme-radius-icon: 0;
--hy-theme-radius-small: 0;
--hy-theme-radius-control: 0;
--hy-theme-radius-card: 0;
--hy-theme-radius-language: 0;
--hy-theme-radius-modal: 0;
--hy-theme-radius-pill: 0;
--hy-theme-radius-circle: 0;
}
.hy-loading {
position: fixed;
inset: 0;
z-index: 90;
display: none;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 10px;
width: 100vw;
min-height: 100vh;
background: rgba(10, 7, 18, 0.48);
color: var(--hy-theme-muted);
text-align: center;
pointer-events: auto;
}
.hy-loading.active,
.hy-loading.is-active {
display: flex;
}
.hy-loading__mascot {
width: 72px;
height: 72px;
background: url('./png/loading-cat.webp') center / contain no-repeat;
animation: hy-loading-float 1.6s ease-in-out infinite;
}
.hy-loading__spinner {
width: 24px;
height: 24px;
border: 2px solid rgba(125, 87, 199, 0.18);
border-top-color: var(--hy-theme-button);
border-radius: 50%;
animation: hy-loading-spin 0.86s linear infinite;
}
.hy-loading__text {
font-size: 12px;
font-weight: 700;
line-height: 16px;
}
@keyframes hy-loading-float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-6px);
}
}
@keyframes hy-loading-spin {
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: reduce) {
.hy-loading__mascot,
.hy-loading__spinner {
animation: none;
}
}
/* 通用骨架屏:加载中给文本/块级占位元素加 .hy-skeleton 变成流光占位条,数据到达后移除该类恢复真实内容。
底色取主题软色变量lalu/yumi/aslan 三套主题自动跟随;圆形占位(头像等)叠加 .hy-skeleton--circle。 */
.hy-skeleton {
position: relative;
display: inline-block;
overflow: hidden;
min-width: 3.2em;
min-height: 1em;
border-radius: var(--hy-skeleton-radius, 6px);
background: linear-gradient(
90deg,
var(--hy-theme-primary-soft) 25%,
var(--hy-theme-line) 37%,
var(--hy-theme-primary-soft) 63%
);
background-size: 400% 100%;
color: transparent !important;
animation: hy-skeleton-shimmer 1.4s ease infinite;
pointer-events: none;
user-select: none;
}
.hy-skeleton--circle {
--hy-skeleton-radius: 50%;
}
/* 占位期间隐藏子节点(图标等),避免真实内容在流光条上透出。 */
.hy-skeleton > * {
visibility: hidden;
}
@keyframes hy-skeleton-shimmer {
0% {
background-position: 100% 50%;
}
100% {
background-position: 0 50%;
}
}
@media (prefers-reduced-motion: reduce) {
.hy-skeleton {
animation: none;
}
}
/* 页面级骨架屏common/skeleton.js整页覆盖一层模拟页面结构的占位层
数据就绪后整层淡出移除。块级元素复用上面的 .hy-skeleton 流光条。 */
.hy-page-skeleton {
position: fixed;
inset: 0;
z-index: 80;
display: none;
overflow: hidden;
padding: calc(14px + env(safe-area-inset-top)) 16px 30px;
background: var(--hy-theme-bg);
opacity: 1;
transition: opacity 0.2s ease;
}
.hy-page-skeleton.is-active {
display: block;
}
.hy-page-skeleton.is-leaving {
opacity: 0;
pointer-events: none;
}
/* 骨架层中央叠加拉鲁猫 loading 图 + 转圈,视觉复用 .hy-loading__mascot / .hy-loading__spinner。 */
.hy-page-skeleton__mascot-wrap {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 10px;
pointer-events: none;
}
.hy-page-skeleton__header {
display: grid;
grid-template-columns: 36px minmax(0, 1fr) 36px;
align-items: center;
justify-items: center;
height: 58px;
margin-bottom: 10px;
}
.hy-page-skeleton__header .hy-skeleton:nth-child(2) {
width: 42%;
height: 20px;
}
.hy-page-skeleton__card {
margin-bottom: 12px;
padding: 14px;
border: 1px solid var(--hy-theme-line);
border-radius: var(--hy-theme-radius-card);
background: var(--hy-theme-surface);
}
.hy-page-skeleton__profile {
display: grid;
grid-template-columns: 76px minmax(0, 1fr);
gap: 12px;
align-items: center;
min-height: 112px;
}
.hy-page-skeleton__lines {
display: grid;
gap: 10px;
}
.hy-page-skeleton__lines .hy-skeleton:first-child {
width: 56%;
height: 18px;
}
.hy-page-skeleton__lines .hy-skeleton:last-child {
width: 38%;
height: 13px;
}
.hy-page-skeleton__grid {
display: grid;
gap: 12px;
margin-bottom: 12px;
}
.hy-page-skeleton__cell {
display: grid;
justify-items: start;
gap: 9px;
padding: 16px 13px;
border: 1px solid var(--hy-theme-line);
border-radius: var(--hy-theme-radius-card);
background: var(--hy-theme-surface);
}
.hy-page-skeleton__cell--center {
justify-items: center;
}
.hy-page-skeleton__cell .hy-skeleton {
height: 13px;
}
.hy-page-skeleton__cell .hy-skeleton--circle {
width: 46px;
height: 46px;
min-width: 46px;
}
@media (prefers-reduced-motion: reduce) {
.hy-page-skeleton {
transition: none;
}
}