/* ============================================================
   🛒 購物車、結帳、成功畫面樣式 (Cart & Success)
   ============================================================ */

/* ============================================================
   1. StickyBar (底部懸浮島嶼 - 旗艦版)
   ============================================================ */


.stickybar {
  /* 🔥 核心修正：強制固定定位 */
  position: fixed !important; 
  bottom: 20px !important; 
  left: 20px !important; 
  right: 20px !important; 
  margin: 0 auto !important;
  width: auto !important;
  max-width: 600px;
  z-index: 10000 !important;
  overflow: visible !important;
  padding: 16px 20px;
  border-radius: 24px;
  
  /* 高級玻璃質感 */
  background: rgba(255, 255, 255, 0.75);
  backdrop-filter: blur(28px) saturate(180%);
  -webkit-backdrop-filter: blur(28px) saturate(180%);
  
  border: 1px solid rgba(255, 255, 255, 0.6);
  box-shadow: 
    0 10px 30px rgba(0, 0, 0, 0.15),
    0 4px 8px rgba(0, 0, 0, 0.05),
    inset 0 1px 0 rgba(255, 255, 255, 0.5);
    
  /* 動畫設定 */
  transition: transform 0.3s ease, opacity 0.3s ease;
  
  /* 預設狀態：不做任何 transform，避免干擾 fixed */
  transform: none;
  opacity: 1;
}

/* 當 AI 開啟時，強制隱藏 StickyBar */
#StickyBar.ai-open-hidden {
    display: none !important;
    visibility: hidden !important;
    opacity: 0 !important;
    pointer-events: none !important;
}

/* 隱藏狀態 (往下推) */
.stickybar.hide { 
  transform: translateY(150%) !important; 
  opacity: 0 !important; 
  pointer-events: none;
}

/* 顯示狀態 (復原) */
.stickybar.show {
  transform: translateY(0) !important;
  opacity: 1 !important;
  z-index: 99999;
}

/* 當 StickyBar 需要在 Modal 操作時顯示，給予極高的層級 */
#StickyBar.sticky-high-z {
    z-index: 99999 !important; /* 確保比 Product Modal 高 */
}

/* === 內部排版 === */
.sticky-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  position: relative;
  z-index: 2;
}

