' + escapeHtml(order.product_name || '订单') + '
订单号 ' + escapeHtml(order.order_number) + '
diff --git a/assets/css/routes/orders.css b/assets/css/routes/orders.css
index 916d1d66..5d6fed71 100644
--- a/assets/css/routes/orders.css
+++ b/assets/css/routes/orders.css
@@ -1,1692 +1,102 @@
-/**
- * AKSRT Orders — user-center embedded + legacy shell
- * 订单中心:卡片 / 状态 tab / 统计 / 售后
- */
-
-/* ==================== Shell ==================== */
+/* Knowledge-payment order center */
.aksrt-orders-page {
- padding: 24px 0;
- color: var(--color-ink, #1f2329);
-}
-
-.aksrt-orders-page__header h1 {
- font-size: 24px;
- font-weight: 700;
- margin: 0 0 8px;
- color: var(--color-ink);
-}
-
-.aksrt-orders-page__header p {
- color: var(--color-ink-3, #8b8f97);
- margin: 0 0 20px;
-}
-
-/* UC embed: no outer page padding */
-.uc-orders-panel.aksrt-orders-page {
+ --orders-ink: var(--color-ink, #1d2738);
+ --orders-muted: var(--color-ink-3, #758096);
+ --orders-line: color-mix(in srgb, var(--color-line, #e1e6ef) 88%, transparent);
padding: 0;
- max-width: 100%;
+ color: var(--orders-ink);
}
.uc-orders-panel__head {
- gap: 12px;
- margin-bottom: 4px;
- padding: 2px 2px 12px;
- border-bottom: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 80%, transparent);
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) minmax(285px, 42%);
+ gap: 28px;
+ align-items: end;
+ padding: 4px 0 22px;
+ border-bottom: 1px solid var(--orders-line);
}
-.uc-orders-panel__head .font-bold {
- letter-spacing: 0.01em;
+.aksrt-orders-page__eyebrow {
+ margin: 0 0 7px;
+ color: var(--color-primary, #3b82f6);
+ font-size: 11px;
+ font-weight: 750;
+ letter-spacing: .14em;
+ text-transform: uppercase;
}
-/* ==================== Stats ==================== */
+.uc-orders-panel__title { display: flex; align-items: center; gap: 9px; font-size: 21px; }
+.uc-orders-panel__title-icon { color: var(--color-primary, #3b82f6); font-size: 17px; }
+.uc-orders-panel__title-wrap > p:last-child { margin-bottom: 0; }
+
.aksrt-orders-page__stats {
display: grid;
- grid-template-columns: repeat(3, minmax(0, 1fr));
- gap: 12px;
- margin: 0 0 18px;
-}
-
-.aksrt-orders-page__stat {
- position: relative;
- padding: 16px 18px;
- border-radius: var(--radius-xl, 14px);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 90%, transparent);
- background:
- linear-gradient(
- 145deg,
- color-mix(in srgb, var(--surface-1, #fff) 92%, var(--color-primary, #3b82f6) 8%),
- var(--surface-1, #fff) 55%
- );
- box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
- display: flex;
- flex-direction: column;
- gap: 8px;
- overflow: hidden;
- transition: transform 0.18s ease, box-shadow 0.18s ease;
-}
-
-.aksrt-orders-page__stat::after {
- content: "";
- position: absolute;
- right: -12px;
- top: -12px;
- width: 64px;
- height: 64px;
- border-radius: 50%;
- background: color-mix(in srgb, var(--color-primary, #3b82f6) 10%, transparent);
- pointer-events: none;
-}
-
-.aksrt-orders-page__stat:hover {
- transform: translateY(-1px);
- box-shadow: 0 6px 16px rgba(15, 23, 42, 0.06);
-}
-
-.aksrt-orders-page__stat-label {
- font-size: 12px;
- font-weight: 500;
- color: var(--color-ink-3, #8b8f97);
- letter-spacing: 0.02em;
-}
-
-.aksrt-orders-page__stat-value {
- font-size: 24px;
- font-weight: 750;
- color: var(--color-ink, #1f2329);
- line-height: 1.1;
- font-variant-numeric: tabular-nums;
-}
-
-.aksrt-orders-page__stat-value.c-red {
- color: var(--color-error, #ef4444);
-}
-
-.aksrt-orders-page__stat-value.c-green {
- color: var(--color-success, #16a34a);
-}
-
-/* ==================== Extra nav (sections) ==================== */
-.aksrt-orders-page__extra-nav {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- margin: 0 0 14px;
-}
-
-.aksrt-orders-page__extra-link {
- display: inline-flex;
- align-items: center;
- gap: 6px;
- padding: 7px 14px;
- border-radius: 999px;
- border: 1px solid var(--color-line, #e5e7eb);
- background: var(--surface-4, var(--surface-2, #f6f7f9));
- color: var(--color-ink-2, #4b5563);
- font-size: 13px;
- font-weight: 550;
- text-decoration: none;
- transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
-}
-
-.aksrt-orders-page__extra-link:hover {
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 35%, var(--color-line, #e5e7eb));
- color: var(--color-primary, #3b82f6);
- background: color-mix(in srgb, var(--color-primary, #3b82f6) 8%, var(--surface-1, #fff));
-}
-
-.aksrt-orders-page__extra-link.is-active {
- background: color-mix(in srgb, var(--color-primary, #3b82f6) 12%, var(--surface-1, #fff));
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 40%, var(--color-line, #e5e7eb));
- color: var(--color-primary, #3b82f6);
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #3b82f6) 12%, transparent);
-}
-
-/* ==================== Type filter chips ==================== */
-.aksrt-orders-page__filters,
-.aksrt-orders-page__type-filters {
- display: flex;
- gap: 8px;
- flex-wrap: wrap;
- margin: 0 0 14px;
-}
-
-.aksrt-orders-page__filter-chip {
- padding: 6px 14px;
- border-radius: 999px;
- border: 1px solid var(--color-line, #e5e7eb);
- background: var(--surface-1, #fff);
- font-size: 12.5px;
- font-weight: 550;
- text-decoration: none;
- color: var(--color-ink-2, #4b5563);
- transition: all 0.15s ease;
- line-height: 1.4;
-}
-
-.aksrt-orders-page__filter-chip:hover {
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 40%, var(--color-line, #e5e7eb));
- color: var(--color-primary, #3b82f6);
-}
-
-.aksrt-orders-page__filter-chip.is-active {
- background: var(--color-primary, #3b82f6);
- color: var(--color-on-primary, #fff);
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 55%, #000 0%);
- box-shadow: 0 4px 12px color-mix(in srgb, var(--color-primary, #3b82f6) 28%, transparent);
-}
-
-/* ==================== Status tabs ==================== */
-.aksrt-orders-page__tabs {
- display: flex;
- gap: 4px;
- flex-wrap: nowrap;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- scrollbar-width: thin;
- margin: 0 0 16px;
- padding: 4px;
- border-radius: 12px;
- background: var(--surface-2, #f3f4f6);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 70%, transparent);
-}
-
-.aksrt-orders-page__tab {
- position: relative;
- flex: 1 0 auto;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- gap: 6px;
- min-width: 72px;
- padding: 9px 14px;
- border-radius: 9px;
- font-size: 13px;
- font-weight: 600;
- color: var(--color-ink-2, #4b5563);
- text-decoration: none;
- white-space: nowrap;
- transition: background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
-}
-
-.aksrt-orders-page__tab:hover {
- color: var(--color-ink, #1f2329);
- background: color-mix(in srgb, var(--surface-1, #fff) 70%, transparent);
-}
-
-.aksrt-orders-page__tab.is-active {
- background: var(--surface-1, #fff);
- color: var(--color-primary, #3b82f6);
- box-shadow: 0 1px 3px rgba(15, 23, 42, 0.08), 0 0 0 1px color-mix(in srgb, var(--color-line, #e5e7eb) 60%, transparent);
-}
-
-.aksrt-orders-page__tab-badge {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- min-width: 18px;
- height: 18px;
- padding: 0 5px;
- border-radius: 999px;
- background: var(--color-error, #ef4444);
- color: #fff;
- font-size: 11px;
- font-weight: 700;
- line-height: 1;
-}
-
-.uc-orders-panel .aksrt-orders-page__tab-badge {
- margin-left: 2px;
-}
-
-/* ==================== Order cards ==================== */
-.aksrt-orders-page__list {
- display: grid;
- grid-template-columns: 1fr;
- gap: 14px;
- width: 100%;
-}
-
-.aksrt-orders-page__card {
- background: var(--surface-1, #fff);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 88%, transparent);
- border-radius: var(--radius-xl, 14px);
- box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
- overflow: hidden;
- transition: box-shadow 0.18s ease, border-color 0.18s ease, transform 0.18s ease;
-}
-
-.aksrt-orders-page__card:hover {
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 22%, var(--color-line, #e5e7eb));
- box-shadow: 0 8px 24px rgba(15, 23, 42, 0.07);
-}
-
-.aksrt-orders-page__card-head {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- gap: 8px 10px;
- padding: 12px 16px;
- background: color-mix(in srgb, var(--surface-2, #f6f7f9) 88%, transparent);
- border-bottom: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 75%, transparent);
-}
-
-.aksrt-orders-page__card-type {
- display: inline-flex;
- align-items: center;
- padding: 2px 9px;
- border-radius: 999px;
- background: color-mix(in srgb, var(--color-primary, #3b82f6) 12%, transparent);
- color: var(--color-primary, #3b82f6);
- font-size: 12px;
- font-weight: 650;
- letter-spacing: 0.01em;
-}
-
-.aksrt-orders-page__card-number {
- font-size: 12.5px;
- font-weight: 600;
- color: var(--color-ink-2, #4b5563);
- font-variant-numeric: tabular-nums;
- font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
-}
-
-.aksrt-orders-page__card-time {
- margin-left: auto;
- font-size: 12px;
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-orders-page__card-status {
- font-size: 12.5px;
- font-weight: 700;
- color: var(--color-primary, #3b82f6);
- padding: 2px 0;
-}
-
-/* line items */
-.aksrt-orders-page__card-items {
- display: grid;
- gap: 12px;
- padding: 14px 16px 6px;
-}
-
-.aksrt-orders-page__card-item {
- display: grid;
- grid-template-columns: 64px minmax(0, 1fr) auto;
- gap: 12px;
- align-items: center;
-}
-
-/* Item without a thumbnail: drop the fixed 64px image column so the title
- * and price fill the row instead of being crushed into the missing image cell. */
-.aksrt-orders-page__card-item--no-image {
- grid-template-columns: minmax(0, 1fr) auto;
-}
-
-.aksrt-orders-page__card-img {
- width: 64px;
- height: 64px;
- border-radius: 10px;
- object-fit: cover;
- background: var(--surface-3, #eef0f3);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 70%, transparent);
-}
-
-.aksrt-orders-page__card-item-info {
- min-width: 0;
- display: grid;
- gap: 4px;
-}
-
-.aksrt-orders-page__card-item-title {
- font-size: 14px;
- font-weight: 650;
- color: var(--color-ink, #1f2329);
- line-height: 1.4;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
-}
-
-.aksrt-orders-page__card-item-opts {
- font-size: 12px;
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-orders-page__card-item-price {
- text-align: right;
- display: grid;
- gap: 2px;
- justify-items: end;
- font-variant-numeric: tabular-nums;
-}
-
-.aksrt-orders-page__card-item-price strong {
- font-size: 14px;
- font-weight: 700;
- color: var(--color-ink, #1f2329);
-}
-
-.aksrt-orders-page__card-item-price span {
- font-size: 12px;
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-orders-page__card-summary {
- display: flex;
- flex-wrap: wrap;
- align-items: baseline;
- justify-content: flex-end;
- gap: 8px;
- padding: 8px 16px 4px;
- font-size: 13px;
- color: var(--color-ink-2, #4b5563);
-}
-
-.aksrt-orders-page__card-summary strong {
- font-size: 18px;
- font-weight: 750;
- color: var(--color-error, #ef4444);
- font-variant-numeric: tabular-nums;
-}
-
-.aksrt-orders-page__card-summary small {
- color: var(--color-ink-3, #8b8f97);
- font-size: 12px;
-}
-
-/* logistics */
-.aksrt-orders-page__timeline {
- margin: 6px 16px 0;
- padding: 10px 12px;
- border-radius: 10px;
- background: var(--surface-2, #f6f7f9);
- border: 1px dashed color-mix(in srgb, var(--color-line, #e5e7eb) 90%, transparent);
-}
-
-.aksrt-orders-page__timeline-toggle {
- margin: 0;
- font-size: 13px;
- font-weight: 600;
- color: var(--color-ink-2, #4b5563);
- cursor: pointer;
- display: flex;
- align-items: center;
- gap: 8px;
- user-select: none;
-}
-
-.aksrt-orders-page__timeline-toggle .fa-chevron-down {
- margin-left: auto;
- opacity: 0.55;
- transition: transform 0.15s ease;
-}
-
-.aksrt-orders-page__timeline.is-open .aksrt-orders-page__timeline-toggle .fa-chevron-down {
- transform: rotate(180deg);
-}
-
-.aksrt-orders-page__timeline-body {
- margin-top: 10px;
- display: grid;
- gap: 8px;
-}
-
-.aksrt-orders-page__timeline-item {
- display: grid;
- grid-template-columns: 120px minmax(0, 1fr);
- gap: 10px;
- font-size: 12.5px;
- color: var(--color-ink-2, #4b5563);
-}
-
-.aksrt-orders-page__timeline-item time {
- color: var(--color-ink-3, #8b8f97);
- font-variant-numeric: tabular-nums;
-}
-
-/* actions */
-.aksrt-orders-page__card-actions {
- display: flex;
- flex-wrap: wrap;
- justify-content: flex-end;
- align-items: center;
- gap: 8px;
- padding: 12px 16px 14px;
- border-top: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 70%, transparent);
- margin-top: 8px;
- background: color-mix(in srgb, var(--surface-1, #fff) 70%, var(--surface-2, #f6f7f9));
-}
-
-.aksrt-orders-page__card-actions .btn-sm,
-.aksrt-orders-page__card-actions .btn-primary,
-.aksrt-orders-page__card-actions .btn-outline,
-.aksrt-orders-page__card-actions .btn-ghost,
-.aksrt-orders-page__card-actions a.btn-outline,
-.aksrt-orders-page__card-actions a.btn-ghost {
- min-height: 32px;
- padding: 0 12px;
- border-radius: 999px;
- font-size: 12.5px;
- font-weight: 600;
- line-height: 30px;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- text-decoration: none;
- cursor: pointer;
- transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
-}
-
-.aksrt-orders-page__card-actions .btn-primary,
-.aksrt-orders-page__card-actions button.btn-primary {
- border: 1px solid transparent;
- background: var(--color-primary, #3b82f6);
- color: var(--color-on-primary, #fff);
- box-shadow: 0 4px 10px color-mix(in srgb, var(--color-primary, #3b82f6) 25%, transparent);
-}
-
-.aksrt-orders-page__card-actions .btn-primary:hover {
- filter: brightness(1.05);
-}
-
-.aksrt-orders-page__card-actions .btn-primary.c-green {
- background: var(--color-success, #16a34a);
- box-shadow: 0 4px 10px color-mix(in srgb, var(--color-success, #16a34a) 22%, transparent);
-}
-
-.aksrt-orders-page__card-actions .btn-outline,
-.aksrt-orders-page__card-actions a.btn-outline {
- border: 1px solid var(--color-line, #e5e7eb);
- background: var(--surface-1, #fff);
- color: var(--color-ink-2, #4b5563);
-}
-
-.aksrt-orders-page__card-actions .btn-outline:hover,
-.aksrt-orders-page__card-actions a.btn-outline:hover {
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 40%, var(--color-line, #e5e7eb));
- color: var(--color-primary, #3b82f6);
-}
-
-.aksrt-orders-page__card-actions .btn-ghost,
-.aksrt-orders-page__card-actions a.btn-ghost {
- border: 1px solid transparent;
- background: transparent;
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-orders-page__card-actions .btn-ghost:hover {
- color: var(--color-ink, #1f2329);
- background: color-mix(in srgb, var(--surface-2, #f3f4f6) 80%, transparent);
-}
-
-.aksrt-orders-page__countdown {
- font-size: 12.5px;
- color: var(--color-warning, #d97706);
- font-weight: 650;
- margin-right: auto;
- font-variant-numeric: tabular-nums;
-}
-
-/* Order detail modal content */
-html.aksrt-modal-open {
- overflow: hidden;
-}
-
-.aksrt-order-detail-dialog {
- display: flex;
- flex-direction: column;
- width: min(520px, 100%);
- max-height: min(85vh, 760px);
- border-radius: 20px;
- overflow: hidden;
- background: var(--surface-1, #fff);
- box-shadow:
- 0 24px 60px rgba(15, 23, 42, 0.18),
- 0 0 0 1px color-mix(in srgb, var(--color-line, #e5e7eb) 60%, transparent);
-}
-
-.aksrt-order-detail-dialog .aksrt-modal__header {
- background: transparent;
- border-bottom: none;
- padding: 16px 18px 4px;
-}
-
-.aksrt-order-detail-dialog .aksrt-modal__header h3 {
- font-size: 16px;
- font-weight: 750;
- letter-spacing: 0.01em;
-}
-
-.aksrt-order-detail-dialog .aksrt-modal__close {
- width: 34px;
- height: 34px;
- background: color-mix(in srgb, var(--surface-2, #f3f4f6) 88%, transparent);
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-order-detail-dialog .aksrt-modal__close:hover {
- color: var(--color-ink, #1f2329);
- background: var(--surface-3, #e8eaed);
-}
-
-.aksrt-order-detail-dialog .aksrt-modal__body {
- min-height: 0;
- padding: 8px 18px 16px;
- gap: 14px;
- overflow-x: hidden;
- overflow-y: auto;
- overscroll-behavior: contain;
-}
-
-/* Hero: status + amount */
-.aksrt-order-detail__hero {
- position: relative;
- margin: 0 -18px;
- padding: 16px 18px 18px;
- background:
- radial-gradient(120% 90% at 100% 0%, color-mix(in srgb, var(--color-primary, #3b82f6) 16%, transparent) 0%, transparent 55%),
- linear-gradient(165deg,
- color-mix(in srgb, var(--color-primary, #3b82f6) 10%, var(--surface-1, #fff)) 0%,
- var(--surface-1, #fff) 70%);
- border-bottom: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 65%, transparent);
-}
-
-.aksrt-order-detail__hero.is-pending,
-.aksrt-order-detail__hero.is-created {
- background:
- radial-gradient(120% 90% at 100% 0%, color-mix(in srgb, var(--color-warning, #d97706) 18%, transparent) 0%, transparent 55%),
- linear-gradient(165deg,
- color-mix(in srgb, var(--color-warning, #d97706) 10%, var(--surface-1, #fff)) 0%,
- var(--surface-1, #fff) 70%);
-}
-
-.aksrt-order-detail__hero.is-paid,
-.aksrt-order-detail__hero.is-delivered,
-.aksrt-order-detail__hero.is-completed {
- background:
- radial-gradient(120% 90% at 100% 0%, color-mix(in srgb, var(--color-success, #16a34a) 16%, transparent) 0%, transparent 55%),
- linear-gradient(165deg,
- color-mix(in srgb, var(--color-success, #16a34a) 10%, var(--surface-1, #fff)) 0%,
- var(--surface-1, #fff) 70%);
-}
-
-.aksrt-order-detail__hero.is-cancelled,
-.aksrt-order-detail__hero.is-expired,
-.aksrt-order-detail__hero.is-refunded,
-.aksrt-order-detail__hero.is-refunding {
- background:
- radial-gradient(120% 90% at 100% 0%, color-mix(in srgb, var(--color-ink-3, #8b8f97) 14%, transparent) 0%, transparent 55%),
- linear-gradient(165deg,
- color-mix(in srgb, var(--color-ink-3, #8b8f97) 8%, var(--surface-1, #fff)) 0%,
- var(--surface-1, #fff) 70%);
-}
-
-.aksrt-order-detail__hero-top {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- gap: 8px;
- margin-bottom: 14px;
-}
-
-.aksrt-order-detail__status-pill {
- display: inline-flex;
- align-items: center;
- gap: 6px;
- padding: 5px 12px;
- border-radius: 999px;
- font-size: 12px;
- font-weight: 700;
- letter-spacing: 0.02em;
- background: color-mix(in srgb, var(--color-primary, #3b82f6) 14%, transparent);
- color: var(--color-primary, #3b82f6);
-}
-
-.aksrt-order-detail__status-pill::before {
- content: "";
- width: 6px;
- height: 6px;
- border-radius: 50%;
- background: currentColor;
- box-shadow: 0 0 0 3px color-mix(in srgb, currentColor 18%, transparent);
-}
-
-.aksrt-order-detail__status-pill.is-pending,
-.aksrt-order-detail__status-pill.is-created,
-.aksrt-order-detail__status-pill.is-pending-review {
- background: color-mix(in srgb, var(--color-warning, #d97706) 14%, transparent);
- color: var(--color-warning, #d97706);
-}
-
-.aksrt-order-detail__status-pill.is-paid,
-.aksrt-order-detail__status-pill.is-delivered,
-.aksrt-order-detail__status-pill.is-completed {
- background: color-mix(in srgb, var(--color-success, #16a34a) 14%, transparent);
- color: var(--color-success, #16a34a);
-}
-
-.aksrt-order-detail__status-pill.is-cancelled,
-.aksrt-order-detail__status-pill.is-expired,
-.aksrt-order-detail__status-pill.is-refunded,
-.aksrt-order-detail__status-pill.is-refunding {
- background: color-mix(in srgb, var(--color-ink-3, #8b8f97) 14%, transparent);
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-order-detail__type-chip {
- display: inline-flex;
- align-items: center;
- padding: 4px 10px;
- border-radius: 999px;
- font-size: 11.5px;
- font-weight: 600;
- color: var(--color-ink-2, #4b5563);
- background: color-mix(in srgb, var(--surface-2, #f3f4f6) 90%, transparent);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 80%, transparent);
-}
-
-.aksrt-order-detail__hero-amount-wrap {
- display: flex;
- flex-direction: column;
- gap: 4px;
-}
-
-.aksrt-order-detail__hero-label {
- font-size: 12px;
- color: var(--color-ink-3, #8b8f97);
- letter-spacing: 0.02em;
-}
-
-.aksrt-order-detail__hero-amount {
- font-size: 28px;
- font-weight: 800;
- line-height: 1.15;
- color: var(--color-error, #ef4444);
- font-variant-numeric: tabular-nums;
- letter-spacing: -0.02em;
-}
-
-/* Product card */
-.aksrt-order-detail__product {
- display: grid;
- grid-template-columns: 64px minmax(0, 1fr);
- gap: 12px;
- align-items: center;
- padding: 12px;
- border-radius: 14px;
- background: color-mix(in srgb, var(--surface-2, #f6f7f9) 70%, var(--surface-1, #fff));
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 80%, transparent);
-}
-
-.aksrt-order-detail__thumb {
- width: 64px;
- height: 64px;
- border-radius: 12px;
- object-fit: cover;
- background: var(--surface-3, #eef0f3);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 70%, transparent);
-}
-
-.aksrt-order-detail__thumb--empty {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- color: color-mix(in srgb, var(--color-primary, #3b82f6) 55%, var(--color-ink-4, #c0c4cc));
- font-size: 20px;
- background:
- radial-gradient(circle at 30% 30%, color-mix(in srgb, var(--color-primary, #3b82f6) 12%, transparent), transparent 65%),
- var(--surface-3, #eef0f3);
-}
-
-.aksrt-order-detail__product-info {
- min-width: 0;
- display: grid;
- gap: 6px;
-}
-
-.aksrt-order-detail__product-title {
- font-size: 14.5px;
- font-weight: 700;
- color: var(--color-ink, #1f2329);
- line-height: 1.4;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
-}
-
-.aksrt-order-detail__product-meta {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- gap: 6px 8px;
- font-size: 12.5px;
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-order-detail__dot {
- width: 3px;
- height: 3px;
- border-radius: 50%;
- background: var(--color-ink-4, #c0c4cc);
-}
-
-/* Sections */
-.aksrt-order-detail__section {
- display: grid;
- gap: 10px;
-}
-
-.aksrt-order-detail__section-title {
- margin: 0;
- font-size: 13px;
- font-weight: 700;
- color: var(--color-ink, #1f2329);
- display: flex;
- align-items: center;
- gap: 8px;
-}
-
-.aksrt-order-detail__section-title::before {
- content: "";
- width: 3px;
- height: 13px;
- border-radius: 2px;
- background: linear-gradient(180deg, var(--color-primary, #3b82f6), color-mix(in srgb, var(--color-primary, #3b82f6) 40%, #fff));
- display: inline-block;
-}
-
-.aksrt-order-detail__list {
- margin: 0;
- padding: 0;
- display: grid;
- gap: 0;
+ grid-template-columns: repeat(3, 1fr);
+ border: 1px solid var(--orders-line);
border-radius: 14px;
background: var(--surface-1, #fff);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 88%, transparent);
overflow: hidden;
}
-
-.aksrt-order-detail__row {
- display: grid;
- grid-template-columns: 88px minmax(0, 1fr);
- gap: 10px 12px;
- align-items: center;
- padding: 11px 14px;
- font-size: 13.5px;
- border-bottom: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 65%, transparent);
- background: transparent;
- transition: background 0.12s ease;
-}
-
-.aksrt-order-detail__row:last-child {
- border-bottom: none;
-}
-
-.aksrt-order-detail__row:hover {
- background: color-mix(in srgb, var(--surface-2, #f6f7f9) 55%, transparent);
-}
-
-.aksrt-order-detail__row dt {
- margin: 0;
- color: var(--color-ink-3, #8b8f97);
- font-weight: 500;
- font-size: 12.5px;
-}
-
-.aksrt-order-detail__row dd {
- margin: 0;
- color: var(--color-ink, #1f2329);
- font-weight: 600;
- word-break: break-all;
- font-variant-numeric: tabular-nums;
- text-align: right;
- display: inline-flex;
- align-items: center;
- justify-content: flex-end;
- gap: 6px;
- min-width: 0;
-}
-
-.aksrt-order-detail__value {
- min-width: 0;
-}
-
-.aksrt-order-detail__row.is-discount dd {
- color: var(--color-success, #16a34a);
-}
-
-.aksrt-order-detail__copy {
- flex: 0 0 auto;
- width: 28px;
- height: 28px;
- border: none;
- border-radius: 8px;
- background: color-mix(in srgb, var(--surface-2, #f3f4f6) 90%, transparent);
- color: var(--color-ink-3, #8b8f97);
- cursor: pointer;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- font-size: 12px;
- transition: background 0.15s ease, color 0.15s ease, transform 0.15s ease;
-}
-
-.aksrt-order-detail__copy:hover {
- color: var(--color-primary, #3b82f6);
- background: color-mix(in srgb, var(--color-primary, #3b82f6) 12%, transparent);
-}
-
-.aksrt-order-detail__copy.is-copied {
- color: var(--color-success, #16a34a);
- background: color-mix(in srgb, var(--color-success, #16a34a) 14%, transparent);
- transform: scale(1.05);
-}
-
-/* Multi-item list */
-.aksrt-order-detail__items {
- margin: 0;
- padding: 0;
- list-style: none;
- display: grid;
- gap: 0;
- border-radius: 14px;
- background: var(--surface-1, #fff);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 88%, transparent);
- overflow: hidden;
-}
-
-.aksrt-order-detail__item {
- display: grid;
- grid-template-columns: 40px minmax(0, 1fr) auto auto;
- gap: 10px;
- align-items: center;
- padding: 10px 12px;
- font-size: 13px;
- color: var(--color-ink-2, #4b5563);
- border-bottom: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 65%, transparent);
-}
-
-.aksrt-order-detail__item:last-child {
- border-bottom: none;
-}
-
-.aksrt-order-detail__item-img {
- width: 40px;
- height: 40px;
- border-radius: 8px;
- object-fit: cover;
- background: var(--surface-3, #eef0f3);
-}
-
-.aksrt-order-detail__item-title {
- min-width: 0;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- font-weight: 600;
- color: var(--color-ink, #1f2329);
-}
-
-.aksrt-order-detail__item-qty {
- font-style: normal;
- color: var(--color-ink-3, #8b8f97);
- font-variant-numeric: tabular-nums;
-}
-
-.aksrt-order-detail__item-price {
- font-weight: 700;
- color: var(--color-ink, #1f2329);
- font-variant-numeric: tabular-nums;
- min-width: 64px;
- text-align: right;
-}
-
-/* Timeline */
-.aksrt-order-detail__timeline {
- position: relative;
- margin: 0;
- padding: 4px 0 2px 18px;
- list-style: none;
- display: grid;
- gap: 12px;
-}
-
-.aksrt-order-detail__timeline::before {
- content: "";
- position: absolute;
- left: 5px;
- top: 10px;
- bottom: 10px;
- width: 2px;
- border-radius: 2px;
- background: linear-gradient(
- 180deg,
- color-mix(in srgb, var(--color-primary, #3b82f6) 55%, transparent),
- color-mix(in srgb, var(--color-line, #e5e7eb) 90%, transparent)
- );
-}
-
-.aksrt-order-detail__timeline-item {
- position: relative;
- display: grid;
-}
-
-.aksrt-order-detail__timeline-dot {
- position: absolute;
- left: -18px;
- top: 6px;
- width: 10px;
- height: 10px;
- border-radius: 50%;
- background: var(--color-primary, #3b82f6);
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #3b82f6) 14%, transparent);
-}
-
-.aksrt-order-detail__timeline-item.is-latest .aksrt-order-detail__timeline-dot {
- background: var(--color-success, #16a34a);
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-success, #16a34a) 16%, transparent);
-}
-
-.aksrt-order-detail__timeline-body {
- display: grid;
- gap: 2px;
-}
-
-.aksrt-order-detail__timeline-label {
- font-size: 13.5px;
- font-weight: 650;
- color: var(--color-ink, #1f2329);
-}
-
-.aksrt-order-detail__timeline-item.is-latest .aksrt-order-detail__timeline-label {
- color: var(--color-success, #16a34a);
-}
-
-.aksrt-order-detail__timeline-time {
- font-size: 12px;
- color: var(--color-ink-3, #8b8f97);
- font-variant-numeric: tabular-nums;
-}
-
-/* Footer actions */
-.aksrt-order-detail-dialog .aksrt-modal__footer {
- padding: 14px 18px 16px;
- background: color-mix(in srgb, var(--surface-2, #f6f7f9) 72%, transparent);
- border-top: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 70%, transparent);
- gap: 8px;
- justify-content: flex-end;
-}
-
-.aksrt-order-detail-dialog .aksrt-modal__footer:empty {
- display: none;
-}
-
-.aksrt-modal__footer .btn-primary,
-.aksrt-modal__footer .btn-outline,
-.aksrt-modal__footer .btn-ghost,
-.aksrt-modal__footer a.btn-ghost,
-.aksrt-modal__footer a.btn-outline {
- min-height: 38px;
- padding: 0 18px;
- border-radius: 11px;
- font-size: 13.5px;
- font-weight: 650;
- line-height: 36px;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- text-decoration: none;
- cursor: pointer;
- transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
-}
-
-.aksrt-modal__footer .btn-primary {
- border: 1px solid transparent;
- background: linear-gradient(180deg, color-mix(in srgb, var(--color-primary, #3b82f6) 92%, #fff), var(--color-primary, #3b82f6));
- color: var(--color-on-primary, #fff);
- box-shadow: 0 8px 18px color-mix(in srgb, var(--color-primary, #3b82f6) 28%, transparent);
-}
-
-.aksrt-modal__footer .btn-primary:hover {
- filter: brightness(1.04);
- transform: translateY(-1px);
-}
-
-.aksrt-modal__footer .btn-primary.c-green {
- background: linear-gradient(180deg, color-mix(in srgb, var(--color-success, #16a34a) 90%, #fff), var(--color-success, #16a34a));
- box-shadow: 0 8px 18px color-mix(in srgb, var(--color-success, #16a34a) 28%, transparent);
-}
-
-.aksrt-modal__footer .btn-outline {
- border: 1px solid var(--color-line, #e5e7eb);
- background: var(--surface-1, #fff);
- color: var(--color-ink-2, #4b5563);
-}
-
-.aksrt-modal__footer .btn-outline:hover {
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 45%, var(--color-line, #e5e7eb));
- color: var(--color-primary, #3b82f6);
- transform: translateY(-1px);
-}
-
-.aksrt-modal__footer .btn-ghost {
- border: 1px solid transparent;
- background: transparent;
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-modal__footer .btn-ghost:hover {
- color: var(--color-ink, #1f2329);
- background: color-mix(in srgb, var(--surface-2, #f3f4f6) 80%, transparent);
-}
-
-/* Dark mode polish */
-html.dark .aksrt-order-detail-dialog {
- background: var(--surface-1, #1a1d24);
- box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
-}
-
-html.dark .aksrt-order-detail__product,
-html.dark .aksrt-order-detail__list,
-html.dark .aksrt-order-detail__items {
- background: color-mix(in srgb, var(--surface-2, #12151b) 55%, var(--surface-1, #1a1d24));
- border-color: color-mix(in srgb, var(--color-line, #333) 90%, transparent);
-}
-
-html.dark .aksrt-order-detail__type-chip,
-html.dark .aksrt-order-detail__copy {
- background: var(--surface-2, #12151b);
- border-color: var(--color-line, #333);
-}
-
-html.dark .aksrt-order-detail-dialog .aksrt-modal__footer {
- background: color-mix(in srgb, var(--surface-2, #12151b) 80%, transparent);
-}
-
-@media (max-width: 767px) {
- .aksrt-order-detail-dialog {
- width: 100%;
- max-width: 100%;
- border-radius: 18px 18px 0 0;
- margin-top: auto;
- max-height: 92vh;
- }
-
- .aksrt-order-detail__hero-amount {
- font-size: 26px;
- }
-
- .aksrt-order-detail__product {
- grid-template-columns: 56px minmax(0, 1fr);
- }
-
- .aksrt-order-detail__thumb {
- width: 56px;
- height: 56px;
- }
-
- .aksrt-order-detail__row {
- grid-template-columns: 76px minmax(0, 1fr);
- padding: 10px 12px;
- }
-
- .aksrt-order-detail__item {
- grid-template-columns: 36px minmax(0, 1fr) auto auto;
- }
-
- .aksrt-modal__footer {
- flex-wrap: wrap;
- }
-
- .aksrt-modal__footer .btn-primary,
- .aksrt-modal__footer .btn-outline,
- .aksrt-modal__footer .btn-ghost,
- .aksrt-modal__footer a {
- flex: 1 1 calc(50% - 8px);
- min-width: 0;
- }
-}
-
-/* legacy item classes (if any remain) */
-.aksrt-orders-page__item {
- background: var(--surface-1);
- border-radius: var(--radius-2xl, 16px);
- box-shadow: var(--shadow-sm);
- overflow: hidden;
-}
-
-/* ==================== Pagination ==================== */
-.aksrt-orders-page__pagination {
- display: flex;
- justify-content: center;
- flex-wrap: wrap;
- gap: 8px;
- margin-top: 22px;
-}
-
-.aksrt-orders-page__page-chip {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- min-width: 36px;
- height: 36px;
- padding: 0 10px;
- border-radius: 10px;
- border: 1px solid var(--color-line, #e5e7eb);
- background: var(--surface-1, #fff);
- font-size: 13px;
- font-weight: 600;
- text-decoration: none;
- color: var(--color-ink-2, #4b5563);
- transition: all 0.15s ease;
-}
-
-.aksrt-orders-page__page-chip:hover {
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 45%, var(--color-line, #e5e7eb));
- color: var(--color-primary, #3b82f6);
-}
-
-.aksrt-orders-page__page-chip.is-active {
- background: var(--color-primary, #3b82f6);
- color: var(--color-on-primary, #fff);
- border-color: transparent;
- box-shadow: 0 4px 12px color-mix(in srgb, var(--color-primary, #3b82f6) 28%, transparent);
-}
-
-/* ==================== Empty ==================== */
-.aksrt-orders-page__empty {
- text-align: center;
- padding: 56px 20px;
- border-radius: var(--radius-xl, 14px);
- border: 1px dashed color-mix(in srgb, var(--color-line, #e5e7eb) 90%, transparent);
- background:
- radial-gradient(circle at 50% 0%, color-mix(in srgb, var(--color-primary, #3b82f6) 8%, transparent), transparent 55%),
- var(--surface-2, #f6f7f9);
-}
-
-.aksrt-orders-page__empty i {
- font-size: 42px;
- color: color-mix(in srgb, var(--color-primary, #3b82f6) 45%, var(--color-ink-4, #c0c4cc));
- margin-bottom: 14px;
- display: block;
- opacity: 0.9;
-}
-
-.aksrt-orders-page__empty p {
- margin: 0;
- font-size: 14px;
- color: var(--color-ink-3, #8b8f97);
-}
-
-/* ==================== After-sale / coupons / favorites ==================== */
-.aksrt-orders-page__aftersale,
-.aksrt-orders-page__coupons,
-.aksrt-orders-page__favorites {
- margin-top: 4px;
-}
-
-.aksrt-orders-page__aftersale h2,
-.aksrt-orders-page__coupons h2,
-.aksrt-orders-page__favorites h2 {
- margin: 0 0 14px;
- font-size: 16px;
- font-weight: 700;
-}
-
-.aksrt-as-list {
- display: grid;
- gap: 12px;
-}
-
-.aksrt-as-card {
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 88%, transparent);
- border-radius: 12px;
- background: var(--surface-1, #fff);
- padding: 14px 16px;
- box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
-}
-
-.aksrt-as-card__head {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- gap: 8px 12px;
- margin-bottom: 6px;
-}
-
-.aksrt-as-card__order {
- font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
- font-size: 12px;
- color: var(--color-ink-3, #8b8f97);
-}
-
-.aksrt-as-card__status {
- margin-left: auto;
- font-size: 12.5px;
- font-weight: 700;
- color: var(--color-warning, #d97706);
-}
-
-.aksrt-as-card__meta {
- font-size: 12px;
- margin-bottom: 8px;
-}
-
-.aksrt-as-card__reason {
- font-size: 13.5px;
- color: var(--color-ink-2, #4b5563);
- line-height: 1.5;
- margin-bottom: 10px;
-}
-
-.aksrt-as-timeline {
- margin: 0 0 12px;
- padding: 0 0 0 14px;
- border-left: 2px solid color-mix(in srgb, var(--color-primary, #3b82f6) 25%, var(--color-line, #e5e7eb));
- list-style: none;
- display: grid;
- gap: 8px;
-}
-
-.aksrt-as-timeline li {
- display: grid;
- gap: 2px;
- font-size: 12.5px;
- color: var(--color-ink-2, #4b5563);
-}
-
-.aksrt-as-timeline time {
- color: var(--color-ink-3, #8b8f97);
- font-size: 11.5px;
-}
-
-.aksrt-as-card__actions {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- justify-content: flex-end;
-}
-
-.aksrt-orders-page__fav-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
- gap: 12px;
-}
-
-.aksrt-orders-page__fav-card {
- display: grid;
- gap: 8px;
- padding: 10px;
- border-radius: 12px;
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 88%, transparent);
- background: var(--surface-1, #fff);
- text-decoration: none;
- color: inherit;
- transition: box-shadow 0.15s ease, transform 0.15s ease;
-}
-
-.aksrt-orders-page__fav-card:hover {
- box-shadow: 0 8px 20px rgba(15, 23, 42, 0.08);
- transform: translateY(-1px);
-}
-
-.aksrt-orders-page__fav-card img {
- width: 100%;
- aspect-ratio: 1;
- object-fit: cover;
- border-radius: 8px;
- background: var(--surface-3, #eef0f3);
-}
-
-.aksrt-orders-page__fav-card h3 {
- margin: 0;
- font-size: 13px;
- font-weight: 600;
- line-height: 1.35;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- overflow: hidden;
-}
-
-.aksrt-orders-page__fav-card strong {
- color: var(--color-error, #ef4444);
- font-size: 14px;
-}
-
-/* ==================== Form fields + modal ==================== */
-.aksrt-orders-page__field {
- display: grid;
- gap: 6px;
-}
-
-.aksrt-orders-page__field label {
- font-size: 13.5px;
- font-weight: 600;
- color: var(--color-ink, #1f2329);
-}
-
-.aksrt-orders-page__select,
-.aksrt-orders-page__textarea,
-.aksrt-orders-page__input {
- width: 100%;
- border: 1px solid var(--color-line, #e5e7eb);
- border-radius: 10px;
- padding: 10px 12px;
- font-size: 14px;
- color: var(--color-ink, #1f2329);
- background: var(--surface-1, #fff);
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
- box-sizing: border-box;
-}
-
-.aksrt-orders-page__select:focus,
-.aksrt-orders-page__textarea:focus,
-.aksrt-orders-page__input:focus {
- outline: none;
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 50%, var(--color-line, #e5e7eb));
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #3b82f6) 16%, transparent);
-}
-
-.aksrt-modal[hidden] {
- display: none !important;
-}
-
-.aksrt-modal {
- position: fixed;
- inset: 0;
- z-index: var(--z-modal, 10050);
- display: none;
- align-items: center;
- justify-content: center;
- padding: 16px;
-}
-
-.aksrt-modal:not([hidden]) {
- display: flex;
-}
-
-.aksrt-modal.is-open {
- display: flex;
-}
-
-.aksrt-modal__overlay {
- position: absolute;
- inset: 0;
- background: rgba(15, 23, 42, 0.48);
- backdrop-filter: blur(5px);
- -webkit-backdrop-filter: blur(5px);
-}
-
-.aksrt-modal__dialog {
- position: relative;
- background: var(--surface-1, #fff);
- border-radius: 16px;
- width: min(520px, 100%);
- max-height: 85vh;
- overflow-y: auto;
- box-shadow: 0 24px 60px rgba(15, 23, 42, 0.22);
- border: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 70%, transparent);
-}
-
-.aksrt-modal__dialog.aksrt-order-detail-dialog {
- overflow: hidden;
-}
-
-.aksrt-modal__header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 16px 18px;
- border-bottom: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 80%, transparent);
- position: sticky;
- top: 0;
- background: var(--surface-1, #fff);
- z-index: 1;
-}
-
-.aksrt-modal__header h3 {
- margin: 0;
- font-size: 16px;
- font-weight: 700;
- color: var(--color-ink, #1f2329);
-}
-
-.aksrt-modal__close {
- border: none;
- background: var(--surface-2, #f3f4f6);
- width: 32px;
- height: 32px;
- border-radius: 999px;
- font-size: 20px;
- cursor: pointer;
- color: var(--color-ink-3, #8b8f97);
- line-height: 1;
- transition: color 0.15s ease, background 0.15s ease;
-}
-
-.aksrt-modal__close:hover {
- color: var(--color-ink, #1f2329);
- background: var(--surface-3, #e8eaed);
-}
-
-.aksrt-modal__body {
- padding: 16px 18px;
- display: grid;
- gap: 14px;
-}
-
-.aksrt-modal__footer {
- display: flex;
- justify-content: flex-end;
- gap: 10px;
- padding: 14px 18px 16px;
- border-top: 1px solid color-mix(in srgb, var(--color-line, #e5e7eb) 80%, transparent);
-}
-
-/* ==================== Responsive ==================== */
-@media (max-width: 767px) {
- .aksrt-orders-page {
- padding: 16px 0;
- }
-
- .aksrt-orders-page__stats {
- grid-template-columns: 1fr;
- }
-
- .aksrt-orders-page__filters,
- .aksrt-orders-page__type-filters {
- flex-wrap: nowrap;
- overflow-x: auto;
- padding-bottom: 2px;
- -webkit-overflow-scrolling: touch;
- }
-
- .aksrt-orders-page__filter-chip {
- flex-shrink: 0;
- }
-
- .aksrt-orders-page__card-item {
- grid-template-columns: 56px minmax(0, 1fr);
- }
-
- .aksrt-orders-page__card-img {
- width: 56px;
- height: 56px;
- }
-
- .aksrt-orders-page__card-item-price {
- grid-column: 2;
- text-align: left;
- justify-items: start;
- flex-direction: row;
- display: flex;
- gap: 10px;
- align-items: baseline;
- }
-
- .aksrt-orders-page__card-item--no-image {
- grid-template-columns: minmax(0, 1fr);
- }
-
- .aksrt-orders-page__card-item--no-image .aksrt-orders-page__card-item-price {
- grid-column: auto;
- }
-
- .aksrt-orders-page__card-time {
- margin-left: 0;
- width: 100%;
- order: 5;
- }
-
- .aksrt-orders-page__card-head {
- gap: 6px 8px;
- }
-
- .aksrt-orders-page__card-actions {
- justify-content: stretch;
- }
-
- .aksrt-orders-page__card-actions .btn-sm,
- .aksrt-orders-page__card-actions .btn-primary,
- .aksrt-orders-page__card-actions .btn-outline,
- .aksrt-orders-page__card-actions .btn-ghost,
- .aksrt-orders-page__card-actions a {
- flex: 1 1 auto;
- }
-
- .aksrt-orders-page__timeline-item {
- grid-template-columns: 1fr;
- gap: 2px;
- }
-
- .aksrt-orders-page__countdown {
- width: 100%;
- margin-right: 0;
- margin-bottom: 4px;
- }
-}
-
-@media (max-width: 480px) {
- .aksrt-orders-page__stat {
- padding: 14px;
- }
-
- .aksrt-orders-page__stat-value {
- font-size: 20px;
- }
-
- .aksrt-orders-page__tab {
- min-width: 64px;
- padding: 8px 10px;
- font-size: 12.5px;
- }
-
- .aksrt-modal__dialog {
- max-height: 92vh;
- }
-}
-
-/* ==================== Dark mode ==================== */
-html.dark .aksrt-orders-page__stat,
-html.dark .aksrt-orders-page__card,
-html.dark .aksrt-as-card,
-html.dark .aksrt-orders-page__fav-card {
- background: var(--surface-1, #1a1d24);
- border-color: color-mix(in srgb, var(--color-line, #333) 90%, transparent);
- box-shadow: none;
-}
-
-html.dark .aksrt-orders-page__stat {
- background: linear-gradient(
- 145deg,
- color-mix(in srgb, var(--surface-1, #1a1d24) 88%, var(--color-primary, #3b82f6) 12%),
- var(--surface-1, #1a1d24) 60%
- );
-}
-
-html.dark .aksrt-orders-page__tabs {
- background: var(--surface-2, #12151b);
-}
-
-html.dark .aksrt-orders-page__tab.is-active {
- background: var(--surface-1, #1a1d24);
-}
-
-html.dark .aksrt-orders-page__card-head,
-html.dark .aksrt-orders-page__card-actions {
- background: color-mix(in srgb, var(--surface-2, #12151b) 80%, transparent);
-}
-
-html.dark .aksrt-orders-page__empty {
- background:
- radial-gradient(circle at 50% 0%, color-mix(in srgb, var(--color-primary, #3b82f6) 14%, transparent), transparent 55%),
- var(--surface-2, #12151b);
-}
-
-html.dark .aksrt-orders-page__filter-chip {
- background: var(--surface-2, #12151b);
- border-color: var(--color-line, #333);
-}
-
-html.dark .aksrt-modal__dialog {
- background: var(--surface-1, #1a1d24);
- box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
-}
-
-html.dark .aksrt-modal__header,
-html.dark .aksrt-modal__close {
- background: var(--surface-1, #1a1d24);
-}
-
-html.dark .aksrt-modal__close {
- background: var(--surface-2, #12151b);
-}
-
-/* UC panel title / cart chip */
-.uc-orders-panel__title {
- display: inline-flex;
- align-items: center;
- gap: 8px;
- font-size: 16px;
-}
-.uc-orders-panel__title-icon {
- width: 28px;
- height: 28px;
- border-radius: 8px;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- font-size: 13px;
- color: var(--color-primary, #3b82f6);
- background: color-mix(in srgb, var(--color-primary, #3b82f6) 12%, transparent);
-}
-.uc-orders-panel__cart-link {
- display: inline-flex;
- align-items: center;
- gap: 6px;
- padding: 7px 12px;
- border-radius: 999px;
- border: 1px solid var(--color-line, #e5e7eb);
- background: var(--surface-1, #fff);
- color: var(--color-ink-2, #4b5563);
- font-size: 12.5px;
- font-weight: 600;
- text-decoration: none;
- transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
-}
-.uc-orders-panel__cart-link:hover {
- border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 40%, var(--color-line, #e5e7eb));
- color: var(--color-primary, #3b82f6);
- background: color-mix(in srgb, var(--color-primary, #3b82f6) 8%, var(--surface-1, #fff));
-}
-.aksrt-orders-page__empty-hint {
- margin: 8px 0 0;
- max-width: 280px;
- margin-left: auto;
- margin-right: auto;
- line-height: 1.5;
-}
+.aksrt-orders-page__stat { display: grid; gap: 5px; padding: 13px 15px; border-right: 1px solid var(--orders-line); }
+.aksrt-orders-page__stat:last-child { border-right: 0; }
+.aksrt-orders-page__stat span { color: var(--orders-muted); font-size: 11px; font-weight: 600; }
+.aksrt-orders-page__stat strong { font-size: 21px; line-height: 1; font-variant-numeric: tabular-nums; }
+.aksrt-orders-page__stat strong.is-pending { color: var(--color-warning, #c87819); }
+.aksrt-orders-page__stat strong.is-completed { color: var(--color-success, #168560); }
+
+.aksrt-orders-page__search { display: flex; gap: 8px; align-items: center; margin: 20px 0 12px; padding: 7px; border: 1px solid var(--orders-line); border-radius: 12px; background: var(--surface-1, #fff); }
+.aksrt-orders-page__search > i { margin-left: 7px; color: var(--orders-muted); font-size: 13px; }
+.aksrt-orders-page__search input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; color: var(--orders-ink); font-size: 13px; }
+.aksrt-orders-page__search button, .aksrt-orders-page__card-actions .btn-primary, .aksrt-orders-page__card-actions .btn-outline, .aksrt-orders-page__card-actions .btn-ghost, .aksrt-orders-page__empty .btn-outline, .aksrt-modal__footer .btn-primary, .aksrt-modal__footer .btn-outline, .aksrt-modal__footer .btn-ghost { display: inline-flex; align-items: center; justify-content: center; min-height: 34px; padding: 0 13px; border-radius: 8px; border: 1px solid transparent; font-size: 12px; font-weight: 650; text-decoration: none; cursor: pointer; }
+.aksrt-orders-page .btn-primary, .aksrt-modal__footer .btn-primary { background: var(--color-primary, #3b82f6); color: var(--color-on-primary, #fff); }
+.aksrt-orders-page .btn-outline, .aksrt-modal__footer .btn-outline { border-color: var(--orders-line); background: var(--surface-1, #fff); color: var(--orders-ink); }
+.aksrt-orders-page .btn-ghost, .aksrt-modal__footer .btn-ghost { background: transparent; color: var(--orders-muted); }
+.aksrt-orders-page__filter-toggle { background: var(--surface-2, #f4f6f9); color: var(--orders-ink); white-space: nowrap; }
+
+.aksrt-orders-page__filter-panel { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin: -2px 0 14px; padding: 12px; border-radius: 10px; background: var(--surface-2, #f4f6f9); }
+.aksrt-orders-page__filter-label { color: var(--orders-muted); font-size: 12px; font-weight: 650; }
+.aksrt-orders-page__type-filters { display: flex; flex-wrap: wrap; gap: 6px; }
+.aksrt-orders-page__filter-chip { padding: 5px 9px; border: 1px solid var(--orders-line); border-radius: 999px; background: var(--surface-1, #fff); color: var(--orders-muted); font-size: 12px; text-decoration: none; }
+.aksrt-orders-page__filter-chip.is-active { border-color: var(--color-primary, #3b82f6); background: color-mix(in srgb, var(--color-primary, #3b82f6) 10%, var(--surface-1, #fff)); color: var(--color-primary, #3b82f6); font-weight: 700; }
+.aksrt-orders-page__clear { margin-left: auto; color: var(--color-primary, #3b82f6); font-size: 12px; text-decoration: none; }
+
+.aksrt-orders-page__tabs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; margin: 0 0 14px; border-bottom: 1px solid var(--orders-line); }
+.aksrt-orders-page__tab { position: relative; padding: 11px 8px; color: var(--orders-muted); text-align: center; font-size: 13px; font-weight: 650; text-decoration: none; }
+.aksrt-orders-page__tab.is-active { color: var(--orders-ink); }
+.aksrt-orders-page__tab.is-active::after { position: absolute; right: 28%; bottom: -1px; left: 28%; height: 2px; border-radius: 2px; background: var(--color-primary, #3b82f6); content: ""; }
+.aksrt-orders-page__tab-badge { display: inline-grid; min-width: 17px; height: 17px; place-items: center; border-radius: 50%; background: var(--color-warning, #c87819); color: #fff; font-size: 10px; }
+
+.aksrt-orders-page__list { display: grid; gap: 10px; }
+.aksrt-orders-page__card { overflow: hidden; border: 1px solid var(--orders-line); border-radius: 13px; background: var(--surface-1, #fff); transition: border-color .18s ease, transform .18s ease, box-shadow .18s ease; }
+.aksrt-orders-page__card:hover { border-color: color-mix(in srgb, var(--color-primary, #3b82f6) 36%, var(--orders-line)); box-shadow: 0 8px 22px rgba(30, 48, 79, .07); transform: translateY(-1px); }
+.aksrt-orders-page__card-rail { display: flex; gap: 10px; align-items: center; padding: 9px 14px; background: var(--surface-2, #f7f8fb); color: var(--orders-muted); font-size: 11px; }
+.aksrt-orders-page__card-rail time { margin-left: auto; font-variant-numeric: tabular-nums; }
+.aksrt-orders-page__card-status { font-weight: 700; }
+.aksrt-orders-page__card-status.is-pending { color: var(--color-warning, #c87819); }
+.aksrt-orders-page__card-status.is-completed { color: var(--color-success, #168560); }
+.aksrt-orders-page__card-main { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto; gap: 13px; align-items: center; padding: 14px; }
+.aksrt-orders-page__card-img, .aksrt-orders-page__card-art { width: 52px; height: 52px; border-radius: 10px; object-fit: cover; }
+.aksrt-orders-page__card-art { display: grid; place-items: center; color: var(--color-primary, #3b82f6); background: color-mix(in srgb, var(--color-primary, #3b82f6) 10%, var(--surface-2, #f4f6f9)); }
+.aksrt-orders-page__card-copy { min-width: 0; }
+.aksrt-orders-page__card-copy h3 { display: -webkit-box; margin: 0 0 5px; overflow: hidden; color: var(--orders-ink); font-size: 14px; line-height: 1.35; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
+.aksrt-orders-page__card-copy p { margin: 0; color: var(--orders-muted); font-family: var(--font-mono, monospace); font-size: 11px; }
+.aksrt-orders-page__card-value { display: grid; gap: 3px; text-align: right; }
+.aksrt-orders-page__card-value strong { color: var(--orders-ink); font-size: 15px; font-variant-numeric: tabular-nums; }
+.aksrt-orders-page__card-value span { color: var(--orders-muted); font-size: 11px; }
+.aksrt-orders-page__card-actions { display: flex; gap: 7px; align-items: center; justify-content: flex-end; padding: 9px 14px; border-top: 1px solid var(--orders-line); }
+.aksrt-orders-page__countdown { margin-right: auto; color: var(--color-warning, #c87819); font-size: 11px; font-variant-numeric: tabular-nums; }
+.aksrt-orders-page__card-actions .is-entitlement { background: var(--color-success, #168560); }
+
+.aksrt-orders-page__pagination { display: flex; justify-content: center; gap: 6px; margin-top: 20px; }
+.aksrt-orders-page__page-chip { display: grid; width: 31px; height: 31px; place-items: center; border: 1px solid var(--orders-line); border-radius: 8px; color: var(--orders-muted); font-size: 12px; text-decoration: none; }
+.aksrt-orders-page__page-chip.is-active { border-color: var(--color-primary, #3b82f6); background: var(--color-primary, #3b82f6); color: #fff; }
+.aksrt-orders-page__empty { padding: 52px 20px; border: 1px dashed var(--orders-line); border-radius: 13px; background: var(--surface-2, #f7f8fb); text-align: center; }
+.aksrt-orders-page__empty i { display: block; margin-bottom: 12px; color: var(--color-primary, #3b82f6); font-size: 30px; }
+.aksrt-orders-page__empty h3 { margin: 0 0 7px; font-size: 15px; }.aksrt-orders-page__empty p { margin: 0 0 16px; color: var(--orders-muted); font-size: 13px; }
+
+.aksrt-modal[hidden] { display: none !important; }.aksrt-modal { position: fixed; inset: 0; z-index: var(--z-modal, 10050); display: grid; place-items: center; padding: 16px; }.aksrt-modal__overlay { position: absolute; inset: 0; background: rgba(18, 31, 50, .5); backdrop-filter: blur(4px); }.aksrt-modal__dialog { position: relative; width: min(470px, 100%); overflow: hidden; border: 1px solid var(--orders-line); border-radius: 16px; background: var(--surface-1, #fff); box-shadow: 0 24px 62px rgba(16, 25, 42, .25); }.aksrt-modal__header { display: flex; align-items: center; justify-content: space-between; padding: 15px 17px; border-bottom: 1px solid var(--orders-line); }.aksrt-modal__header h3 { margin: 0; font-size: 15px; }.aksrt-modal__close { width: 28px; height: 28px; border: 0; border-radius: 50%; background: var(--surface-2, #f4f6f9); color: var(--orders-muted); font-size: 19px; cursor: pointer; }.aksrt-modal__body { display: grid; gap: 14px; padding: 16px; }.aksrt-modal__footer { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 7px; padding: 12px 16px; border-top: 1px solid var(--orders-line); background: var(--surface-2, #f7f8fb); }
+.aksrt-order-detail__hero { display: flex; align-items: center; justify-content: space-between; padding: 15px; border-radius: 11px; background: color-mix(in srgb, var(--color-primary, #3b82f6) 9%, var(--surface-2, #f7f8fb)); }.aksrt-order-detail__hero.is-pending { background: color-mix(in srgb, var(--color-warning, #c87819) 11%, var(--surface-2, #f7f8fb)); }.aksrt-order-detail__hero.is-completed { background: color-mix(in srgb, var(--color-success, #168560) 10%, var(--surface-2, #f7f8fb)); }.aksrt-order-detail__status-pill { font-size: 12px; font-weight: 700; }.aksrt-order-detail__hero-amount { font-size: 23px; font-variant-numeric: tabular-nums; }.aksrt-order-detail__product { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: 11px; align-items: center; }.aksrt-order-detail__thumb { width: 56px; height: 56px; border-radius: 10px; object-fit: cover; }.aksrt-order-detail__thumb--empty { display: grid; place-items: center; background: var(--surface-2, #f4f6f9); color: var(--color-primary, #3b82f6); }.aksrt-order-detail__product-title { display: block; line-height: 1.4; }.aksrt-order-detail__product-meta { display: block; margin-top: 5px; color: var(--orders-muted); font-size: 12px; }.aksrt-order-detail__list { margin: 0; border: 1px solid var(--orders-line); border-radius: 10px; overflow: hidden; }.aksrt-order-detail__list > div { display: grid; grid-template-columns: 86px minmax(0, 1fr); padding: 10px 12px; border-bottom: 1px solid var(--orders-line); font-size: 12px; }.aksrt-order-detail__list > div:last-child { border-bottom: 0; }.aksrt-order-detail__list dt { color: var(--orders-muted); }.aksrt-order-detail__list dd { margin: 0; overflow-wrap: anywhere; text-align: right; font-variant-numeric: tabular-nums; }
+
+@media (max-width: 767px) { .uc-orders-panel__head { grid-template-columns: 1fr; gap: 17px; }.aksrt-orders-page__stats { max-width: none; }.aksrt-orders-page__search { flex-wrap: wrap; }.aksrt-orders-page__search input { min-width: 150px; }.aksrt-orders-page__search .btn-primary { margin-left: auto; }.aksrt-orders-page__filter-toggle { margin-left: auto; }.aksrt-orders-page__card-rail time { width: 100%; margin-left: 0; order: 3; }.aksrt-orders-page__card-main { grid-template-columns: 48px minmax(0, 1fr); }.aksrt-orders-page__card-img, .aksrt-orders-page__card-art { width: 48px; height: 48px; }.aksrt-orders-page__card-value { grid-column: 2; text-align: left; }.aksrt-orders-page__card-actions > :not(.aksrt-orders-page__countdown) { flex: 1 1 auto; }.aksrt-orders-page__countdown { width: 100%; }.aksrt-modal { align-items: end; padding: 0; }.aksrt-modal__dialog { width: 100%; border-radius: 16px 16px 0 0; }.aksrt-modal__footer > * { flex: 1; } }
+@media (prefers-reduced-motion: reduce) { .aksrt-orders-page__card { transition: none; } }
+html.dark .aksrt-orders-page__stat, html.dark .aksrt-orders-page__card, html.dark .aksrt-modal__dialog { background: var(--surface-1, #1a1d24); } html.dark .aksrt-orders-page__card-rail, html.dark .aksrt-orders-page__filter-panel, html.dark .aksrt-modal__footer { background: var(--surface-2, #12151b); }
diff --git a/assets/js/order-center.js b/assets/js/order-center.js
index d6e09ed3..0cede03f 100644
--- a/assets/js/order-center.js
+++ b/assets/js/order-center.js
@@ -1,10 +1,5 @@
/**
- * AKSRT Order Center — v2.0
- *
- * 前台订单中心交互:
- * - 支付 / 取消 / 售后:操作成功后局部刷新订单卡片,不再整页 reload
- * - 倒计时
- * - Toast 通知替代 window.alert
+ * Knowledge-payment order center interactions.
*
* @package AKSRT
*/
@@ -13,914 +8,269 @@
"use strict";
var page = document.querySelector("[data-aksrt-order-center]");
- if (!page || !window.aksrtData) {
- return;
- }
+ if (!page || !window.aksrtData) return;
- /* ── Toast helper ── */
- function showToast(text, duration) {
- duration = duration || 2500;
- var container = document.getElementById("toast-container");
- if (!container) {
- container = document.createElement("div");
- container.id = "toast-container";
- container.style.cssText = "position:fixed;bottom:24px;right:24px;z-index:99999;display:flex;flex-direction:column-reverse;gap:10px;pointer-events:none;";
- document.body.appendChild(container);
- }
- var toast = document.createElement("div");
- toast.style.cssText = "pointer-events:auto;display:flex;align-items:center;gap:8px;padding:10px 20px;background:rgba(0,0,0,0.78);backdrop-filter:blur(12px);color:#fff;font-family:var(--font-ui);font-size:14px;font-weight:500;border-radius:100px;box-shadow:0 4px 20px rgba(0,0,0,0.2);animation:aksrtToastIn 0.35s cubic-bezier(0.22,1,0.36,1) forwards;white-space:nowrap;";
- toast.textContent = text;
- container.appendChild(toast);
- setTimeout(function () {
- toast.style.animation = "aksrtToastOut 0.4s ease forwards";
- setTimeout(function () { if (toast.parentNode) toast.parentNode.removeChild(toast); }, 400);
- }, duration);
- }
-
- // Inject toast keyframes if not present
- if (!document.getElementById("aksrt-toast-keyframes")) {
- var style = document.createElement("style");
- style.id = "aksrt-toast-keyframes";
- style.textContent = "@keyframes aksrtToastIn{0%{opacity:0;transform:translateY(16px) scale(0.92)}100%{opacity:1;transform:translateY(0) scale(1)}}@keyframes aksrtToastOut{0%{opacity:1;transform:translateY(0) scale(1)}100%{opacity:0;transform:translateY(8px) scale(0.95)}}";
- document.head.appendChild(style);
- }
-
- /* ── REST helper ── */
- function restRoot() {
- return ((aksrtData.siteUrl || "").replace(/\/$/, "")) + "/wp-json/aksrt/v1";
- }
-
- function request(path, body, method) {
- var opts = {
- method: method || "POST",
- credentials: "same-origin",
- headers: {
- "Content-Type": "application/json",
- "X-WP-Nonce": (aksrtData && aksrtData.restNonce) || ""
- }
- };
- if (body !== undefined) {
- opts.body = JSON.stringify(body || {});
- }
- return fetch(restRoot() + path, opts).then(function (response) {
- return response.text().then(function (text) {
- var data = {};
- try {
- data = text ? JSON.parse(text) : {};
- } catch (e) {
- data = {
- success: false,
- message: response.status === 404
- ? "支付接口未找到(404),请刷新页面或联系管理员。"
- : ("请求失败(HTTP " + response.status + ")")
- };
- }
- if (typeof data.success === "undefined" && response.ok === false) {
- data.success = false;
- data.message = data.message || data.code || ("HTTP " + response.status);
- }
- return data;
- });
- });
- }
-
- function orderPath(orderNumber, suffix) {
- var base = "/shop/frontend/orders/" + encodeURIComponent(orderNumber || "");
- return suffix ? base + suffix : base;
- }
-
- /* ── Order review modal (zibll 1:1) ── */
- var STAR_SVG =
- '';
- var SCORE_LABELS = ["", "非常差", "较差", "一般", "较好", "非常好"];
-
- function formatRemain(sec) {
- sec = Math.max(0, sec | 0);
- var d = Math.floor(sec / 86400);
- var h = Math.floor((sec % 86400) / 3600);
- var m = Math.floor((sec % 3600) / 60);
- var s = sec % 60;
- function z(n) { return n < 10 ? "0" + n : String(n); }
- if (d > 0) return d + "天" + z(h) + ":" + z(m) + ":" + z(s);
- return z(h) + ":" + z(m) + ":" + z(s);
- }
-
- function bindShopScore(root) {
- if (!root) return;
- root.querySelectorAll("[data-aksrt-score-box], .shop-score-box").forEach(function (box) {
- if (box.dataset.scoreBound === "1") return;
- box.dataset.scoreBound = "1";
- var iconBox = box.querySelector(".score-icon");
- var textBox = box.querySelector(".score-text");
- var input = box.querySelector(".score-input");
- if (!iconBox) return;
- var value = parseInt(box.getAttribute("score-value") || (input && input.value) || "0", 10) || 0;
- var html = "";
- for (var i = 1; i <= 5; i++) {
- html += '' + STAR_SVG + "";
- }
- iconBox.innerHTML = html;
- function paint(score, hover) {
- iconBox.querySelectorAll(".icon-star").forEach(function (star) {
- var s = parseInt(star.getAttribute("data-score"), 10) || 0;
- star.classList.toggle("active", !hover && s <= score);
- star.classList.toggle("hover", !!hover && s <= score);
- });
- if (textBox) textBox.textContent = SCORE_LABELS[score] || "";
- }
- paint(value, false);
- iconBox.addEventListener("mouseover", function (e) {
- var star = e.target.closest(".icon-star");
- if (!star || !iconBox.contains(star)) return;
- paint(parseInt(star.getAttribute("data-score"), 10) || 0, true);
- });
- iconBox.addEventListener("mouseleave", function () {
- var cur = parseInt(box.getAttribute("score-value") || "0", 10) || 0;
- paint(cur, false);
- });
- iconBox.addEventListener("click", function (e) {
- var star = e.target.closest(".icon-star");
- if (!star || !iconBox.contains(star)) return;
- var score = parseInt(star.getAttribute("data-score"), 10) || 0;
- box.setAttribute("score-value", String(score));
- if (input) input.value = String(score);
- paint(score, false);
- });
- });
- }
-
- function bindReviewImages(form) {
- var preview = form.querySelector("[data-aksrt-review-preview]");
- var fileInput = form.querySelector("[data-aksrt-review-file]");
- var addBtn = form.querySelector("[data-aksrt-review-add]");
- if (!preview || !fileInput) return;
- var max = parseInt(preview.getAttribute("data-max") || "6", 10) || 6;
- var files = [];
-
- function render() {
- preview.querySelectorAll(".preview-item").forEach(function (n) { n.remove(); });
- files.forEach(function (item, idx) {
- var node = document.createElement("div");
- node.className = "preview-item";
- node.innerHTML = '';
- node.querySelector("img").src = item.url;
- node.querySelector(".remove").addEventListener("click", function (e) {
- e.preventDefault();
- e.stopPropagation();
- if (item.url && item.url.indexOf("blob:") === 0) {
- try { URL.revokeObjectURL(item.url); } catch (err) {}
- }
- files.splice(idx, 1);
- render();
- });
- preview.insertBefore(node, addBtn);
- });
- if (addBtn) addBtn.style.display = files.length >= max ? "none" : "";
- form._aksrtReviewFiles = files.slice();
- }
-
- function onPick() {
- if (files.length >= max) return;
- fileInput.click();
- }
- if (addBtn) {
- addBtn.addEventListener("click", onPick);
- addBtn.addEventListener("keydown", function (e) {
- if (e.key === "Enter" || e.key === " ") {
- e.preventDefault();
- onPick();
- }
- });
- }
- fileInput.addEventListener("change", function () {
- var list = Array.prototype.slice.call(fileInput.files || []);
- list.forEach(function (file) {
- if (files.length >= max) return;
- if (!file.type || file.type.indexOf("image/") !== 0) return;
- files.push({ file: file, url: URL.createObjectURL(file) });
- });
- fileInput.value = "";
- render();
- });
- form._aksrtReviewFiles = [];
- render();
- }
-
- function bindReviewCountdown(root) {
- var el = root.querySelector("[data-aksrt-review-countdown]");
- if (!el) return;
- var remain = parseInt(el.getAttribute("data-aksrt-review-countdown") || "0", 10) || 0;
- if (remain <= 0) return;
- el.textContent = formatRemain(remain);
- var timer = window.setInterval(function () {
- remain -= 1;
- if (remain <= 0) {
- window.clearInterval(timer);
- el.textContent = "交易已关闭";
- return;
- }
- el.textContent = formatRemain(remain);
- }, 1000);
- root._aksrtReviewTimer = timer;
- }
-
- function fileToDataUrl(file) {
- return new Promise(function (resolve, reject) {
- var reader = new FileReader();
- reader.onload = function () { resolve(String(reader.result || "")); };
- reader.onerror = function () { reject(new Error("read failed")); };
- reader.readAsDataURL(file);
- });
- }
-
- function openOrderReviewModal(orderNumber, triggerBtn) {
- if (!window.AksrtRemoteModal || typeof window.AksrtRemoteModal.openRemote !== "function") {
- showToast("评价组件未加载");
- return;
- }
- if (triggerBtn) triggerBtn.disabled = true;
- var url = restRoot() + orderPath(orderNumber, "/review-modal");
- window.AksrtRemoteModal.openRemote({
- url: url,
- className: "modal-mini full-sm",
- height: 380,
- mobileBottom: true
- }).then(function (shell) {
- if (triggerBtn) triggerBtn.disabled = false;
- if (!shell) return;
- var form = shell.querySelector("[data-aksrt-order-review-form]");
- if (!form) return;
- bindShopScore(shell);
- bindReviewImages(form);
- bindReviewCountdown(shell);
-
- form.addEventListener("submit", function (e) {
- e.preventDefault();
- var errBox = form.querySelector("[data-aksrt-review-error]");
- function showErr(msg) {
- if (errBox) {
- errBox.hidden = false;
- errBox.textContent = msg;
- } else {
- showToast(msg);
- }
- }
- if (errBox) {
- errBox.hidden = true;
- errBox.textContent = "";
- }
-
- var productId = parseInt(form.getAttribute("data-product-id") || "0", 10) || 0;
- var needShipping = form.getAttribute("data-need-shipping") === "1";
- var scoreProduct = parseInt((form.querySelector('input[name="score[product]"]') || {}).value || "0", 10) || 0;
- var scoreService = parseInt((form.querySelector('input[name="score[service]"]') || {}).value || "0", 10) || 0;
- var scoreShipping = parseInt((form.querySelector('input[name="score[shipping]"]') || {}).value || "0", 10) || 0;
- if (scoreProduct < 1 || scoreService < 1) {
- showErr("请对商品进行评分");
- return;
- }
- if (needShipping && scoreShipping < 1) {
- showErr("请对物流服务进行评分");
- return;
- }
-
- var comment = (form.querySelector('textarea[name="comment"]') || {}).value || "";
- var submitBtn = form.querySelector("[data-aksrt-review-submit]");
- if (submitBtn) {
- submitBtn.disabled = true;
- submitBtn.textContent = "提交中…";
- }
-
- var pending = form._aksrtReviewFiles || [];
- Promise.all(pending.map(function (item) {
- return item.file ? fileToDataUrl(item.file) : Promise.resolve(item.url || "");
- })).then(function (images) {
- images = images.filter(Boolean);
- return request(orderPath(orderNumber, "/review"), {
- product_id: productId,
- content: comment,
- rating_product: scoreProduct,
- rating_service: scoreService,
- rating_shipping: needShipping ? scoreShipping : scoreService,
- images: images
- });
- }).then(function (result) {
- if (submitBtn) {
- submitBtn.disabled = false;
- submitBtn.innerHTML = ' 确认提交';
- }
- if (!result || !result.success) {
- showErr((result && result.message) || "评价失败");
- return;
- }
- showToast((result.message) || "评价成功");
- if (window.AksrtRemoteModal) window.AksrtRemoteModal.close();
- var card = findOrderCard(orderNumber);
- updateCardStatus(card, "completed", "已完成");
- if (card) {
- var btn = card.querySelector("[data-aksrt-order-review]");
- if (btn) btn.remove();
- }
- }).catch(function () {
- if (submitBtn) {
- submitBtn.disabled = false;
- submitBtn.innerHTML = ' 确认提交';
- }
- showErr("网络错误");
- });
- });
- }).catch(function (err) {
- if (triggerBtn) triggerBtn.disabled = false;
- showToast((err && err.message) || "无法打开评价");
- });
- }
-
- /* ── 扫码支付弹层(微信 Native code_url 等)── */
- function showPaymentQr(content, orderNumber) {
- var existing = document.getElementById("aksrt-pay-qr-overlay");
- if (existing) existing.remove();
-
- var overlay = document.createElement("div");
- overlay.id = "aksrt-pay-qr-overlay";
- overlay.style.cssText = "position:fixed;inset:0;z-index:100000;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.5);";
-
- var qrImg = "";
- if (window.AksrtShare && typeof window.AksrtShare.buildQrDataUrl === "function") {
- var dataUrl = window.AksrtShare.buildQrDataUrl(content, 220);
- if (dataUrl) {
- qrImg = '
';
- }
- }
- if (!qrImg) {
- qrImg = '
' + String(content).replace(/[<>&]/g, "") + "
"; - } - - var card = document.createElement("div"); - card.style.cssText = "background:#fff;border-radius:12px;padding:24px;max-width:300px;text-align:center;box-shadow:0 10px 40px rgba(0,0,0,0.2);"; - card.innerHTML = - '支付完成后本页将自动更新
' + - ''; - overlay.appendChild(card); - document.body.appendChild(overlay); - - function close() { overlay.remove(); } - overlay.addEventListener("click", function (e) { if (e.target === overlay) close(); }); - card.querySelector("#aksrt-pay-qr-close").addEventListener("click", function () { - close(); - // 关闭后查询订单是否已到账 - if (orderNumber) { - request(orderPath(orderNumber), {}, "GET").then(function () { - window.location.reload(); - }).catch(function () {}); - } - }); - } - - /* ── 第三方支付返回提示(?payment=success|pending|cancelled)── */ - (function paymentReturnNotice() { - var params = new URLSearchParams(window.location.search); - var pay = params.get("payment"); - if (!pay) return; - var map = { success: "支付成功!", pending: "支付处理中,到账后将自动更新。", cancelled: "支付已取消。", fail: "支付失败,请重试。" }; - showToast(map[pay] || "支付状态:" + pay, 3500); - })(); - - /* ── Local card refresh helpers ── */ - function findOrderCard(orderNumber) { - return page.querySelector('[data-aksrt-order-card="' + orderNumber + '"]'); - } - - function escapeHtml(value) { - return String(value == null ? "" : value) - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); - } - - function formatMoney(order) { - var amount = Number(order && order.amount != null ? order.amount : 0); - if (order && order.is_points) { - var symbol = order.currency_symbol || "积分"; - return escapeHtml(symbol) + " " + Math.round(amount); - } - return "¥" + amount.toFixed(2); - } - - /** Plain money for table cells (formatMoney already escapes). */ - function formatMoneyText(order) { - var amount = Number(order && order.amount != null ? order.amount : 0); - if (order && order.is_points) { - var symbol = order.currency_symbol || "积分"; - return String(symbol) + " " + Math.round(amount); - } - return "¥" + amount.toFixed(2); - } - - function updateCardStatus(card, newStatus, statusLabel) { - if (!card) return; - if (newStatus) { - card.setAttribute("data-order-status", newStatus); - } - var badge = card.querySelector(".aksrt-orders-page__card-status, .aksrt-orders-page__item-badge"); - if (badge) { - badge.textContent = statusLabel || newStatus; - } - // Hide action buttons that are no longer relevant - var actions = card.querySelectorAll("[data-aksrt-order-pay], [data-aksrt-order-cancel]"); - for (var i = 0; i < actions.length; i++) { - actions[i].style.display = "none"; - } - // Hide countdown if present - var countdown = card.querySelector("[data-aksrt-order-countdown]"); - if (countdown) { - countdown.style.display = "none"; - } - } - - /* ── Order detail modal ── */ var detailModal = page.querySelector("[data-aksrt-order-detail-modal]"); var detailBody = page.querySelector("[data-aksrt-order-detail-body]"); var detailFooter = page.querySelector("[data-aksrt-order-detail-footer]"); var detailOrderNumber = ""; - function closeOrderDetailModal() { + function toast(message) { + if (window.AksrtToast && typeof window.AksrtToast.show === "function") { + window.AksrtToast.show(message); + return; + } + window.alert(message); + } + + function restRoot() { + return String(aksrtData.siteUrl || "").replace(/\/$/, "") + "/wp-json/aksrt/v1"; + } + + function request(path, body, method) { + var options = { + method: method || "POST", + credentials: "same-origin", + headers: { "X-WP-Nonce": aksrtData.restNonce || "" } + }; + if (body !== undefined) { + options.headers["Content-Type"] = "application/json"; + options.body = JSON.stringify(body || {}); + } + return fetch(restRoot() + path, options).then(function (response) { + return response.json().catch(function () { + return { success: false, message: "请求失败(HTTP " + response.status + ")" }; + }); + }); + } + + function orderPath(orderNumber, suffix) { + return "/orders/" + encodeURIComponent(orderNumber || "") + (suffix || ""); + } + + function escapeHtml(value) { + return String(value == null ? "" : value) + .replace(/&/g, "&").replace(//g, ">").replace(/\"/g, """) + .replace(/'/g, "'"); + } + + function formatMoney(order) { + var amount = Number(order && order.amount || 0); + return order && order.is_points + ? escapeHtml(order.currency_symbol || "积分") + " " + Math.round(amount) + : "¥" + amount.toFixed(2); + } + + function closeDetail() { if (detailModal) detailModal.hidden = true; detailOrderNumber = ""; document.documentElement.classList.remove("aksrt-modal-open"); } - document.addEventListener("keydown", function (event) { - if (event.key === "Escape" && detailModal && !detailModal.hidden) { - closeOrderDetailModal(); - } - }); + function renderDetail(order) { + if (!detailBody || !detailFooter) return; + var actions = order.actions || {}; + var image = order.image || ""; + var title = order.product_name || "订单"; + var status = order.status_group || "closed"; + var html = '加载中…
'; detailFooter.innerHTML = ""; detailModal.hidden = false; document.documentElement.classList.add("aksrt-modal-open"); - request(orderPath(orderNumber), undefined, "GET").then(function (result) { - var order = null; - if (result && result.data && result.data.order_number) { - order = result.data; - } else if (result && result.data && result.data.data && result.data.data.order_number) { - order = result.data.data; - } else if (result && result.order_number) { - order = result; - } - if (result && result.success === false) { - detailBody.innerHTML = '' + escapeHtml((result && result.message) || "加载失败") + "
"; + if (orderNumber !== detailOrderNumber) return; + if (!result.success || !result.data) { + detailBody.innerHTML = '' + escapeHtml(result.message || "订单不存在") + "
"; return; } - if (!order || !order.order_number) { - detailBody.innerHTML = '订单不存在
'; - return; - } - renderOrderDetail(order); + renderDetail(result.data); }).catch(function () { detailBody.innerHTML = '网络错误,请稍后重试
'; }); } - function renderOrderDetail(order) { - if (!detailBody || !detailFooter) return; - var actions = (order && order.actions) || {}; - var payment = order.payment_method || {}; - var paymentLabel = payment.label || payment.value || "—"; - var qty = order.quantity || 1; - if ((!qty || qty < 1) && order.items && order.items.length) { - qty = 0; - order.items.forEach(function (item) { - qty += Math.max(1, parseInt(item.quantity || item.qty || 1, 10) || 1); - }); - } - if (!qty || qty < 1) qty = 1; + function currentViewPath() { + var params = new URLSearchParams(window.location.search); + var allowed = ["order_status", "order_type", "order_number", "order_page"]; + var query = new URLSearchParams(); + allowed.forEach(function (key) { if (params.get(key)) query.set(key, params.get(key)); }); + return "/orders/view" + (query.toString() ? "?" + query.toString() : ""); + } - var status = order.status || ""; - var statusLabel = order.status_label || status || "—"; - var statusClass = "is-" + String(status).replace(/[^a-z0-9_-]/gi, "-"); - var title = order.product_name || (order.product && order.product.title) || "订单"; - var image = order.image || (order.product && order.product.image) || ""; - if (!image && order.items && order.items.length && order.items[0].image) { - image = order.items[0].image; - } - var orderNo = order.order_number || "—"; + function actionHtml(order) { + var actions = order.actions || {}; + var html = ''; + if (actions.can_cancel) html += ''; + if (actions.can_pay) html += ''; + if (actions.can_open && order.permalink) html += '' + escapeHtml(order.entitlement_label || '打开已购内容') + ''; + return html; + } - // Meta fields only — amount lives in hero; type is already on the list card. - var rows = [ - { key: "qty", label: "数量", value: "×" + String(qty) }, - { key: "no", label: "订单编号", value: orderNo, copyable: true }, - { key: "created", label: "创建时间", value: order.created_at || "—" }, - { key: "paid", label: "支付时间", value: order.paid_at || "—" }, - { key: "pay", label: "支付方式", value: paymentLabel } - ]; + function cardHtml(order) { + var image = order.image + ? '订单号 ' + escapeHtml(order.order_number) + '
换个条件试试,或清除当前筛选。
暂无可用优惠券
'; - return; - } - var html = '加载失败
'; - }); - page.addEventListener("click", function (e) { - var b = e.target.closest("[data-aksrt-copy-coupon]"); - if (!b) return; - var code = b.getAttribute("data-aksrt-copy-coupon") || ""; - if (!code) return; - if (navigator.clipboard && navigator.clipboard.writeText) { - navigator.clipboard.writeText(code).then(function () { showToast("已复制 " + code); }); - } else { - showToast(code); - } - }); - } -})(); + document.addEventListener("keydown", function (event) { + if (event.key === "Escape" && detailModal && !detailModal.hidden) closeDetail(); + }); + window.setInterval(updateCountdowns, 1000); +}()); diff --git a/inc/helpers/aksrt-transactions.php b/inc/helpers/aksrt-transactions.php index 8217a609..dc67ef56 100644 --- a/inc/helpers/aksrt-transactions.php +++ b/inc/helpers/aksrt-transactions.php @@ -17,13 +17,14 @@ function aksrt_get_order_status_labels(): array { return []; } -function aksrt_get_orders_page_view(int $user_id, int $paged = 1, int $per_page = 20, string $status = '', string $product_type = ''): array { +function aksrt_get_orders_page_view(int $user_id, int $paged = 1, int $per_page = 20, string $status = 'all', string $product_type = '', string $order_number = ''): array { $empty = [ 'items' => [], 'total' => 0, 'total_pages' => 1, 'page' => 1, - 'stats' => ['total' => 0, 'pending' => 0, 'paid' => 0], + 'query' => [], + 'stats' => ['total' => 0, 'pending' => 0, 'completed' => 0], 'product_types' => class_exists('\AKSRT\Core\DomainModel') ? array_merge(['' => __('全部类型', 'aksrt')], \AKSRT\Core\DomainModel::order_product_type_labels()) : [], @@ -38,6 +39,7 @@ function aksrt_get_orders_page_view(int $user_id, int $paged = 1, int $per_page 'per_page' => $per_page, 'status' => $status, 'product_type' => $product_type, + 'order_number' => $order_number, ]; if (class_exists('\AKSRT\Payment\UserOrders')) { diff --git a/inc/helpers/user-center-renderers/profile-orders.php b/inc/helpers/user-center-renderers/profile-orders.php index 293e873b..7e90e058 100644 --- a/inc/helpers/user-center-renderers/profile-orders.php +++ b/inc/helpers/user-center-renderers/profile-orders.php @@ -1,6 +1,6 @@ ' . esc_html__('请先登录', 'aksrt') . ''; - return; + echo '