2026-07-17 11:54:43 +08:00

736 lines
13 KiB
CSS

:root {
--fami-primary: #0fe3d4;
--fami-primary-strong: #0ccfc2;
--fami-bg: #f5f5f5;
--fami-surface: #ffffff;
--fami-text: #333333;
--fami-copy: #5c5a4b;
--fami-muted: #878787;
--fami-disabled: #e4e4e4;
--fami-disabled-text: #b1b1b1;
}
* {
box-sizing: border-box;
}
html,
body {
width: 100%;
min-height: 100%;
margin: 0;
-webkit-font-smoothing: antialiased;
-webkit-tap-highlight-color: transparent;
-webkit-text-size-adjust: 100%;
}
body {
display: flex;
justify-content: center;
overflow-x: hidden;
background: #111111;
color: var(--fami-text);
font-family:
-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'SF Pro Display',
'Segoe UI', Helvetica, Arial, sans-serif;
}
button,
input {
font: inherit;
}
button {
margin: 0;
border: 0;
padding: 0;
background: transparent;
color: inherit;
}
button,
[role='button'] {
cursor: pointer;
}
button:focus,
input:focus {
outline: none;
}
button:focus-visible,
input:focus-visible {
outline: 2px solid rgba(15, 227, 212, 0.55);
outline-offset: 2px;
}
[hidden] {
display: none !important;
}
img.is-empty {
background: var(--fami-disabled);
}
body.modal-open {
overflow: hidden;
}
.fami-page {
position: relative;
width: 100%;
max-width: 375px;
min-height: max(812px, 100dvh);
overflow-x: hidden;
background: var(--fami-bg);
}
.fami-status-bar {
position: absolute;
z-index: 10;
top: 0;
left: 0;
width: 100%;
height: 44px;
background: #ffffff;
direction: ltr;
}
.fami-status-time {
position: absolute;
top: 13px;
left: 33.867px;
width: 54px;
height: 15px;
color: #000000;
font-family: Helvetica, Arial, sans-serif;
font-size: 15px;
font-weight: 400;
line-height: 15px;
text-align: center;
}
.fami-status-icon {
position: absolute;
display: block;
}
.fami-status-icon--cellular {
top: 15px;
right: 63.66px;
width: 17px;
height: 11.332px;
}
.fami-status-icon--wifi {
top: 16.327px;
right: 43.33px;
width: 15.333px;
height: 11.007px;
}
.fami-status-icon--battery {
top: 16.335px;
right: 14px;
width: 24.331px;
height: 11.333px;
}
.fami-nav {
position: absolute;
z-index: 9;
top: 44px;
left: 0;
width: 100%;
height: 44px;
background: #ffffff;
direction: ltr;
}
.fami-nav__back,
.fami-nav__language {
position: absolute;
top: 10px;
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
}
.fami-nav__back {
left: 12px;
}
.fami-nav__language {
right: 12px;
}
.fami-nav__back img,
.fami-nav__language img {
display: block;
width: 24px;
height: 24px;
}
.fami-nav__title {
position: absolute;
top: 11px;
left: 50%;
margin: 0;
color: var(--fami-text);
font-size: 18px;
font-weight: 600;
line-height: 18px;
text-align: center;
text-transform: capitalize;
white-space: nowrap;
transform: translateX(-50%);
}
.language-switcher {
position: absolute;
top: 0;
right: 0;
width: 48px;
height: 44px;
}
.language-menu {
position: absolute;
z-index: 40;
top: 42px;
right: 8px;
display: grid;
gap: 2px;
width: 70px;
padding: 5px;
border: 1px solid rgba(51, 51, 51, 0.08);
border-radius: 8px;
background: #ffffff;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.14);
}
.language-menu button {
min-height: 32px;
border-radius: 6px;
font-size: 12px;
font-weight: 600;
}
.language-menu button.is-active {
background: rgba(15, 227, 212, 0.14);
color: #087d75;
}
.fami-card {
border-radius: 8px;
background: var(--fami-surface);
}
.fami-profile {
position: absolute;
top: 100px;
right: 12px;
left: 12px;
display: flex;
align-items: center;
gap: 12px;
height: 96px;
padding: 12px;
}
.fami-profile__avatar {
display: block;
flex: 0 0 auto;
width: 72px;
height: 72px;
border-radius: 8px;
object-fit: cover;
object-position: center 26%;
}
.fami-profile__avatar.is-round {
border-radius: 999px;
}
.fami-profile__copy,
.fami-contact__copy {
display: flex;
min-width: 0;
flex-direction: column;
align-items: flex-start;
color: var(--fami-text);
text-transform: capitalize;
}
.fami-profile__copy {
gap: 8px;
}
.fami-profile__name,
.fami-contact__name {
overflow: hidden;
width: 100%;
font-size: 16px;
font-weight: 600;
line-height: 19px;
text-overflow: ellipsis;
white-space: nowrap;
}
.fami-profile__meta,
.fami-contact__meta {
overflow: hidden;
width: 100%;
font-size: 12px;
font-weight: 500;
line-height: 14px;
text-overflow: ellipsis;
white-space: nowrap;
}
.fami-profile__note {
overflow: hidden;
width: 100%;
color: #b1b1b1;
font-size: 10px;
font-weight: 600;
line-height: 12px;
text-overflow: ellipsis;
white-space: nowrap;
}
.fami-contact {
position: absolute;
top: 208px;
right: 12px;
left: 12px;
display: flex;
align-items: center;
gap: 12px;
height: 65px;
padding: 12px;
text-align: left;
}
.fami-contact__icon {
display: block;
flex: 0 0 auto;
width: 41px;
height: 41px;
}
.fami-contact__copy {
gap: 8px;
flex: 1 1 auto;
}
.fami-contact__edit {
display: block;
flex: 0 0 auto;
width: 20px;
height: 20px;
}
.fami-balance-card {
position: absolute;
top: 284px;
right: 16px;
left: 12px;
height: 99px;
overflow: hidden;
border-radius: 12px;
background: url('./assets/fami/balance-bg.svg') center / 100% 100% no-repeat;
}
.fami-balance-card__label {
position: absolute;
top: 12px;
left: 12px;
color: var(--fami-copy);
font-size: 14px;
font-weight: 500;
line-height: 20px;
letter-spacing: -0.56px;
text-transform: capitalize;
}
.fami-balance-card__value {
position: absolute;
top: 45px;
left: 12px;
display: flex;
align-items: center;
gap: 9px;
min-width: 180px;
height: 41px;
}
.fami-balance-card__value img {
display: block;
width: 41px;
height: 41px;
object-fit: contain;
}
.fami-balance-card__value strong {
color: var(--fami-text);
font-size: 18px;
font-weight: 500;
line-height: 18px;
white-space: nowrap;
}
.fami-balance-card__withdraw {
position: absolute;
top: 62px;
right: 12px;
display: flex;
align-items: center;
justify-content: center;
min-width: 89px;
height: 25px;
border-radius: 25px;
padding: 4px 12px;
background: var(--fami-primary);
color: #ffffff;
font-size: 12px;
font-weight: 700;
line-height: 17px;
letter-spacing: -0.5px;
text-align: center;
white-space: nowrap;
}
.fami-date-strip {
position: absolute;
right: 12px;
left: 12px;
display: flex;
align-items: center;
height: 24px;
overflow-x: auto;
overflow-y: hidden;
scrollbar-width: none;
scroll-snap-type: x proximity;
}
.fami-date-strip::-webkit-scrollbar {
display: none;
}
.fami-date-strip__item {
position: relative;
flex: 0 0 49px;
height: 24px;
color: rgba(51, 51, 51, 0.4);
font-size: 14px;
font-weight: 600;
line-height: 20px;
text-align: center;
white-space: nowrap;
scroll-snap-align: center;
}
.fami-date-strip__item.is-active {
color: var(--fami-text);
}
.fami-date-strip__item:first-child {
flex-basis: 42px;
text-align: left;
}
.fami-date-strip__item + .fami-date-strip__item {
margin-left: 6px;
}
.fami-date-strip__item.is-active::after {
position: absolute;
right: 50%;
bottom: 0;
width: 14px;
height: 4px;
background: url('./assets/fami/underline.svg') center / 14px 4px no-repeat;
content: '';
transform: translateX(50%);
}
.fami-primary-button {
display: flex;
align-items: center;
justify-content: center;
width: 295px;
height: 56px;
border-radius: 37px;
background: var(--fami-primary);
color: #ffffff;
font-size: 18px;
font-weight: 700;
line-height: 22px;
text-align: center;
}
.fami-primary-button:active {
background: var(--fami-primary-strong);
}
.fami-primary-button:disabled,
.fami-primary-button.is-disabled {
background: var(--fami-disabled);
color: var(--fami-disabled-text);
}
.fami-primary-button__icon {
width: 32px;
height: 32px;
margin-right: 11px;
}
.fami-home-indicator {
position: fixed;
z-index: 8;
bottom: 0;
left: 50%;
width: min(100%, 375px);
height: 24px;
background: var(--fami-bg) url('./assets/fami/home-indicator.svg') center /
375px 24px no-repeat;
pointer-events: none;
transform: translateX(-50%);
}
.fami-empty {
color: var(--fami-muted);
font-size: 12px;
line-height: 18px;
text-align: center;
}
.fami-skeleton {
position: relative;
overflow: hidden;
color: transparent !important;
border-radius: 4px;
background: #ececec;
}
.fami-skeleton::after {
position: absolute;
inset: 0;
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.76),
transparent
);
content: '';
transform: translateX(-100%);
animation: fami-skeleton 1.2s infinite;
}
@keyframes fami-skeleton {
to {
transform: translateX(100%);
}
}
.fami-modal {
position: fixed;
z-index: 60;
inset: 0;
display: flex;
align-items: flex-end;
justify-content: center;
}
.fami-modal__backdrop {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.42);
}
.fami-sheet {
position: relative;
z-index: 1;
width: min(100%, 375px);
max-height: 78dvh;
overflow-y: auto;
border-radius: 20px 20px 0 0;
padding: 20px 20px calc(24px + env(safe-area-inset-bottom));
background: #ffffff;
}
.fami-sheet__head {
display: flex;
align-items: center;
justify-content: space-between;
min-height: 32px;
margin-bottom: 18px;
}
.fami-sheet__head h2 {
margin: 0;
color: var(--fami-text);
font-size: 18px;
font-weight: 700;
line-height: 24px;
}
.fami-sheet__close {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: 50%;
background: #f1f1f1;
color: var(--fami-text);
font-size: 22px;
line-height: 1;
}
.fami-field {
display: grid;
gap: 8px;
}
.fami-field > span {
color: var(--fami-copy);
font-size: 13px;
font-weight: 600;
}
.fami-field input,
.fami-search-control input {
width: 100%;
height: 48px;
border: 1px solid #e8e8e8;
border-radius: 12px;
padding: 0 14px;
background: #f8f8f8;
color: var(--fami-text);
font-size: 15px;
}
.fami-search-control {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 8px;
}
.fami-search-control button {
min-width: 78px;
height: 48px;
border-radius: 12px;
padding: 0 14px;
background: var(--fami-primary);
color: #ffffff;
font-size: 14px;
font-weight: 700;
}
.fami-sheet__action {
width: 100%;
height: 50px;
margin-top: 16px;
border-radius: 25px;
background: var(--fami-primary);
color: #ffffff;
font-size: 16px;
font-weight: 700;
}
.fami-sheet__action:disabled {
background: var(--fami-disabled);
color: var(--fami-disabled-text);
}
.fami-sheet__status {
margin-top: 10px;
color: #c73a4c;
font-size: 12px;
line-height: 18px;
}
.fami-sheet__status.is-success {
color: #09958b;
}
.fami-search-result {
display: flex;
align-items: center;
gap: 12px;
min-height: 76px;
margin-top: 14px;
border-radius: 8px;
padding: 12px;
background: var(--fami-bg);
}
.fami-search-result img {
width: 52px;
height: 52px;
border-radius: 50%;
object-fit: cover;
}
.fami-search-result__copy {
display: grid;
min-width: 0;
flex: 1;
gap: 6px;
}
.fami-search-result__copy strong {
overflow: hidden;
font-size: 15px;
text-overflow: ellipsis;
white-space: nowrap;
}
.fami-search-result__copy span {
color: var(--fami-copy);
font-size: 12px;
}
.fami-search-result__action {
min-width: 66px;
height: 34px;
border-radius: 18px;
padding: 0 12px;
background: var(--fami-primary);
color: #ffffff;
font-size: 12px;
font-weight: 700;
}
[dir='rtl'] .fami-contact {
text-align: right;
}
[dir='rtl'] .fami-profile__copy,
[dir='rtl'] .fami-contact__copy {
align-items: flex-end;
}
[dir='rtl'] .fami-primary-button__icon {
margin-right: 0;
margin-left: 11px;
}
@media (max-width: 374px) {
.fami-page {
min-height: 100dvh;
}
}
@media (prefers-reduced-motion: reduce) {
.fami-skeleton::after {
animation: none;
}
}