/* === 左側：金額 === */
.amount-box {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.grand-total {
  display: flex;
  align-items: baseline;
  gap: 6px;
}

.grand-total .label {
  font-size: 13px;
  color: #7a8c82;
  font-weight: 500;
}

.grand-total b {
  font-size: 22px;
  font-weight: 800;
  color: #2f4b3c;
  letter-spacing: 0.5px;
  font-family: "Noto Serif TC", serif; /* 數字用宋體更有質感 */
}

.sub-detail {
  font-size: 12px;
  color: #889990;
  display: flex;
  gap: 8px;
}

/* 運費小標籤 */
.ship-tag {
  background: rgba(90, 123, 104, 0.1);
  padding: 1px 6px;
  border-radius: 4px;
  color: #5a7b68;
  font-weight: 600;
}

/* === 右側：操作區 === */
.action-box {
  display: flex;
  align-items: center;
  gap: 10px;
}

/* 查看明細 (圓形按鈕) */
.icon-btn {
  width: 42px;
  height: 42px;
  border-radius: 50%;
  border: 1px solid rgba(180, 200, 190, 0.5);
  background: rgba(255, 255, 255, 0.6);
  color: #5a7b68;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: all 0.2s;
  font-size: 12px;
}
.icon-btn:hover {
  background: #fff;
  transform: translateY(-2px);
  box-shadow: 0 4px 12px rgba(90, 123, 104, 0.15);
}

/* 去買單按鈕 (Sticky 專用) */
.submit-btn-sticky {
  padding: 10px 24px;
  height: 42px;
  border-radius: 21px; /* 膠囊狀 */
  background: linear-gradient(135deg, #2f4b3c, #4a6b58);
  color: #fff;
  font-weight: 600;
  font-size: 15px;
  border: none;
  box-shadow: 0 4px 14px rgba(47, 75, 60, 0.3);
  cursor: pointer;
  transition: all 0.2s;
  white-space: nowrap;
}
.submit-btn-sticky:hover {
  transform: translateY(-2px);
  box-shadow: 0 6px 18px rgba(47, 75, 60, 0.4);
  background: linear-gradient(135deg, #3a5c4a, #5a7b68);
}
/* 箭頭旋轉動畫 */
.arrow-icon {
  display: inline-block;
  /* 讓箭頭轉動跟視窗滑動的時間一致，視覺上會更同步 */
  transition: transform 0.4s cubic-bezier(0.25, 1, 0.5, 1);
}

/* 當明細打開時，箭頭轉 180 度 (變向下) */
.arrow-icon.rotated {
  transform: rotate(180deg);
}

/* === 免運進度條 (整合在頂部) === */
.progress-bar-wrap {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 4px; /* 細一點 */
  background: rgba(0, 0, 0, 0.05);
  z-index: 10;
  
  /* 🔥 關鍵：這裡設圓角 + hidden，才不會切到氣泡 */
  border-radius: 24px 24px 0 0; 
  overflow: hidden;
}

#freeProgressBar {
  height: 100%;
  width: 0%;
  /* 漸層綠色 */
  background: linear-gradient(90deg, #8fb79c, #5a7b68);
  border-radius: 0 4px 4px 0; /* 右邊圓頭 */
  transition: width 0.5s cubic-bezier(0.25, 1, 0.5, 1);
  
  /* 微微發光 */
  box-shadow: 0 0 6px rgba(90, 123, 104, 0.4);
}

/* 免運提示 (浮在上方) */
.free-hint {
  position: absolute;
  /* 🔥 位置修正：浮在卡片正上方邊緣，不要飛太高 */
  top: -36px; 
  left: 50%;
  transform: translateX(-50%) translateY(10px) scale(0.9); /* 初始狀態：微縮+下沉 */
  
  
  /* 外觀美化 */
  background: rgba(47, 75, 60, 0.75); /* 深墨綠底 */
  color: #fff;
  font-size: 13px;
  font-weight: 500;
  padding: 6px 14px;
  border-radius: 20px;
  
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  
  /* 高級陰影 */
  box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  backdrop-filter: blur(4px);
  
  /* 彈跳動畫設定 */
  transition: 
    opacity 0.3s ease,
    transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); /* Q彈曲線 */
  
  z-index: -1; /* 讓它在卡片後面層級，製造「浮出」感 */
}

.free-hint.show {
  opacity: 1;
  transform: translateX(-50%) translateY(0) scale(1);
  z-index: 1000; /* 顯示時浮到最上層 */
}

/* 加上一個小三角形指針 */
.free-hint::after {
  content: "";
  position: absolute;
  bottom: -5px;
  left: 50%;
  transform: translateX(-50%);
  border-width: 5px 5px 0;
  border-style: solid;
  border-color: rgba(47, 75, 60, 0.9) transparent transparent transparent;
}

/* 4. 確保卡片內容壓在進度條上面 */
.sticky-inner {
  position: relative;
  z-index: 2; /* 確保文字按鈕在進度條上面 */
  padding-top: 6px; /* 稍微留點空間給進度條呼吸 */
}

/* 手機版適配 */
@media (max-width: 400px) {
  .stickybar { bottom: 16px; left: 12px; right: 12px; padding: 14px; }
  .grand-total b { font-size: 20px; }
  .submit-btn-sticky { padding: 8px 18px; font-size: 14px; }
}
/* ============================================================
   2. Shopping Sheet (購物明細 - 旗艦精品版)
   ============================================================ */

/* === Modal 容器 (頂級毛玻璃) === */
.sheet-backdrop {
  position: fixed; inset: 0; display: none; align-items: flex-end; justify-content: center;
  background: rgba(20, 30, 25, 0.45); backdrop-filter: blur(8px) saturate(120%); 
  z-index: 2000 !important; opacity: 0; transition: opacity 0.4s ease;
}
.sheet-backdrop[aria-hidden="false"] { display: flex; opacity: 1; }

.sheet {
  position: fixed; left: 0; right: 0; bottom: 0; 
  max-height: calc(85vh - var(--stickybar-height, 90px)); /* 拉高一點 */
  
  /* 極光白漸層背景 */
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(248, 250, 248, 0.9) 100%);
  border-radius: 32px 32px 0 0; /* 大圓角 */
  box-shadow: 0 -10px 40px rgba(90, 123, 104, 0.2);
  border-top: 1px solid rgba(255, 255, 255, 0.8);
  
  
  transform: translateY(110%); 
  transition: transform 0.4s cubic-bezier(0.25, 1, 0.5, 1);
  z-index: 2200 !important; padding: 24px 24px calc(32px + env(safe-area-inset-bottom));
  overflow-y: auto; -webkit-overflow-scrolling: touch;
  overscroll-behavior-y: contain;
  padding-bottom: calc(90px + env(safe-area-inset-bottom)) !important;
}
.sheet[data-open="true"] { transform: translateY(0); }

/* === 拉桿 (Pill) === */
.sheet-handle {
  width: 48px; height: 5px; 
  background: #d0dcd5; border-radius: 999px; 
  margin: 0 auto 20px; /* 增加下方間距 */
  box-shadow: inset 0 1px 2px rgba(0,0,0,0.05);
  position: relative; /* 為了讓偽元素定位 */
  z-index: 10;
}
.sheet-handle::after {
  content: "";
  position: absolute;
  top: -20px; bottom: -20px;
  left: -50%; right: -50%;
  /* background: rgba(255,0,0,0.2); 開發時可打開這行看範圍 */ 
}
/* === 標題 (書法美學) === */
.sheet h3 {
  font-size: 22px; text-align: center; font-weight: 800; color: #2a3a32; 
  margin-bottom: 24px; letter-spacing: 1px;
  position: relative; display: inline-block; left: 50%; transform: translateX(-50%);
}
/* 標題裝飾線 */
.sheet h3::after {
  content: ""; display: block; width: 40px; height: 3px; 
  background: linear-gradient(90deg, #a8b78f, #c7d6b3);
  border-radius: 4px; margin: 8px auto 0;
}

/* === 商品列表 (卡片化) === */
.sheet #cartItems {
  display: flex; flex-direction: column; gap: 12px; margin-bottom: 24px;
}

.line-item {
  position: relative; overflow: hidden;
  background: #fff; border-radius: 16px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.03); border: 1px solid rgba(0,0,0,0.04);
  transition: all 0.3s ease;
}
/* 滑動刪除時的紅色底 */
.line-item::before {
  content: "🗑️"; 
  position: absolute; right: 20px; top: 50%; transform: translateY(-50%);
  font-size: 20px; color: #fff; z-index: 0;
}
.line-item:active { transform: scale(0.98); background: #fffbfb; }

/* 內容區塊 */
.swipe-content {
  display: flex; justify-content: space-between; align-items: center;
  padding: 16px 18px; background: #fff; position: relative; z-index: 1;
  transition: transform 0.25s cubic-bezier(0.25, 0.8, 0.5, 1);
  /* 🔥 新增：確保高度能隨內容撐開 */
  height: auto; 
  min-height: 72px; /* 設定一個舒適的最小高度 */
}

/* 商品資訊 */
.swipe-info { 
  display: flex; 
  flex-direction: column; 
  gap: 4px; 
  
  /* 🔥 新增：佔據剩餘空間，防止被價格擠壓 */
  flex: 1; 
  min-width: 0; /* Flexbox 換行救星 (防止文字溢出容器) */
  padding-right: 12px; /* 跟右邊價格保持距離 */ 
}
.li-title { 
  font-size: 16px; 
  font-weight: 700; 
  color: #2f4b3c; 
  letter-spacing: 0.3px;
  
  /* 🔥 新增：強制換行與行高優化 */
  white-space: normal !important; /* 強制覆蓋任何可能導致不換行的設定 */
  word-wrap: break-word;          /* 過長的字強制切斷 */
  line-height: 1.4;               /* 讓多行文字閱讀不擁擠 */
}
.li-qty { font-size: 13px; color: #889990; font-weight: 500; }

/* 價格 (右側強調) */
.li-sub { 
  font-size: 16px; 
  font-weight: 700; 
  color: #305c46; 
  font-family: "Noto Serif TC", serif;
  
  /* 🔥 新增：防止價格被擠壓或換行 */
  white-space: nowrap; 
  flex-shrink: 0; /* 空間不夠時，絕不縮小價格欄位 */
}

/* === 刪除按鈕 (紅色漸層) === */
.swipe-delete {
  position: absolute; 
  right: 0; top: 0; bottom: 0; 
  width: 80px;
  
  /* 🎨 美化：紅色漸層背景 */
  background: linear-gradient(135deg, #ff5f5f, #e04f4f);
  color: #fff; 
  border: none; 
  font-weight: 600;
  
  /* 🔥 關鍵：預設往右推 100%，藏在畫面外 */
  transform: translateX(100%); 
  transition: transform 0.25s;
  
  display: flex; align-items: center; justify-content: center; 
  z-index: 2; /* 確保它浮在內容層之上 */
}

/* === 金額結算區 (極簡分隔線) === */
.sheet .line {
  display: flex; justify-content: space-between; align-items: center;
  margin: 10px 0; font-size: 15px; color: #556660;
}

.sheet .line.total {
  margin-top: 18px; padding-top: 18px;
  border-top: 1px dashed rgba(160, 180, 170, 0.4); /* 虛線分隔 */
  font-weight: 700; font-size: 18px; color: #2a3a32;
  align-items: baseline;
}

/* 總金額數字放大 */
.sheet .line.total span:last-child {
  font-size: 24px; color: #b8860b; /* 金色 */
  font-family: "Noto Serif TC", serif;
}

/* === 關閉按鈕 (懸浮膠囊) === */
/* 右上角 X 按鈕樣式 */
.sheet-close-btn {
  position: absolute;
  top: 20px;
  right: 20px;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.05); /* 淡淡的灰色背景 */
  border: none;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #555;
  cursor: pointer;
  z-index: 50; /* 確保在最上層 */
  transition: background 0.2s;
}

.sheet-close-btn:active {
  background: rgba(0, 0, 0, 0.15);
  transform: scale(0.95);
}

/* 確保標題不會被按鈕蓋住，如果標題太長 */
.sheet h3 {
  padding: 0 40px; /* 左右留白 */
}

/* 隱藏版商品的金色標記 */
.li-title span[style*="color"] {
  background: linear-gradient(90deg, #b8860b, #d4af37);
  -webkit-background-clip: text; -webkit-text-fill-color: transparent;
  text-shadow: 0 1px 2px rgba(184, 134, 11, 0.1);
}
/* 明細小字 (裝罐資訊、禮盒內容) */
.li-title .muted {
  display: block;      /* 讓它自動變到下一行 */
  margin-top: 4px;     /* 與標題的距離 */
  font-size: 13px;     /* 字體小一點 */
  font-weight: 400;    /* 字體細一點 */
  color: #858585;      /* 灰色 */
  line-height: 1.4;
}

/* === 金額明細區塊 (Refined Summary) === */
.summary-block {
  margin-top: 12px;       /* 與上方商品列表的距離 */
  margin-bottom: 8px;     /* 與下方總金額的距離 */
  padding: 0 12px;        /* 左右內縮，讓視覺比卡片更集中 */
  display: flex;
  flex-direction: column;
  gap: 8px;               /* 每一行的間距 */
}

/* 每一行的通用樣式 */
.summary-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 14px;        /* 比卡片標題小一點，強調精緻感 */
  line-height: 1.5;
}

/* 左側標籤 (柔和灰綠) */
.summary-row .label {
  color: #6c7a74;         
  font-weight: 500;
  letter-spacing: 0.5px;
}

/* 右側數值 (襯線體數字) */
.summary-row .value {
  color: #4a5e54;
  font-family: "Noto Serif TC", serif; /* 呼應總金額字體 */
  font-weight: 600;
}

/* === 折扣行特別樣式 (Discount Highlight) === */
.summary-row.discount {
  margin-top: 4px;        /* 稍微與上方區隔 */
  padding-top: 8px;       /* 上方留白 */
  border-top: 1px dashed rgba(0,0,0,0.06); /* 淡淡的分隔線 */
}

.summary-row.discount .label {
  color: #c05d55;         /* 質感豆沙紅 */
  font-weight: 700;
  display: flex; align-items: center; gap: 4px;
}

.summary-row.discount .value {
  color: #c05d55;         /* 數字也變紅 */
  font-weight: 700;
}

/* 修正既有的 .line.total 上方間距，讓整體更協調 */
.sheet .line.total {
  margin-top: 12px;       /* 縮小原本過大的間距 */
  padding-top: 20px;
  /* 維持您原本的虛線設定，這裡不需更動，只需調整間距 */
}
/* ============================================================
   3. Success Modal (成功畫面 - 旗艦儀式感版)
   ============================================================ */

/* === 背景遮罩 (深邃霧化) === */
.success-backdrop {
  position: fixed; inset: 0; display: flex; align-items: center; justify-content: center;
  background: rgba(20, 35, 30, 0.65); /* 深墨綠半透明 */
  backdrop-filter: blur(16px) saturate(120%); /* 強力磨砂 */
  -webkit-backdrop-filter: blur(16px) saturate(120%);
  opacity: 0; visibility: hidden; transition: all 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);
  z-index: 10050;
}
.success-backdrop.show { opacity: 1; visibility: visible; }

/* === 主卡片 (懸浮玻璃 + 流光邊框) === */
.success-card.glass-success {
  width: 86%; max-width: 380px; padding: 40px 30px 32px;
  border-radius: 32px;
  
  /* 頂級玻璃材質 */
  background: linear-gradient(145deg, rgba(255,255,255,0.95), rgba(245,250,248,0.9));
  box-shadow: 
    0 20px 60px rgba(0, 0, 0, 0.25),
    0 0 0 1px rgba(255, 255, 255, 0.8) inset; /* 內發光邊框 */

  text-align: center;
  transform: scale(0.9) translateY(20px);
  transition: all 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); /* 彈跳出場 */
}

.success-backdrop.show .success-card {
  transform: scale(1) translateY(0);
}

/* === 依序滑入動畫 (Stagger Animation) === */
.stagger-1, .stagger-2, .stagger-3, .stagger-4, .stagger-5 {
  opacity: 0; transform: translateY(10px); transition: all 0.6s ease;
}
.success-backdrop.show .stagger-1 { opacity: 1; transform: translateY(0); transition-delay: 0.1s; }
.success-backdrop.show .stagger-2 { opacity: 1; transform: translateY(0); transition-delay: 0.2s; }
.success-backdrop.show .stagger-3 { opacity: 1; transform: translateY(0); transition-delay: 0.3s; }
.success-backdrop.show .stagger-4 { opacity: 1; transform: translateY(0); transition-delay: 0.4s; }
.success-backdrop.show .stagger-5 { opacity: 1; transform: translateY(0); transition-delay: 0.5s; }


/* === 1. 勾勾動畫 === */
.success-header { position: relative; width: 80px; height: 80px; margin: 0 auto 16px; }

/* 背後的光暈呼吸 */
.check-glow {
  position: absolute; inset: 0; border-radius: 50%;
  background: radial-gradient(circle, rgba(76,217,100,0.2) 0%, transparent 70%);
  animation: pulseGlow 2s infinite;
}
@keyframes pulseGlow { 0% { transform: scale(0.8); opacity: 0.5; } 100% { transform: scale(1.5); opacity: 0; } }

.success-check { width: 100%; height: 100%; position: relative; z-index: 2; }
.check-circle {
  stroke: #5a7b68; stroke-width: 3; stroke-linecap: round;
  stroke-dasharray: 320; stroke-dashoffset: 320;
  animation: drawCircle 0.8s cubic-bezier(0.25, 1, 0.5, 1) forwards 0.2s;
}
.check-mark {
  stroke: #4cd964; stroke-width: 5; stroke-linecap: round; stroke-linejoin: round;
  stroke-dasharray: 80; stroke-dashoffset: 80;
  animation: drawCheck 0.5s cubic-bezier(0.65, 0, 0.45, 1) forwards 0.6s;
  filter: drop-shadow(0 2px 4px rgba(76,217,100,0.4));
}
@keyframes drawCircle { to { stroke-dashoffset: 0; } }
@keyframes drawCheck { to { stroke-dashoffset: 0; } }


/* === 2. 文字組 === */
.success-title {
  font-size: 24px; font-weight: 800; color: #2f4b3c; letter-spacing: 1px; margin-bottom: 6px;
}
.success-sub {
  font-size: 14px; color: #7a8c82; font-weight: 500; margin-bottom: 24px;
}


/* === 3. 擬真收據 (Receipt) === */
.success-receipt {
  background: #fff;
  border: 1px solid rgba(180, 200, 190, 0.4);
  border-radius: 16px;
  padding: 16px 20px;
  margin-bottom: 24px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.03);
  position: relative;
}
/* 頂部的裝飾線 */
.success-receipt::before {
  content: ""; position: absolute; top: -1px; left: 20%; right: 20%; height: 2px;
  background: linear-gradient(90deg, transparent, #a8c2b3, transparent);
}

.receipt-row {
  display: flex; justify-content: space-between; align-items: center; font-size: 14px;
}
.receipt-row .label { color: #889990; font-weight: 500; }
.receipt-row .value { color: #333; font-weight: 600; letter-spacing: 0.5px; }
.receipt-row .value.price { color: #b8860b; font-weight: 700; font-size: 16px; font-family: "Noto Serif TC", serif; }
.font-mono { font-family: monospace; font-size: 13px; letter-spacing: 0; background: #f4f4f4; padding: 2px 6px; border-radius: 4px; color: #555 !important;}

.receipt-divider {
  height: 1px; background: #f0f0f0; margin: 12px 0;
  background-image: linear-gradient(to right, #ccc 40%, rgba(255, 255, 255, 0) 0%);
  background-position: bottom; background-size: 6px 1px; background-repeat: repeat-x;
}


/* === 4. LINE 按鈕 (Hero Button) === */
#lineBindBox { margin-bottom: 12px; }

.line-bind-btn {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  width: 100%; padding: 14px 0;
  border-radius: 14px;
  text-decoration: none;
  
  /* LINE 官方綠漸層 */
  background: linear-gradient(135deg, #06c755, #00b900);
  color: #fff; font-size: 16px; font-weight: 700; letter-spacing: 0.5px;
  
  box-shadow: 0 4px 12px rgba(6, 199, 85, 0.3);
  transition: all 0.25s ease;
}
.line-bind-btn svg { fill: #fff; } /* ICON 顏色 */

.line-bind-btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(6, 199, 85, 0.4);
  background: linear-gradient(135deg, #0be060, #00b900);
}
.line-bind-btn:active { transform: scale(0.98); }

.line-hint { font-size: 12px; color: #99a; margin-top: 8px; font-weight: 400; }


/* === 5. 返回按鈕 (次要按鈕) === */
.success-close {
  background: transparent; border: none;
  color: #7a8c82; font-size: 15px; font-weight: 600;
  padding: 10px 20px; cursor: pointer;
  transition: color 0.2s;
}
.success-close:hover { color: #2f4b3c; text-decoration: underline; text-underline-offset: 4px; }

/* === 4. Global Loading Overlay === */
.loading-overlay {
  position: fixed; inset: 0; background: rgba(255, 255, 255, 0.8); backdrop-filter: blur(4px);
  display: flex; flex-direction: column; justify-content: center; align-items: center;
  z-index: 9999; opacity: 0; pointer-events: none; transition: opacity 0.3s;
}
.loading-overlay.show { opacity: 1; pointer-events: auto; }
.loading-spinner { width: 48px; height: 48px; border: 4px solid #ccc; border-top-color: #1e90ff; border-radius: 50%; animation: spin 1s linear infinite; }
.loading-text { margin-top: 16px; font-size: 15px; font-weight: 600; color: #333; }
@keyframes spin { to { transform: rotate(360deg); } }