Files
laimiao-web-new/me.html
T

2738 lines
178 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<meta name="theme-color" content="#FFFFFF" />
<meta name="skill-agent-api" content="%VITE_SKILL_AGENT_URL%" />
<meta name="referrer" content="no-referrer" />
<title>个人中心|来秒AI</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='9' fill='%2308482D'/%3E%3Cpath d='M18.6 3 7.5 18h6.7l-1.7 11L24.5 13h-6.6l.7-10Z' fill='%23DAE7C7'/%3E%3C/svg%3E" />
<link rel="preconnect" href="https://fonts.googleapis.cn" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.cn/css2?family=Inter:wght@400;500;600;700;800;900&family=Noto+Sans+SC:wght@400;500;700;900&display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.cn/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet" />
<script>window.__TEAM_API_BASE__ = "%VITE_TEAM_API_URL%";</script>
<style>
html, body { height: 100%; margin: 0; }
.material-symbols-outlined { font-family: "Material Symbols Outlined"; font-weight: normal; font-style: normal; font-size: 24px; line-height: 1; letter-spacing: normal; text-transform: none; display: inline-block; white-space: nowrap; overflow-wrap: normal; direction: ltr; font-feature-settings: "liga"; -webkit-font-smoothing: antialiased; opacity: 0; }
.material-symbols-outloaded .material-symbols-outlined { opacity: 1; }
@keyframes appBootSpin {
100% { transform: rotate(360deg); }
}
@layer properties;
@layer theme, base, components, utilities;
@layer theme {
:root, :host { --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
"Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
"Segoe UI Symbol", "Noto Color Emoji"; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace; --color-red-50: oklch(97.1% 0.013 17.38); --color-red-100: oklch(93.6% 0.032 17.717); --color-red-200: oklch(88.5% 0.062 18.334); --color-red-300: oklch(80.8% 0.114 19.571); --color-red-400: oklch(70.4% 0.191 22.216); --color-red-500: oklch(63.7% 0.237 25.331); --color-red-600: oklch(57.7% 0.245 27.325); --color-red-700: oklch(50.5% 0.213 27.518); --color-orange-50: oklch(98% 0.016 73.684); --color-orange-100: oklch(95.4% 0.038 75.164); --color-orange-400: oklch(75% 0.183 55.934); --color-orange-500: oklch(70.5% 0.213 47.604); --color-orange-600: oklch(64.6% 0.222 41.116); --color-orange-700: oklch(55.3% 0.195 38.402); --color-amber-50: oklch(98.7% 0.022 95.277); --color-amber-100: oklch(96.2% 0.059 95.617); --color-amber-200: oklch(92.4% 0.12 95.746); --color-amber-300: oklch(87.9% 0.169 91.605); --color-amber-400: oklch(82.8% 0.189 84.429); --color-amber-500: oklch(76.9% 0.188 70.08); --color-amber-600: oklch(66.6% 0.179 58.318); --color-amber-700: oklch(55.5% 0.163 48.998); --color-amber-800: oklch(47.3% 0.137 46.201); --color-amber-900: oklch(41.4% 0.112 45.904); --color-yellow-100: oklch(97.3% 0.071 103.193); --color-yellow-400: oklch(85.2% 0.199 91.936); --color-yellow-600: oklch(68.1% 0.162 75.834); --color-green-50: oklch(98.2% 0.018 155.826); --color-green-100: oklch(96.2% 0.044 156.743); --color-green-500: oklch(72.3% 0.219 149.579); --color-green-600: oklch(62.7% 0.194 149.214); --color-green-700: oklch(52.7% 0.154 150.069); --color-green-800: oklch(44.8% 0.119 151.328); --color-emerald-200: oklch(90.5% 0.093 164.15); --color-emerald-500: oklch(69.6% 0.17 162.48); --color-emerald-600: oklch(59.6% 0.145 163.225); --color-emerald-800: oklch(43.2% 0.095 166.913); --color-sky-200: oklch(90.1% 0.058 230.902); --color-blue-50: oklch(97% 0.014 254.604); --color-blue-100: oklch(93.2% 0.032 255.585); --color-blue-500: oklch(62.3% 0.214 259.815); --color-blue-600: oklch(54.6% 0.245 262.881); --color-blue-700: oklch(48.8% 0.243 264.376); --color-indigo-100: oklch(93% 0.034 272.788); --color-indigo-600: oklch(51.1% 0.262 276.966); --color-indigo-900: oklch(35.9% 0.144 278.697); --color-purple-100: oklch(94.6% 0.033 307.174); --color-purple-500: oklch(62.7% 0.265 303.9); --color-purple-600: oklch(55.8% 0.288 302.321); --color-purple-700: oklch(49.6% 0.265 301.924); --color-pink-100: oklch(94.8% 0.028 342.258); --color-pink-600: oklch(59.2% 0.249 0.584); --color-slate-200: oklch(92.9% 0.013 255.508); --color-slate-300: oklch(86.9% 0.022 252.894); --color-slate-400: oklch(70.4% 0.04 256.788); --color-slate-500: oklch(55.4% 0.046 257.417); --color-slate-600: oklch(44.6% 0.043 257.281); --color-slate-900: oklch(20.8% 0.042 265.755); --color-gray-50: oklch(98.5% 0.002 247.839); --color-gray-100: oklch(96.7% 0.003 264.542); --color-gray-200: oklch(92.8% 0.006 264.531); --color-gray-300: oklch(87.2% 0.01 258.338); --color-gray-400: oklch(70.7% 0.022 261.325); --color-gray-500: oklch(55.1% 0.027 264.364); --color-gray-600: oklch(44.6% 0.03 256.802); --color-gray-700: oklch(37.3% 0.034 259.733); --color-gray-800: oklch(27.8% 0.033 256.848); --color-gray-900: oklch(21% 0.034 264.665); --color-neutral-50: oklch(98.5% 0 none); --color-neutral-100: oklch(97% 0 none); --color-neutral-200: oklch(92.2% 0 none); --color-neutral-300: oklch(87% 0 none); --color-neutral-400: oklch(70.8% 0 none); --color-neutral-500: oklch(55.6% 0 none); --color-neutral-600: oklch(43.9% 0 none); --color-neutral-700: oklch(37.1% 0 none); --color-neutral-800: oklch(26.9% 0 none); --color-neutral-900: oklch(20.5% 0 none); --color-neutral-950: oklch(14.5% 0 none); --color-black: #000; --color-white: #fff; --spacing: 0.25rem; --container-md: 28rem; --container-lg: 32rem; --container-xl: 36rem; --container-2xl: 42rem; --container-4xl: 56rem; --container-5xl: 64rem; --container-7xl: 80rem; --text-xs: 0.75rem; --text-xs--line-height: calc(1 / 0.75); --text-sm: 0.875rem; --text-sm--line-height: calc(1.25 / 0.875); --text-base: 1rem; --text-base--line-height: calc(1.5 / 1); --text-lg: 1.125rem; --text-lg--line-height: calc(1.75 / 1.125); --text-xl: 1.25rem; --text-xl--line-height: calc(1.75 / 1.25); --text-2xl: 1.5rem; --text-2xl--line-height: calc(2 / 1.5); --text-3xl: 1.875rem; --text-3xl--line-height: calc(2.25 / 1.875); --text-4xl: 2.25rem; --text-4xl--line-height: calc(2.5 / 2.25); --text-5xl: 3rem; --text-5xl--line-height: 1; --text-6xl: 3.75rem; --text-6xl--line-height: 1; --text-9xl: 8rem; --text-9xl--line-height: 1; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --font-weight-black: 900; --tracking-tight: -0.025em; --tracking-wide: 0.025em; --tracking-wider: 0.05em; --tracking-widest: 0.1em; --leading-snug: 1.375; --leading-relaxed: 1.625; --radius-sm: 0.25rem; --radius-md: 0.375rem; --radius-lg: 0.5rem; --radius-xl: 0.75rem; --radius-2xl: 1rem; --radius-3xl: 1.5rem; --ease-in: cubic-bezier(0.4, 0, 1, 1); --ease-out: cubic-bezier(0, 0, 0.2, 1); --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); --animate-spin: spin 1s linear infinite; --blur-sm: 8px; --blur-md: 12px; --blur-3xl: 64px; --default-transition-duration: 150ms; --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); --default-font-family: var(--font-sans); --default-mono-font-family: var(--font-mono); --font-display: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Helvetica Neue", "Microsoft YaHei", sans-serif; }
}
@layer base {
*, ::after, ::before, ::backdrop, ::file-selector-button { box-sizing: border-box; margin: 0px; padding: 0px; border: 0px solid; }
html, :host { line-height: 1.5; text-size-adjust: 100%; tab-size: 4; font-family: var(--default-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); font-feature-settings: var(--default-font-feature-settings, normal); font-variation-settings: var(--default-font-variation-settings, normal); -webkit-tap-highlight-color: transparent; }
hr { height: 0px; color: inherit; border-top-width: 1px; }
abbr:where([title]) { text-decoration: underline dotted; }
h1, h2, h3, h4, h5, h6 { font-size: inherit; font-weight: inherit; }
a { color: inherit; text-decoration: inherit; }
b, strong { font-weight: bolder; }
code, kbd, samp, pre { font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace); font-feature-settings: var(--default-mono-font-feature-settings, normal); font-variation-settings: var(--default-mono-font-variation-settings, normal); font-size: 1em; }
small { font-size: 80%; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sub { bottom: -0.25em; }
sup { top: -0.5em; }
table { text-indent: 0px; border-color: inherit; border-collapse: collapse; }
progress { vertical-align: baseline; }
summary { display: list-item; }
ol, ul, menu { list-style: none; }
img, svg, video, canvas, audio, iframe, embed, object { display: block; vertical-align: middle; }
img, video { max-width: 100%; height: auto; }
button, input, select, optgroup, textarea, ::file-selector-button { font: inherit; letter-spacing: inherit; color: inherit; border-radius: 0px; background-color: transparent; opacity: 1; }
:where(select:is([multiple], [size])) optgroup { font-weight: bolder; }
:where(select:is([multiple], [size])) optgroup option { padding-inline-start: 20px; }
::file-selector-button { margin-inline-end: 4px; }
::placeholder { opacity: 1; }
@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
::placeholder {
color: currentcolor;
@supports (color: color-mix(in lab, red, red)) {
color: color-mix(currentcolor, transparent);
}
}
}
textarea { resize: vertical; }
::-webkit-search-decoration { appearance: none; }
::-webkit-date-and-time-value { min-height: 1lh; text-align: inherit; }
::-webkit-datetime-edit { display: inline-flex; }
::-webkit-datetime-edit-fields-wrapper { padding: 0px; }
::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { padding-block: 0px; }
::-webkit-calendar-picker-indicator { line-height: 1; }
button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button { appearance: button; }
::-webkit-inner-spin-button, ::-webkit-outer-spin-button { height: auto; }
[hidden]:where(:not([hidden="until-found"])) { display: none !important; }
}
@layer utilities {
.pointer-events-auto { pointer-events: auto; }
.pointer-events-none { pointer-events: none; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0px; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border-width: 0px; }
.absolute { position: absolute; }
.fixed { position: fixed; }
.relative { position: relative; }
.sticky { position: sticky; }
.inset-0 { inset: 0px; }
.inset-x-0 { inset-inline: 0px; }
.inset-y-0 { inset-block: 0px; }
.-top-2 { top: calc(var(--spacing) * -2); }
.top-0 { top: 0px; }
.top-0\.5 { top: calc(var(--spacing) * 0.5); }
.top-1 { top: var(--spacing); }
.top-1\/2 { top: calc(50%); }
.top-2 { top: calc(var(--spacing) * 2); }
.top-2\.5 { top: calc(var(--spacing) * 2.5); }
.top-3 { top: calc(var(--spacing) * 3); }
.top-4 { top: calc(var(--spacing) * 4); }
.top-5 { top: calc(var(--spacing) * 5); }
.top-6 { top: calc(var(--spacing) * 6); }
.top-8 { top: calc(var(--spacing) * 8); }
.top-10 { top: calc(var(--spacing) * 10); }
.top-12 { top: calc(var(--spacing) * 12); }
.top-14 { top: calc(var(--spacing) * 14); }
.top-16 { top: calc(var(--spacing) * 16); }
.-right-2 { right: calc(var(--spacing) * -2); }
.right-0 { right: 0px; }
.right-0\.5 { right: calc(var(--spacing) * 0.5); }
.right-1 { right: var(--spacing); }
.right-2 { right: calc(var(--spacing) * 2); }
.right-2\.5 { right: calc(var(--spacing) * 2.5); }
.right-4 { right: calc(var(--spacing) * 4); }
.right-5 { right: calc(var(--spacing) * 5); }
.right-8 { right: calc(var(--spacing) * 8); }
.-bottom-2 { bottom: calc(var(--spacing) * -2); }
.bottom-0 { bottom: 0px; }
.bottom-0\.5 { bottom: calc(var(--spacing) * 0.5); }
.bottom-2 { bottom: calc(var(--spacing) * 2); }
.bottom-2\.5 { bottom: calc(var(--spacing) * 2.5); }
.bottom-4 { bottom: calc(var(--spacing) * 4); }
.bottom-10 { bottom: calc(var(--spacing) * 10); }
.left-0 { left: 0px; }
.left-0\.5 { left: calc(var(--spacing) * 0.5); }
.left-1\/2 { left: calc(50%); }
.left-2 { left: calc(var(--spacing) * 2); }
.left-2\.5 { left: calc(var(--spacing) * 2.5); }
.left-3 { left: calc(var(--spacing) * 3); }
.left-4 { left: calc(var(--spacing) * 4); }
.left-12 { left: calc(var(--spacing) * 12); }
.z-10 { z-index: 10; }
.z-40 { z-index: 40; }
.z-50 { z-index: 50; }
.z-\[5\] { z-index: 5; }
.z-\[60\] { z-index: 60; }
.z-\[80\] { z-index: 80; }
.z-\[100\] { z-index: 100; }
.z-\[200\] { z-index: 200; }
.z-\[210\] { z-index: 210; }
.z-\[220\] { z-index: 220; }
.z-\[10000\] { z-index: 10000; }
.container {
width: 100%;
@media (width >= 40rem) {
max-width: 40rem;
}
@media (width >= 48rem) {
max-width: 48rem;
}
@media (width >= 64rem) {
max-width: 64rem;
}
@media (width >= 80rem) {
max-width: 80rem;
}
@media (width >= 96rem) {
max-width: 96rem;
}
}
.mx-1 { margin-inline: var(--spacing); }
.mx-2 { margin-inline: calc(var(--spacing) * 2); }
.mx-4 { margin-inline: calc(var(--spacing) * 4); }
.mx-auto { margin-inline: auto; }
.my-2 { margin-block: calc(var(--spacing) * 2); }
.my-3 { margin-block: calc(var(--spacing) * 3); }
.my-4 { margin-block: calc(var(--spacing) * 4); }
.my-8 { margin-block: calc(var(--spacing) * 8); }
.-mt-16 { margin-top: calc(var(--spacing) * -16); }
.mt-0\.5 { margin-top: calc(var(--spacing) * 0.5); }
.mt-1 { margin-top: var(--spacing); }
.mt-1\.5 { margin-top: calc(var(--spacing) * 1.5); }
.mt-2 { margin-top: calc(var(--spacing) * 2); }
.mt-3 { margin-top: calc(var(--spacing) * 3); }
.mt-4 { margin-top: calc(var(--spacing) * 4); }
.mt-6 { margin-top: calc(var(--spacing) * 6); }
.mt-8 { margin-top: calc(var(--spacing) * 8); }
.mt-10 { margin-top: calc(var(--spacing) * 10); }
.mt-12 { margin-top: calc(var(--spacing) * 12); }
.mt-16 { margin-top: calc(var(--spacing) * 16); }
.-mr-1 { margin-right: calc(var(--spacing) * -1); }
.-mr-16 { margin-right: calc(var(--spacing) * -16); }
.mr-2 { margin-right: calc(var(--spacing) * 2); }
.mb-0\.5 { margin-bottom: calc(var(--spacing) * 0.5); }
.mb-1 { margin-bottom: var(--spacing); }
.mb-1\.5 { margin-bottom: calc(var(--spacing) * 1.5); }
.mb-2 { margin-bottom: calc(var(--spacing) * 2); }
.mb-3 { margin-bottom: calc(var(--spacing) * 3); }
.mb-4 { margin-bottom: calc(var(--spacing) * 4); }
.mb-5 { margin-bottom: calc(var(--spacing) * 5); }
.mb-6 { margin-bottom: calc(var(--spacing) * 6); }
.mb-8 { margin-bottom: calc(var(--spacing) * 8); }
.mb-10 { margin-bottom: calc(var(--spacing) * 10); }
.mb-12 { margin-bottom: calc(var(--spacing) * 12); }
.mb-16 { margin-bottom: calc(var(--spacing) * 16); }
.ml-1\.5 { margin-left: calc(var(--spacing) * 1.5); }
.ml-2 { margin-left: calc(var(--spacing) * 2); }
.ml-3 { margin-left: calc(var(--spacing) * 3); }
.ml-4 { margin-left: calc(var(--spacing) * 4); }
.ml-6 { margin-left: calc(var(--spacing) * 6); }
.ml-\[21px\] { margin-left: 21px; }
.ml-auto { margin-left: auto; }
.block { display: block; }
.flex { display: flex; }
.grid { display: grid; }
.hidden { display: none; }
.inline-block { display: inline-block; }
.inline-flex { display: inline-flex; }
.table { display: table; }
.aspect-\[2\/3\] { aspect-ratio: 2 / 3; }
.aspect-\[3\/2\] { aspect-ratio: 3 / 2; }
.aspect-\[3\/4\] { aspect-ratio: 3 / 4; }
.aspect-\[4\/3\] { aspect-ratio: 4 / 3; }
.aspect-\[4\/5\] { aspect-ratio: 4 / 5; }
.aspect-\[9\/16\] { aspect-ratio: 9 / 16; }
.aspect-square { aspect-ratio: 1 / 1; }
.h-0\.5 { height: calc(var(--spacing) * 0.5); }
.h-1 { height: var(--spacing); }
.h-1\.5 { height: calc(var(--spacing) * 1.5); }
.h-3 { height: calc(var(--spacing) * 3); }
.h-3\.5 { height: calc(var(--spacing) * 3.5); }
.h-4 { height: calc(var(--spacing) * 4); }
.h-5 { height: calc(var(--spacing) * 5); }
.h-6 { height: calc(var(--spacing) * 6); }
.h-7 { height: calc(var(--spacing) * 7); }
.h-8 { height: calc(var(--spacing) * 8); }
.h-9 { height: calc(var(--spacing) * 9); }
.h-10 { height: calc(var(--spacing) * 10); }
.h-11 { height: calc(var(--spacing) * 11); }
.h-12 { height: calc(var(--spacing) * 12); }
.h-14 { height: calc(var(--spacing) * 14); }
.h-16 { height: calc(var(--spacing) * 16); }
.h-20 { height: calc(var(--spacing) * 20); }
.h-24 { height: calc(var(--spacing) * 24); }
.h-28 { height: calc(var(--spacing) * 28); }
.h-32 { height: calc(var(--spacing) * 32); }
.h-36 { height: calc(var(--spacing) * 36); }
.h-48 { height: calc(var(--spacing) * 48); }
.h-56 { height: calc(var(--spacing) * 56); }
.h-60 { height: calc(var(--spacing) * 60); }
.h-\[1px\] { height: 1px; }
.h-\[38px\] { height: 38px; }
.h-\[85vh\] { height: 85vh; }
.h-\[90\%\] { height: 90%; }
.h-auto { height: auto; }
.h-full { height: 100%; }
.h-px { height: 1px; }
.h-screen { height: 100vh; }
.max-h-24 { max-height: calc(var(--spacing) * 24); }
.max-h-40 { max-height: calc(var(--spacing) * 40); }
.max-h-48 { max-height: calc(var(--spacing) * 48); }
.max-h-53 { max-height: calc(var(--spacing) * 53); }
.max-h-56 { max-height: calc(var(--spacing) * 56); }
.max-h-\[8em\] { max-height: 8em; }
.max-h-\[78vh\] { max-height: 78vh; }
.max-h-\[85vh\] { max-height: 85vh; }
.max-h-\[90vh\] { max-height: 90vh; }
.max-h-full { max-height: 100%; }
.min-h-0 { min-height: 0px; }
.min-h-\[1\.75em\] { min-height: 1.75em; }
.min-h-\[192px\] { min-height: 192px; }
.min-h-\[280px\] { min-height: 280px; }
.min-h-\[300px\] { min-height: 300px; }
.min-h-\[max\(960px\,100vh\)\] { min-height: max(960px, 100vh); }
.min-h-full { min-height: 100%; }
.min-h-screen { min-height: 100vh; }
.w-1 { width: var(--spacing); }
.w-1\.5 { width: calc(var(--spacing) * 1.5); }
.w-2 { width: calc(var(--spacing) * 2); }
.w-3 { width: calc(var(--spacing) * 3); }
.w-3\.5 { width: calc(var(--spacing) * 3.5); }
.w-4 { width: calc(var(--spacing) * 4); }
.w-5 { width: calc(var(--spacing) * 5); }
.w-6 { width: calc(var(--spacing) * 6); }
.w-7 { width: calc(var(--spacing) * 7); }
.w-8 { width: calc(var(--spacing) * 8); }
.w-9 { width: calc(var(--spacing) * 9); }
.w-10 { width: calc(var(--spacing) * 10); }
.w-11 { width: calc(var(--spacing) * 11); }
.w-12 { width: calc(var(--spacing) * 12); }
.w-14 { width: calc(var(--spacing) * 14); }
.w-16 { width: calc(var(--spacing) * 16); }
.w-20 { width: calc(var(--spacing) * 20); }
.w-24 { width: calc(var(--spacing) * 24); }
.w-28 { width: calc(var(--spacing) * 28); }
.w-32 { width: calc(var(--spacing) * 32); }
.w-36 { width: calc(var(--spacing) * 36); }
.w-40 { width: calc(var(--spacing) * 40); }
.w-48 { width: calc(var(--spacing) * 48); }
.w-60 { width: calc(var(--spacing) * 60); }
.w-64 { width: calc(var(--spacing) * 64); }
.w-\[70\%\] { width: 70%; }
.w-\[90\%\] { width: 90%; }
.w-\[92vw\] { width: 92vw; }
.w-\[95vw\] { width: 95vw; }
.w-auto { width: auto; }
.w-fit { width: fit-content; }
.w-full { width: 100%; }
.w-px { width: 1px; }
.max-w-2xl { max-width: var(--container-2xl); }
.max-w-4xl { max-width: var(--container-4xl); }
.max-w-5xl { max-width: var(--container-5xl); }
.max-w-7xl { max-width: var(--container-7xl); }
.max-w-53 { max-width: calc(var(--spacing) * 53); }
.max-w-\[10em\] { max-width: 10em; }
.max-w-\[66\.666\%\] { max-width: 66.666%; }
.max-w-\[85\%\] { max-width: 85%; }
.max-w-\[92vw\] { max-width: 92vw; }
.max-w-\[120px\] { max-width: 120px; }
.max-w-\[160px\] { max-width: 160px; }
.max-w-\[420px\] { max-width: 420px; }
.max-w-\[480px\] { max-width: 480px; }
.max-w-\[1000px\] { max-width: 1000px; }
.max-w-\[calc\(100\%-24px\)\] { max-width: calc(100% - 24px); }
.max-w-full { max-width: 100%; }
.max-w-lg { max-width: var(--container-lg); }
.max-w-md { max-width: var(--container-md); }
.max-w-xl { max-width: var(--container-xl); }
.min-w-0 { min-width: 0px; }
.min-w-\[80px\] { min-width: 80px; }
.min-w-full { min-width: 100%; }
.flex-1 { flex: 1 1 0%; }
.flex-none { flex: 0 0 auto; }
.flex-shrink { flex-shrink: 1; }
.flex-shrink-0 { flex-shrink: 0; }
.shrink-0 { flex-shrink: 0; }
.grow { flex-grow: 1; }
.border-collapse { border-collapse: collapse; }
.-translate-x-1\/2 { --tw-translate-x: calc(calc(1 / 2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); }
.-translate-y-1\/2 { --tw-translate-y: calc(calc(1 / 2 * 100%) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); }
.-translate-y-2 { --tw-translate-y: calc(var(--spacing) * -2); translate: var(--tw-translate-x) var(--tw-translate-y); }
.-translate-y-5 { --tw-translate-y: calc(var(--spacing) * -5); translate: var(--tw-translate-x) var(--tw-translate-y); }
.translate-y-0 { --tw-translate-y: 0px; translate: var(--tw-translate-x) var(--tw-translate-y); }
.rotate-180 { rotate: 180deg; }
.transform { transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); }
.animate-spin { animation: var(--animate-spin); }
.cursor-grab { cursor: grab; }
.cursor-grabbing { cursor: grabbing; }
.cursor-not-allowed { cursor: not-allowed; }
.cursor-nwse-resize { cursor: nwse-resize; }
.cursor-pointer { cursor: pointer; }
.cursor-zoom-in { cursor: zoom-in; }
.touch-none { touch-action: none; }
.resize { resize: both; }
.resize-none { resize: none; }
.resize-y { resize: vertical; }
.scroll-mt-20 { scroll-margin-top: calc(var(--spacing) * 20); }
.list-inside { list-style-position: inside; }
.list-disc { list-style-type: disc; }
.columns-1 { columns: 1; }
.columns-2 { columns: 2; }
.columns-3 { columns: 3; }
.break-inside-avoid { break-inside: avoid; }
.break-inside-avoid-column { break-inside: avoid-column; }
.grid-cols-1 { grid-template-columns: repeat(1, minmax(0px, 1fr)); }
.grid-cols-2 { grid-template-columns: repeat(2, minmax(0px, 1fr)); }
.grid-cols-3 { grid-template-columns: repeat(3, minmax(0px, 1fr)); }
.grid-rows-2 { grid-template-rows: repeat(2, minmax(0px, 1fr)); }
.flex-col { flex-direction: column; }
.flex-wrap { flex-wrap: wrap; }
.items-baseline { align-items: baseline; }
.items-center { align-items: center; }
.items-end { align-items: flex-end; }
.items-start { align-items: flex-start; }
.items-stretch { align-items: stretch; }
.justify-between { justify-content: space-between; }
.justify-center { justify-content: center; }
.justify-end { justify-content: flex-end; }
.gap-0\.5 { gap: calc(var(--spacing) * 0.5); }
.gap-1 { gap: var(--spacing); }
.gap-1\.5 { gap: calc(var(--spacing) * 1.5); }
.gap-2 { gap: calc(var(--spacing) * 2); }
.gap-2\.5 { gap: calc(var(--spacing) * 2.5); }
.gap-3 { gap: calc(var(--spacing) * 3); }
.gap-4 { gap: calc(var(--spacing) * 4); }
.gap-6 { gap: calc(var(--spacing) * 6); }
.gap-8 { gap: calc(var(--spacing) * 8); }
.gap-12 { gap: calc(var(--spacing) * 12); }
:where(.space-y-1 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(var(--spacing) * var(--tw-space-y-reverse)); margin-block-end: calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse))); }
:where(.space-y-1\.5 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse))); }
:where(.space-y-2 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); }
:where(.space-y-3 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse))); }
:where(.space-y-4 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse))); }
:where(.space-y-5 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse))); }
:where(.space-y-6 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); }
:where(.space-y-8 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse))); }
:where(.space-y-10 > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse))); }
.gap-x-12 { column-gap: calc(var(--spacing) * 12); }
:where(.space-x-1\.5 > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 1.5) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-x-reverse))); }
:where(.space-x-3 > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse))); }
:where(.space-x-4 > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse))); }
.gap-y-8 { row-gap: calc(var(--spacing) * 8); }
:where(.divide-y > :not(:last-child)) { --tw-divide-y-reverse: 0; border-bottom-style: var(--tw-border-style); border-top-style: var(--tw-border-style); border-top-width: calc(1px * var(--tw-divide-y-reverse)); border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); }
:where(.divide-gray-50 > :not(:last-child)) { border-color: var(--color-gray-50); }
:where(.divide-gray-200 > :not(:last-child)) { border-color: var(--color-gray-200); }
.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.overflow-hidden { overflow: hidden; }
.overflow-x-auto { overflow-x: auto; }
.overflow-x-hidden { overflow-x: hidden; }
.overflow-y-auto { overflow-y: auto; }
.rounded { border-radius: 0.25rem; }
.rounded-2xl { border-radius: var(--radius-2xl); }
.rounded-3xl { border-radius: var(--radius-3xl); }
.rounded-\[32px\] { border-radius: 32px; }
.rounded-full { border-radius: calc(infinity * 1px); }
.rounded-lg { border-radius: var(--radius-lg); }
.rounded-md { border-radius: var(--radius-md); }
.rounded-sm { border-radius: var(--radius-sm); }
.rounded-xl { border-radius: var(--radius-xl); }
.rounded-l-lg { border-top-left-radius: var(--radius-lg); border-bottom-left-radius: var(--radius-lg); }
.rounded-r-lg { border-top-right-radius: var(--radius-lg); border-bottom-right-radius: var(--radius-lg); }
.border { border-style: var(--tw-border-style); border-width: 1px; }
.border-2 { border-style: var(--tw-border-style); border-width: 2px; }
.border-4 { border-style: var(--tw-border-style); border-width: 4px; }
.border-\[3px\] { border-style: var(--tw-border-style); border-width: 3px; }
.border-\[4px\] { border-style: var(--tw-border-style); border-width: 4px; }
.border-t { border-top-style: var(--tw-border-style); border-top-width: 1px; }
.border-r { border-right-style: var(--tw-border-style); border-right-width: 1px; }
.border-b { border-bottom-style: var(--tw-border-style); border-bottom-width: 1px; }
.border-b-2 { border-bottom-style: var(--tw-border-style); border-bottom-width: 2px; }
.border-l-4 { border-left-style: var(--tw-border-style); border-left-width: 4px; }
.border-dashed { --tw-border-style: dashed; border-style: dashed; }
.border-\[\#FF8C00\] { border-color: rgb(255, 140, 0); }
.border-\[\#eeeeee\] { border-color: rgb(238, 238, 238); }
.border-amber-200 { border-color: var(--color-amber-200); }
.border-amber-300 { border-color: var(--color-amber-300); }
.border-amber-400 { border-color: var(--color-amber-400); }
.border-black { border-color: var(--color-black); }
.border-blue-500 { border-color: var(--color-blue-500); }
.border-gray-100 { border-color: var(--color-gray-100); }
.border-gray-200 { border-color: var(--color-gray-200); }
.border-gray-300 { border-color: var(--color-gray-300); }
.border-gray-900 { border-color: var(--color-gray-900); }
.border-green-100 { border-color: var(--color-green-100); }
.border-green-500 { border-color: var(--color-green-500); }
.border-neutral-100 { border-color: var(--color-neutral-100); }
.border-neutral-200 { border-color: var(--color-neutral-200); }
.border-neutral-200\/70 {
border-color: color-mix(in srgb, oklch(0.922 0 none) 70%, transparent 30%);
@supports (color: color-mix(in lab, red, red)) {
border-color: color-mix(in oklab, var(--color-neutral-200) 70%, transparent);
}
}
.border-neutral-800 { border-color: var(--color-neutral-800); }
.border-orange-100\/50 {
border-color: color-mix(in srgb, oklch(0.954 0.038 75.164), transparent);
@supports (color: color-mix(in lab, red, red)) {
border-color: color-mix(in oklab, var(--color-orange-100) 50%, transparent);
}
}
.border-purple-500 { border-color: var(--color-purple-500); }
.border-red-100 { border-color: var(--color-red-100); }
.border-red-200 { border-color: var(--color-red-200); }
.border-red-500 { border-color: var(--color-red-500); }
.border-slate-200 { border-color: var(--color-slate-200); }
.border-transparent { border-color: transparent; }
.border-white { border-color: var(--color-white); }
.border-white\/30 {
border-color: color-mix(in srgb, rgb(255, 255, 255) 30%, transparent 70%);
@supports (color: color-mix(in lab, red, red)) {
border-color: color-mix(in oklab, var(--color-white) 30%, transparent);
}
}
.border-t-gray-900 { border-top-color: var(--color-gray-900); }
.border-t-transparent { border-top-color: transparent; }
.bg-\[\#22C55E\] { background-color: rgb(34, 197, 94); }
.bg-\[\#F5F5F5\] { background-color: rgb(245, 245, 245); }
.bg-\[\#b3341f\] { background-color: rgb(179, 52, 31); }
.bg-\[\#f0f5ff\] { background-color: rgb(240, 245, 255); }
.bg-\[\#f5f5f5\] { background-color: rgb(245, 245, 245); }
.bg-\[\#f5f5f7\] { background-color: rgb(245, 245, 247); }
.bg-\[\#f6e8d3\] { background-color: rgb(246, 232, 211); }
.bg-\[\#f9f9f9\] { background-color: rgb(249, 249, 249); }
.bg-\[\#f9fafb\] { background-color: rgb(249, 250, 251); }
.bg-amber-50 { background-color: var(--color-amber-50); }
.bg-amber-50\/60 {
background-color: color-mix(in srgb, oklch(0.987 0.022 95.277) 60%, transparent 40%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-amber-50) 60%, transparent);
}
}
.bg-amber-100 { background-color: var(--color-amber-100); }
.bg-amber-500 { background-color: var(--color-amber-500); }
.bg-black { background-color: var(--color-black); }
.bg-black\/10 {
background-color: color-mix(in srgb, rgb(0, 0, 0) 10%, transparent 90%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-black) 10%, transparent);
}
}
.bg-black\/30 {
background-color: color-mix(in srgb, rgb(0, 0, 0) 30%, transparent 70%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-black) 30%, transparent);
}
}
.bg-black\/40 {
background-color: color-mix(in srgb, rgb(0, 0, 0) 40%, transparent 60%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-black) 40%, transparent);
}
}
.bg-black\/50 {
background-color: color-mix(in srgb, rgb(0, 0, 0), transparent);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-black) 50%, transparent);
}
}
.bg-black\/55 {
background-color: color-mix(in srgb, rgb(0, 0, 0) 55%, transparent 45%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-black) 55%, transparent);
}
}
.bg-black\/60 {
background-color: color-mix(in srgb, rgb(0, 0, 0) 60%, transparent 40%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-black) 60%, transparent);
}
}
.bg-black\/90 {
background-color: color-mix(in srgb, rgb(0, 0, 0) 90%, transparent 10%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-black) 90%, transparent);
}
}
.bg-blue-50 { background-color: var(--color-blue-50); }
.bg-blue-100 { background-color: var(--color-blue-100); }
.bg-gray-50 { background-color: var(--color-gray-50); }
.bg-gray-50\/50 {
background-color: color-mix(in srgb, oklch(0.985 0.002 247.839), transparent);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-gray-50) 50%, transparent);
}
}
.bg-gray-100 { background-color: var(--color-gray-100); }
.bg-gray-200 { background-color: var(--color-gray-200); }
.bg-gray-300 { background-color: var(--color-gray-300); }
.bg-gray-300\/60 {
background-color: color-mix(in srgb, oklch(0.872 0.01 258.338) 60%, transparent 40%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-gray-300) 60%, transparent);
}
}
.bg-gray-400 { background-color: var(--color-gray-400); }
.bg-gray-500 { background-color: var(--color-gray-500); }
.bg-gray-900 { background-color: var(--color-gray-900); }
.bg-gray-900\/40 {
background-color: color-mix(in srgb, oklch(0.21 0.034 264.665) 40%, transparent 60%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-gray-900) 40%, transparent);
}
}
.bg-gray-900\/60 {
background-color: color-mix(in srgb, oklch(0.21 0.034 264.665) 60%, transparent 40%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-gray-900) 60%, transparent);
}
}
.bg-gray-900\/85 {
background-color: color-mix(in srgb, oklch(0.21 0.034 264.665) 85%, transparent 15%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-gray-900) 85%, transparent);
}
}
.bg-green-50 { background-color: var(--color-green-50); }
.bg-green-100 { background-color: var(--color-green-100); }
.bg-indigo-100 { background-color: var(--color-indigo-100); }
.bg-neutral-50 { background-color: var(--color-neutral-50); }
.bg-neutral-100 { background-color: var(--color-neutral-100); }
.bg-neutral-200 { background-color: var(--color-neutral-200); }
.bg-neutral-800\/80 {
background-color: color-mix(in srgb, oklch(0.269 0 none) 80%, transparent 20%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-neutral-800) 80%, transparent);
}
}
.bg-neutral-900 { background-color: var(--color-neutral-900); }
.bg-neutral-950 { background-color: var(--color-neutral-950); }
.bg-orange-50 { background-color: var(--color-orange-50); }
.bg-orange-50\/80 {
background-color: color-mix(in srgb, oklch(0.98 0.016 73.684) 80%, transparent 20%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-orange-50) 80%, transparent);
}
}
.bg-pink-100 { background-color: var(--color-pink-100); }
.bg-purple-100 { background-color: var(--color-purple-100); }
.bg-red-50 { background-color: var(--color-red-50); }
.bg-red-50\/80 {
background-color: color-mix(in srgb, oklch(0.971 0.013 17.38) 80%, transparent 20%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-red-50) 80%, transparent);
}
}
.bg-red-100 { background-color: var(--color-red-100); }
.bg-red-500 { background-color: var(--color-red-500); }
.bg-transparent { background-color: transparent; }
.bg-white { background-color: var(--color-white); }
.bg-white\/5 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 5%, transparent 95%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 5%, transparent);
}
}
.bg-white\/10 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 10%, transparent 90%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 10%, transparent);
}
}
.bg-white\/15 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 15%, transparent 85%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 15%, transparent);
}
}
.bg-white\/20 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 20%, transparent 80%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 20%, transparent);
}
}
.bg-white\/25 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 25%, transparent 75%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 25%, transparent);
}
}
.bg-white\/30 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 30%, transparent 70%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 30%, transparent);
}
}
.bg-white\/40 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 40%, transparent 60%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 40%, transparent);
}
}
.bg-white\/50 {
background-color: color-mix(in srgb, rgb(255, 255, 255), transparent);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 50%, transparent);
}
}
.bg-white\/60 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 60%, transparent 40%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 60%, transparent);
}
}
.bg-white\/70 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 70%, transparent 30%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 70%, transparent);
}
}
.bg-white\/80 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 80%, transparent 20%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 80%, transparent);
}
}
.bg-white\/85 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 85%, transparent 15%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 85%, transparent);
}
}
.bg-white\/90 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 90%, transparent 10%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 90%, transparent);
}
}
.bg-white\/95 {
background-color: color-mix(in srgb, rgb(255, 255, 255) 95%, transparent 5%);
@supports (color: color-mix(in lab, red, red)) {
background-color: color-mix(in oklab, var(--color-white) 95%, transparent);
}
}
.bg-yellow-100 { background-color: var(--color-yellow-100); }
.bg-linear-to-b {
--tw-gradient-position: to bottom;
@supports (background-image: linear-gradient(in lab, red, red)) {
--tw-gradient-position: to bottom in oklab;
}
background-image: linear-gradient(var(--tw-gradient-stops));
}
.bg-linear-to-br {
--tw-gradient-position: to bottom right;
@supports (background-image: linear-gradient(in lab, red, red)) {
--tw-gradient-position: to bottom right in oklab;
}
background-image: linear-gradient(var(--tw-gradient-stops));
}
.bg-linear-to-t {
--tw-gradient-position: to top;
@supports (background-image: linear-gradient(in lab, red, red)) {
--tw-gradient-position: to top in oklab;
}
background-image: linear-gradient(var(--tw-gradient-stops));
}
.bg-gradient-to-r { --tw-gradient-position: to right in oklab; background-image: linear-gradient(var(--tw-gradient-stops)); }
.from-\[\#FF8C00\] { --tw-gradient-from: #FF8C00; --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.from-black\/40 {
--tw-gradient-from: color-mix(in srgb, #000 40%, transparent);
@supports (color: color-mix(in lab, red, red)) {
--tw-gradient-from: color-mix(in oklab, var(--color-black) 40%, transparent);
}
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
}
.from-black\/70 {
--tw-gradient-from: color-mix(in srgb, #000 70%, transparent);
@supports (color: color-mix(in lab, red, red)) {
--tw-gradient-from: color-mix(in oklab, var(--color-black) 70%, transparent);
}
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
}
.from-blue-500 { --tw-gradient-from: var(--color-blue-500); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.from-emerald-200 { --tw-gradient-from: var(--color-emerald-200); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.from-indigo-900 { --tw-gradient-from: var(--color-indigo-900); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.from-purple-500 { --tw-gradient-from: var(--color-purple-500); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.from-sky-200 { --tw-gradient-from: var(--color-sky-200); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.via-amber-200 { --tw-gradient-via: var(--color-amber-200); --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-via-stops); }
.via-green-500 { --tw-gradient-via: var(--color-green-500); --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-via-stops); }
.via-purple-700 { --tw-gradient-via: var(--color-purple-700); --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-via-stops); }
.via-transparent { --tw-gradient-via: transparent; --tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-via-stops); }
.to-\[\#FFD700\] { --tw-gradient-to: #FFD700; --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.to-blue-500 { --tw-gradient-to: var(--color-blue-500); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.to-emerald-800 { --tw-gradient-to: var(--color-emerald-800); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.to-indigo-600 { --tw-gradient-to: var(--color-indigo-600); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.to-orange-400 { --tw-gradient-to: var(--color-orange-400); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.to-transparent { --tw-gradient-to: transparent; --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); }
.fill-current { fill: currentcolor; }
.object-contain { object-fit: contain; }
.object-cover { object-fit: cover; }
.p-0 { padding: 0px; }
.p-1 { padding: var(--spacing); }
.p-1\.5 { padding: calc(var(--spacing) * 1.5); }
.p-2 { padding: calc(var(--spacing) * 2); }
.p-3 { padding: calc(var(--spacing) * 3); }
.p-4 { padding: calc(var(--spacing) * 4); }
.p-6 { padding: calc(var(--spacing) * 6); }
.p-8 { padding: calc(var(--spacing) * 8); }
.p-10 { padding: calc(var(--spacing) * 10); }
.p-12 { padding: calc(var(--spacing) * 12); }
.px-0 { padding-inline: 0px; }
.px-1 { padding-inline: var(--spacing); }
.px-1\.5 { padding-inline: calc(var(--spacing) * 1.5); }
.px-2 { padding-inline: calc(var(--spacing) * 2); }
.px-2\.5 { padding-inline: calc(var(--spacing) * 2.5); }
.px-3 { padding-inline: calc(var(--spacing) * 3); }
.px-4 { padding-inline: calc(var(--spacing) * 4); }
.px-5 { padding-inline: calc(var(--spacing) * 5); }
.px-6 { padding-inline: calc(var(--spacing) * 6); }
.px-7 { padding-inline: calc(var(--spacing) * 7); }
.px-8 { padding-inline: calc(var(--spacing) * 8); }
.px-\[10\%\] { padding-inline: 10%; }
.py-0\.5 { padding-block: calc(var(--spacing) * 0.5); }
.py-1 { padding-block: var(--spacing); }
.py-1\.5 { padding-block: calc(var(--spacing) * 1.5); }
.py-2 { padding-block: calc(var(--spacing) * 2); }
.py-2\.5 { padding-block: calc(var(--spacing) * 2.5); }
.py-3 { padding-block: calc(var(--spacing) * 3); }
.py-3\.5 { padding-block: calc(var(--spacing) * 3.5); }
.py-4 { padding-block: calc(var(--spacing) * 4); }
.py-5 { padding-block: calc(var(--spacing) * 5); }
.py-6 { padding-block: calc(var(--spacing) * 6); }
.py-8 { padding-block: calc(var(--spacing) * 8); }
.py-10 { padding-block: calc(var(--spacing) * 10); }
.py-12 { padding-block: calc(var(--spacing) * 12); }
.py-16 { padding-block: calc(var(--spacing) * 16); }
.py-20 { padding-block: calc(var(--spacing) * 20); }
.py-24 { padding-block: calc(var(--spacing) * 24); }
.pt-0\.5 { padding-top: calc(var(--spacing) * 0.5); }
.pt-1 { padding-top: var(--spacing); }
.pt-2 { padding-top: calc(var(--spacing) * 2); }
.pt-3 { padding-top: calc(var(--spacing) * 3); }
.pt-4 { padding-top: calc(var(--spacing) * 4); }
.pt-6 { padding-top: calc(var(--spacing) * 6); }
.pt-8 { padding-top: calc(var(--spacing) * 8); }
.pt-14 { padding-top: calc(var(--spacing) * 14); }
.pt-32 { padding-top: calc(var(--spacing) * 32); }
.pt-40 { padding-top: calc(var(--spacing) * 40); }
.pr-1\.5 { padding-right: calc(var(--spacing) * 1.5); }
.pr-3 { padding-right: calc(var(--spacing) * 3); }
.pr-4 { padding-right: calc(var(--spacing) * 4); }
.pr-32 { padding-right: calc(var(--spacing) * 32); }
.pb-0 { padding-bottom: 0px; }
.pb-1 { padding-bottom: var(--spacing); }
.pb-2 { padding-bottom: calc(var(--spacing) * 2); }
.pb-3 { padding-bottom: calc(var(--spacing) * 3); }
.pb-4 { padding-bottom: calc(var(--spacing) * 4); }
.pb-8 { padding-bottom: calc(var(--spacing) * 8); }
.pb-16 { padding-bottom: calc(var(--spacing) * 16); }
.pl-1\.5 { padding-left: calc(var(--spacing) * 1.5); }
.pl-4 { padding-left: calc(var(--spacing) * 4); }
.pl-16 { padding-left: calc(var(--spacing) * 16); }
.text-center { text-align: center; }
.text-left { text-align: left; }
.text-right { text-align: right; }
.font-display { font-family: var(--font-display); }
.font-mono { font-family: var(--font-mono); }
.text-2xl { font-size: var(--text-2xl); line-height: var(--tw-leading, var(--text-2xl--line-height)); }
.text-3xl { font-size: var(--text-3xl); line-height: var(--tw-leading, var(--text-3xl--line-height)); }
.text-4xl { font-size: var(--text-4xl); line-height: var(--tw-leading, var(--text-4xl--line-height)); }
.text-5xl { font-size: var(--text-5xl); line-height: var(--tw-leading, var(--text-5xl--line-height)); }
.text-6xl { font-size: var(--text-6xl); line-height: var(--tw-leading, var(--text-6xl--line-height)); }
.text-9xl { font-size: var(--text-9xl); line-height: var(--tw-leading, var(--text-9xl--line-height)); }
.text-base { font-size: var(--text-base); line-height: var(--tw-leading, var(--text-base--line-height)); }
.text-lg { font-size: var(--text-lg); line-height: var(--tw-leading, var(--text-lg--line-height)); }
.text-sm { font-size: var(--text-sm); line-height: var(--tw-leading, var(--text-sm--line-height)); }
.text-xl { font-size: var(--text-xl); line-height: var(--tw-leading, var(--text-xl--line-height)); }
.text-xs { font-size: var(--text-xs); line-height: var(--tw-leading, var(--text-xs--line-height)); }
.text-\[8px\] { font-size: 8px; }
.text-\[9px\] { font-size: 9px; }
.text-\[10px\] { font-size: 10px; }
.text-\[11px\] { font-size: 11px; }
.text-\[12px\] { font-size: 12px; }
.text-\[13px\] { font-size: 13px; }
.text-\[14px\] { font-size: 14px; }
.text-\[15px\] { font-size: 15px; }
.text-\[16px\] { font-size: 16px; }
.text-\[17px\] { font-size: 17px; }
.text-\[18px\] { font-size: 18px; }
.text-\[20px\] { font-size: 20px; }
.text-\[22px\] { font-size: 22px; }
.leading-4 { --tw-leading: calc(var(--spacing) * 4); line-height: calc(var(--spacing) * 4); }
.leading-5 { --tw-leading: calc(var(--spacing) * 5); line-height: calc(var(--spacing) * 5); }
.leading-\[1\.6\] { --tw-leading: 1.6; line-height: 1.6; }
.leading-none { --tw-leading: 1; line-height: 1; }
.leading-relaxed { --tw-leading: var(--leading-relaxed); line-height: var(--leading-relaxed); }
.leading-snug { --tw-leading: var(--leading-snug); line-height: var(--leading-snug); }
.font-black { --tw-font-weight: var(--font-weight-black); font-weight: var(--font-weight-black); }
.font-bold { --tw-font-weight: var(--font-weight-bold); font-weight: var(--font-weight-bold); }
.font-medium { --tw-font-weight: var(--font-weight-medium); font-weight: var(--font-weight-medium); }
.font-normal { --tw-font-weight: var(--font-weight-normal); font-weight: var(--font-weight-normal); }
.font-semibold { --tw-font-weight: var(--font-weight-semibold); font-weight: var(--font-weight-semibold); }
.tracking-\[0\.3em\] { --tw-tracking: 0.3em; letter-spacing: 0.3em; }
.tracking-tight { --tw-tracking: var(--tracking-tight); letter-spacing: var(--tracking-tight); }
.tracking-wide { --tw-tracking: var(--tracking-wide); letter-spacing: var(--tracking-wide); }
.tracking-wider { --tw-tracking: var(--tracking-wider); letter-spacing: var(--tracking-wider); }
.tracking-widest { --tw-tracking: var(--tracking-widest); letter-spacing: var(--tracking-widest); }
.break-words { overflow-wrap: break-word; }
.break-all { word-break: break-all; }
.whitespace-nowrap { white-space: nowrap; }
.whitespace-pre-wrap { white-space: pre-wrap; }
.text-\[\#1b1b1b\] { color: rgb(27, 27, 27); }
.text-\[\#22C55E\] { color: rgb(34, 197, 94); }
.text-\[\#333333\] { color: rgb(51, 51, 51); }
.text-\[\#f9f9f9\] { color: rgb(249, 249, 249); }
.text-amber-600 { color: var(--color-amber-600); }
.text-amber-700 { color: var(--color-amber-700); }
.text-amber-800 { color: var(--color-amber-800); }
.text-black { color: var(--color-black); }
.text-blue-500 { color: var(--color-blue-500); }
.text-blue-600 { color: var(--color-blue-600); }
.text-blue-700 { color: var(--color-blue-700); }
.text-emerald-500 { color: var(--color-emerald-500); }
.text-emerald-600 { color: var(--color-emerald-600); }
.text-gray-300 { color: var(--color-gray-300); }
.text-gray-400 { color: var(--color-gray-400); }
.text-gray-500 { color: var(--color-gray-500); }
.text-gray-600 { color: var(--color-gray-600); }
.text-gray-700 { color: var(--color-gray-700); }
.text-gray-800 { color: var(--color-gray-800); }
.text-gray-900 { color: var(--color-gray-900); }
.text-green-500 { color: var(--color-green-500); }
.text-green-600 { color: var(--color-green-600); }
.text-green-700 { color: var(--color-green-700); }
.text-green-800 { color: var(--color-green-800); }
.text-indigo-600 { color: var(--color-indigo-600); }
.text-neutral-300 { color: var(--color-neutral-300); }
.text-neutral-400 { color: var(--color-neutral-400); }
.text-neutral-500 { color: var(--color-neutral-500); }
.text-neutral-600 { color: var(--color-neutral-600); }
.text-neutral-700 { color: var(--color-neutral-700); }
.text-neutral-900 { color: var(--color-neutral-900); }
.text-orange-500 { color: var(--color-orange-500); }
.text-orange-600 { color: var(--color-orange-600); }
.text-orange-700 { color: var(--color-orange-700); }
.text-pink-600 { color: var(--color-pink-600); }
.text-purple-600 { color: var(--color-purple-600); }
.text-red-400 { color: var(--color-red-400); }
.text-red-500 { color: var(--color-red-500); }
.text-red-500\/90 {
color: color-mix(in srgb, oklch(0.637 0.237 25.331) 90%, transparent 10%);
@supports (color: color-mix(in lab, red, red)) {
color: color-mix(in oklab, var(--color-red-500) 90%, transparent);
}
}
.text-red-600 { color: var(--color-red-600); }
.text-red-700 { color: var(--color-red-700); }
.text-slate-300 { color: var(--color-slate-300); }
.text-slate-400 { color: var(--color-slate-400); }
.text-slate-500 { color: var(--color-slate-500); }
.text-slate-600 { color: var(--color-slate-600); }
.text-slate-900 { color: var(--color-slate-900); }
.text-white { color: var(--color-white); }
.text-white\/60 {
color: color-mix(in srgb, rgb(255, 255, 255) 60%, transparent 40%);
@supports (color: color-mix(in lab, red, red)) {
color: color-mix(in oklab, var(--color-white) 60%, transparent);
}
}
.text-white\/80 {
color: color-mix(in srgb, rgb(255, 255, 255) 80%, transparent 20%);
@supports (color: color-mix(in lab, red, red)) {
color: color-mix(in oklab, var(--color-white) 80%, transparent);
}
}
.text-white\/90 {
color: color-mix(in srgb, rgb(255, 255, 255) 90%, transparent 10%);
@supports (color: color-mix(in lab, red, red)) {
color: color-mix(in oklab, var(--color-white) 90%, transparent);
}
}
.text-yellow-400 { color: var(--color-yellow-400); }
.text-yellow-600 { color: var(--color-yellow-600); }
.capitalize { text-transform: capitalize; }
.uppercase { text-transform: uppercase; }
.ordinal { --tw-ordinal: ordinal; font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,); }
.line-through { text-decoration-line: line-through; }
.underline { text-decoration-line: underline; }
.underline-offset-2 { text-underline-offset: 2px; }
.antialiased { -webkit-font-smoothing: antialiased; }
.placeholder-gray-400::placeholder { color: var(--color-gray-400); }
.accent-amber-500 { accent-color: var(--color-amber-500); }
.accent-gray-900 { accent-color: var(--color-gray-900); }
.opacity-0 { opacity: 0; }
.opacity-10 { opacity: 0.1; }
.opacity-50 { opacity: 0.5; }
.opacity-60 { opacity: 0.6; }
.opacity-100 { opacity: 1; }
.shadow { --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-2xl { --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-\[0_0_0_1\.5px_rgba\(0\,0\,0\,0\.35\)\] { --tw-shadow: 0 0 0 1.5px var(--tw-shadow-color, rgba(0,0,0,0.35)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-\[0_0_20px_rgba\(0\,0\,0\,0\.2\)\] { --tw-shadow: 0 0 20px var(--tw-shadow-color, rgba(0,0,0,0.2)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-\[0_0_20px_rgba\(0\,0\,0\,0\.05\)\] { --tw-shadow: 0 0 20px var(--tw-shadow-color, rgba(0,0,0,0.05)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-\[0_4px_20px_-2px_rgba\(0\,0\,0\,0\.05\)\,0_2px_10px_-4px_rgba\(0\,0\,0\,0\.03\)\] { --tw-shadow: 0 4px 20px -2px var(--tw-shadow-color, rgba(0,0,0,0.05)), 0 2px 10px -4px var(--tw-shadow-color, rgba(0,0,0,0.03)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-\[0_8px_30px_rgb\(0\,0\,0\,0\.04\)\] { --tw-shadow: 0 8px 30px var(--tw-shadow-color, rgb(0,0,0,0.04)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-lg { --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-md { --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-sm { --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-xl { --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.ring-1 { --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.ring-2 { --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.ring-4 { --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.shadow-black\/5 {
--tw-shadow-color: color-mix(in srgb, #000 5%, transparent);
@supports (color: color-mix(in lab, red, red)) {
--tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-black) 5%, transparent) var(--tw-shadow-alpha), transparent);
}
}
.shadow-black\/20 {
--tw-shadow-color: color-mix(in srgb, #000 20%, transparent);
@supports (color: color-mix(in lab, red, red)) {
--tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent);
}
}
.shadow-gray-500\/10 {
--tw-shadow-color: color-mix(in srgb, oklch(55.1% 0.027 264.364) 10%, transparent);
@supports (color: color-mix(in lab, red, red)) {
--tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-gray-500) 10%, transparent) var(--tw-shadow-alpha), transparent);
}
}
.ring-gray-100 { --tw-ring-color: var(--color-gray-100); }
.ring-transparent { --tw-ring-color: transparent; }
.ring-white { --tw-ring-color: var(--color-white); }
.ring-white\/40 {
--tw-ring-color: color-mix(in srgb, #fff 40%, transparent);
@supports (color: color-mix(in lab, red, red)) {
--tw-ring-color: color-mix(in oklab, var(--color-white) 40%, transparent);
}
}
.blur-3xl { --tw-blur: blur(var(--blur-3xl)); filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); }
.drop-shadow-\[0_1px_2px_rgba\(255\,255\,255\,0\.5\)\] { --tw-drop-shadow-size: drop-shadow(0 1px 2px var(--tw-drop-shadow-color, rgba(255,255,255,0.5))); --tw-drop-shadow: var(--tw-drop-shadow-size); filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); }
.drop-shadow-\[0_2px_4px_rgba\(0\,0\,0\,0\.3\)\] { --tw-drop-shadow-size: drop-shadow(0 2px 4px var(--tw-drop-shadow-color, rgba(0,0,0,0.3))); --tw-drop-shadow: var(--tw-drop-shadow-size); filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); }
.grayscale { --tw-grayscale: grayscale(100%); filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); }
.backdrop-blur-\[2px\] { --tw-backdrop-blur: blur(2px); backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); }
.backdrop-blur-\[4px\] { --tw-backdrop-blur: blur(4px); backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); }
.backdrop-blur-md { --tw-backdrop-blur: blur(var(--blur-md)); backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); }
.backdrop-blur-sm { --tw-backdrop-blur: blur(var(--blur-sm)); backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,); }
.transition { transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); }
.transition-\[width\] { transition-property: width; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); }
.transition-all { transition-property: all; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); }
.transition-colors { transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); }
.transition-opacity { transition-property: opacity; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); }
.transition-shadow { transition-property: box-shadow; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); }
.transition-transform { transition-property: transform, translate, scale, rotate; transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); transition-duration: var(--tw-duration, var(--default-transition-duration)); }
.duration-150 { --tw-duration: 150ms; transition-duration: 150ms; }
.duration-200 { --tw-duration: 200ms; transition-duration: 200ms; }
.duration-300 { --tw-duration: 300ms; transition-duration: 300ms; }
.duration-500 { --tw-duration: 500ms; transition-duration: 500ms; }
.ease-in { --tw-ease: var(--ease-in); transition-timing-function: var(--ease-in); }
.ease-in-out { --tw-ease: var(--ease-in-out); transition-timing-function: var(--ease-in-out); }
.ease-out { --tw-ease: var(--ease-out); transition-timing-function: var(--ease-out); }
.outline-none { --tw-outline-style: none; outline-style: none; }
.select-none { user-select: none; }
@media (hover: hover) {
.group-hover\:scale-105:is(:where(.group):hover *) { --tw-scale-x: 105%; --tw-scale-y: 105%; --tw-scale-z: 105%; scale: var(--tw-scale-x) var(--tw-scale-y); }
.group-hover\:scale-110:is(:where(.group):hover *) { --tw-scale-x: 110%; --tw-scale-y: 110%; --tw-scale-z: 110%; scale: var(--tw-scale-x) var(--tw-scale-y); }
.group-hover\:border-gray-300:is(:where(.group):hover *) { border-color: var(--color-gray-300); }
.group-hover\:text-black:is(:where(.group):hover *) { color: var(--color-black); }
.group-hover\:opacity-100:is(:where(.group):hover *) { opacity: 1; }
.group-hover\:shadow-lg:is(:where(.group):hover *) { --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.group-hover\:ring-gray-100:is(:where(.group):hover *) { --tw-ring-color: var(--color-gray-100); }
.group-hover\/qr\:opacity-100:is(:where(.group\/qr):hover *) { opacity: 1; }
}
.peer-checked\:translate-x-4:is(:where(.peer):checked ~ *) { --tw-translate-x: calc(var(--spacing) * 4); translate: var(--tw-translate-x) var(--tw-translate-y); }
.peer-checked\:bg-gray-900:is(:where(.peer):checked ~ *) { background-color: var(--color-gray-900); }
.placeholder\:text-gray-300::placeholder { color: var(--color-gray-300); }
.placeholder\:text-neutral-400::placeholder { color: var(--color-neutral-400); }
@media (hover: hover) {
.hover\:-translate-y-1:hover { --tw-translate-y: calc(var(--spacing) * -1); translate: var(--tw-translate-x) var(--tw-translate-y); }
.hover\:scale-105:hover { --tw-scale-x: 105%; --tw-scale-y: 105%; --tw-scale-z: 105%; scale: var(--tw-scale-x) var(--tw-scale-y); }
.hover\:scale-110:hover { --tw-scale-x: 110%; --tw-scale-y: 110%; --tw-scale-z: 110%; scale: var(--tw-scale-x) var(--tw-scale-y); }
.hover\:border-black:hover { border-color: var(--color-black); }
.hover\:border-gray-300:hover { border-color: var(--color-gray-300); }
.hover\:border-gray-400:hover { border-color: var(--color-gray-400); }
.hover\:border-gray-900:hover { border-color: var(--color-gray-900); }
.hover\:border-red-300:hover { border-color: var(--color-red-300); }
.hover\:bg-\[\#F0F0F0\]:hover { background-color: rgb(240, 240, 240); }
.hover\:bg-\[\#f5f5f5\]:hover { background-color: rgb(245, 245, 245); }
.hover\:bg-\[\#f9f9f9\]:hover { background-color: rgb(249, 249, 249); }
.hover\:bg-amber-50:hover { background-color: var(--color-amber-50); }
.hover\:bg-amber-100:hover { background-color: var(--color-amber-100); }
.hover\:bg-amber-600:hover { background-color: var(--color-amber-600); }
.hover\:bg-black:hover { background-color: var(--color-black); }
.hover\:bg-black\/5:hover { background-color: color-mix(in srgb, rgb(0, 0, 0) 5%, transparent 95%); }
@supports (color: color-mix(in lab, red, red)) {
.hover\:bg-black\/5:hover { background-color: color-mix(in oklab, var(--color-black) 5%, transparent); }
}
.hover\:bg-gray-50:hover { background-color: var(--color-gray-50); }
.hover\:bg-gray-100:hover { background-color: var(--color-gray-100); }
.hover\:bg-gray-200:hover { background-color: var(--color-gray-200); }
.hover\:bg-gray-600:hover { background-color: var(--color-gray-600); }
.hover\:bg-gray-800:hover { background-color: var(--color-gray-800); }
.hover\:bg-neutral-100:hover { background-color: var(--color-neutral-100); }
.hover\:bg-neutral-200:hover { background-color: var(--color-neutral-200); }
.hover\:bg-neutral-700:hover { background-color: var(--color-neutral-700); }
.hover\:bg-neutral-800:hover { background-color: var(--color-neutral-800); }
.hover\:bg-red-50:hover { background-color: var(--color-red-50); }
.hover\:bg-red-600:hover { background-color: var(--color-red-600); }
.hover\:bg-white\/20:hover { background-color: color-mix(in srgb, rgb(255, 255, 255) 20%, transparent 80%); }
@supports (color: color-mix(in lab, red, red)) {
.hover\:bg-white\/20:hover { background-color: color-mix(in oklab, var(--color-white) 20%, transparent); }
}
.hover\:text-amber-900:hover { color: var(--color-amber-900); }
.hover\:text-black:hover { color: var(--color-black); }
.hover\:text-gray-600:hover { color: var(--color-gray-600); }
.hover\:text-gray-700:hover { color: var(--color-gray-700); }
.hover\:text-gray-800:hover { color: var(--color-gray-800); }
.hover\:text-gray-900:hover { color: var(--color-gray-900); }
.hover\:text-neutral-600:hover { color: var(--color-neutral-600); }
.hover\:text-neutral-900:hover { color: var(--color-neutral-900); }
.hover\:text-red-600:hover { color: var(--color-red-600); }
.hover\:text-slate-900:hover { color: var(--color-slate-900); }
.hover\:text-white:hover { color: var(--color-white); }
.hover\:underline:hover { text-decoration-line: underline; }
.hover\:opacity-80:hover { opacity: 0.8; }
.hover\:opacity-90:hover { opacity: 0.9; }
.hover\:shadow-\[0_0_30px_rgba\(0\,0\,0\,0\.3\)\]:hover { --tw-shadow: 0 0 30px var(--tw-shadow-color, rgba(0,0,0,0.3)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.hover\:shadow-lg:hover { --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.hover\:shadow-md:hover { --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
}
.focus\:border-amber-400:focus { border-color: var(--color-amber-400); }
.focus\:border-black:focus { border-color: var(--color-black); }
.focus\:border-gray-900:focus { border-color: var(--color-gray-900); }
.focus\:bg-white:focus { background-color: var(--color-white); }
.focus\:ring-0:focus { --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.focus\:ring-1:focus { --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
.focus\:ring-gray-900:focus { --tw-ring-color: var(--color-gray-900); }
.focus\:outline-none:focus { --tw-outline-style: none; outline-style: none; }
.active\:scale-90:active { --tw-scale-x: 90%; --tw-scale-y: 90%; --tw-scale-z: 90%; scale: var(--tw-scale-x) var(--tw-scale-y); }
.active\:scale-95:active { --tw-scale-x: 95%; --tw-scale-y: 95%; --tw-scale-z: 95%; scale: var(--tw-scale-x) var(--tw-scale-y); }
.active\:scale-\[0\.98\]:active { scale: 0.98; }
.active\:bg-gray-200:active { background-color: var(--color-gray-200); }
.active\:text-gray-700:active { color: var(--color-gray-700); }
.disabled\:cursor-not-allowed:disabled { cursor: not-allowed; }
.disabled\:bg-gray-300:disabled { background-color: var(--color-gray-300); }
.disabled\:opacity-40:disabled { opacity: 0.4; }
.disabled\:opacity-50:disabled { opacity: 0.5; }
.disabled\:opacity-60:disabled { opacity: 0.6; }
.disabled\:shadow-none:disabled { --tw-shadow: 0 0 #0000; box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
@media (hover: hover) {
.disabled\:hover\:bg-gray-300:disabled:hover { background-color: var(--color-gray-300); }
}
@media (width < 420px) {
.max-\[420px\]\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0px, 1fr)); }
}
@media (width >= 40rem) {
.sm\:col-span-2 { grid-column: span 2 / span 2; }
.sm\:my-8 { margin-block: calc(var(--spacing) * 8); }
.sm\:flex { display: flex; }
.sm\:hidden { display: none; }
.sm\:inline { display: inline; }
.sm\:inline-flex { display: inline-flex; }
.sm\:table-cell { display: table-cell; }
.sm\:h-8 { height: calc(var(--spacing) * 8); }
.sm\:h-10 { height: calc(var(--spacing) * 10); }
.sm\:h-\[88vh\] { height: 88vh; }
.sm\:w-8 { width: calc(var(--spacing) * 8); }
.sm\:w-10 { width: calc(var(--spacing) * 10); }
.sm\:w-\[min\(1080px\,96vw\)\] { width: min(1080px, 96vw); }
.sm\:columns-2 { columns: 2; }
.sm\:columns-3 { columns: 3; }
.sm\:columns-4 { columns: 4; }
.sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0px, 1fr)); }
.sm\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0px, 1fr)); }
.sm\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0px, 1fr)); }
.sm\:flex-row { flex-direction: row; }
.sm\:items-center { align-items: center; }
.sm\:gap-3 { gap: calc(var(--spacing) * 3); }
.sm\:gap-8 { gap: calc(var(--spacing) * 8); }
.sm\:rounded-2xl { border-radius: var(--radius-2xl); }
.sm\:p-4 { padding: calc(var(--spacing) * 4); }
.sm\:p-8 { padding: calc(var(--spacing) * 8); }
.sm\:px-5 { padding-inline: calc(var(--spacing) * 5); }
.sm\:px-6 { padding-inline: calc(var(--spacing) * 6); }
.sm\:px-8 { padding-inline: calc(var(--spacing) * 8); }
.sm\:px-10 { padding-inline: calc(var(--spacing) * 10); }
.sm\:py-8 { padding-block: calc(var(--spacing) * 8); }
.sm\:py-12 { padding-block: calc(var(--spacing) * 12); }
.sm\:pt-0 { padding-top: 0px; }
.sm\:pb-10 { padding-bottom: calc(var(--spacing) * 10); }
.sm\:pb-20 { padding-bottom: calc(var(--spacing) * 20); }
.sm\:text-left { text-align: left; }
.sm\:text-2xl { font-size: var(--text-2xl); line-height: var(--tw-leading, var(--text-2xl--line-height)); }
.sm\:text-4xl { font-size: var(--text-4xl); line-height: var(--tw-leading, var(--text-4xl--line-height)); }
.sm\:text-base { font-size: var(--text-base); line-height: var(--tw-leading, var(--text-base--line-height)); }
.sm\:text-lg { font-size: var(--text-lg); line-height: var(--tw-leading, var(--text-lg--line-height)); }
.sm\:text-sm { font-size: var(--text-sm); line-height: var(--tw-leading, var(--text-sm--line-height)); }
.sm\:text-xs { font-size: var(--text-xs); line-height: var(--tw-leading, var(--text-xs--line-height)); }
.sm\:text-\[11px\] { font-size: 11px; }
.sm\:shadow-2xl { --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25)); box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); }
}
@media (width >= 48rem) {
.md\:block { display: block; }
.md\:flex { display: flex; }
.md\:hidden { display: none; }
.md\:columns-3 { columns: 3; }
.md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0px, 1fr)); }
.md\:flex-row { flex-direction: row; }
.md\:items-center { align-items: center; }
.md\:p-12 { padding: calc(var(--spacing) * 12); }
.md\:pt-0 { padding-top: 0px; }
.md\:text-3xl { font-size: var(--text-3xl); line-height: var(--tw-leading, var(--text-3xl--line-height)); }
}
@media (width >= 64rem) {
.lg\:min-h-0 { min-height: 0px; }
.lg\:w-\[340px\] { width: 340px; }
.lg\:columns-3 { columns: 3; }
.lg\:columns-4 { columns: 4; }
.lg\:columns-5 { columns: 5; }
.lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0px, 1fr)); }
.lg\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0px, 1fr)); }
.lg\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0px, 1fr)); }
.lg\:flex-row { flex-direction: row; }
.lg\:border-t-0 { border-top-style: var(--tw-border-style); border-top-width: 0px; }
.lg\:border-l { border-left-style: var(--tw-border-style); border-left-width: 1px; }
.lg\:p-12 { padding: calc(var(--spacing) * 12); }
.lg\:px-8 { padding-inline: calc(var(--spacing) * 8); }
}
@media (width >= 80rem) {
.xl\:columns-4 { columns: 4; }
.xl\:columns-5 { columns: 5; }
.xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0px, 1fr)); }
}
@media (width >= 96rem) {
.\32 xl\:columns-6 { columns: 6; }
.\32 xl\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0px, 1fr)); }
}
}
@layer base {
html { -webkit-font-smoothing: antialiased; text-rendering: optimizelegibility; }
body { font-family: var(--font-display); }
}
@property --tw-translate-x { syntax: "*"; inherits: false; initial-value: 0; }
@property --tw-translate-y { syntax: "*"; inherits: false; initial-value: 0; }
@property --tw-translate-z { syntax: "*"; inherits: false; initial-value: 0; }
@property --tw-rotate-x { syntax: "*"; inherits: false; }
@property --tw-rotate-y { syntax: "*"; inherits: false; }
@property --tw-rotate-z { syntax: "*"; inherits: false; }
@property --tw-skew-x { syntax: "*"; inherits: false; }
@property --tw-skew-y { syntax: "*"; inherits: false; }
@property --tw-space-y-reverse { syntax: "*"; inherits: false; initial-value: 0; }
@property --tw-space-x-reverse { syntax: "*"; inherits: false; initial-value: 0; }
@property --tw-divide-y-reverse { syntax: "*"; inherits: false; initial-value: 0; }
@property --tw-border-style { syntax: "*"; inherits: false; initial-value: solid; }
@property --tw-gradient-position { syntax: "*"; inherits: false; }
@property --tw-gradient-from { syntax: "<color>"; inherits: false; initial-value: #0000; }
@property --tw-gradient-via { syntax: "<color>"; inherits: false; initial-value: #0000; }
@property --tw-gradient-to { syntax: "<color>"; inherits: false; initial-value: #0000; }
@property --tw-gradient-stops { syntax: "*"; inherits: false; }
@property --tw-gradient-via-stops { syntax: "*"; inherits: false; }
@property --tw-gradient-from-position { syntax: "<length-percentage>"; inherits: false; initial-value: 0%; }
@property --tw-gradient-via-position { syntax: "<length-percentage>"; inherits: false; initial-value: 50%; }
@property --tw-gradient-to-position { syntax: "<length-percentage>"; inherits: false; initial-value: 100%; }
@property --tw-leading { syntax: "*"; inherits: false; }
@property --tw-font-weight { syntax: "*"; inherits: false; }
@property --tw-tracking { syntax: "*"; inherits: false; }
@property --tw-ordinal { syntax: "*"; inherits: false; }
@property --tw-slashed-zero { syntax: "*"; inherits: false; }
@property --tw-numeric-figure { syntax: "*"; inherits: false; }
@property --tw-numeric-spacing { syntax: "*"; inherits: false; }
@property --tw-numeric-fraction { syntax: "*"; inherits: false; }
@property --tw-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }
@property --tw-shadow-color { syntax: "*"; inherits: false; }
@property --tw-shadow-alpha { syntax: "<percentage>"; inherits: false; initial-value: 100%; }
@property --tw-inset-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }
@property --tw-inset-shadow-color { syntax: "*"; inherits: false; }
@property --tw-inset-shadow-alpha { syntax: "<percentage>"; inherits: false; initial-value: 100%; }
@property --tw-ring-color { syntax: "*"; inherits: false; }
@property --tw-ring-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }
@property --tw-inset-ring-color { syntax: "*"; inherits: false; }
@property --tw-inset-ring-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }
@property --tw-ring-inset { syntax: "*"; inherits: false; }
@property --tw-ring-offset-width { syntax: "<length>"; inherits: false; initial-value: 0px; }
@property --tw-ring-offset-color { syntax: "*"; inherits: false; initial-value: #fff; }
@property --tw-ring-offset-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }
@property --tw-blur { syntax: "*"; inherits: false; }
@property --tw-brightness { syntax: "*"; inherits: false; }
@property --tw-contrast { syntax: "*"; inherits: false; }
@property --tw-grayscale { syntax: "*"; inherits: false; }
@property --tw-hue-rotate { syntax: "*"; inherits: false; }
@property --tw-invert { syntax: "*"; inherits: false; }
@property --tw-opacity { syntax: "*"; inherits: false; }
@property --tw-saturate { syntax: "*"; inherits: false; }
@property --tw-sepia { syntax: "*"; inherits: false; }
@property --tw-drop-shadow { syntax: "*"; inherits: false; }
@property --tw-drop-shadow-color { syntax: "*"; inherits: false; }
@property --tw-drop-shadow-alpha { syntax: "<percentage>"; inherits: false; initial-value: 100%; }
@property --tw-drop-shadow-size { syntax: "*"; inherits: false; }
@property --tw-backdrop-blur { syntax: "*"; inherits: false; }
@property --tw-backdrop-brightness { syntax: "*"; inherits: false; }
@property --tw-backdrop-contrast { syntax: "*"; inherits: false; }
@property --tw-backdrop-grayscale { syntax: "*"; inherits: false; }
@property --tw-backdrop-hue-rotate { syntax: "*"; inherits: false; }
@property --tw-backdrop-invert { syntax: "*"; inherits: false; }
@property --tw-backdrop-opacity { syntax: "*"; inherits: false; }
@property --tw-backdrop-saturate { syntax: "*"; inherits: false; }
@property --tw-backdrop-sepia { syntax: "*"; inherits: false; }
@property --tw-duration { syntax: "*"; inherits: false; }
@property --tw-ease { syntax: "*"; inherits: false; }
@property --tw-scale-x { syntax: "*"; inherits: false; initial-value: 1; }
@property --tw-scale-y { syntax: "*"; inherits: false; initial-value: 1; }
@property --tw-scale-z { syntax: "*"; inherits: false; initial-value: 1; }
@keyframes spin {
100% { transform: rotate(360deg); }
}
@layer properties {
@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
*, ::before, ::after, ::backdrop { --tw-translate-x: 0; --tw-translate-y: 0; --tw-translate-z: 0; --tw-rotate-x: initial; --tw-rotate-y: initial; --tw-rotate-z: initial; --tw-skew-x: initial; --tw-skew-y: initial; --tw-space-y-reverse: 0; --tw-space-x-reverse: 0; --tw-divide-y-reverse: 0; --tw-border-style: solid; --tw-gradient-position: initial; --tw-gradient-from: #0000; --tw-gradient-via: #0000; --tw-gradient-to: #0000; --tw-gradient-stops: initial; --tw-gradient-via-stops: initial; --tw-gradient-from-position: 0%; --tw-gradient-via-position: 50%; --tw-gradient-to-position: 100%; --tw-leading: initial; --tw-font-weight: initial; --tw-tracking: initial; --tw-ordinal: initial; --tw-slashed-zero: initial; --tw-numeric-figure: initial; --tw-numeric-spacing: initial; --tw-numeric-fraction: initial; --tw-shadow: 0 0 #0000; --tw-shadow-color: initial; --tw-shadow-alpha: 100%; --tw-inset-shadow: 0 0 #0000; --tw-inset-shadow-color: initial; --tw-inset-shadow-alpha: 100%; --tw-ring-color: initial; --tw-ring-shadow: 0 0 #0000; --tw-inset-ring-color: initial; --tw-inset-ring-shadow: 0 0 #0000; --tw-ring-inset: initial; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-blur: initial; --tw-brightness: initial; --tw-contrast: initial; --tw-grayscale: initial; --tw-hue-rotate: initial; --tw-invert: initial; --tw-opacity: initial; --tw-saturate: initial; --tw-sepia: initial; --tw-drop-shadow: initial; --tw-drop-shadow-color: initial; --tw-drop-shadow-alpha: 100%; --tw-drop-shadow-size: initial; --tw-backdrop-blur: initial; --tw-backdrop-brightness: initial; --tw-backdrop-contrast: initial; --tw-backdrop-grayscale: initial; --tw-backdrop-hue-rotate: initial; --tw-backdrop-invert: initial; --tw-backdrop-opacity: initial; --tw-backdrop-saturate: initial; --tw-backdrop-sepia: initial; --tw-duration: initial; --tw-ease: initial; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scale-z: 1; }
}
}
.mobile-sidebar-enter-active[data-v-56bfec04] { transition: 0.3s; }
.mobile-sidebar-leave-active[data-v-56bfec04] { transition: 0.3s; }
.mobile-sidebar-enter-from[data-v-56bfec04], .mobile-sidebar-leave-to[data-v-56bfec04] { opacity: 0; }
.mobile-sidebar-enter-from aside[data-v-56bfec04], .mobile-sidebar-leave-to aside[data-v-56bfec04] { transform: translateX(-100%); }
.mobile-sidebar-enter-to aside[data-v-56bfec04], .mobile-sidebar-leave-from aside[data-v-56bfec04] { transform: translateX(0px); }
.marquee-wrapper[data-v-f0ed4234] { position: relative; width: 100%; }
.marquee-container[data-v-f0ed4234] { display: flex; white-space: nowrap; animation: 20s linear 0s infinite normal none running marquee-f0ed4234; }
.marquee-text[data-v-f0ed4234] { flex-shrink: 0; padding-right: 2rem; }
.marquee-text-duplicate[data-v-f0ed4234] { padding-left: 2rem; }
@keyframes marquee-f0ed4234 {
0% { transform: translateX(0px); }
100% { transform: translateX(-50%); }
}
.marquee-wrapper:hover .marquee-container[data-v-f0ed4234] { animation-play-state: paused; }
.lightbox-enter-active[data-v-188a4043], .lightbox-leave-active[data-v-188a4043] { transition: opacity 0.3s; }
.lightbox-enter-from[data-v-188a4043], .lightbox-leave-to[data-v-188a4043] { opacity: 0; }
.modal-enter-active[data-v-ef6fb3de], .modal-leave-active[data-v-ef6fb3de] { transition: opacity 0.2s; }
.modal-enter-from[data-v-ef6fb3de], .modal-leave-to[data-v-ef6fb3de] { opacity: 0; }
.scrollbar-hide[data-v-ef6fb3de]::-webkit-scrollbar { display: none; }
.scrollbar-hide[data-v-ef6fb3de] { scrollbar-width: none; }
.border-primary[data-v-ef6fb3de] { border-color: rgb(139, 92, 246); }
#toast { position: fixed; left: 50%; bottom: 32px; z-index: 100; padding: 8px 14px; border-radius: 8px; background: rgba(0,0,0,0.85); color: #fff; font-size: 12px; opacity: 0; pointer-events: none; transform: translateX(-50%) translateY(6px); transition: opacity .2s ease, transform .2s ease; }
#toast.is-visible { opacity: 1; transform: translateX(-50%) translateY(0); }
</style>
</head>
<body class="material-symbols-outloaded">
<div data-v-ef6fb3de="" class="bg-white text-gray-800 min-h-screen"><!-- 移动端顶部个人中心子导航 --><div data-v-ef6fb3de="" class="md:hidden border-b border-gray-100 bg-white sticky top-14 z-10"><div data-v-ef6fb3de="" class="flex overflow-x-auto scrollbar-hide"><button data-v-ef6fb3de="" type="button" class="flex-1 min-w-[80px] py-3 text-sm font-medium transition-colors text-center whitespace-nowrap text-gray-900 border-b-2 border-primary"> 个人资料 </button><button data-v-ef6fb3de="" type="button" class="flex-1 min-w-[80px] py-3 text-sm font-medium transition-colors text-center whitespace-nowrap text-gray-400"> 邀请好友 </button><button data-v-ef6fb3de="" type="button" class="flex-1 min-w-[80px] py-3 text-sm font-medium transition-colors text-center whitespace-nowrap text-gray-400"> 企业认证 </button><button data-v-ef6fb3de="" type="button" class="flex-1 min-w-[80px] py-3 text-sm font-medium transition-colors text-center whitespace-nowrap text-gray-400"> 退出登录 </button></div></div><div data-v-ef6fb3de="" class="flex h-screen overflow-hidden"><!-- 全局左侧导航(与生成页一致,保持不变) --><!-- Desktop Sidebar --><aside data-v-56bfec04="" class="hidden sm:flex bg-[#f9f9f9] border-r border-[#eeeeee] flex-col shrink-0 transition-all duration-300 ease-in-out w-64"><div data-v-56bfec04="" class="p-4 flex items-center justify-between mb-4"><div data-v-56bfec04="" class="flex items-center gap-2.5 cursor-pointer hover:scale-105 transform duration-200 ml-2"><svg data-v-56bfec04="" class="w-6 h-6 shrink-0" viewBox="0 0 32 32" fill="none" aria-hidden="true"><path data-v-56bfec04="" d="M19 2 5 19h8l-2 11L27 12h-9l1-10Z" fill="#08482D"></path><path data-v-56bfec04="" d="M19 2 11 12" fill="none" stroke="#DAE7C7" stroke-width="1.4" stroke-linecap="round"></path></svg><span data-v-56bfec04="" class="font-bold text-lg tracking-tight text-gray-900">来秒AI</span></div><button data-v-56bfec04="" class="flex items-center justify-center mt-1 group w-7 h-7 rounded-lg hover:bg-[#F0F0F0] transition-colors duration-200 cursor-pointer shrink-0"><svg data-v-56bfec04="" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none" class="text-[#333333] w-5 h-5"><rect data-v-56bfec04="" width="15.167" height="11.833" x="2.417" y="4.083" stroke="currentColor" stroke-width="1.5" rx="0.917"></rect><path data-v-56bfec04="" stroke="currentColor" stroke-width="1.5" d="M6.667 4.167v11.666"></path></svg></button></div><nav data-v-56bfec04="" class="flex-1 px-4 overflow-y-auto space-y-8"><div data-v-56bfec04=""><h3 data-v-56bfec04="" class="px-4 text-[10px] font-bold uppercase tracking-widest mb-3 whitespace-nowrap text-gray-400"> 开启创作 </h3><div data-v-56bfec04="" class="space-y-1"><button data-v-56bfec04="" type="button" class="flex items-center gap-2.5 px-4 py-2.5 rounded-lg text-sm font-medium transition-all cursor-pointer hover:scale-105 transform duration-200 w-full bg-[#f5f5f5] text-black font-semibold"><span data-v-56bfec04="" class="material-symbols-outlined text-[20px] shrink-0">edit_square</span><span data-v-56bfec04="">新对话</span></button></div></div><div data-v-56bfec04=""><h3 data-v-56bfec04="" class="px-4 text-[10px] font-bold uppercase tracking-widest mb-3 whitespace-nowrap text-gray-400"> 最近 </h3><!-- 收起态:只显示一个图标,点击展开侧边栏 --><!-- 展开态:按日期分组 --><div data-v-56bfec04="" class="space-y-2"></div></div></nav><div data-v-56bfec04="" class="p-4 border-t border-[#eeeeee]"><div data-v-56bfec04="" class="flex items-center"><div data-v-56bfec04="" class="flex items-center gap-3 px-2 py-2 cursor-pointer rounded-lg transition-all flex-1 min-w-0 hover:bg-gray-50"><div data-v-56bfec04="" class="w-8 h-8 rounded-full bg-gray-100 overflow-hidden ring-1 ring-gray-100 flex items-center justify-center shrink-0"><span data-v-56bfec04="" class="material-symbols-outlined text-gray-400">person</span></div><div data-v-56bfec04="" class="flex-1 min-w-0 flex items-center gap-2"><p data-v-56bfec04="" class="text-xs font-semibold text-gray-900 truncate min-w-0 flex-1">来秒AI 创作者</p><button data-v-56bfec04="" type="button" class="relative shrink-0 whitespace-nowrap rounded border border-gray-300 pl-1.5 pr-1.5 pt-0.5 pb-3 text-[10px] font-medium text-gray-500 transition-colors hover:border-black cursor-pointer" title="认证成功后赠送 1000 算力积分"> 企业认证 <span data-v-56bfec04="" class="absolute bottom-0.5 right-1 text-[9px] font-normal leading-none">+1000积分</span></button></div></div></div></div></aside><!-- Mobile Top Nav --><nav data-v-56bfec04="" class="sm:hidden fixed top-0 left-0 right-0 z-40 h-14 bg-white border-b border-[#eeeeee] flex items-center justify-between px-4"><div data-v-56bfec04="" class="flex items-center gap-3"><button data-v-56bfec04="" type="button" class="w-8 h-8 flex items-center justify-center rounded-lg hover:bg-gray-100 transition-colors cursor-pointer"><span data-v-56bfec04="" class="material-symbols-outlined text-gray-700 text-[22px]">menu</span></button><div data-v-56bfec04="" class="flex items-center gap-2 cursor-pointer"><svg data-v-56bfec04="" class="w-6 h-6 shrink-0" viewBox="0 0 32 32" fill="none" aria-hidden="true"><path data-v-56bfec04="" d="M19 2 5 19h8l-2 11L27 12h-9l1-10Z" fill="#08482D"></path><path data-v-56bfec04="" d="M19 2 11 12" fill="none" stroke="#DAE7C7" stroke-width="1.4" stroke-linecap="round"></path></svg><span data-v-56bfec04="" class="font-bold text-base text-gray-900">来秒AI</span></div></div></nav><!-- Mobile Sidebar -->
<div id="mobileDrawer" class="hidden fixed inset-0 z-50 sm:hidden">
<div id="mobileBackdrop" class="absolute inset-0 bg-black/40 backdrop-blur-sm"></div>
<aside class="absolute left-0 top-0 h-full bg-[#f9f9f9] border-r border-[#eeeeee] flex flex-col shrink-0 w-64 shadow-2xl">
<div class="p-6 flex items-center justify-between mb-4 gap-2.5">
<div class="flex items-center gap-2.5"><svg class="w-6 h-6 shrink-0" viewBox="0 0 32 32" fill="none" aria-hidden="true"><path d="M19 2 5 19h8l-2 11L27 12h-9l1-10Z" fill="#08482D"/><path d="M19 2 11 12" fill="none" stroke="#DAE7C7" stroke-width="1.4" stroke-linecap="round"/></svg><span class="font-bold text-lg tracking-tight text-gray-900">来秒AI</span></div>
<button id="mobileClose" type="button" class="text-gray-500 hover:text-gray-900 cursor-pointer hover:scale-110 transform duration-200"><span class="material-symbols-outlined text-xl">close</span></button>
</div>
<nav class="flex-1 px-4 space-y-8 overflow-y-auto">
<div><h3 class="px-4 text-[10px] font-bold text-gray-400 uppercase tracking-widest mb-3">开启创作</h3><div class="space-y-1"><button id="mNewChat" type="button" class="flex items-center gap-2.5 px-4 py-2.5 rounded-lg text-sm font-medium transition-all cursor-pointer hover:scale-105 transform duration-200 w-full bg-[#f5f5f5] text-black font-semibold"><span class="material-symbols-outlined text-[20px] shrink-0">edit_square</span>新对话</button></div></div>
<div><h3 class="px-4 text-[10px] font-bold text-gray-400 uppercase tracking-widest mb-3">最近</h3><div class="space-y-2"></div></div>
</nav>
<div class="p-4 border-t border-[#eeeeee]"><div id="mUserRow" class="flex items-center gap-3 px-2 py-2 cursor-pointer rounded-lg transition-all hover:bg-gray-50"><div class="w-8 h-8 rounded-full bg-gray-100 overflow-hidden ring-1 ring-gray-100 flex items-center justify-center shrink-0"><span class="material-symbols-outlined text-gray-400">person</span></div><div class="flex-1 min-w-0 flex items-center gap-2"><p class="text-xs font-semibold text-gray-900 truncate min-w-0 flex-1">来秒AI 创作者</p><button id="mCertBtn" type="button" class="relative shrink-0 whitespace-nowrap rounded border border-gray-300 pl-1.5 pr-1.5 pt-0.5 pb-3 text-[10px] font-medium text-gray-500 transition-colors hover:border-black cursor-pointer">企业认证<span class="absolute bottom-0.5 right-1 text-[9px] font-normal leading-none">+1000积分</span></button></div></div></div>
</aside>
</div>
<!-- 个人中心二级选择栏 --><aside data-v-ef6fb3de="" class="w-64 bg-white border-r border-[#eeeeee] flex flex-col shrink-0 hidden md:flex z-10"><div data-v-ef6fb3de="" class="p-6 pb-2"><h2 data-v-ef6fb3de="" class="text-lg font-bold text-gray-900">个人中心</h2></div><nav data-v-ef6fb3de="" class="flex-1 px-3 py-4 space-y-1"><button data-v-ef6fb3de="" type="button" class="w-full text-left px-4 py-3 text-sm font-medium rounded-lg transition-colors flex items-center gap-3 cursor-pointer hover:scale-105 transform duration-200 bg-[#f5f5f5] text-gray-900 font-semibold"><span data-v-ef6fb3de="" class="material-symbols-outlined text-[20px]">person</span> 个人资料 </button><button data-v-ef6fb3de="" type="button" class="w-full text-left px-4 py-3 text-sm font-medium rounded-lg transition-colors flex items-center gap-3 cursor-pointer hover:scale-105 transform duration-200 text-gray-500 hover:bg-[#f9f9f9] hover:text-gray-900"><span data-v-ef6fb3de="" class="material-symbols-outlined text-[20px]">group_add</span> 邀请好友 </button><button data-v-ef6fb3de="" type="button" class="w-full text-left px-4 py-3 text-sm font-medium rounded-lg transition-colors flex items-center gap-3 cursor-pointer hover:scale-105 transform duration-200 text-gray-500 hover:bg-[#f9f9f9] hover:text-gray-900"><span data-v-ef6fb3de="" class="material-symbols-outlined text-[20px]">workspace_premium</span> 企业认证 </button><div data-v-ef6fb3de="" class="my-2 border-t border-gray-100"></div><button data-v-ef6fb3de="" type="button" class="w-full text-left px-4 py-3 text-sm font-medium rounded-lg transition-colors flex items-center gap-3 hover:bg-gray-50 hover:text-red-600 cursor-pointer hover:scale-105 transform duration-200"><span data-v-ef6fb3de="" class="material-symbols-outlined text-[20px]">logout</span> 退出登录 </button></nav></aside><main data-v-ef6fb3de="" class="flex-1 flex flex-col h-full bg-white overflow-y-auto pt-14 md:pt-0"><div data-panel="profile"><!--v-if--><!--v-if--><div data-v-ef6fb3de="" class="max-w-4xl w-full mx-auto px-4 sm:px-10 py-8 sm:py-12"><header data-v-ef6fb3de="" class="mb-10"><h1 data-v-ef6fb3de="" class="text-2xl font-bold text-gray-900 mb-2">个人资料</h1><p data-v-ef6fb3de="" class="text-sm text-gray-500">管理您的个人信息和账户展示设置。</p></header><div data-v-ef6fb3de="" class="space-y-10"><div data-v-ef6fb3de="" class="flex items-start gap-8"><div data-v-ef6fb3de="" class="relative group cursor-pointer"><div data-v-ef6fb3de="" class="w-24 h-24 rounded-full overflow-hidden border border-gray-100 ring-2 ring-transparent group-hover:ring-gray-100 transition-all"><div data-v-ef6fb3de="" class="w-full h-full bg-gray-100 flex items-center justify-center"><span data-v-ef6fb3de="" class="material-symbols-outlined text-gray-300 text-4xl">person</span></div></div><div data-v-ef6fb3de="" class="absolute inset-0 bg-black/40 rounded-full flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity"><span data-v-ef6fb3de="" class="material-symbols-outlined text-white">photo_camera</span></div><input data-v-ef6fb3de="" type="file" accept="image/*" class="hidden"></div><div data-v-ef6fb3de="" class="flex-1 pt-2"><h3 data-v-ef6fb3de="" class="text-sm font-semibold text-gray-900 mb-1">头像</h3><p data-v-ef6fb3de="" class="text-xs text-gray-500 mb-4">支持 JPG, PNG, GIF 格式,最大 2MB。</p><div data-v-ef6fb3de="" class="flex gap-3"><button data-v-ef6fb3de="" type="button" class="px-4 py-2 text-xs font-medium text-white bg-black rounded-lg hover:bg-gray-800 transition-colors cursor-pointer"> 上传新头像 </button></div></div></div><div data-v-ef6fb3de="" class="h-px bg-gray-100"></div><div data-v-ef6fb3de="" class="grid grid-cols-1 gap-6 max-w-lg"><div data-v-ef6fb3de=""><label data-v-ef6fb3de="" class="block text-sm font-medium text-gray-700 mb-2">昵称</label><input data-v-ef6fb3de="" class="w-full px-4 py-2.5 bg-gray-50 border border-gray-200 rounded-lg text-sm text-gray-900 focus:outline-none focus:ring-1 focus:ring-gray-900 focus:bg-white transition-all placeholder-gray-400" placeholder="输入您的昵称" type="text" maxlength="16" value="来秒AI 创作者"><p data-v-ef6fb3de="" class="mt-2 text-xs text-gray-400">昵称每 30 天可修改一次。</p></div><div data-v-ef6fb3de=""><label data-v-ef6fb3de="" class="block text-sm font-medium text-gray-700 mb-2">用户 ID</label><div data-v-ef6fb3de="" class="flex items-center justify-between px-4 py-3 bg-gray-50 border border-gray-100 rounded-lg"><span data-v-ef6fb3de="" class="text-sm font-mono text-gray-600">10001</span><button data-v-ef6fb3de="" type="button" class="text-xs text-gray-400 hover:text-black flex items-center gap-1 transition-colors cursor-pointer"><span data-v-ef6fb3de="" class="material-symbols-outlined text-[14px]">content_copy</span> 复制 </button></div></div></div><div data-v-ef6fb3de="" class="h-px bg-gray-100"></div><div data-v-ef6fb3de=""><h3 data-v-ef6fb3de="" class="text-sm font-semibold text-gray-900 mb-4">账户信息</h3><div data-v-ef6fb3de="" class="grid grid-cols-2 max-[420px]:grid-cols-1 gap-4 max-w-lg"><div data-v-ef6fb3de="" class="p-4 border border-gray-100 rounded-lg bg-gray-50/50"><div data-v-ef6fb3de="" class="text-xs text-gray-500 mb-1">注册时间</div><div data-v-ef6fb3de="" class="text-sm font-medium text-gray-900">2025年 01月 01日</div></div><div data-v-ef6fb3de="" class="p-4 border border-gray-100 rounded-lg bg-gray-50/50"><div data-v-ef6fb3de="" class="text-xs text-gray-500 mb-1">绑定手机</div><div data-v-ef6fb3de="" class="text-sm font-medium text-gray-900 flex items-center justify-between"><span data-v-ef6fb3de="">138****8000</span><span data-v-ef6fb3de="" class="text-[10px] text-green-600 bg-green-50 px-1.5 py-0.5 rounded border border-green-100">已验证</span></div></div></div><button data-v-ef6fb3de="" type="button" class="sm:hidden mt-6 w-full px-4 py-3 text-sm font-medium text-red-600 bg-white border border-red-200 rounded-lg hover:bg-red-50 hover:border-red-300 transition-all cursor-pointer flex items-center justify-center gap-2"><span data-v-ef6fb3de="" class="material-symbols-outlined text-[20px]">logout</span> 退出登录 </button></div></div></div></div><div data-panel="invite" class="hidden"><div data-v-f0ed4234="" data-v-ef6fb3de="" class="max-w-4xl w-full mx-auto px-4 sm:px-10 py-8 sm:py-12"><header data-v-f0ed4234="" class="mb-10"><h1 data-v-f0ed4234="" class="text-2xl font-bold text-gray-900 mb-2">邀请好友</h1><p data-v-f0ed4234="" class="text-sm text-gray-500">分享邀请链接,与好友一起把每个灵感变成作品。</p></header><div data-v-f0ed4234="" class="space-y-8"><div class="bg-black text-white rounded-xl p-8 relative overflow-hidden group" data-v-f0ed4234=""><div class="absolute top-0 right-0 p-8 opacity-10 pointer-events-none" data-v-f0ed4234=""><span class="material-symbols-outlined text-9xl" data-v-f0ed4234="">redeem</span></div><div class="relative z-10 flex flex-col md:flex-row items-start md:items-center justify-between gap-6" data-v-f0ed4234=""><div data-v-f0ed4234=""><h3 class="text-lg font-semibold mb-2 flex items-center gap-2" data-v-f0ed4234=""><span class="material-symbols-outlined text-yellow-400" data-v-f0ed4234="">stars</span> 邀请奖励 </h3><p class="text-2xl md:text-3xl font-bold tracking-tight mb-2" data-v-f0ed4234="">每邀请一位好友</p><p class="text-gray-300" data-v-f0ed4234=""> 双方均可获得 <span class="text-white font-bold text-lg mx-1 border-b border-white/30" data-v-f0ed4234="">200</span> 算力积分奖励 </p></div><div class="hidden md:block" data-v-f0ed4234=""><div class="w-16 h-16 rounded-full bg-white/10 flex items-center justify-center backdrop-blur-sm" data-v-f0ed4234=""><span class="material-symbols-outlined text-3xl" data-v-f0ed4234="">currency_bitcoin</span></div></div></div></div><div data-v-f0ed4234="" class="w-full bg-gray-50 rounded-xl p-6 border border-gray-100"><label data-v-f0ed4234="" class="block text-sm font-medium text-gray-700 mb-3">您的专属邀请链接</label><div data-v-f0ed4234="" class="flex flex-col sm:flex-row items-stretch sm:items-center gap-3 w-full"><div data-v-f0ed4234="" class="flex-1 bg-white border border-gray-200 rounded-lg px-4 py-3 text-sm text-gray-600 font-mono shadow-sm overflow-hidden"><span data-v-f0ed4234="" class="truncate block">https://laimiaoai.com/invite/demo</span></div><button data-v-f0ed4234="" type="button" class="px-6 py-3 text-sm font-medium text-white bg-black rounded-lg hover:bg-gray-800 transition-colors shadow-md flex items-center justify-center gap-2 shrink-0 cursor-pointer hover:scale-105 transform duration-200 disabled:opacity-60 disabled:cursor-not-allowed"><span data-v-f0ed4234="" class="material-symbols-outlined text-[18px]">content_copy</span> 复制链接 </button></div><p data-v-f0ed4234="" class="text-xs text-gray-400 mt-3">链接有效期永久,邀请无上限。</p></div><div data-v-f0ed4234="" class="h-px bg-gray-100 w-full my-8"></div><div data-v-f0ed4234=""><div data-v-f0ed4234="" class="flex items-center justify-between mb-6"><h3 data-v-f0ed4234="" class="text-lg font-bold text-gray-900">邀请记录</h3><div data-v-f0ed4234="" class="text-sm text-gray-500"> 已累计邀请 <span data-v-f0ed4234="" class="font-bold text-black">0</span> 人 </div></div><div data-v-f0ed4234="" class="border border-gray-200 rounded-lg p-12 text-center"><span data-v-f0ed4234="" class="material-symbols-outlined text-gray-300 text-5xl mb-3">group_add</span><p data-v-f0ed4234="" class="text-gray-500 text-sm">暂无邀请记录</p><p data-v-f0ed4234="" class="text-gray-400 text-xs mt-1">分享您的邀请链接给好友吧</p></div></div></div><!--teleport start--><!--teleport end--></div><!--v-if--><!--v-if--></div><div data-panel="certification" class="hidden"><!--v-if--><div data-v-ef6fb3de="" class="max-w-4xl w-full mx-auto px-4 sm:px-10 py-8 sm:py-12"><header class="mb-10"><h1 class="text-2xl font-bold text-gray-900 mb-2">企业认证</h1><p class="text-sm text-gray-500"> 提交企业资质资料,认证成功后可获得认证标识并赠送 <span class="font-semibold text-amber-600">1000</span> 算力积分。 </p></header><div><!--v-if--><form class="max-w-xl space-y-10"><div><h3 class="text-sm font-bold text-gray-900 mb-6 flex items-center gap-2"><span class="w-1 h-4 bg-black rounded-full"></span> 企业信息 </h3><div class="space-y-6"><div><label class="block text-xs font-semibold text-gray-500 mb-2 uppercase tracking-wider">营业执照</label><div id="certLicenseBox" class="border-2 border-dashed border-gray-200 rounded-xl p-8 flex flex-col items-center justify-center bg-gray-50/50 hover:bg-gray-50 transition-colors cursor-pointer"><input id="certLicenseInput" type="file" accept=".jpg,.jpeg,.png,.pdf" class="hidden"><span class="material-symbols-outlined text-gray-400 text-3xl mb-2">upload_file</span><p class="text-sm text-gray-500 font-medium">点击上传文件</p><p class="text-[10px] text-gray-400 mt-1">支持 JPG, PNG, PDF 格式 (最大 15MB)</p></div><!--v-if--></div><div><label class="block text-xs font-semibold text-gray-500 mb-2 uppercase tracking-wider">企业名称</label><input class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-black focus:ring-0 text-sm transition-all outline-none" id="certCompanyName" placeholder="请输入企业全称" type="text" maxlength="30"><!--v-if--></div><div><label class="block text-xs font-semibold text-gray-500 mb-2 uppercase tracking-wider">统一社会信用代码</label><input class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-black focus:ring-0 text-sm transition-all outline-none" id="certCompanyCode" placeholder="18位统一社会信用代码" type="text" maxlength="18"><!--v-if--></div></div></div><div><h3 class="text-sm font-bold text-gray-900 mb-6 flex items-center gap-2"><span class="w-1 h-4 bg-black rounded-full"></span> 联系人信息 </h3><div class="space-y-6"><div><label class="block text-xs font-semibold text-gray-500 mb-2 uppercase tracking-wider">联系人</label><input class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-black focus:ring-0 text-sm transition-all outline-none" id="certContactName" placeholder="请输入姓名" type="text" maxlength="10"><!--v-if--></div><div><label class="block text-xs font-semibold text-gray-500 mb-2 uppercase tracking-wider">联系人职位</label><input class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-black focus:ring-0 text-sm transition-all outline-none" id="certContactStation" placeholder="请输入职位" type="text" maxlength="20"><!--v-if--></div><div><label class="block text-xs font-semibold text-gray-500 mb-2 uppercase tracking-wider">联系人手机</label><input class="w-full px-4 py-3 rounded-lg border border-gray-200 focus:border-black focus:ring-0 text-sm transition-all outline-none" id="certContactMobile" placeholder="请输入11位手机号码" type="tel" maxlength="11"><!--v-if--></div><div><label class="block text-xs font-semibold text-gray-500 mb-2 uppercase tracking-wider">验证码</label><div class="flex gap-3"><input class="flex-1 px-4 py-3 rounded-lg border border-gray-200 focus:border-black focus:ring-0 text-sm transition-all outline-none" id="certAuthCode" placeholder="请输入验证码" type="text" maxlength="4"><button class="px-6 py-3 border border-gray-200 rounded-lg text-sm font-semibold hover:border-black transition-all whitespace-nowrap cursor-pointer hover:scale-105 transform duration-200" type="button" id="certSendCode">获取验证码</button></div><!--v-if--></div></div></div><div class="pt-2"><button class="w-full py-4 bg-black text-white rounded-xl font-bold text-sm hover:bg-gray-800 transition-all shadow-lg active:scale-[0.98] cursor-pointer" type="button" id="certSubmit">提交认证</button><p class="text-center text-[10px] text-gray-400 mt-4"> 提交即代表您同意 <a href="#" class="text-gray-500 underline underline-offset-2 hover:text-gray-700">《来秒AI 用户服务协议》</a></p></div></form></div><!--teleport start--><!--teleport end--><!--teleport start--><!--teleport end--></div><!--v-if--></div></main></div><!--teleport start--><!--teleport end--><!--teleport start--><!--teleport end--></div>
<div id="toast" role="status" aria-live="polite"></div>
<script>
(function () {
"use strict";
const sidebar = document.querySelector("aside");
const meNav = Array.prototype.slice.call(document.querySelectorAll("aside")).find(function (a) { return a.querySelector("h2") && a.querySelector("h2").textContent.trim() === "个人中心"; });
const main = document.querySelector("main");
const panels = Array.prototype.slice.call(document.querySelectorAll("[data-panel]"));
const mobileTabBar = Array.prototype.slice.call(document.querySelectorAll("div")).find(function (el) {
return el.className && String(el.className).indexOf("md:hidden") !== -1 && el.querySelector("button") && el.textContent.indexOf("个人资料") !== -1;
});
const tabs = ["profile", "invite", "certification", "logout"];
const meButtons = meNav ? Array.prototype.slice.call(meNav.querySelectorAll("nav > button")) : [];
const mobileButtons = mobileTabBar ? Array.prototype.slice.call(mobileTabBar.querySelectorAll("button")) : [];
meButtons.forEach(function (b, i) { b.setAttribute("data-tab", tabs[i]); });
mobileButtons.forEach(function (b, i) { b.setAttribute("data-tab", tabs[i]); });
// 邀请好友 / 企业认证 暂时隐藏(保留页面代码,仅隐藏入口)
const HIDDEN_TABS = ["invite", "certification"];
meButtons.concat(mobileButtons).forEach(function (b) {
if (HIDDEN_TABS.indexOf(b.getAttribute("data-tab")) !== -1) b.classList.add("hidden");
});
const top = sidebar.firstElementChild;
const logoRow = top.firstElementChild;
const collapseBtn = top.querySelector("button");
const newChat = sidebar.querySelector("nav button");
const newChatLabel = newChat.querySelector("span:last-child");
const labels = Array.prototype.slice.call(sidebar.querySelectorAll("h3"));
const recentLabel = labels.find(function (h) { return h.textContent.trim() === "最近"; });
const recentGroups = recentLabel ? recentLabel.nextElementSibling : null;
const SKILL_META = (document.querySelector('meta[name="skill-agent-api"]') || {}).content || "";
const SKILL_API = SKILL_META && SKILL_META.charAt(0) !== "%" ? SKILL_META.replace(/\/$/, "") : "/skill-agent";
const RECENT_BUCKETS = [
{ max: 0, label: "今天" },
{ max: 7, label: "7天内" },
{ max: 30, label: "30天内" },
{ max: Infinity, label: "更早" }
];
const recentSessions = [];
const collapsedGroups = Object.create(null);
function sessionDayLabel(ts) {
const day = new Date(ts || Date.now());
day.setHours(0, 0, 0, 0);
const startToday = new Date();
startToday.setHours(0, 0, 0, 0);
const diffDays = Math.floor((startToday.getTime() - day.getTime()) / 86400000);
for (let i = 0; i < RECENT_BUCKETS.length; i += 1) {
if (diffDays <= RECENT_BUCKETS[i].max) return RECENT_BUCKETS[i].label;
}
return "更早";
}
function currentUid() {
try {
const info = JSON.parse(localStorage.getItem("user_info") || "{}");
if (info && info.uid) return String(info.uid);
if (info && info.user_id) return String(info.user_id);
} catch (error) { /* ignore */ }
return "";
}
function currentTeam() {
const cached = localStorage.getItem("team_id") || localStorage.getItem("trip_team_id");
if (cached) return cached;
try {
const info = JSON.parse(localStorage.getItem("user_info") || "{}");
return info && info.team_id ? String(info.team_id) : "";
} catch (error) { return ""; }
}
function renderRecentSessions() {
if (!recentGroups) return;
recentGroups.innerHTML = "";
if (!recentSessions.length) return;
const index = Object.create(null);
recentSessions.forEach(function (session) {
const label = sessionDayLabel(session.createdAt);
if (!index[label]) index[label] = { label: label, items: [] };
index[label].items.push(session);
});
RECENT_BUCKETS.forEach(function (bucket) {
const group = index[bucket.label];
if (!group) return;
const collapsed = collapsedGroups[group.label] !== false;
const box = document.createElement("div");
const head = document.createElement("button");
head.type = "button";
head.className = "flex items-center justify-between w-full px-4 py-1.5 rounded-lg text-[11px] font-semibold text-gray-400 hover:text-gray-600 hover:bg-gray-50 transition-colors cursor-pointer";
head.innerHTML = '<span></span><span class="material-symbols-outlined text-sm transition-transform duration-200 ' + (collapsed ? "" : "rotate-180") + '">expand_more</span>';
head.firstChild.textContent = group.label;
head.addEventListener("click", function () {
if (sidebar.classList.contains("w-20")) { setCollapsed(false); return; }
collapsedGroups[group.label] = !collapsed;
renderRecentSessions();
});
const items = document.createElement("div");
items.className = "space-y-1 mt-1" + (collapsed ? " hidden" : "");
group.items.forEach(function (session) {
const item = document.createElement("button");
item.type = "button";
item.className = "flex items-center gap-2.5 px-4 py-2.5 rounded-lg text-[13px] font-medium transition-all cursor-pointer hover:scale-105 transform duration-200 w-full text-gray-500 hover:bg-gray-50 hover:text-gray-900";
item.innerHTML = '<span class="material-symbols-outlined text-[14px] shrink-0 text-gray-400">sms</span><span class="truncate"></span>';
item.querySelector(".truncate").textContent = session.title || "新对话";
item.addEventListener("click", function () {
window.location.href = "/generate?session=" + encodeURIComponent(session.id);
});
items.appendChild(item);
});
box.appendChild(head);
box.appendChild(items);
recentGroups.appendChild(box);
});
}
async function loadRecentSessions() {
const token = localStorage.getItem("access_token");
if (!token || !recentGroups) return;
const params = new URLSearchParams({ limit: "50" });
const uid = currentUid();
const teamId = currentTeam();
if (uid) params.set("uid", uid);
if (teamId) params.set("team_id", teamId);
try {
const response = await fetch(SKILL_API + "/sessions?" + params.toString(), {
headers: { Authorization: token }
});
if (!response.ok) return;
const data = await response.json();
const list = Array.isArray(data.sessions) ? data.sessions : [];
list.forEach(function (meta) {
const id = meta && meta.session_id;
if (!id) return;
recentSessions.push({
id: id,
title: meta.title || "新对话",
createdAt: (meta.update_time || meta.add_time || 0) * 1000
});
});
recentSessions.sort(function (a, b) { return (b.createdAt || 0) - (a.createdAt || 0); });
renderRecentSessions();
} catch (error) {
console.warn("会话列表加载失败", error);
}
}
const footer = sidebar.lastElementChild;
const userRow = footer.querySelector("div.flex.items-center.gap-3");
const userMeta = userRow ? userRow.children[1] : null;
const certBtn = userMeta ? userMeta.querySelector("button") : null;
const mobileNav = Array.prototype.slice.call(document.querySelectorAll("nav")).find(function (n) {
return n.className && String(n.className).indexOf("sm:hidden") !== -1;
});
const mobileMenu = mobileNav ? mobileNav.querySelector("button") : null;
const mobileLogo = mobileNav ? mobileNav.querySelector("div.flex.items-center.gap-2") : null;
const mobileDrawer = document.getElementById("mobileDrawer");
const mobileBackdrop = document.getElementById("mobileBackdrop");
const mobileClose = document.getElementById("mobileClose");
const mNewChat = document.getElementById("mNewChat");
const mUserRow = document.getElementById("mUserRow");
const mCertBtn = document.getElementById("mCertBtn");
const toast = document.getElementById("toast");
let toastTimer = 0;
let recentCollapsed = null;
function showToast(message) {
if (!toast) return;
toast.textContent = message;
toast.classList.add("is-visible");
window.clearTimeout(toastTimer);
toastTimer = window.setTimeout(function () { toast.classList.remove("is-visible"); }, 2200);
}
function logout() {
[
"access_token",
"open_token",
"user_info",
"team_id",
"team_score",
"current_session_id",
"trip_team_id",
"trip_team_score",
].forEach(function (key) { localStorage.removeItem(key); });
showToast("已退出登录");
window.setTimeout(function () { window.location.href = "/login/?v=20261107"; }, 300);
}
function goGenerate() { window.location.href = "/generate"; }
function goHome() { window.location.href = "/"; }
if (recentLabel && recentGroups) {
recentCollapsed = document.createElement("button");
recentCollapsed.type = "button";
recentCollapsed.className =
"group hidden items-center justify-center w-full py-2.5 rounded-lg transition-all cursor-pointer hover:bg-[#f5f5f5] hover:scale-105 transform duration-200";
recentCollapsed.innerHTML =
'<span class="material-symbols-outlined text-[20px] shrink-0 text-gray-500 group-hover:text-black transition-colors">sms</span>';
recentCollapsed.addEventListener("click", function () { setCollapsed(false); });
recentLabel.parentNode.insertBefore(recentCollapsed, recentGroups);
}
function setCollapsed(collapsed) {
sidebar.classList.toggle("w-64", !collapsed);
sidebar.classList.toggle("w-20", collapsed);
logoRow.classList.toggle("hidden", collapsed);
collapseBtn.classList.toggle("mx-auto", collapsed);
labels.forEach(function (label) {
label.classList.toggle("text-gray-400", !collapsed);
label.classList.toggle("text-[#f9f9f9]", collapsed);
});
newChatLabel.classList.toggle("hidden", collapsed);
newChat.classList.toggle("justify-center", collapsed);
newChat.classList.toggle("px-0", collapsed);
if (recentGroups) recentGroups.classList.toggle("hidden", collapsed);
if (recentCollapsed) {
recentCollapsed.classList.toggle("hidden", !collapsed);
recentCollapsed.classList.toggle("flex", collapsed);
}
if (userMeta) userMeta.classList.toggle("hidden", collapsed);
userRow.classList.toggle("justify-center", collapsed);
}
function toggleCollapse() {
setCollapsed(!sidebar.classList.contains("w-20"));
}
function setTab(tab) {
if (tab === "logout") {
logout();
return;
}
panels.forEach(function (panel) {
panel.classList.toggle("hidden", panel.getAttribute("data-panel") !== tab);
});
meButtons.forEach(function (button) {
const active = button.getAttribute("data-tab") === tab;
button.classList.toggle("bg-[#f5f5f5]", active);
button.classList.toggle("text-gray-900", active);
button.classList.toggle("font-semibold", active);
button.classList.toggle("text-gray-500", !active);
button.classList.toggle("hover:bg-[#f9f9f9]", !active);
button.classList.toggle("hover:text-gray-900", !active);
});
mobileButtons.forEach(function (button) {
const active = button.getAttribute("data-tab") === tab;
button.classList.toggle("text-gray-900", active);
button.classList.toggle("border-b-2", active);
button.classList.toggle("border-primary", active);
button.classList.toggle("text-gray-400", !active);
});
const url = new URL(window.location.href);
if (tab === "profile") url.searchParams.delete("tab");
else url.searchParams.set("tab", tab);
window.history.replaceState({}, "", url.pathname + url.search);
main.scrollTop = 0;
}
void loadRecentSessions();
collapseBtn.addEventListener("click", toggleCollapse);
logoRow.addEventListener("click", goHome);
newChat.addEventListener("click", goGenerate);
userRow.addEventListener("click", function () { setTab("profile"); });
if (certBtn) {
certBtn.classList.add("hidden");
certBtn.addEventListener("click", function (event) { event.stopPropagation(); });
}
meButtons.forEach(function (button) {
button.addEventListener("click", function () { setTab(button.getAttribute("data-tab")); });
});
mobileButtons.forEach(function (button) {
button.addEventListener("click", function () { setTab(button.getAttribute("data-tab")); });
});
if (mobileMenu) mobileMenu.addEventListener("click", function () { mobileDrawer.classList.remove("hidden"); });
if (mobileLogo) mobileLogo.addEventListener("click", goHome);
if (mobileClose) mobileClose.addEventListener("click", function () { mobileDrawer.classList.add("hidden"); });
if (mobileBackdrop) mobileBackdrop.addEventListener("click", function () { mobileDrawer.classList.add("hidden"); });
if (mNewChat) mNewChat.addEventListener("click", function () { mobileDrawer.classList.add("hidden"); goGenerate(); });
if (mUserRow) mUserRow.addEventListener("click", function () { mobileDrawer.classList.add("hidden"); setTab("profile"); });
if (mCertBtn) {
mCertBtn.classList.add("hidden");
mCertBtn.addEventListener("click", function (event) { event.stopPropagation(); });
}
const profilePanel = panels.find(function (p) { return p.getAttribute("data-panel") === "profile"; });
const profileAvatarBox = profilePanel ? profilePanel.querySelector(".w-24.h-24") : null;
const profileNicknameInput = profilePanel ? profilePanel.querySelector('input[type="text"]') : null;
const profileUidEl = profilePanel ? profilePanel.querySelector("span.font-mono") : null;
const regLabelEl = profilePanel ? findLeafByText(profilePanel, "注册时间") : null;
const regValueEl = regLabelEl ? regLabelEl.nextElementSibling : null;
const mobileLabelEl = profilePanel ? findLeafByText(profilePanel, "绑定手机") : null;
const mobileValueEl = mobileLabelEl ? mobileLabelEl.nextElementSibling : null;
const mobileTextEl = mobileValueEl ? mobileValueEl.querySelector("span") : null;
const mobileBadgeEl = mobileValueEl ? mobileValueEl.querySelectorAll("span")[1] : null;
function teamApiBase() {
const base = String(window.__TEAM_API_BASE__ || "");
return base && base.charAt(0) !== "%" ? base.replace(/\/+$/, "") : "";
}
function readStoredUserInfo() {
try {
return JSON.parse(localStorage.getItem("user_info") || "{}") || {};
} catch (error) {
return {};
}
}
function findLeafByText(root, text) {
return Array.prototype.slice.call(root.querySelectorAll("div")).find(function (el) {
return el.children.length === 0 && el.textContent.trim() === text;
}) || null;
}
function formatUserDate(timestamp) {
if (!timestamp) return "-";
const date = new Date(timestamp * 1000);
if (isNaN(date.getTime())) return "-";
return date.getFullYear() + "年 " + String(date.getMonth() + 1).padStart(2, "0") + "月 " + String(date.getDate()).padStart(2, "0") + "日";
}
function maskUserMobile(mobile) {
if (!mobile) return "未绑定";
return mobile.length >= 7 ? mobile.slice(0, 3) + "****" + mobile.slice(-4) : mobile;
}
function setUserAvatar(el, url, iconClass, wrapClass) {
if (!el) return;
el.textContent = "";
if (url) {
const img = document.createElement("img");
img.src = url;
img.alt = "头像";
img.className = "w-full h-full object-cover";
img.addEventListener("error", function () { setUserAvatar(el, "", iconClass, wrapClass); });
el.appendChild(img);
return;
}
const icon = document.createElement("span");
icon.className = iconClass || "material-symbols-outlined text-gray-400";
icon.textContent = "person";
if (wrapClass) {
const wrap = document.createElement("div");
wrap.className = wrapClass;
wrap.appendChild(icon);
el.appendChild(wrap);
return;
}
el.appendChild(icon);
}
function renderUserInfo(info) {
const user = info || readStoredUserInfo();
const nickname = String(user.nickname || "").trim() || "来秒AI 创作者";
const avatar = String(user.avatar || "").trim();
const uid = user.uid ? String(user.uid) : "";
const mobile = String(user.mobile || "").trim();
const addTime = Number(user.add_time || 0);
if (userRow) {
setUserAvatar(userRow.children[0], avatar);
const nameEl = userRow.querySelector("p");
if (nameEl) nameEl.textContent = nickname;
}
if (mUserRow) {
setUserAvatar(mUserRow.children[0], avatar);
const nameEl = mUserRow.querySelector("p");
if (nameEl) nameEl.textContent = nickname;
}
if (profileAvatarBox) {
setUserAvatar(profileAvatarBox, avatar, "material-symbols-outlined text-gray-300 text-4xl", "w-full h-full bg-gray-100 flex items-center justify-center");
}
if (profileNicknameInput) profileNicknameInput.value = nickname;
if (profileUidEl) profileUidEl.textContent = uid || "-";
if (regValueEl) regValueEl.textContent = formatUserDate(addTime);
if (mobileTextEl) mobileTextEl.textContent = maskUserMobile(mobile);
if (mobileBadgeEl) mobileBadgeEl.classList.toggle("hidden", !mobile);
}
async function loadUserInfo() {
renderUserInfo();
const token = localStorage.getItem("access_token");
if (!token) return;
try {
const response = await fetch(teamApiBase() + "/api/user/me", { headers: { Authorization: token } });
if (!response.ok) return;
const data = await response.json();
if (!data || (data.ret !== undefined && data.ret !== 0)) return;
delete data.access_token;
delete data.open_token;
const merged = Object.assign({}, readStoredUserInfo(), data);
localStorage.setItem("user_info", JSON.stringify(merged));
renderUserInfo(merged);
} catch (error) {
console.warn("用户信息加载失败", error);
}
}
let savingProfile = false;
function currentNickname() {
return profileNicknameInput ? profileNicknameInput.value.trim() : String(readStoredUserInfo().nickname || "").trim();
}
async function updateUserProfile(payload) {
const token = localStorage.getItem("access_token");
if (!token) throw new Error("请先登录");
const response = await fetch(teamApiBase() + "/api/user/update", {
method: "PUT",
headers: { "Content-Type": "application/json", Authorization: token },
body: JSON.stringify(payload),
});
if (!response.ok) throw new Error("HTTP " + response.status);
const data = await response.json();
if (!data || (data.ret !== undefined && data.ret !== 0)) {
throw new Error((data && data.msg) || "更新失败");
}
if (data.access_token) localStorage.setItem("access_token", data.access_token);
if (data.open_token) localStorage.setItem("open_token", data.open_token);
const merged = Object.assign({}, readStoredUserInfo(), data);
delete merged.access_token;
delete merged.open_token;
localStorage.setItem("user_info", JSON.stringify(merged));
renderUserInfo(merged);
return merged;
}
async function uploadAvatarDirect(file) {
const token = localStorage.getItem("access_token");
if (!token) throw new Error("请先登录");
const url = new URL(teamApiBase() + "/api/base/upload_url", window.location.origin);
url.searchParams.set("filename", file.name || "avatar.png");
url.searchParams.set("category", "avatar");
const response = await fetch(url.toString(), { headers: { Authorization: token } });
if (!response.ok) throw new Error("HTTP " + response.status);
const data = await response.json();
if (data.ret !== undefined && data.ret !== 0) throw new Error(data.msg || "获取上传凭证失败");
if (!data.put_url || !data.img_url) throw new Error("上传凭证无效");
const putUrl = window.location.protocol === "https:"
? String(data.put_url).replace(/^http:\/\//, "https://")
: String(data.put_url);
await new Promise(function (resolve, reject) {
const xhr = new XMLHttpRequest();
xhr.open("PUT", putUrl);
xhr.setRequestHeader("Content-Type", data.content_type || file.type || "application/octet-stream");
xhr.onerror = function () { reject(new Error("上传失败,网络错误")); };
xhr.onload = function () {
if (xhr.status >= 200 && xhr.status < 300) resolve();
else reject(new Error("上传失败,HTTP " + xhr.status));
};
xhr.send(file);
});
return data.img_url;
}
function uploadAvatarRelay(file) {
return new Promise(function (resolve, reject) {
const form = new FormData();
form.append("imgfile", file);
form.append("category", "avatar");
const xhr = new XMLHttpRequest();
xhr.open("POST", teamApiBase() + "/api/base/imgupload");
xhr.setRequestHeader("Authorization", localStorage.getItem("access_token") || "");
xhr.onerror = function () { reject(new Error("上传失败,网络错误")); };
xhr.onload = function () {
let data = {};
try { data = JSON.parse(xhr.responseText); } catch (error) { data = {}; }
if (xhr.status < 200 || xhr.status >= 300) { reject(new Error("上传失败,HTTP " + xhr.status)); return; }
if (data.ret !== undefined && data.ret !== 0) { reject(new Error(data.msg || "上传失败")); return; }
if (!data.img_url) { reject(new Error("上传失败")); return; }
resolve(data.img_url);
};
xhr.send(form);
});
}
async function uploadAvatar(file) {
try {
return await uploadAvatarDirect(file);
} catch (error) {
console.warn("直传头像失败,尝试服务器中转", error);
return await uploadAvatarRelay(file);
}
}
async function handleAvatarUpload(file) {
if (savingProfile) return;
if (!file.type || file.type.indexOf("image/") !== 0) { showToast("请选择图片文件"); return; }
if (file.size > 2 * 1024 * 1024) { showToast("图片大小不能超过 2MB"); return; }
const nickname = currentNickname();
if (!nickname) { showToast("昵称不能为空"); return; }
if (nickname.length > 16) { showToast("昵称不能超过 16 个字符"); return; }
const stored = readStoredUserInfo();
const previewUrl = URL.createObjectURL(file);
setUserAvatar(profileAvatarBox, previewUrl, "material-symbols-outlined text-gray-300 text-4xl", "w-full h-full bg-gray-100 flex items-center justify-center");
savingProfile = true;
showToast("正在上传头像…");
try {
const avatar = await uploadAvatar(file);
await updateUserProfile({ nickname, avatar, introduce: stored.introduce || "" });
showToast("头像已更新");
} catch (error) {
showToast("头像更新失败:" + (error && error.message ? error.message : error));
renderUserInfo();
} finally {
savingProfile = false;
URL.revokeObjectURL(previewUrl);
}
}
async function saveNickname() {
if (!profileNicknameInput || savingProfile) return;
const stored = readStoredUserInfo();
const nickname = profileNicknameInput.value.trim();
if (nickname === String(stored.nickname || "").trim()) return;
if (!nickname) { showToast("昵称不能为空"); profileNicknameInput.value = stored.nickname || "来秒AI 创作者"; return; }
if (nickname.length > 16) { showToast("昵称不能超过 16 个字符"); profileNicknameInput.value = stored.nickname || ""; return; }
savingProfile = true;
try {
await updateUserProfile({ nickname, avatar: stored.avatar || "", introduce: stored.introduce || "" });
showToast("昵称已更新");
} catch (error) {
showToast("昵称更新失败:" + (error && error.message ? error.message : error));
renderUserInfo();
} finally {
savingProfile = false;
}
}
if (profilePanel) {
const avatarInput = profilePanel.querySelector('input[type="file"]');
const avatarBox = profilePanel.querySelector(".w-24.h-24");
const uploadBtn = Array.prototype.slice.call(profilePanel.querySelectorAll("button")).find(function (b) { return b.textContent.trim() === "上传新头像"; });
if (uploadBtn && avatarInput) uploadBtn.addEventListener("click", function () { avatarInput.click(); });
if (avatarBox && avatarInput) avatarBox.addEventListener("click", function () { avatarInput.click(); });
if (avatarInput) {
avatarInput.addEventListener("change", function () {
const file = avatarInput.files && avatarInput.files[0];
if (!file) return;
handleAvatarUpload(file);
avatarInput.value = "";
});
}
if (profileNicknameInput) {
profileNicknameInput.setAttribute("maxlength", "16");
profileNicknameInput.addEventListener("change", saveNickname);
profileNicknameInput.addEventListener("keydown", function (event) {
if (event.key === "Enter") {
event.preventDefault();
profileNicknameInput.blur();
}
});
}
const copyBtn = Array.prototype.slice.call(profilePanel.querySelectorAll("button")).find(function (b) { return b.textContent.indexOf("复制") !== -1; });
if (copyBtn) copyBtn.addEventListener("click", function () {
const uid = profileUidEl ? profileUidEl.textContent.trim() : "";
if (!uid || uid === "-") { showToast("暂无用户 ID"); return; }
copyText(uid, "用户 ID 已复制");
});
const logoutBtn = Array.prototype.slice.call(profilePanel.querySelectorAll("button")).find(function (b) { return b.textContent.trim() === "退出登录"; });
if (logoutBtn) logoutBtn.addEventListener("click", logout);
}
const invitePanel = panels.find(function (p) { return p.getAttribute("data-panel") === "invite"; });
if (invitePanel) {
const linkEl = invitePanel.querySelector("span.truncate");
const copyBtn = Array.prototype.slice.call(invitePanel.querySelectorAll("button")).find(function (b) { return b.textContent.indexOf("复制链接") !== -1; });
const recordTitle = Array.prototype.slice.call(invitePanel.querySelectorAll("h3")).find(function (h) { return h.textContent.trim() === "邀请记录"; });
const recordHeadRow = recordTitle ? recordTitle.parentElement : null;
const countEl = recordHeadRow
? Array.prototype.slice.call(recordHeadRow.querySelectorAll("span")).find(function (el) { return String(el.className).indexOf("font-bold") !== -1; })
: null;
const recordSection = recordHeadRow ? recordHeadRow.parentElement : null;
let inviteLink = "";
if (copyBtn) {
copyBtn.addEventListener("click", function () {
if (!inviteLink) { showToast("邀请链接加载中,请稍后"); return; }
copyText(inviteLink, "邀请链接已复制");
});
}
loadInviteData();
async function loadInviteData() {
const token = localStorage.getItem("access_token") || "";
if (!token) {
if (linkEl) linkEl.textContent = "登录后获取专属邀请链接";
if (countEl) countEl.textContent = "0";
return;
}
const base = teamApiBase();
const headers = { Authorization: token };
try {
const response = await fetch(base + "/api/team/invite", { headers: headers });
const data = await response.json().catch(function () { return {}; });
if (response.ok && (data.ret === undefined || data.ret === 0) && data.invite_link) {
const code = String(data.invite_link || "").split("/").filter(Boolean).pop() || "";
inviteLink = code
? window.location.origin + "/invite/?code=" + encodeURIComponent(code)
: window.location.origin + data.invite_link;
if (linkEl) linkEl.textContent = inviteLink;
}
} catch (error) {
console.warn("邀请链接加载失败", error);
}
try {
const response = await fetch(base + "/api/user/inviter_list", { headers: headers });
const data = await response.json().catch(function () { return {}; });
const list = Array.isArray(data.data_list) ? data.data_list : [];
if (countEl) countEl.textContent = String(list.length);
renderInviteRecords(list);
} catch (error) {
console.warn("邀请记录加载失败", error);
}
}
function renderInviteRecords(list) {
if (!recordSection) return;
const emptyBox = recordSection.querySelector("div.border.border-gray-200.rounded-lg");
if (!list.length) return;
if (emptyBox) emptyBox.remove();
const wrap = document.createElement("div");
wrap.className = "border border-gray-200 rounded-lg overflow-hidden";
list.forEach(function (item) {
const row = document.createElement("div");
Object.assign(row.style, {
display: "flex",
alignItems: "center",
gap: "12px",
padding: "14px 18px",
borderTop: "1px solid #f1f5f9",
});
const avatar = document.createElement("div");
Object.assign(avatar.style, {
width: "36px",
height: "36px",
borderRadius: "999px",
overflow: "hidden",
background: "#f1f5f9",
flex: "none",
display: "flex",
alignItems: "center",
justifyContent: "center",
color: "#94a3b8",
fontSize: "13px",
});
if (item.avatar) {
const img = document.createElement("img");
img.src = item.avatar;
img.alt = item.nickname || "好友";
img.referrerPolicy = "no-referrer";
Object.assign(img.style, { width: "100%", height: "100%", objectFit: "cover" });
avatar.appendChild(img);
} else {
avatar.textContent = (item.nickname || "好").slice(0, 1);
}
const name = document.createElement("div");
Object.assign(name.style, { flex: "1", minWidth: "0", fontSize: "13px", fontWeight: "600", color: "#111827" });
name.textContent = item.nickname || "微信好友";
name.style.overflow = "hidden";
name.style.textOverflow = "ellipsis";
name.style.whiteSpace = "nowrap";
const time = document.createElement("div");
Object.assign(time.style, { fontSize: "12px", color: "#94a3b8", flex: "none" });
time.textContent = formatInviteTime(item.add_time);
row.appendChild(avatar);
row.appendChild(name);
row.appendChild(time);
wrap.appendChild(row);
});
recordSection.appendChild(wrap);
}
function formatInviteTime(ts) {
if (!ts) return "";
const date = new Date(Number(ts) * 1000);
if (Number.isNaN(date.getTime())) return "";
const pad = function (value) { return String(value).padStart(2, "0"); };
return date.getFullYear() + "-" + pad(date.getMonth() + 1) + "-" + pad(date.getDate());
}
}
function copyText(text, message) {
const done = function () { showToast(message); };
const fallback = function () {
const textarea = document.createElement("textarea");
textarea.value = text;
textarea.setAttribute("readonly", "");
textarea.style.position = "fixed";
textarea.style.top = "-1000px";
textarea.style.left = "-1000px";
document.body.appendChild(textarea);
textarea.select();
textarea.setSelectionRange(0, textarea.value.length);
let ok = false;
try { ok = document.execCommand("copy"); } catch (error) { ok = false; }
document.body.removeChild(textarea);
if (ok) done();
else showToast("复制失败,请手动选择复制");
};
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(done, fallback);
return;
}
fallback();
}
loadUserInfo();
const initialTab = new URLSearchParams(window.location.search).get("tab") || "profile";
if (initialTab && HIDDEN_TABS.indexOf(initialTab) === -1) setTab(initialTab);
})();
</script>
<script>
(function () {
"use strict";
var panel = document.querySelector('[data-panel="certification"]');
if (!panel) return;
panel.innerHTML = '<div id="certRoot"></div>';
var root = document.getElementById("certRoot");
function apiBase() {
var base = String(window.__TEAM_API_BASE__ || "");
return base && base.charAt(0) !== "%" ? base.replace(/\/+$/, "") : "";
}
function teamId() {
var stored = localStorage.getItem("team_id");
if (stored) return stored;
try {
var info = JSON.parse(localStorage.getItem("user_info") || "{}");
return info && info.team_id ? String(info.team_id) : "";
} catch (error) {
return "";
}
}
function token() {
return localStorage.getItem("access_token") || "";
}
var style = document.createElement("style");
style.textContent = ""
+ ".cert-wrap{max-width:896px;margin:0 auto;padding:32px 40px;color:#111827;font-family:'Inter','Noto Sans SC',-apple-system,BlinkMacSystemFont,'PingFang SC',sans-serif}"
+ ".cert-head h1{margin:0 0 8px;font-size:24px;font-weight:700;color:#111827}"
+ ".cert-head p{margin:0 0 40px;font-size:14px;color:#6b7280;line-height:1.6}"
+ ".cert-head b{color:#d97706;font-weight:600}"
+ ".cert-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:96px 0;color:#9ca3af}"
+ ".cert-loading .material-symbols-outlined{font-size:36px;animation:certspin 1s linear infinite;margin-bottom:12px}"
+ "@keyframes certspin{to{transform:rotate(360deg)}}"
+ ".cert-banner{display:flex;align-items:center;gap:8px;padding:12px 24px;border-radius:12px;font-size:13px;font-weight:700;letter-spacing:.02em;margin-bottom:32px}"
+ ".cert-banner--pending{background:#fff7ed;border:1px solid #ffedd5;color:#c2410c}"
+ ".cert-banner--passed{background:#f0fdf4;border:1px solid #dcfce7;color:#15803d}"
+ ".cert-banner--rejected{background:#fef2f2;border:1px solid #fee2e2;color:#dc2626}"
+ ".cert-banner .material-symbols-outlined{font-size:16px}"
+ ".cert-progress h2{margin:0 0 6px;font-size:24px;font-weight:700;letter-spacing:-.01em;color:#111827}"
+ ".cert-progress p{margin:0;font-size:14px;color:#9ca3af}"
+ ".cert-steps{display:flex;width:100%;margin:40px 0 48px}"
+ ".cert-step{position:relative;flex:1;display:flex;flex-direction:column;align-items:center;text-align:center}"
+ ".cert-step-line{position:absolute;left:50%;top:12px;width:100%;height:1px;background:#f3f4f6}"
+ ".cert-step:last-child .cert-step-line{display:none}"
+ ".cert-dot{z-index:2;width:24px;height:24px;border-radius:999px;display:flex;align-items:center;justify-content:center;background:#fff;border:2px solid #e5e7eb;box-shadow:0 0 0 4px #fff;color:#d1d5db}"
+ ".cert-dot .material-symbols-outlined{font-size:14px}"
+ ".cert-dot--done{background:#000;border-color:#000;color:#fff}"
+ ".cert-dot--current{border-color:#000;color:#000}"
+ ".cert-dot--current .inner{width:6px;height:6px;border-radius:999px;background:#000}"
+ ".cert-dot--error{background:#ef4444;border-color:#ef4444;color:#fff}"
+ ".cert-step-label{margin-top:12px;font-size:14px;font-weight:700;color:#111827}"
+ ".cert-step-label--muted{color:#111827;font-weight:500}"
+ ".cert-step-label--error{color:#dc2626}"
+ ".cert-step-sub{margin-top:4px;font-size:12px;color:#9ca3af}"
+ ".cert-step-sub--error{color:#f87171}"
+ ".cert-status-card{background:#f9fafb;border:1px solid #f3f4f6;border-radius:16px;padding:28px 32px;margin-bottom:40px;position:relative;overflow:hidden}"
+ ".cert-status-line{display:flex;align-items:center;gap:12px;font-size:16px;font-weight:700;color:#111827;margin-bottom:12px}"
+ ".cert-status-line .material-symbols-outlined{font-size:22px}"
+ ".cert-status-line .state{font-weight:700}"
+ ".cert-status-card p{margin:0;font-size:12px;color:#6b7280;line-height:1.8;max-width:560px}"
+ ".cert-status-card .reason{margin-top:8px;color:#dc2626}"
+ ".cert-tone--passed{color:#16a34a}"
+ ".cert-tone--pending{color:#ea580c}"
+ ".cert-tone--rejected{color:#dc2626}"
+ ".cert-support{background:#fff;border:1px solid #e5e7eb;border-radius:16px;padding:24px 32px;margin-bottom:40px}"
+ ".cert-support h3{margin:0 0 16px;font-size:16px;font-weight:700;display:flex;align-items:center;gap:12px;color:#111827}"
+ ".cert-support p{margin:0 0 12px;font-size:12px;color:#6b7280;line-height:1.8}"
+ ".cert-support-body{display:flex;align-items:center;gap:24px;flex-wrap:wrap}"
+ ".cert-qr{width:144px;height:144px;flex:none;border:1px solid #e5e7eb;border-radius:12px;background:#fff;padding:8px;display:flex;align-items:center;justify-content:center;overflow:hidden}"
+ ".cert-qr img{width:100%;height:100%;object-fit:contain}"
+ ".cert-support-text{flex:1;min-width:220px}"
+ ".cert-code-box{display:inline-flex;align-items:center;gap:12px;background:#f9fafb;border:1px solid #e5e7eb;border-radius:10px;padding:8px 16px}"
+ ".cert-code-box span{font-size:12px;color:#6b7280}"
+ ".cert-code-box b{font-size:18px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.3em;color:#111827}"
+ ".cert-btn{display:inline-flex;align-items:center;justify-content:center;padding:14px 32px;border-radius:12px;border:0;background:#000;color:#fff;font-size:14px;font-weight:700;cursor:pointer;transition:background .2s ease,transform .15s ease}"
+ ".cert-btn:hover{background:#1f2937}"
+ ".cert-btn:active{transform:scale(.98)}"
+ ".cert-btn:disabled{opacity:.6;cursor:not-allowed}"
+ ".cert-btn--ghost{background:#fff;color:#374151;border:1px solid #e5e7eb}"
+ ".cert-btn--ghost:hover{background:#f9fafb}"
+ ".cert-preview h3{margin:0 0 24px;font-size:11px;font-weight:700;letter-spacing:.14em;color:#9ca3af;display:flex;align-items:center;gap:8px;text-transform:uppercase}"
+ ".cert-preview h3::before{content:'';width:4px;height:12px;border-radius:999px;background:#e5e7eb}"
+ ".cert-preview-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:28px 48px}"
+ ".cert-preview-label{margin:0 0 6px;font-size:11px;font-weight:600;letter-spacing:.05em;color:#9ca3af;text-transform:uppercase}"
+ ".cert-preview-value{margin:0;font-size:14px;font-weight:500;color:#111827;word-break:break-all}"
+ ".cert-preview-full{grid-column:1 / -1}"
+ ".cert-license-img{display:block;max-height:224px;max-width:100%;border-radius:12px;border:1px solid #f3f4f6;background:#f9fafb;cursor:zoom-in;object-fit:contain}"
+ ".cert-license-empty{margin-top:12px;width:160px;height:190px;border-radius:12px;background:#f9fafb;border:1px solid #f3f4f6;display:flex;align-items:center;justify-content:center;color:#d1d5db}"
+ ".cert-form{max-width:576px}"
+ ".cert-section{margin-bottom:40px}"
+ ".cert-section h3{margin:0 0 24px;font-size:14px;font-weight:700;color:#111827;display:flex;align-items:center;gap:8px}"
+ ".cert-section h3::before{content:'';width:4px;height:16px;border-radius:999px;background:#000}"
+ ".cert-field{margin-bottom:24px}"
+ ".cert-label{display:block;margin-bottom:8px;font-size:11px;font-weight:600;letter-spacing:.08em;color:#6b7280;text-transform:uppercase}"
+ ".cert-input{width:100%;padding:12px 16px;border:1px solid #e5e7eb;border-radius:8px;font-size:14px;color:#111827;outline:none;transition:border-color .2s ease;background:#fff}"
+ ".cert-input:focus{border-color:#000}"
+ ".cert-input--error{border-color:#ef4444}"
+ ".cert-error{margin:4px 0 0;font-size:11px;color:#ef4444}"
+ ".cert-hint{margin:4px 0 0;font-size:11px;color:#9ca3af}"
+ ".cert-dropzone{border:2px dashed #e5e7eb;border-radius:12px;padding:32px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:rgba(249,250,251,.5);cursor:pointer;transition:background .2s ease,border-color .2s ease}"
+ ".cert-dropzone:hover{background:#f9fafb}"
+ ".cert-dropzone--error{border-color:#ef4444}"
+ ".cert-dropzone .material-symbols-outlined{font-size:30px;color:#9ca3af;margin-bottom:8px}"
+ ".cert-dropzone p{margin:0;font-size:14px;font-weight:500;color:#6b7280}"
+ ".cert-dropzone small{display:block;margin-top:4px;font-size:10px;color:#9ca3af}"
+ ".cert-license-box{position:relative;border:2px dashed #e5e7eb;border-radius:12px;padding:16px;display:flex;align-items:center;justify-content:center;background:rgba(249,250,251,.5)}"
+ ".cert-license-remove{position:absolute;top:-8px;right:-8px;width:24px;height:24px;border-radius:999px;border:0;background:#6b7280;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center}"
+ ".cert-license-remove .material-symbols-outlined{font-size:16px}"
+ ".cert-code-row{display:flex;gap:12px}"
+ ".cert-code-row .cert-input{flex:1}"
+ ".cert-send{flex:none;padding:12px 24px;border:1px solid #e5e7eb;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#111827;cursor:pointer;white-space:nowrap;transition:border-color .2s ease,transform .15s ease}"
+ ".cert-send:hover{border-color:#000;transform:scale(1.02)}"
+ ".cert-send:disabled{opacity:.6;cursor:not-allowed;transform:none}"
+ ".cert-submit{width:100%;padding:16px;border:0;border-radius:12px;background:#000;color:#fff;font-size:14px;font-weight:700;cursor:pointer;box-shadow:0 12px 24px -12px rgba(0,0,0,.4);transition:background .2s ease,transform .15s ease}"
+ ".cert-submit:hover{background:#1f2937}"
+ ".cert-submit:active{transform:scale(.98)}"
+ ".cert-submit:disabled{opacity:.6;cursor:not-allowed}"
+ ".cert-agree{margin:16px 0 0;text-align:center;font-size:10px;color:#9ca3af}"
+ ".cert-agree a{color:#6b7280;text-decoration:underline;text-underline-offset:2px}"
+ ".cert-back{display:inline-flex;align-items:center;gap:8px;margin-bottom:32px;border:0;background:transparent;color:#6b7280;font-size:14px;cursor:pointer}"
+ ".cert-back:hover{color:#111827}"
+ ".cert-lightbox{position:fixed;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;padding:24px;background:rgba(0,0,0,.8)}"
+ ".cert-lightbox img{max-width:92vw;max-height:88vh;border-radius:12px;background:#fff;box-shadow:0 24px 60px -20px rgba(0,0,0,.6)}"
+ ".cert-lightbox button{position:absolute;top:20px;right:20px;width:40px;height:40px;border-radius:999px;border:0;background:rgba(255,255,255,.15);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center}"
+ ".cert-toast{position:fixed;left:50%;bottom:36px;transform:translateX(-50%) translateY(10px);padding:10px 18px;border-radius:999px;background:rgba(16,20,16,.9);color:#fff;font-size:13px;opacity:0;pointer-events:none;transition:opacity .2s ease,transform .2s ease;z-index:130}"
+ ".cert-toast.show{opacity:1;transform:translateX(-50%) translateY(0)}"
+ "@media(max-width:640px){.cert-wrap{padding:24px 16px}.cert-preview-grid{grid-template-columns:1fr}.cert-progress h2{font-size:20px}.cert-head h1{font-size:20px}}";
document.head.appendChild(style);
var toastEl = document.createElement("div");
toastEl.className = "cert-toast";
document.body.appendChild(toastEl);
var toastTimer = 0;
function toast(message) {
toastEl.textContent = message;
toastEl.classList.add("show");
window.clearTimeout(toastTimer);
toastTimer = window.setTimeout(function () { toastEl.classList.remove("show"); }, 2600);
}
var state = {
loading: true,
view: "form",
certState: -1,
addTime: 0,
reason: "",
companyName: "",
verifyCode: "",
detail: null,
hasRecord: false,
resubmit: false,
sending: false,
countdown: 0,
submitting: false,
checking: false,
licenseUrl: "",
licenseName: "",
error: "",
form: { companyName: "", creditCode: "", contactName: "", contactPosition: "", contactPhone: "", code: "" }
};
function currentTeam() {
var id = teamId();
return id && id !== "0" ? id : "";
}
function fmtDate(ts) {
var date = ts ? new Date(Number(ts) * 1000) : new Date();
if (Number.isNaN(date.getTime())) date = new Date();
var pad = function (n) { return String(n).padStart(2, "0"); };
return date.getFullYear() + "年 " + pad(date.getMonth() + 1) + "月 " + pad(date.getDate()) + "日";
}
function maskPhone(mobile) {
if (!mobile || mobile.length < 11) return mobile || "-";
return mobile.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
}
async function request(path, options) {
var opts = options || {};
var headers = Object.assign({}, opts.headers || {});
if (opts.auth !== false) headers.Authorization = token();
if (opts.body && !headers["Content-Type"]) headers["Content-Type"] = "application/json";
var response = await fetch(apiBase() + path, Object.assign({}, opts, { headers: headers }));
var data = {};
try { data = await response.json(); } catch (error) { data = {}; }
return { ok: response.ok, status: response.status, data: data };
}
async function load() {
state.loading = true;
state.error = "";
render();
var id = currentTeam();
if (!id || !token()) {
state.loading = false;
state.view = "form";
render();
return;
}
try {
var stateRes = await request("/api/company/state?team_id=" + encodeURIComponent(id));
if (stateRes.ok && stateRes.data && (stateRes.data.ret === undefined || stateRes.data.ret === 0)) {
state.certState = Number(stateRes.data.state || 0);
state.addTime = Number(stateRes.data.add_time || 0);
state.reason = stateRes.data.reason || "";
state.companyName = stateRes.data.company_name || "";
state.verifyCode = stateRes.data.code ? String(stateRes.data.code) : "";
} else {
state.certState = -1;
}
} catch (error) {
state.certState = -1;
}
try {
var detailRes = await request("/api/company/detail?team_id=" + encodeURIComponent(id));
if (detailRes.ok && detailRes.data && (detailRes.data.ret === undefined || detailRes.data.ret === 0)) {
state.detail = detailRes.data;
state.hasRecord = !!(detailRes.data.company_name || detailRes.data.company_code || detailRes.data.business_license);
if (!state.companyName) state.companyName = detailRes.data.company_name || "";
} else {
state.detail = null;
state.hasRecord = false;
}
} catch (error) {
state.detail = null;
state.hasRecord = false;
}
if (state.certState === 1) state.view = "passed";
else if (state.certState === 2) state.view = "rejected";
else if (state.hasRecord) state.view = "pending";
else state.view = "form";
state.loading = false;
render();
}
function stepMarkup(steps) {
return '<div class="cert-steps">' + steps.map(function (step, index) {
var dot = '<div class="cert-dot ' + (step.dotClass || "") + '">' + (step.icon ? '<span class="material-symbols-outlined">' + step.icon + "</span>" : step.inner || "") + "</div>";
var line = index < steps.length - 1 ? '<div class="cert-step-line"></div>' : "";
return '<div class="cert-step">' + line + dot
+ '<p class="cert-step-label ' + (step.labelClass || "") + '">' + step.label + "</p>"
+ (step.sub ? '<p class="cert-step-sub ' + (step.subClass || "") + '">' + step.sub + "</p>" : "")
+ "</div>";
}).join("") + "</div>";
}
function renderStatus() {
var view = state.view;
var detail = state.detail || {};
var tone = view === "passed" ? "passed" : view === "rejected" ? "rejected" : "pending";
var banner = view === "passed"
? '<div class="cert-banner cert-banner--passed"><span class="material-symbols-outlined">verified</span><p>已通过企业认证</p></div>'
: view === "rejected"
? '<div class="cert-banner cert-banner--rejected"><span class="material-symbols-outlined">error</span><p>认证未通过,修改资料后可重新提交</p></div>'
: '<div class="cert-banner cert-banner--pending"><span class="material-symbols-outlined">redeem</span><p>认证成功后,系统将赠送 <span style="color:#c2410c">1000</span> 算力积分</p></div>';
var subtitle = view === "passed"
? "您的账号已通过官方企业身份认证"
: view === "rejected"
? "您的认证资料未通过审核,请修改后重新提交"
: "您的资料已提交,正在等待审核";
var step2 = view === "passed"
? { dotClass: "cert-dot--done", icon: "check", label: "资料审核中", sub: "已通过" }
: view === "rejected"
? { dotClass: "cert-dot--error", icon: "close", label: "资料审核未通过", labelClass: "cert-step-label--error", sub: "未通过", subClass: "cert-step-sub--error" }
: { dotClass: "cert-dot--current", inner: '<div class="inner"></div>', label: "资料审核中", sub: "当前阶段" };
var steps = stepMarkup([
{ dotClass: "cert-dot--done", icon: "check", label: "提交成功", sub: fmtDate(state.addTime) },
step2,
{
dotClass: view === "passed" ? "cert-dot--done" : "",
icon: view === "passed" ? "check" : "circle",
label: "认证完成",
labelClass: view === "passed" ? "" : "cert-step-label--muted",
sub: "+1000 积分",
subClass: view === "passed" ? "" : "cert-step-sub--error"
}
]);
var statusText = view === "passed" ? "通过" : view === "rejected" ? "未通过" : "审核中";
var statusIcon = view === "passed" ? "verified" : view === "rejected" ? "error" : "pending_actions";
var statusDesc = view === "passed"
? "恭喜,您的企业已通过官方认证,认证标识已生效。"
: view === "rejected"
? "很抱歉,您提交的资料未通过审核。请核对机构名称、统一社会信用代码与营业执照是否一致后重新提交,或联系客服协助处理。"
: "预计一个工作日内完成,审核结果将通过站内信通知您。如资料有误,我们将开放编辑权限并通知您重新提交。";
var support = view === "pending"
? '<div class="cert-support">'
+ '<h3><span class="material-symbols-outlined">support_agent</span>添加客服,完成认证</h3>'
+ '<div class="cert-support-body">'
+ '<div class="cert-qr"><img src="https://public.laimiaoai.com/tripcn.ai/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20260923172649_973_5.png" alt="客服微信二维码" referrerpolicy="no-referrer" /></div>'
+ '<div class="cert-support-text">'
+ '<p>扫描二维码添加客服微信好友,发送验证码,认证完成即可获得 <span style="color:#ea580c;font-weight:700">1000</span> 算力积分。</p>'
+ '<div class="cert-code-box"><span>您的验证码</span><b>' + (state.verifyCode || "——") + "</b></div>"
+ "</div></div></div>"
: "";
var resubmit = view === "rejected"
? '<div style="margin-bottom:40px"><button type="button" class="cert-btn" id="certResubmit">重新提交认证</button></div>'
: "";
var license = detail.business_license
? '<img class="cert-license-img" id="certLicensePreview" src="' + detail.business_license + '" alt="营业执照" referrerpolicy="no-referrer" />'
: '<div class="cert-license-empty"><span class="material-symbols-outlined" style="font-size:36px">image</span></div>';
return '<div class="cert-wrap">'
+ '<header class="cert-head"><h1>企业认证</h1><p>提交企业资质资料,认证成功后可获得认证标识并赠送 <b>1000</b> 算力积分。</p></header>'
+ banner
+ '<div class="cert-progress"><h2>企业认证进度</h2><p>' + subtitle + "</p></div>"
+ steps
+ '<div class="cert-status-card">'
+ '<div class="cert-status-line"><span class="material-symbols-outlined cert-tone--' + tone + '">' + statusIcon + "</span>"
+ "<span>审核状态 <span class=\"state cert-tone--" + tone + '">' + statusText + "</span></span></div>"
+ "<p>" + statusDesc + "</p>"
+ (view === "rejected" && state.reason ? '<p class="reason">未通过原因:' + state.reason + "</p>" : "")
+ "</div>"
+ support
+ resubmit
+ '<div class="cert-preview"><h3>已提交资料预览</h3><div class="cert-preview-grid">'
+ '<div><p class="cert-preview-label">企业名称</p><p class="cert-preview-value">' + (detail.company_name || "-") + "</p></div>"
+ '<div><p class="cert-preview-label">统一社会信用代码</p><p class="cert-preview-value">' + (detail.company_code || "-") + "</p></div>"
+ '<div><p class="cert-preview-label">联系人</p><p class="cert-preview-value">' + (detail.contact_name || "-") + "</p></div>"
+ '<div><p class="cert-preview-label">联系人手机号</p><p class="cert-preview-value">' + maskPhone(detail.contact_mobile) + "</p></div>"
+ '<div class="cert-preview-full"><p class="cert-preview-label">营业执照副本</p>' + license + "</div>"
+ "</div></div></div>";
}
function renderForm() {
var f = state.form;
var err = state.errors || {};
var licenseBlock = state.licenseUrl
? '<div class="cert-license-box"><img class="cert-license-img" id="certLicensePreview" src="' + state.licenseUrl + '" alt="营业执照预览" referrerpolicy="no-referrer" />'
+ '<button type="button" class="cert-license-remove" id="certLicenseRemove" aria-label="移除营业执照"><span class="material-symbols-outlined">close</span></button></div>'
: '<div class="cert-dropzone ' + (err.license ? "cert-dropzone--error" : "") + '" id="certDropzone">'
+ '<input type="file" id="certLicenseInput" accept=".jpg,.jpeg,.png,.pdf" style="display:none" />'
+ '<span class="material-symbols-outlined">upload_file</span><p>点击上传文件</p><small>支持 JPG, PNG, PDF 格式(最大 15MB)</small></div>';
return '<div class="cert-wrap">'
+ '<header class="cert-head"><h1>企业认证</h1><p>提交企业资质资料,认证成功后可获得认证标识并赠送 <b>1000</b> 算力积分。</p></header>'
+ (state.resubmit ? '<button type="button" class="cert-back" id="certBack"><span class="material-symbols-outlined" style="font-size:18px">arrow_back</span>返回认证进度</button>' : "")
+ '<form class="cert-form" id="certForm">'
+ '<div class="cert-section"><h3>企业信息</h3>'
+ '<div class="cert-field" id="certLicenseField"><label class="cert-label">营业执照</label>' + licenseBlock
+ (err.license ? '<p class="cert-error">' + err.license + "</p>" : "") + "</div>"
+ '<div class="cert-field"><label class="cert-label">企业名称</label>'
+ '<input class="cert-input ' + (err.companyName ? "cert-input--error" : "") + '" id="fCompanyName" type="text" maxlength="30" placeholder="请输入企业全称" value="' + escapeAttr(f.companyName) + '" />'
+ (err.companyName ? '<p class="cert-error">' + err.companyName + "</p>" : "") + "</div>"
+ '<div class="cert-field"><label class="cert-label">统一社会信用代码</label>'
+ '<input class="cert-input ' + (err.creditCode ? "cert-input--error" : "") + '" id="fCreditCode" type="text" maxlength="18" placeholder="18位统一社会信用代码" value="' + escapeAttr(f.creditCode) + '" />'
+ '<div id="certCreditMsg">' + (err.creditCode ? '<p class="cert-error">' + err.creditCode + "</p>" : (state.checking ? '<p class="cert-hint">正在校验统一社会信用代码…</p>' : "")) + "</div>"
+ "</div></div>"
+ '<div class="cert-section"><h3>联系人信息</h3>'
+ '<div class="cert-field"><label class="cert-label">联系人</label>'
+ '<input class="cert-input ' + (err.contactName ? "cert-input--error" : "") + '" id="fContactName" type="text" maxlength="10" placeholder="请输入姓名" value="' + escapeAttr(f.contactName) + '" />'
+ (err.contactName ? '<p class="cert-error">' + err.contactName + "</p>" : "") + "</div>"
+ '<div class="cert-field"><label class="cert-label">联系人职位</label>'
+ '<input class="cert-input ' + (err.contactPosition ? "cert-input--error" : "") + '" id="fContactPosition" type="text" maxlength="20" placeholder="请输入职位" value="' + escapeAttr(f.contactPosition) + '" />'
+ (err.contactPosition ? '<p class="cert-error">' + err.contactPosition + "</p>" : "") + "</div>"
+ '<div class="cert-field"><label class="cert-label">联系人手机</label>'
+ '<input class="cert-input ' + (err.contactPhone ? "cert-input--error" : "") + '" id="fContactPhone" type="tel" maxlength="11" placeholder="请输入11位手机号码" value="' + escapeAttr(f.contactPhone) + '" />'
+ (err.contactPhone ? '<p class="cert-error">' + err.contactPhone + "</p>" : "") + "</div>"
+ '<div class="cert-field"><label class="cert-label">验证码</label><div class="cert-code-row">'
+ '<input class="cert-input ' + (err.code ? "cert-input--error" : "") + '" id="fCode" type="text" maxlength="6" placeholder="请输入验证码" value="' + escapeAttr(f.code) + '" />'
+ '<button class="cert-send" type="button" id="certSendCode" ' + (state.sending || state.countdown > 0 ? "disabled" : "") + ">"
+ (state.countdown > 0 ? state.countdown + "s" : "获取验证码") + "</button></div>"
+ (err.code ? '<p class="cert-error">' + err.code + "</p>" : "") + "</div></div>"
+ '<div><button class="cert-submit" type="button" id="certSubmit" ' + (state.submitting ? "disabled" : "") + ">" + (state.submitting ? "提交中..." : "提交认证") + "</button>"
+ '<p class="cert-agree">提交即代表您同意 <a href="#">《来秒AI 用户服务协议》</a></p></div>'
+ "</form></div>";
}
function escapeAttr(value) {
return String(value == null ? "" : value)
.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}
function render() {
if (state.loading) {
root.innerHTML = '<div class="cert-wrap"><div class="cert-loading"><span class="material-symbols-outlined">progress_activity</span><p>正在加载认证状态…</p></div></div>';
return;
}
root.innerHTML = state.view === "form" ? renderForm() : renderStatus();
bind();
}
function readForm() {
var get = function (id) { var el = document.getElementById(id); return el ? el.value.trim() : ""; };
state.form.companyName = get("fCompanyName");
state.form.creditCode = get("fCreditCode");
state.form.contactName = get("fContactName");
state.form.contactPosition = get("fContactPosition");
state.form.contactPhone = get("fContactPhone");
state.form.code = get("fCode");
}
function bind() {
var resubmitBtn = document.getElementById("certResubmit");
if (resubmitBtn) {
resubmitBtn.addEventListener("click", function () {
var d = state.detail || {};
state.form = {
companyName: d.company_name || "",
creditCode: d.company_code || "",
contactName: d.contact_name || "",
contactPosition: d.contact_station || d.contact_rank || "",
contactPhone: d.contact_mobile || "",
code: ""
};
state.licenseUrl = d.business_license || "";
state.resubmit = true;
state.errors = {};
state.view = "form";
render();
});
}
var backBtn = document.getElementById("certBack");
if (backBtn) {
backBtn.addEventListener("click", function () {
state.resubmit = false;
state.view = state.certState === 1 ? "passed" : state.certState === 2 ? "rejected" : "pending";
render();
});
}
bindLicense();
var creditInput = document.getElementById("fCreditCode");
if (creditInput) {
creditInput.addEventListener("blur", function () { void checkCreditCode(creditInput.value.trim()); });
}
var sendBtn = document.getElementById("certSendCode");
if (sendBtn) {
sendBtn.addEventListener("click", function () { void sendCode(); });
}
var submitBtn = document.getElementById("certSubmit");
if (submitBtn) {
submitBtn.addEventListener("click", function () { void submit(); });
}
var form = document.getElementById("certForm");
if (form) {
form.addEventListener("submit", function (event) { event.preventDefault(); });
}
}
function licenseBlockMarkup() {
if (state.licenseUrl) {
return '<div class="cert-license-box"><img class="cert-license-img" id="certLicensePreview" src="' + escapeAttr(state.licenseUrl) + '" alt="营业执照预览" referrerpolicy="no-referrer" />'
+ '<button type="button" class="cert-license-remove" id="certLicenseRemove" aria-label="移除营业执照"><span class="material-symbols-outlined">close</span></button></div>';
}
return '<div class="cert-dropzone" id="certDropzone">'
+ '<input type="file" id="certLicenseInput" accept=".jpg,.jpeg,.png,.pdf" style="display:none" />'
+ '<span class="material-symbols-outlined">upload_file</span><p>点击上传文件</p><small>支持 JPG、PNG、PDF 格式(最大 15MB)</small></div>';
}
function refreshLicenseBlock() {
var field = document.getElementById("certLicenseField");
if (!field) return;
var existing = field.querySelector(".cert-dropzone, .cert-license-box");
if (existing) existing.outerHTML = licenseBlockMarkup();
else field.insertAdjacentHTML("beforeend", licenseBlockMarkup());
bindLicense();
}
function bindLicense() {
var preview = document.getElementById("certLicensePreview");
if (preview) {
preview.addEventListener("click", function () { openLightbox(preview.getAttribute("src")); });
}
var dropzone = document.getElementById("certDropzone");
var fileInput = document.getElementById("certLicenseInput");
if (dropzone && fileInput) {
dropzone.addEventListener("click", function () { fileInput.click(); });
fileInput.addEventListener("change", function () {
var file = fileInput.files && fileInput.files[0];
if (file) void uploadLicense(file);
});
}
var removeLicense = document.getElementById("certLicenseRemove");
if (removeLicense) {
removeLicense.addEventListener("click", function () {
state.licenseUrl = "";
state.licenseName = "";
refreshLicenseBlock();
});
}
}
function openLightbox(src) {
if (!src) return;
var box = document.createElement("div");
box.className = "cert-lightbox";
box.innerHTML = '<button type="button" aria-label="关闭"><span class="material-symbols-outlined">close</span></button><img alt="营业执照" referrerpolicy="no-referrer" src="' + escapeAttr(src) + '" />';
box.addEventListener("click", function (event) {
if (event.target === box || (event.target.closest && event.target.closest("button"))) box.remove();
});
document.body.appendChild(box);
}
async function uploadLicense(file) {
if (file.size > 15 * 1024 * 1024) { toast("营业执照不能超过 15MB"); return; }
if (!token()) { toast("请先登录"); return; }
var formData = new FormData();
formData.append("imgfile", file);
formData.append("category", "company");
var dropzone = document.getElementById("certDropzone");
if (dropzone) dropzone.style.opacity = "0.6";
try {
var response = await fetch(apiBase() + "/api/base/imgupload", {
method: "POST",
headers: { Authorization: token() },
body: formData
});
var data = {};
try { data = await response.json(); } catch (error) { data = {}; }
if (!response.ok || (data.ret !== undefined && data.ret !== 0) || !data.img_url) {
throw new Error(data.msg || "上传失败");
}
state.licenseUrl = data.img_url;
state.licenseName = file.name;
toast("营业执照已上传");
refreshLicenseBlock();
} catch (error) {
toast(error instanceof Error ? error.message : "上传失败");
if (dropzone) dropzone.style.opacity = "";
}
}
function setFieldError(inputId, message) {
var input = document.getElementById(inputId);
if (!input) return;
input.classList.toggle("cert-input--error", !!message);
var next = input.nextElementSibling;
if (next && next.classList && next.classList.contains("cert-error")) {
if (message) next.textContent = message;
else next.remove();
} else if (message) {
var p = document.createElement("p");
p.className = "cert-error";
p.textContent = message;
input.parentElement.insertBefore(p, input.nextSibling);
}
}
function setCreditMessage(html) {
var box = document.getElementById("certCreditMsg");
if (box) box.innerHTML = html;
}
async function checkCreditCode(code) {
if (!code || !/^[0-9A-Z]{18}$/.test(code)) return;
setCreditMessage('<p class="cert-hint">正在校验统一社会信用代码…</p>');
try {
var res = await request("/api/company/check_code?company_code=" + encodeURIComponent(code) + "&team_id=" + encodeURIComponent(currentTeam()) + "&app_type=0", { auth: false });
if (res.ok && res.data && res.data.ret !== undefined && res.data.ret !== 0) {
setFieldError("fCreditCode", res.data.msg || "该营业执照不可用");
setCreditMessage('');
} else {
setFieldError("fCreditCode", "");
setCreditMessage('');
}
} catch (error) {
setCreditMessage('');
}
}
async function sendCode() {
if (state.sending || state.countdown > 0) return;
readForm();
var mobile = state.form.contactPhone;
if (!/^1\d{10}$/.test(mobile)) {
setFieldError("fContactPhone", "请输入正确的手机号");
return;
}
setFieldError("fContactPhone", "");
var btn = document.getElementById("certSendCode");
if (btn) { btn.disabled = true; btn.textContent = "发送中…"; }
try {
var res = await request("/api/user/get_signin_code?mobile=" + encodeURIComponent(mobile), { auth: false });
if (!res.ok || (res.data.ret !== undefined && res.data.ret !== 0)) {
throw new Error((res.data && res.data.msg) || "验证码发送失败");
}
toast("验证码已发送");
state.countdown = 60;
window.clearInterval(state.timer);
if (btn) { btn.disabled = true; btn.textContent = state.countdown + "s"; }
state.timer = window.setInterval(function () {
state.countdown -= 1;
if (state.countdown <= 0) {
window.clearInterval(state.timer);
state.countdown = 0;
if (btn) { btn.disabled = false; btn.textContent = "获取验证码"; }
return;
}
if (btn) btn.textContent = state.countdown + "s";
}, 1000);
} catch (error) {
toast(error instanceof Error ? error.message : "验证码发送失败");
if (btn) { btn.disabled = false; btn.textContent = "获取验证码"; }
}
}
async function submit() {
if (state.submitting) return;
readForm();
var f = state.form;
var errors = {};
if (!state.licenseUrl) errors.license = "请上传营业执照";
if (!f.companyName) errors.companyName = "请填写企业名称";
if (!/^[0-9A-Z]{18}$/.test(f.creditCode)) errors.creditCode = "请输入 18 位统一社会信用代码";
if (!f.contactName) errors.contactName = "请填写联系人";
if (!f.contactPosition) errors.contactPosition = "请填写联系人职位";
if (!/^1\d{10}$/.test(f.contactPhone)) errors.contactPhone = "请输入正确的手机号";
if (!/^\d{4,6}$/.test(f.code)) errors.code = "请填写短信验证码";
state.errors = errors;
setFieldError("fCompanyName", errors.companyName || "");
setFieldError("fCreditCode", errors.creditCode || "");
setFieldError("fContactName", errors.contactName || "");
setFieldError("fContactPosition", errors.contactPosition || "");
setFieldError("fContactPhone", errors.contactPhone || "");
setFieldError("fCode", errors.code || "");
var licenseField = document.getElementById("certLicenseField");
var licenseError = document.getElementById("certLicenseError");
if (errors.license) {
if (!licenseError && licenseField) {
licenseError = document.createElement("p");
licenseError.className = "cert-error";
licenseError.id = "certLicenseError";
licenseField.appendChild(licenseError);
}
if (licenseError) licenseError.textContent = errors.license;
} else if (licenseError) {
licenseError.remove();
}
if (Object.keys(errors).length) return;
var id = currentTeam();
if (!id) { toast("请先登录"); return; }
state.submitting = true;
var submitBtn = document.getElementById("certSubmit");
if (submitBtn) { submitBtn.disabled = true; submitBtn.textContent = "提交中..."; }
try {
var res = await request("/api/company/upload", {
method: "POST",
body: JSON.stringify({
team_id: id,
app_type: 0,
company_name: f.companyName,
company_code: f.creditCode,
business_license: state.licenseUrl,
contact_name: f.contactName,
contact_station: f.contactPosition,
contact_rank: f.contactPosition,
contact_mobile: f.contactPhone,
auth_code: f.code,
code: ""
})
});
if (!res.ok || (res.data.ret !== undefined && res.data.ret !== 0)) {
throw new Error((res.data && (res.data.msg || res.data.detail)) || "提交失败");
}
toast("认证申请已提交,请等待审核");
state.resubmit = false;
state.submitting = false;
await load();
} catch (error) {
state.submitting = false;
toast(error instanceof Error ? error.message : "提交失败");
if (submitBtn) { submitBtn.disabled = false; submitBtn.textContent = "提交认证"; }
}
}
load();
})();
</script>
</body>
</html>