2723 lines
178 KiB
HTML
2723 lines
178 KiB
HTML
<!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 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") {
|
||
showToast("已退出登录(演示)");
|
||
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", function () { showToast("已退出登录(演示)"); });
|
||
}
|
||
|
||
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, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
||
}
|
||
|
||
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>
|