diff --git a/.gitignore b/.gitignore index 0dd185c..94d6ef6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ assets/docs/AI-Revolution/稿子.txt projects0.html .claude/ projects/ytmsg/ -docs/ \ No newline at end of file +docs/ +.DS_Store diff --git a/assets/css/style.css b/assets/css/style.css index 77178c8..606ce2b 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -1,41 +1,1241 @@ -/* 引入 Google Fonts 在 HTML Head 中完成,这里处理自定义样式 */ +/* UESTC IA shared design system */ +:root { + --ia-bg: #f6f4ef; + --ia-bg-wash: #e7ece9; + --ia-surface: rgba(255, 255, 255, 0.58); + --ia-surface-strong: rgba(255, 255, 255, 0.78); + --ia-ink: #27313a; + --ia-muted: #68757b; + --ia-soft: #8da0a0; + --ia-line: rgba(109, 125, 128, 0.22); + --ia-primary: #6f8f92; + --ia-primary-deep: #4d6f73; + --ia-accent: #b8a783; + --ia-rose-wash: #d8c7c4; + --ia-shadow: 0 24px 80px rgba(52, 68, 72, 0.14); + --ia-shadow-soft: 0 14px 42px rgba(52, 68, 72, 0.1); + --ia-radius: 8px; +} + +* { + box-sizing: border-box; +} + +html { + background: var(--ia-bg); +} -/* 全局背景:极其微妙的神经网络连接图 */ body { - background-color: #F8FAFC; /* Slate-50 */ - background-image: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%2394a3b8' fill-opacity='0.07'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - font-family: 'Inter', 'Noto Sans SC', sans-serif; - color: #1E293B; /* Slate-800 */ + min-height: 100vh; + background: + linear-gradient(118deg, rgba(216, 199, 196, 0.34), transparent 38%), + linear-gradient(214deg, rgba(111, 143, 146, 0.16), transparent 42%), + linear-gradient(135deg, var(--ia-bg), var(--ia-bg-wash)); + color: var(--ia-ink); + font-family: "Inter", "Noto Sans SC", sans-serif; +} + +body::before { + position: fixed; + inset: 0; + z-index: -1; + pointer-events: none; + content: ""; + background-image: + linear-gradient(rgba(77, 111, 115, 0.045) 1px, transparent 1px), + linear-gradient(90deg, rgba(77, 111, 115, 0.045) 1px, transparent 1px); + background-size: 72px 72px; + mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), transparent 72%); +} + +::selection { + color: #fff; + background: var(--ia-primary-deep); +} + +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: rgba(246, 244, 239, 0.9); +} + +::-webkit-scrollbar-thumb { + background: rgba(109, 125, 128, 0.38); + border-radius: 4px; } -/* 极简滚动条 */ -::-webkit-scrollbar { width: 8px; } -::-webkit-scrollbar-track { background: #f1f1f1; } -::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; } -::-webkit-scrollbar-thumb:hover { background: #94a3b8; } +::-webkit-scrollbar-thumb:hover { + background: rgba(77, 111, 115, 0.58); +} + +a { + color: inherit; +} + +img { + max-width: 100%; +} -/* 玻璃拟态效果 (用于导航栏) */ -.glass-effect { - background: rgba(255, 255, 255, 0.85); - backdrop-filter: blur(12px); - -webkit-backdrop-filter: blur(12px); - border-bottom: 1px solid rgba(226, 232, 240, 0.6); +.glass-effect, +.ia-glass { + background: var(--ia-surface); + border: 1px solid rgba(255, 255, 255, 0.62); + box-shadow: var(--ia-shadow-soft); + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); +} + +.ia-navbar { + background: rgba(246, 244, 239, 0.72); + border-bottom: 1px solid var(--ia-line); + box-shadow: 0 12px 40px rgba(52, 68, 72, 0.08); + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); +} + +.ia-brand-mark { + width: 34px; + height: 34px; + border-radius: var(--ia-radius); + border: 1px solid rgba(255, 255, 255, 0.72); + box-shadow: 0 12px 30px rgba(77, 111, 115, 0.18); + object-fit: cover; } -/* 链接悬停下划线动画 */ .nav-link { - position: relative; + position: relative; + display: inline-flex; + align-items: center; + min-height: 40px; + color: var(--ia-muted); + transition: color 180ms ease, transform 180ms ease; } + .nav-link::after { - content: ''; - position: absolute; - width: 0; - height: 2px; - bottom: -4px; - left: 0; - background-color: #0891B2; /* Cyan-600 */ - transition: width 0.3s ease; -} -.nav-link:hover::after { - width: 100%; + position: absolute; + right: 0; + bottom: 4px; + left: 0; + height: 2px; + content: ""; + background: linear-gradient(90deg, var(--ia-primary), var(--ia-accent)); + border-radius: 999px; + opacity: 0; + transform: scaleX(0.35); + transform-origin: center; + transition: opacity 180ms ease, transform 180ms ease; +} + +.nav-link:hover, +.nav-link.is-active { + color: var(--ia-primary-deep); +} + +.nav-link:hover::after, +.nav-link.is-active::after { + opacity: 1; + transform: scaleX(1); +} + +.ia-mobile-link { + display: block; + padding: 0.88rem 1rem; + color: var(--ia-muted); + border-radius: var(--ia-radius); + transition: background 180ms ease, color 180ms ease; +} + +.ia-mobile-link:hover, +.ia-mobile-link.is-active { + color: var(--ia-primary-deep); + background: rgba(111, 143, 146, 0.12); +} + +.ia-page { + width: min(1120px, calc(100% - 2rem)); + min-height: calc(100vh - 13rem); + margin: 0 auto; +} + +.ia-narrow { + width: min(920px, calc(100% - 2rem)); + margin: 0 auto; +} + +.ia-section { + margin-bottom: 5rem; +} + +.ia-page-header { + max-width: 760px; + margin: 0 auto 3.5rem; + text-align: center; +} + +.ia-kicker { + display: inline-flex; + align-items: center; + gap: 0.45rem; + margin-bottom: 1rem; + color: var(--ia-primary-deep); + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.ia-text-ink { + color: var(--ia-ink); +} + +.ia-text-muted { + color: var(--ia-muted); +} + +.ia-text-primary { + color: var(--ia-primary-deep); +} + +.ia-text-accent { + color: var(--ia-accent); +} + +.ia-page-title { + color: var(--ia-ink); + font-size: 2.75rem; + font-weight: 700; + line-height: 1.12; +} + +.ia-page-subtitle { + margin-top: 1rem; + color: var(--ia-muted); + font-size: 1.05rem; + line-height: 1.8; +} + +.ia-section-title { + display: flex; + align-items: center; + gap: 0.85rem; + margin-bottom: 1.5rem; + color: var(--ia-ink); + font-size: 1.25rem; + font-weight: 700; +} + +.ia-section-title::before { + width: 0.35rem; + height: 1.65rem; + content: ""; + background: linear-gradient(180deg, var(--ia-primary), var(--ia-accent)); + border-radius: 999px; +} + +.ia-card, +.ia-link-card, +.ia-timeline-card { + position: relative; + border: 1px solid var(--ia-line); + border-radius: var(--ia-radius); + background: var(--ia-surface-strong); + box-shadow: var(--ia-shadow-soft); + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); + transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease; +} + +.ia-card:hover, +.ia-link-card:hover, +.ia-timeline-card:hover { + border-color: rgba(111, 143, 146, 0.34); + box-shadow: var(--ia-shadow); + transform: translateY(-3px); +} + +.ia-card::before, +.ia-link-card::before { + position: absolute; + inset: 0; + pointer-events: none; + content: ""; + background: linear-gradient(120deg, transparent 20%, rgba(255, 255, 255, 0.48), transparent 68%); + border-radius: inherit; + opacity: 0; + transform: translateX(-30%); + transition: opacity 180ms ease, transform 600ms ease; +} + +.ia-card:hover::before, +.ia-link-card:hover::before { + opacity: 1; + transform: translateX(30%); +} + +.ia-btn { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 44px; + padding: 0.78rem 1.05rem; + overflow: hidden; + color: var(--ia-primary-deep); + font-size: 0.92rem; + font-weight: 700; + text-decoration: none; + border: 1px solid var(--ia-line); + border-radius: var(--ia-radius); + background: rgba(255, 255, 255, 0.56); + transition: transform 180ms ease, border-color 180ms ease, background 180ms ease, color 180ms ease; +} + +.ia-btn:hover { + color: var(--ia-ink); + border-color: rgba(111, 143, 146, 0.42); + background: rgba(255, 255, 255, 0.82); + transform: translateY(-2px); +} + +.ia-btn-primary { + color: #fff; + border-color: var(--ia-primary-deep); + background: linear-gradient(135deg, var(--ia-primary-deep), var(--ia-primary)); + box-shadow: 0 16px 36px rgba(77, 111, 115, 0.22); +} + +.ia-btn-primary:hover { + color: #fff; + background: linear-gradient(135deg, #45666a, #688b8e); +} + +.ia-btn-ghost { + background: rgba(255, 255, 255, 0.38); +} + +.ia-ripple { + position: absolute; + width: 12px; + height: 12px; + pointer-events: none; + background: rgba(255, 255, 255, 0.55); + border-radius: 999px; + transform: translate(-50%, -50%) scale(0); + animation: ia-ripple 620ms ease-out forwards; +} + +@keyframes ia-ripple { + to { + opacity: 0; + transform: translate(-50%, -50%) scale(18); + } +} + +.ia-tag { + display: inline-flex; + align-items: center; + min-height: 28px; + padding: 0.28rem 0.55rem; + color: var(--ia-primary-deep); + font-size: 0.75rem; + font-weight: 700; + border: 1px solid rgba(111, 143, 146, 0.22); + border-radius: var(--ia-radius); + background: rgba(111, 143, 146, 0.1); +} + +.ia-tag-warm { + color: #776748; + border-color: rgba(184, 167, 131, 0.26); + background: rgba(184, 167, 131, 0.14); +} + +.ia-footer { + margin-top: 6rem; + color: rgba(39, 49, 58, 0.68); + border-top: 1px solid var(--ia-line); + background: rgba(246, 244, 239, 0.7); +} + +.ia-footer a { + transition: color 180ms ease; +} + +.ia-footer a:hover { + color: var(--ia-primary-deep); +} + +.home-immersive { + min-height: 100vh; + overflow-x: hidden; +} + +.home-hero { + position: relative; + display: grid; + min-height: 100vh; + place-items: center; + padding: 7rem 1.25rem 3rem; + overflow: hidden; +} + +.home-hero::after { + position: absolute; + inset: 0; + z-index: 1; + pointer-events: none; + content: ""; + background: + linear-gradient(90deg, rgba(246, 244, 239, 0.35), rgba(246, 244, 239, 0.05), rgba(246, 244, 239, 0.35)), + linear-gradient(180deg, rgba(246, 244, 239, 0.05), rgba(246, 244, 239, 0.30)); +} + +.breathing-bg { + position: absolute; + inset: 0; + z-index: 0; + overflow: hidden; +} + +.breathing-bg canvas { + display: block; + width: 100% !important; + height: 100% !important; +} + +.breathing-bg.is-static::before { + position: absolute; + inset: 0; + content: ""; + background: + linear-gradient(90deg, transparent, rgba(77, 111, 115, 0.11), transparent), + repeating-linear-gradient(90deg, transparent 0 28px, rgba(77, 111, 115, 0.045) 29px 30px); + opacity: 0.8; +} + +.home-copy { + position: relative; + z-index: 2; + width: min(920px, 100%); + text-align: center; +} + +.home-title { + color: var(--ia-ink); + font-size: 4rem; + font-weight: 700; + line-height: 1.05; + text-wrap: balance; + text-shadow: 0 18px 60px rgba(246, 244, 239, 0.88); +} + +.home-subtitle { + margin-top: 1.35rem; + color: var(--ia-primary-deep); + font-size: 1.28rem; + font-weight: 600; + line-height: 1.45; + text-wrap: balance; +} + +.ia-timeline { + position: relative; + display: grid; + gap: 1.35rem; + padding-left: 1.5rem; +} + +.ia-timeline::before { + position: absolute; + top: 0.35rem; + bottom: 0.35rem; + left: 0.28rem; + width: 2px; + content: ""; + background: linear-gradient(180deg, var(--ia-primary), rgba(111, 143, 146, 0.18)); +} + +.ia-timeline-item { + position: relative; +} + +.ia-timeline-item::before { + position: absolute; + top: 1.25rem; + left: -1.42rem; + width: 12px; + height: 12px; + content: ""; + background: var(--ia-primary); + border: 3px solid var(--ia-bg); + border-radius: 999px; + box-shadow: 0 0 0 3px rgba(111, 143, 146, 0.16); +} + +.ia-timeline-card { + padding: 1.35rem; +} + +.ia-date { + color: var(--ia-primary-deep); + font-size: 0.85rem; + font-weight: 700; +} + +.ia-logo-tile { + display: flex; + align-items: center; + justify-content: center; + min-height: 118px; + padding: 1.2rem; +} + +.ia-logo-tile img { + width: 100%; + max-width: 170px; + max-height: 68px; + object-fit: contain; +} + +.ia-avatar { + width: 72px; + height: 72px; + flex: 0 0 72px; + overflow: hidden; + border: 1px solid rgba(255, 255, 255, 0.74); + border-radius: var(--ia-radius); + background: linear-gradient(135deg, rgba(111, 143, 146, 0.16), rgba(184, 167, 131, 0.14)); +} + +.ia-avatar img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.ia-avatar-round { + border-radius: 50%; +} + +/* ── Home contact: borderless style ── */ + +.home-contact-borderless { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.65rem; + margin: 2rem auto 0; +} + +.home-contact-label { + color: var(--ia-ink); + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; + opacity: 0.5; +} + +.home-contact-links { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 0.15rem 0; +} + +.home-contact-text, +.home-contact-link { + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.45rem 0.7rem; + font-size: 0.92rem; + font-weight: 500; + line-height: 1; + text-decoration: none; + border: none; + border-radius: 6px; + background: none; + transition: color 220ms ease, background 220ms ease, transform 220ms ease; +} + +.home-contact-copy { + position: relative; + display: inline-flex; + align-items: center; + gap: 0.4rem; + padding: 0.45rem 0.7rem; + color: var(--ia-muted); + font-family: inherit; + font-size: 0.92rem; + font-weight: 500; + line-height: 1; + cursor: pointer; + border: none; + border-radius: 6px; + background: none; + transition: color 220ms ease, background 220ms ease, transform 220ms ease; +} + +.home-contact-copy-chat { + flex-shrink: 0; + opacity: 0.55; + transition: opacity 220ms ease, transform 220ms ease; +} + +.home-contact-copy-label { + position: relative; +} + +.home-contact-copy-label::after { + position: absolute; + right: 0; + bottom: -2px; + left: 0; + height: 1.5px; + content: ""; + background: linear-gradient(90deg, var(--ia-primary), var(--ia-accent)); + border-radius: 999px; + opacity: 0; + transform: scaleX(0); + transform-origin: center; + transition: opacity 260ms ease, transform 340ms ease; +} + +.home-contact-copy-icon { + flex-shrink: 0; + opacity: 0; + transform: translateX(-4px); + transition: opacity 220ms ease, transform 220ms ease; +} + +.home-contact-copy:hover { + color: var(--ia-ink); + background: rgba(111, 143, 146, 0.08); + transform: translateY(-1px); +} + +.home-contact-copy:hover .home-contact-copy-chat { + opacity: 1; + transform: scale(1.1); +} + +.home-contact-copy:hover .home-contact-copy-label::after { + opacity: 1; + transform: scaleX(1); +} + +.home-contact-copy:hover .home-contact-copy-icon { + opacity: 0.6; + transform: translateX(0); +} + +.home-contact-copy:active { + transform: translateY(0) scale(0.97); +} + +/* Copy toast animation */ +.home-contact-copy-toast { + position: absolute; + top: -2rem; + left: 50%; + padding: 0.3rem 0.7rem; + color: #fff; + font-size: 0.75rem; + font-weight: 600; + white-space: nowrap; + pointer-events: none; + border-radius: 5px; + background: var(--ia-primary-deep); + box-shadow: 0 8px 24px rgba(77, 111, 115, 0.28); + opacity: 0; + transform: translateX(-50%) translateY(6px) scale(0.85); + transition: none; +} + +.home-contact-copy-toast.is-visible { + animation: copy-toast-pop 1.6s ease forwards; +} + +@keyframes copy-toast-pop { + 0% { + opacity: 0; + transform: translateX(-50%) translateY(6px) scale(0.85); + } + 12% { + opacity: 1; + transform: translateX(-50%) translateY(0) scale(1); + } + 70% { + opacity: 1; + transform: translateX(-50%) translateY(0) scale(1); + } + 100% { + opacity: 0; + transform: translateX(-50%) translateY(-8px) scale(0.9); + } +} + +.home-contact-link { + position: relative; + color: var(--ia-primary-deep); + font-weight: 600; + cursor: pointer; +} + +.home-contact-link svg { + flex-shrink: 0; + opacity: 0.7; + transition: opacity 220ms ease, transform 220ms ease; +} + +.home-contact-link::after { + position: absolute; + right: 0.7rem; + bottom: 0.3rem; + left: 0.7rem; + height: 1.5px; + content: ""; + background: linear-gradient(90deg, var(--ia-primary), var(--ia-accent)); + border-radius: 999px; + opacity: 0; + transform: scaleX(0); + transform-origin: center; + transition: opacity 260ms ease, transform 340ms ease; +} + +.home-contact-link:hover { + color: var(--ia-ink); + background: rgba(111, 143, 146, 0.08); + transform: translateY(-1px); +} + +.home-contact-link:hover svg { + opacity: 1; + transform: scale(1.1); +} + +.home-contact-link:hover::after { + opacity: 1; + transform: scaleX(1); +} + +.home-contact-dot { + display: inline-block; + width: 3px; + height: 3px; + margin: 0 0.15rem; + background: var(--ia-soft); + border-radius: 50%; + opacity: 0.5; +} + +.product-board { + display: grid; + max-width: 920px; + margin: 0 auto; + grid-template-columns: 1fr; + gap: 1.15rem; + align-items: stretch; +} + +.product-card { + position: relative; + display: flex; + min-height: 0; + flex-direction: column; + isolation: isolate; + padding: clamp(1.3rem, 3vw, 2rem); + overflow: hidden; + border: 1px solid var(--ia-line); + border-radius: var(--ia-radius); + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.84), rgba(255, 255, 255, 0.5)), + linear-gradient(160deg, rgba(111, 143, 146, 0.12), transparent 54%); + box-shadow: var(--ia-shadow-soft); + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); + transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease; +} + +.product-card:hover { + border-color: rgba(111, 143, 146, 0.34); + box-shadow: var(--ia-shadow); + transform: translateY(-3px); +} + +.product-card-featured { + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.88), rgba(255, 255, 255, 0.56)), + linear-gradient(150deg, rgba(111, 143, 146, 0.18), transparent 46%), + linear-gradient(330deg, rgba(184, 167, 131, 0.18), transparent 50%); +} + +.product-card-topline { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + color: var(--ia-primary-deep); + font-size: 0.72rem; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.product-card h2 { + position: relative; + margin-top: 1.35rem; + color: var(--ia-ink); + font-size: clamp(1.35rem, 2.4vw, 1.75rem); + font-weight: 800; + line-height: 1.18; +} + +.product-card p { + position: relative; + max-width: 68ch; + margin-top: 1rem; + color: var(--ia-muted); + font-size: 0.96rem; + line-height: 1.8; +} + +.product-tags { + position: relative; + display: flex; + flex-wrap: wrap; + gap: 0.45rem; + margin-top: 1.15rem; +} + +.product-actions { + position: relative; + display: flex; + flex-wrap: wrap; + gap: 0.65rem; + margin-top: 1.35rem; + padding-top: 1.2rem; + border-top: 1px solid rgba(109, 125, 128, 0.14); +} + +.event-detail-page { + background: + linear-gradient(118deg, rgba(143, 161, 154, 0.28), transparent 36%), + linear-gradient(238deg, rgba(201, 195, 181, 0.18), transparent 44%), + linear-gradient(180deg, #f7f4ee, #e9efec) !important; + color: var(--ia-ink); +} + +.event-detail-page>nav:not(.ia-navbar), +.event-detail-page>footer:not(.ia-footer) { + display: none !important; +} + +.event-detail-page main, +.event-workshop-page>.max-w-5xl { + width: min(1120px, calc(100% - 2rem)); +} + +.event-detail-page main { + margin-right: auto; + margin-left: auto; +} + +.event-workshop-page>.max-w-5xl { + margin: 0.5rem auto 1.25rem; + padding-right: 0; + padding-left: 0; +} + +.event-workshop-page>.max-w-5xl a { + min-height: 44px; + color: #fff !important; + border: 1px solid rgba(77, 111, 115, 0.28); + border-radius: var(--ia-radius) !important; + background: linear-gradient(135deg, var(--ia-primary-deep), var(--ia-primary)) !important; + box-shadow: 0 16px 34px rgba(77, 111, 115, 0.18) !important; +} + +.event-detail-page .pulse { + animation: none; +} + +.event-detail-page .animate-up { + opacity: 1 !important; + transform: none !important; + animation: none !important; +} + +.event-detail-page .rounded-3xl, +.event-detail-page .rounded-2xl, +.event-detail-page .rounded-xl, +.event-detail-page .rounded-lg { + border-radius: var(--ia-radius) !important; +} + +.event-detail-page .shadow-2xl, +.event-detail-page .shadow-xl, +.event-detail-page .shadow-lg, +.event-detail-page .shadow-md, +.event-detail-page .shadow-sm { + box-shadow: var(--ia-shadow-soft) !important; +} + +.event-detail-page .border-slate-100, +.event-detail-page .border-slate-200, +.event-detail-page .border-blue-200, +.event-detail-page .border-cyan-100, +.event-detail-page .border-brand-100, +.event-detail-page .border-white\/10, +.event-detail-page .border-white\/20 { + border-color: var(--ia-line) !important; +} + +.event-detail-page .text-slate-900, +.event-detail-page .text-slate-800, +.event-detail-page .text-slate-700 { + color: var(--ia-ink) !important; +} + +.event-detail-page .text-slate-600, +.event-detail-page .text-slate-500, +.event-detail-page .text-slate-400, +.event-detail-page .text-blue-800, +.event-detail-page .text-blue-50, +.event-detail-page .text-slate-300 { + color: var(--ia-muted) !important; +} + +.event-detail-page .text-brand-700, +.event-detail-page .text-brand-600, +.event-detail-page .text-brand-500, +.event-detail-page .text-brand-300, +.event-detail-page .text-brand-200, +.event-detail-page .text-cyan-700, +.event-detail-page .text-cyan-600, +.event-detail-page .text-cyan-500, +.event-detail-page .text-blue-600, +.event-detail-page .text-indigo-600, +.event-detail-page .text-purple-600, +.event-detail-page .text-accent-600 { + color: var(--ia-primary-deep) !important; +} + +.event-detail-page .bg-white, +.event-detail-page .bg-slate-50, +.event-detail-page .bg-blue-50, +.event-detail-page .bg-cyan-50, +.event-detail-page .bg-brand-50, +.event-detail-page .bg-blue-100, +.event-detail-page .bg-indigo-100, +.event-detail-page .bg-purple-100, +.event-detail-page .bg-slate-100 { + background-color: rgba(255, 255, 255, 0.56) !important; +} + +.event-detail-page article.bg-white, +.event-detail-page section.bg-white, +.event-detail-page .group.bg-white, +.event-detail-page .bg-white.rounded-2xl, +.event-detail-page .bg-white.rounded-xl { + position: relative; + overflow: hidden; + border: 1px solid var(--ia-line) !important; + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.82), rgba(255, 255, 255, 0.52)), + linear-gradient(160deg, rgba(111, 143, 146, 0.12), transparent 58%) !important; + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); +} + +.event-detail-page article.bg-white::before, +.event-detail-page section.bg-white::before, +.event-detail-page .group.bg-white::before, +.event-detail-page .bg-white.rounded-2xl::before, +.event-detail-page .bg-white.rounded-xl::before { + position: absolute; + inset: 0; + pointer-events: none; + content: ""; + background: linear-gradient(120deg, transparent 24%, rgba(255, 255, 255, 0.46), transparent 72%); + opacity: 0.72; +} + +.event-detail-page article.bg-white>*, +.event-detail-page section.bg-white>*, +.event-detail-page .group.bg-white>*, +.event-detail-page .bg-white.rounded-2xl>*, +.event-detail-page .bg-white.rounded-xl>* { + position: relative; +} + +.event-detail-page figure img { + border: 1px solid rgba(255, 255, 255, 0.72); + border-radius: var(--ia-radius) !important; + box-shadow: var(--ia-shadow-soft) !important; +} + +.event-detail-page blockquote { + color: var(--ia-muted) !important; + border-color: var(--ia-primary) !important; + border-radius: var(--ia-radius); + background: rgba(111, 143, 146, 0.08); +} + +.event-workshop-page header.relative { + width: min(1120px, calc(100% - 2rem)); + margin: 0 auto; + padding: clamp(3rem, 7vw, 5rem) clamp(1.25rem, 5vw, 4rem) !important; + border: 1px solid var(--ia-line); + border-radius: var(--ia-radius); + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.72), rgba(255, 255, 255, 0.38)), + linear-gradient(145deg, rgba(111, 143, 146, 0.24), transparent 52%), + linear-gradient(320deg, rgba(184, 167, 131, 0.16), transparent 54%); + box-shadow: var(--ia-shadow); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); +} + +.event-workshop-page header.relative>.absolute.inset-0 { + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.64), rgba(232, 238, 235, 0.42)), + linear-gradient(90deg, rgba(77, 111, 115, 0.12), transparent 58%) !important; +} + +.event-workshop-page header.relative .blur-3xl { + display: none; +} + +.event-workshop-page header.relative h1, +.event-workshop-page header.relative p, +.event-workshop-page header.relative .text-white, +.event-workshop-page header.relative .text-blue-50, +.event-workshop-page header.relative .text-white\/80 { + color: var(--ia-ink) !important; + text-shadow: none !important; +} + +.event-workshop-page header.relative .inline-flex, +.event-workshop-page header.relative [class*="bg-white/10"] { + color: var(--ia-ink) !important; + border-color: rgba(109, 125, 128, 0.2) !important; + background: rgba(255, 255, 255, 0.48) !important; + box-shadow: none !important; + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); +} + +.event-workshop-page header.relative .bg-green-400 { + background-color: var(--ia-primary) !important; +} + +.event-workshop-page .from-slate-900, +.event-workshop-page .from-slate-800, +.event-workshop-page .to-slate-800, +.event-workshop-page .to-cyan-900 { + --tw-gradient-from: rgba(255, 255, 255, 0.78) var(--tw-gradient-from-position) !important; + --tw-gradient-to: rgba(232, 238, 235, 0.62) var(--tw-gradient-to-position) !important; +} + +.event-workshop-page section.relative.rounded-3xl { + border: 1px solid var(--ia-line); + background: + linear-gradient(135deg, rgba(255, 255, 255, 0.76), rgba(255, 255, 255, 0.5)), + linear-gradient(150deg, rgba(111, 143, 146, 0.16), transparent 54%) !important; + box-shadow: var(--ia-shadow) !important; +} + +.event-workshop-page section.relative.rounded-3xl .text-white, +.event-workshop-page section.relative.rounded-3xl .text-slate-300, +.event-workshop-page section.relative.rounded-3xl .text-slate-200, +.event-workshop-page section.relative.rounded-3xl .text-yellow-400 { + color: var(--ia-ink) !important; +} + +.event-workshop-page .bg-brand-600, +.event-workshop-page .hover\:bg-brand-700:hover { + color: #fff !important; + background-color: var(--ia-primary-deep) !important; +} + +.event-news-page article.bg-white { + padding: clamp(1.4rem, 4vw, 3rem) !important; +} + +.event-news-page .lead { + padding: 1rem 1.1rem; + border-left: 4px solid var(--ia-primary); + border-radius: var(--ia-radius); + background: rgba(111, 143, 146, 0.08); +} + +@media (max-width: 768px) { + .ia-page { + width: min(100% - 1.25rem, 1120px); + } + + .ia-page-title { + font-size: 2.15rem; + } + + .ia-page-subtitle { + font-size: 1rem; + } + + .home-title { + font-size: 2.7rem; + } + + .home-subtitle { + font-size: 1.02rem; + } + + .ia-timeline { + padding-left: 1.1rem; + } + + .ia-timeline-item::before { + left: -1.02rem; + } + + .home-contact-links { + gap: 0.1rem 0; + } + + .home-contact-copy, + .home-contact-link { + font-size: 0.82rem; + padding: 0.38rem 0.5rem; + } + + .product-board { + grid-template-columns: 1fr; + } + + .product-card { + min-height: 0; + } +} + +@media (max-width: 420px) { + .home-title { + font-size: 2.18rem; + } +} + +@media (prefers-reduced-motion: reduce) { + + *, + *::before, + *::after { + scroll-behavior: auto !important; + animation-duration: 0.001ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.001ms !important; + } + + .ia-card:hover, + .ia-link-card:hover, + .ia-timeline-card:hover, + .ia-btn:hover { + transform: none; + } +} + +/* ── Members: borderless chip layout ── */ + +.members-group { + margin-bottom: 3.5rem; +} + +.members-group-title { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 1.5rem; + color: var(--ia-ink); + font-size: 1.15rem; + font-weight: 700; + letter-spacing: 0.02em; +} + +.members-group-title::before { + width: 3px; + height: 1.4rem; + content: ""; + background: linear-gradient(180deg, var(--ia-primary), var(--ia-accent)); + border-radius: 999px; +} + +.members-row { + display: flex; + flex-wrap: wrap; + gap: 0.65rem 1rem; +} + +.member-chip { + position: relative; + display: inline-flex; + align-items: center; + gap: 0.3rem; + padding: 0.55rem 0.85rem; + color: var(--ia-ink); + font-size: 1.02rem; + font-weight: 500; + line-height: 1; + text-decoration: none; + border-radius: 6px; + transition: color 200ms ease, background 200ms ease, transform 200ms ease; +} + +.member-chip.has-link { + cursor: pointer; + color: var(--ia-primary-deep); +} + +.member-chip.has-link:hover { + color: var(--ia-ink); + background: rgba(111, 143, 146, 0.1); + transform: translateY(-1px); +} + +.member-chip.has-link:hover .member-arrow { + opacity: 1; + transform: translateX(2px); +} + +.member-name { + position: relative; +} + +.member-chip.has-link .member-name::after { + position: absolute; + right: 0; + bottom: -2px; + left: 0; + height: 1px; + content: ""; + background: linear-gradient(90deg, var(--ia-primary), var(--ia-accent)); + opacity: 0; + transform: scaleX(0); + transform-origin: left; + transition: opacity 200ms ease, transform 300ms ease; +} + +.member-chip.has-link:hover .member-name::after { + opacity: 1; + transform: scaleX(1); +} + +.member-arrow { + width: 14px; + height: 14px; + flex-shrink: 0; + opacity: 0.45; + transition: opacity 200ms ease, transform 200ms ease; } \ No newline at end of file diff --git a/assets/images/project/zeta/githave-icon.png b/assets/images/project/zeta/githave-icon.png new file mode 100644 index 0000000..3c35236 Binary files /dev/null and b/assets/images/project/zeta/githave-icon.png differ diff --git a/assets/images/project/zeta/githave.png b/assets/images/project/zeta/githave.png new file mode 100644 index 0000000..b9dbaea Binary files /dev/null and b/assets/images/project/zeta/githave.png differ diff --git a/assets/images/project/zeta/zetahub.png b/assets/images/project/zeta/zetahub.png new file mode 100644 index 0000000..8349f08 Binary files /dev/null and b/assets/images/project/zeta/zetahub.png differ diff --git a/assets/js/breathing-background.js b/assets/js/breathing-background.js new file mode 100644 index 0000000..9d4b7c3 --- /dev/null +++ b/assets/js/breathing-background.js @@ -0,0 +1,88 @@ +(function () { + const container = document.getElementById("breathing-bg"); + const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; + + if (!container || typeof window.p5 === "undefined") { + if (container) container.classList.add("is-static"); + return; + } + + new window.p5((p) => { + let resizeObserver; + + function size() { + const rect = container.getBoundingClientRect(); + return { + width: Math.max(320, Math.floor(rect.width || window.innerWidth)), + height: Math.max(420, Math.floor(rect.height || window.innerHeight)), + }; + } + + function drawPattern(time) { + const mobile = p.width < 720; + const numLines = mobile ? 40 : 72; + const numPoints = mobile ? 112 : 180; + const verticalSpan = p.height / (mobile ? 2.15 : 2.35); + + p.clear(); + p.translate(p.width / 2, p.height / 2); + p.noFill(); + + for (let i = 0; i < numLines; i += 1) { + const linePhase = (i / numLines) * p.TWO_PI; + const primaryAlpha = mobile ? 60 : 55; + const accentAlpha = mobile ? 40 : 35; + p.stroke(i % 5 === 0 ? p.color(184, 167, 131, accentAlpha) : p.color(77, 111, 115, primaryAlpha)); + p.strokeWeight(i % 7 === 0 ? 1.8 : 1.1); + + [-1, 1].forEach((side) => { + p.beginShape(); + for (let j = 0; j <= numPoints; j += 1) { + const pointPhase = j / numPoints; + const y = p.map(pointPhase, 0, 1, -verticalSpan, verticalSpan); + const envelope = p.sin(pointPhase * p.PI); + const wave1 = p.sin(time + linePhase) * (mobile ? 42 : 68); + const wave2 = p.sin(pointPhase * 8 + time * 2) * (mobile ? 30 : 48); + const centerComplexity = p.pow(p.cos(pointPhase * p.PI - p.HALF_PI), 2) * (mobile ? 64 : 110); + const wave3 = p.cos(linePhase * 4 - time) * centerComplexity; + const x = envelope * (wave1 + wave2 + wave3 + (mobile ? 46 : 70)); + p.vertex(side * x, y); + } + p.endShape(); + }); + } + } + + p.setup = () => { + const nextSize = size(); + p.pixelDensity(Math.min(window.devicePixelRatio || 1, 1.5)); + p.createCanvas(nextSize.width, nextSize.height); + + if (reduceMotion) { + drawPattern(1.4); + p.noLoop(); + return; + } + + resizeObserver = new ResizeObserver(() => { + const updated = size(); + p.resizeCanvas(updated.width, updated.height); + }); + resizeObserver.observe(container); + }; + + p.draw = () => { + drawPattern(p.frameCount * 0.008); + }; + + p.windowResized = () => { + const updated = size(); + p.resizeCanvas(updated.width, updated.height); + if (reduceMotion) drawPattern(1.4); + }; + + window.addEventListener("beforeunload", () => { + if (resizeObserver) resizeObserver.disconnect(); + }); + }, container); +})(); diff --git a/assets/js/data.js b/assets/js/data.js index e69de29..3e744c8 100644 --- a/assets/js/data.js +++ b/assets/js/data.js @@ -0,0 +1,250 @@ +window.IA_DATA = { + activities: [ + { + date: "2026.04.23", + title: "导师看了不皱眉的科研绘图教程(第二期)", + type: "科研绘图", + status: "Past", + description: "以顶会录用案例,拆解落地实操细节,帮你做出严谨、精准、高质量科研绘图", + links: [ + { + label: "观看视频", + url: "https://www.bilibili.com/video/BV1bNoYB7Ehv/?share_source=copy_web", + external: true, + }, + ], + }, + { + date: "2026.04.09", + title: "导师看了不皱眉的科研绘图教程(第一期)", + type: "科研绘图", + status: "Past", + description: "以顶会录用案例,拆解科研绘图的底层逻辑、格式规范、细节设计和质感提升技巧", + links: [ + { + label: "观看视频", + url: "https://www.bilibili.com/video/BV16ZDWBbExg/?share_source=copy_web", + external: true, + }, + ], + }, + { + date: "2025.12.17", + title: "基础与前沿研究院2026年“大学生创新创业训练计划”项目", + type: "项目分享", + status: "Past", + description: "欢迎大二、大三的同学查看项目详情,了解选题情况。如有感兴趣的项目及时与老师联系。", + links: [ + { + label: "项目详情", + url: "https://docs.qq.com/sheet/DYUlXVGZvUllmTnd5?tab=10g383", + external: true, + }, + ], + }, + { + date: "2025.12.14", + title: "【IA x 深势科技】Uni-Lab线下WorkShop(宜宾场)", + type: "技术工坊", + status: "Past", + description: "本期 WorkShop 聚焦实验室表征设备智能化改造,邀你亲手解锁自动化实验新技能", + links: [ + { + label: "查看原文", + url: "https://mp.weixin.qq.com/s/VFUJ2crP0j9vVowiBJBWTQ", + external: true, + }, + ], + }, + { + date: "2025.11", + title: "【竞赛全攻略】对话四位国赛得主:大学竞赛避坑指南", + type: "竞赛分享", + status: "Past", + description: "大学竞赛避坑指南:从选择到夺奖,一次讲透", + links: [ + { + label: "观看视频", + url: "https://www.bilibili.com/video/BV1cFzpBFEJn/?share_source=copy_web", + external: true, + }, + ], + }, + { + date: "2025.11.14", + title: "成电青年说·成电首档大型青年互动演说分享节目", + type: "青年分享", + status: "Past", + description: "成电学子的成长故事,主讲人:张晰元、黄璇(协会骨干)", + links: [ + { + label: "查看推文", + url: "https://mp.weixin.qq.com/s/5gfmuq_ne5AENQWdhK1bTQ", + external: true, + }, + ], + }, + { + date: "2025.10", + title: "神经科学社更名为交叉学科协会", + type: "协会动态", + status: "Past", + description: "协会面向 AI Methods、Science、Health、Engineering、Finance 等方向展开跨学科协作。", + links: [], + }, + { + date: "2025.02", + title: "电子科技大学神经科学社成立", + type: "协会动态", + status: "Past", + description: "社团成立,开始搭建跨学科交流与实践社区。", + links: [], + }, + ], + + products: [ + { + name: "十万个为什么 skills", + stage: "Agent Skill", + intro: "面向 Claude Code、Codex 等 Agent 的追问式思考技能,帮助用户把问题拆清楚。", + tags: ["Claude Code", "Codex", "Agent Skill"], + links: [ + { label: "GitHub", url: "https://github.com/maxkura/Ask_Why", external: true, primary: true }, + { label: "介绍视频", url: "https://www.bilibili.com/video/BV1QdorBLESn/?share_source=copy_web", external: true }, + ], + }, + { + name: "GitHave & FlashMemory", + stage: "Knowledge Tools", + intro: "围绕代码项目与知识卡片的轻量工具组合,用于沉淀仓库线索、学习记录和高频复盘内容。", + tags: ["GitHub", "Knowledge Base", "Memory"], + links: [ + { label: "立即体验", url: "https://githave.com/home", external: true, primary: true }, + { label: "开源社区", url: "https://zzh.app", external: true }, + ], + }, + { + name: "研途信使", + stage: "Research Journey", + intro: "面向升学、科研训练与竞赛信息的整理入口,帮助成员集中追踪关键节点和资源线索。", + tags: ["Research", "Planning", "Information"], + links: [ + { label: "了解详情", url: "https://mp.weixin.qq.com/s/wvYkFtUadSR2yQqbWdywgQ", external: true, primary: true }, + ], + }, + ], + + advisors: [ + { + name: "尧德中 教授", + title: "杰出科学家", + description: "电子科技大学生命科学与技术学院创院院长", + image: "assets/images/partners/members/DezhongYao.png", + url: "http://faculty.uestc.edu.cn/yaodezhong/zh_CN/index.htm", + }, + { + name: "裴德乐 教授", + title: "古巴科学院院士", + description: "神经信息学权威专家", + image: "assets/images/partners/members/pedro.png", + url: "https://www.life.uestc.edu.cn/sznr2.jsp?urltype=news.NewsContentUrl&wbtreeid=1219&wbnewsid=3398", + }, + { + name: "张帆 教授", + title: "国家青年人才", + description: "脑神经影像计算,弥散磁共振,医学图像分析", + image: "assets/images/partners/members/fanzhang.png", + url: "https://faculty.uestc.edu.cn/fanzhang/zh_CN/index/479541/list/index.htm", + }, + { + name: "郑丁 教授", + title: "海外优青", + description: "半导体器件的人机交互柔性可穿戴技术", + image: "assets/images/partners/members/dingzheng.png", + url: "https://sose.uestc.edu.cn/info/1184/7923.htm", + }, + { + name: "文明健 教授", + title: "NSF 项目主持人", + description: "数据驱动建模,不确定性量化,能源材料与器件", + image: "assets/images/partners/members/mingwenjian.png", + url: "https://www.iffs.uestc.edu.cn/info/1116/5944.htm", + }, + ], + + organizations: [ + { + name: "生命科学与技术学院", + image: "assets/images/partners/orgs/uestc-life.png", + url: "https://www.life.uestc.edu.cn/", + type: "战略支撑单位", + }, + { + name: "深势科技 DP Technology", + image: "assets/images/partners/orgs/DPTech.png", + url: "https://www.dp.tech", + type: "战略支撑单位", + }, + { + name: "蓝耘科技 LANYUN", + image: "assets/images/partners/orgs/lanyun.png", + url: "https://www.lanyun.net/", + type: "战略支撑单位", + }, + { + name: "亚信科技", + image: "assets/images/partners/orgs/Asiainfo.jpg", + url: "", + type: "战略支撑单位", + }, + { + name: "中国移动咪咕", + image: "assets/images/partners/orgs/migu.png", + url: "", + type: "战略支撑单位", + }, + ], + + partners: [ + { + name: "辰境绘卷", + image: "assets/images/partners/orgs/changing-view.png", + url: "partners/changing-view.html", + type: "视觉制作 / AIGC", + }, + { + name: "未央支教队", + image: "assets/images/partners/orgs/weiyang.png", + url: "", + type: "公益实践", + }, + { + name: "尘摄影工作室", + image: "assets/images/partners/orgs/Asher.jpg", + url: "https://mp.weixin.qq.com/s/oeJ3EkE4_VP3RJDYAC3HYA", + type: "影像合作", + }, + ], + + memberGroups: [ + { + name: "主席团", + members: [ + { name: "郭凯文" }, + { name: "张晰元", url: "https://zhangxiyuan2004.github.io" }, + { name: "罗悦嘉" }, + ], + }, + { + name: "副会长", + members: [ + { name: "段之续", url: "https://zxuuuustupid.github.io" }, + { name: "刘锐洁" }, + { name: "张耀" }, + { name: "张煦", url: "https://xuzhang-x-z.github.io" }, + { name: "郭博成" }, + { name: "张博涵" }, + ], + }, + ], +}; diff --git a/assets/js/main.js b/assets/js/main.js index 3e1a6d2..682af34 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -1,93 +1,182 @@ -document.addEventListener("DOMContentLoaded", function () { - console.log("Main.js loaded: Initializing Navbar..."); - - // 1. 注入导航栏 (Navbar) - // 注意:移动端按钮现在使用 SVG,不再依赖 FontAwesome - const navbarHTML = ` - `; - document.body.insertAdjacentHTML("afterbegin", navbarHTML); - // 2. 绑定交互事件 - const btn = document.getElementById("mobile-menu-btn"); - const menu = document.getElementById("mobile-menu"); - const iconMenu = document.getElementById("icon-menu"); - const iconClose = document.getElementById("icon-close"); + document.body.insertAdjacentHTML("afterbegin", navbarHTML); + } + + function bindNavbar() { + const btn = document.getElementById("mobile-menu-btn"); + const menu = document.getElementById("mobile-menu"); + const iconMenu = document.getElementById("icon-menu"); + const iconClose = document.getElementById("icon-close"); + + if (!btn || !menu || !iconMenu || !iconClose) return; + + const setOpen = (open) => { + menu.classList.toggle("hidden", !open); + iconMenu.classList.toggle("hidden", open); + iconClose.classList.toggle("hidden", !open); + btn.setAttribute("aria-expanded", String(open)); + btn.setAttribute("aria-label", open ? "关闭导航菜单" : "打开导航菜单"); + }; - if (btn && menu) { - console.log("Mobile menu elements found, attaching listener."); btn.addEventListener("click", () => { - // 切换菜单显示 - menu.classList.toggle("hidden"); + setOpen(menu.classList.contains("hidden")); + }); - // 切换图标显示 - if (menu.classList.contains("hidden")) { - iconMenu.classList.remove("hidden"); - iconClose.classList.add("hidden"); - } else { - iconMenu.classList.add("hidden"); - iconClose.classList.remove("hidden"); - } + menu.addEventListener("click", (event) => { + if (event.target.closest("a")) setOpen(false); + }); + + document.addEventListener("keydown", (event) => { + if (event.key === "Escape") setOpen(false); }); - } else { - console.error("Error: Mobile menu button not found via JS."); } - // 3. 注入页脚 (Footer) - 保持不变 - const footerHTML = ` - `; - document.body.insertAdjacentHTML("beforeend", footerHTML); -}); + document.body.insertAdjacentHTML("beforeend", footerHTML); + } + + function bindCopyButtons() { + document.addEventListener("click", (event) => { + const btn = event.target.closest("[data-copy]"); + if (!btn) return; + + const text = btn.dataset.copy; + const toast = btn.querySelector(".home-contact-copy-toast"); + + // Copy to clipboard + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(text); + } else { + // Fallback for older browsers + const ta = document.createElement("textarea"); + ta.value = text; + ta.style.position = "fixed"; + ta.style.opacity = "0"; + document.body.appendChild(ta); + ta.select(); + document.execCommand("copy"); + ta.remove(); + } + + // Show toast animation + if (toast) { + toast.classList.remove("is-visible"); + // Force reflow to restart animation + void toast.offsetWidth; + toast.classList.add("is-visible"); + toast.addEventListener("animationend", () => { + toast.classList.remove("is-visible"); + }, { once: true }); + } + }); + } + + document.addEventListener("DOMContentLoaded", () => { + insertNavbar(); + bindNavbar(); + bindRipple(); + bindCopyButtons(); + insertFooter(); + }); +})(); diff --git a/assets/js/render-events.js b/assets/js/render-events.js new file mode 100644 index 0000000..6a34f3b --- /dev/null +++ b/assets/js/render-events.js @@ -0,0 +1,56 @@ +(function () { + const root = document.getElementById("eventsTimeline"); + if (!root || !window.IA_DATA) return; + + const escapeHTML = (value) => + String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + + const isExternal = (url) => /^https?:\/\//i.test(url); + let currentYear = ""; + + function linkHTML(link) { + const external = link.external || isExternal(link.url); + const attrs = external ? ' target="_blank" rel="noopener noreferrer"' : ""; + return `${escapeHTML(link.label)}`; + } + + root.innerHTML = window.IA_DATA.activities + .map((activity) => { + const year = activity.date.slice(0, 4); + const yearLabel = + year !== currentYear + ? `
${escapeHTML(year)}
` + : ""; + currentYear = year; + + const links = activity.links.length + ? `
${activity.links.map(linkHTML).join("")}
` + : ""; + + return ` + ${yearLabel} +
+
+
+
+
${escapeHTML(activity.date)}
+

${escapeHTML(activity.title)}

+
+
+ ${escapeHTML(activity.type)} + ${escapeHTML(activity.status)} +
+
+

${escapeHTML(activity.description)}

+ ${links} +
+
+ `; + }) + .join(""); +})(); diff --git a/assets/js/render-members.js b/assets/js/render-members.js new file mode 100644 index 0000000..ae1387f --- /dev/null +++ b/assets/js/render-members.js @@ -0,0 +1,36 @@ +(function () { + const root = document.getElementById("membersRoot"); + if (!root || !window.IA_DATA) return; + + const escapeHTML = (value) => + String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + + function memberChip(member) { + const name = escapeHTML(member.name); + if (member.url) { + return ` + ${name} + + `; + } + return `${name}`; + } + + root.innerHTML = window.IA_DATA.memberGroups + .map( + (group) => ` +
+

${escapeHTML(group.name)}

+
+ ${group.members.map(memberChip).join("")} +
+
+ `, + ) + .join(""); +})(); diff --git a/assets/js/render-partners.js b/assets/js/render-partners.js new file mode 100644 index 0000000..dcb1244 --- /dev/null +++ b/assets/js/render-partners.js @@ -0,0 +1,76 @@ +(function () { + const advisorsRoot = document.getElementById("advisorsGrid"); + const orgsRoot = document.getElementById("organizationsGrid"); + const partnersRoot = document.getElementById("partnersGrid"); + if (!window.IA_DATA) return; + + const escapeHTML = (value) => + String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + + const isExternal = (url) => /^https?:\/\//i.test(url); + const linkAttrs = (url) => (isExternal(url) ? ' target="_blank" rel="noopener noreferrer"' : ""); + + if (advisorsRoot) { + advisorsRoot.innerHTML = window.IA_DATA.advisors + .map( + (advisor) => ` +
+
+
+ ${escapeHTML(advisor.name)} + +
+
+ ${escapeHTML(advisor.name)} +
${escapeHTML(advisor.title)}
+
+
+

${escapeHTML(advisor.description)}

+
+ `, + ) + .join(""); + } + + function logoTile(item) { + const content = item.image + ? ` + ${escapeHTML(item.name)} + + ` + : `${escapeHTML(item.name)}`; + + if (!item.url) { + return ` + + `; + } + + return ` + +
+
${content}
+
${escapeHTML(item.type)}
+
+
+ `; + } + + if (orgsRoot) { + orgsRoot.innerHTML = window.IA_DATA.organizations.map(logoTile).join(""); + } + + if (partnersRoot) { + partnersRoot.innerHTML = window.IA_DATA.partners.map(logoTile).join(""); + } +})(); diff --git a/assets/js/render-products.js b/assets/js/render-products.js new file mode 100644 index 0000000..d80f088 --- /dev/null +++ b/assets/js/render-products.js @@ -0,0 +1,48 @@ +(function () { + const root = document.getElementById("productsRoot"); + if (!root || !window.IA_DATA) return; + + const escapeHTML = (value) => + String(value) + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + + const isExternal = (url) => /^https?:\/\//i.test(url); + + function linkHTML(link) { + const attrs = link.external || isExternal(link.url) ? ' target="_blank" rel="noopener noreferrer"' : ""; + const variant = link.primary ? "ia-btn ia-btn-primary" : "ia-btn ia-btn-ghost"; + return `${escapeHTML(link.label)}`; + } + + function productCard(product, index) { + const links = product.links?.length + ? `
${product.links.map(linkHTML).join("")}
` + : ""; + const tags = product.tags?.length + ? `
${product.tags.map((tag) => `${escapeHTML(tag)}`).join("")}
` + : ""; + + return ` +
+
+ ${escapeHTML(product.stage)} + ${String(index + 1).padStart(2, "0")} +
+

${escapeHTML(product.name)}

+

${escapeHTML(product.intro)}

+ ${tags} + ${links} +
+ `; + } + + root.innerHTML = ` +
+ ${window.IA_DATA.products.map(productCard).join("")} +
+ `; +})(); diff --git a/events.html b/events.html index 18d2643..dc8eb82 100644 --- a/events.html +++ b/events.html @@ -1,180 +1,27 @@ - - - - - - - 活动日历 | UESTC IA - - - - - + + + 社团活动 | UESTC IA + + + + + + + + + - - - -
- -
-

Events Calendar

-

从前沿讲座到实战工坊,连接学术与产业的脉搏。

-
- - - - - - - - -
- -
- - -
- - 2025.01.20(周二) -
-
- 经验分享 - 1.20 -
-

【学科竞赛分享会】对话四位国赛得主:李旭阳 张煦 黄璇 张博涵

-

大学竞赛避坑指南:从选择到夺奖,一次讲透

- - - -
-
- - -
- - -
- - 2025.12.14(周日) -
-
- 项目分享 - 12.14 -
-

【IA x 深势科技】Uni-Lab线下WorkShop(宜宾场)

-

让实验更智能,让科研更高效。 本期 WorkShop 聚焦实验室表征设备智能化改造,邀你亲手解锁自动化实验新技能,共赴一场用技术赋能科研的进阶之旅!

- - - -
-
- - -
- PAST -
- - 2025.11.14 (周四) -
-

基础与前沿研究院2026年“大学生创新创业训练计划”项目

-

欢迎大二、大三的同学查看项目详情,了解选题情况。如有感兴趣的项目及时与老师联系 -

已结束

- - 查看详情 - -
- -
- - - - -
- PAST -
- - 2025.11.14 (周四) -
-

成电青年说·成电首档大型青年互动演说分享节目

-

主讲人:信通学院张晰元、黄璇同学(协会骨干) -

已结束

- - 查看详情/推文链接 - -
- -
- -
- PAST -
- - 2025.10 -
-

神经科学社更名为交叉学科协会

-

已结束

-
-
- - -
- PAST -
- - 2025.2 -
-

电子科技大学神经科学社成立

-

已结束

-
-
- -
- -
+ +
+
+
Club Activities
+

社团活动

+
+ +
+
- \ No newline at end of file + diff --git a/index.html b/index.html index 8618ede..25153bf 100644 --- a/index.html +++ b/index.html @@ -5,237 +5,52 @@ 首页 | UESTC Interdisciplinary Association - - - - - + + - -
- - -
- - - -
- - -
- -
-

- Platform Stats -

-
-
-
5
-
Research Tracks
-
-
-
5
-
Professors
-
-
-
TOP
-
Partners
+ +
+
+ +
+

UESTC Interdisciplinary Association

+

AI Methods · Science · Health · Engineering · Finance

+
+ 了解我们 +
- - - -
-
-
-
- - - - - FLAGSHIP EVENT -
-

- 【IA x - 深势科技】Uni-Lab线下WorkShop(宜宾场)报名开启!让实验更智能,让科研更高效 -

-

点击查看活动详情 →

-
-
-
+
diff --git a/join.html b/join.html index 6684418..a029e59 100644 --- a/join.html +++ b/join.html @@ -1,133 +1,123 @@ - - - - - - - - + + + + + + 加入我们 | UESTC IA - - - + + - - + + +
+
+
Join UESTC IA
+

加入交叉学科协会

+

欢迎对跨学科研究、产业实践和项目协作感兴趣的同学加入我们。

+
-
+
+
+ +

前沿训练

+

覆盖大模型、科研方法与工程实践。

+
+
+ +

资源连接

+

连接导师、企业与校友网络。

+
+
+ +

成长路径

+

通过真实项目积累作品和经验。

+
+
- -
-

Ready to Define the Future?

-

- 这里没有传统的课堂,只有真实的挑战。加入我们,构建你的“第二课堂”。 -

+
+
+ Join Us +

如何加入

+

扫描下方二维码加入 QQ 群,了解协会最新动态与活动信息。

- -
-
-
- -
-

前沿技术栈

-

接触 Deep Learning, Brain Science 等跨学科前沿,填补传统教育空白。

+
+
+
+ QQ群
-
-
- -
-

产学研资源

-

直接对接顶尖实验室导师与头部企业(深势科技等)实习机会。

+
+
+
+
+ +
+
+

QQ 群

+

获取最新活动通知、项目动态与行业资讯。

+
-
-
- -
-

精英社区

-

与来自信通、计算机、生医、经管的顶尖同学组队,拓展视野。

+
+
+ +
+
+

活动参与

+

优先报名参与协会组织的讲座、工作坊与黑客松。

+
+
+
+ +
+
+

社区互动

+

与志同道合的同学交流学习,构建人脉网络。

+
+
+
- -
- -
-
- -
-

入会流程

- -
- -
-
-
1
-
-

加入咨询群 / 关注频道

-

扫描右侧二维码,获取最新招募简章和活动通知。

-
-
-
-
2
-
-

提交申请表

-

每年 3月 / 9月 开启纳新。填写并提交个人简历与意向方向。

-
-
-
-
3
-
-

面试与定组

-

通过核心骨干/导师面试,确定加入的项目组。

-
-
-
- - -
-
-

扫码加入我们

-

选择适合你的加入方式

-
- -
- -
-
-
- TechPulse 官方频道 -
-
- TechPulse 频道 - 获取最新技术动态 -
-
-
- - -
-
-
- QQ 招募咨询群 -
-
- 招募咨询群 - 直接咨询招新事宜 -
-
-
-
- -
-

* 请认准官方账号,谨防假冒

-
-
-
+
+
+
+
100+
+

社群成员

+
+
10+
+

合作企业/导师

+
+
+
+
+

常见问题

+
+
+

Q: 加入协会需要什么条件?

+

对跨学科研究感兴趣即可加入,无需特定技术背景。

+
+
+

Q: 协会有哪些活动形式?

+

包括技术讲座、项目实战、黑客松、企业参访等多种形式。

+
+
+

Q: 如何参与协会项目?

+

通过 QQ 群获取项目招募信息,可随时报名参与。

+
+
+
- - \ No newline at end of file + + diff --git a/members.html b/members.html new file mode 100644 index 0000000..0ebe2fb --- /dev/null +++ b/members.html @@ -0,0 +1,27 @@ + + + + + + 核心成员 | UESTC IA + + + + + + + + + + + +
+
+
Core Members
+

核心成员

+
+ +
+
+ + diff --git a/partners.html b/partners.html index df4ae1b..e46d143 100644 --- a/partners.html +++ b/partners.html @@ -1,337 +1,40 @@ - - - - - - - - 团队与合作 | UESTC IA - - - - - - -
-
-

- Partners & Advisors -

-

汇聚顶尖学术大脑与产业先锋。

-
- - -
-

- 学术指导委员会 -

-
- -
-
-
- - Professor -
-
-

- 尧德中 教授 -

-

杰出科学家

-
-
-

- 电子科技大学生命科学与技术学院创院院长 -

-
- - -
-
-
- Professor -
-
-

- 裴德乐 教授 -

-

古巴科学院院士

-
-
-

- 神经信息学权威专家 -

-
- - -
-
-
- Professor -
-
-

- 张帆 教授 -

-

国家青年人才

-
-
-

- 脑神经影像计算,弥散磁共振,医学图像分析 -

-
- - -
-
-
- Professor -
-
-

- 郑丁 教授 -

-

海外优青

-
-
-

- 半导体器件的人机交互柔性可穿戴技术 -

-
- - -
-
-
- Professor -
-
-

- 文明健 教授 -

-

- 主持美国自然科学基金(NSF)项目 -

-
-
-

- 数据驱动建模,不确定性量化,能源材料与器件 -

-
-
-
- - -
-

- 战略支撑单位 -

-
- - - 生命科学与技术学院 - - - - - 深势科技 DP Technology - - - - - Asiainfo - - - - 咪咕 - - - - - - - 蓝耘科技 LANYUN - -
-
- -
-

- 合作伙伴 -

-
- - 辰境绘卷 - - - - 未央支教队 - - - 尘摄影工作室 - - - -
-
-
- + + + + + 合作与导师 | UESTC IA + + + + + + + + + + + +
+
+
Partners & Advisors
+

合作与导师

+
+ +
+

学术指导委员会

+
+
+ +
+

战略支撑单位

+
+
+ +
+

合作伙伴

+
+
+
+ diff --git a/partners/changing-view.html b/partners/changing-view.html index d630699..a3fa172 100644 --- a/partners/changing-view.html +++ b/partners/changing-view.html @@ -408,7 +408,7 @@
- 返回合作伙伴列表 + 返回合作与导师
@@ -510,7 +510,7 @@

代表作品

- + 点击观看作品 @@ -547,4 +547,4 @@

官方邮箱

- \ No newline at end of file + diff --git a/projects.html b/projects.html index 368431a..de05954 100644 --- a/projects.html +++ b/projects.html @@ -1,78 +1,27 @@ - + - - - - - - 项目与成果 | UESTC IA - - - - - + + + 产品宣传 | UESTC IA + + + + + + + + + - + +
+
+
Product Promotion
+

产品宣传

+
-
- - -
-

Projects

-

从AI工具到创新应用,这里是我们的研究成果与实践项目。

-
- - - - -
+
+
diff --git a/projects/ytmsg.html b/projects/ytmsg.html index 1e7b15f..e5dcf82 100644 --- a/projects/ytmsg.html +++ b/projects/ytmsg.html @@ -20,7 +20,7 @@
- 返回项目列表 + 返回产品列表
diff --git a/projects/zeta.html b/projects/zeta.html new file mode 100644 index 0000000..960e44c --- /dev/null +++ b/projects/zeta.html @@ -0,0 +1,254 @@ + + + + + + + + + GitHave & FlashMemory - AI编程产品 | UESTC IA + + + + + + + + + +
+
+
+
+ +
+ + + + +
+
+
+ + 灰度测试中 +
+

+ GitHave & FlashMemory +

+

+ 全场景 AI 编程生态,兴趣使然打磨的开源产品 +

+

+ 面向开发者的 AI 工具链,通过 Web 门户、轻量级客户端或多端插件,享受开箱即用的 AI 辅助编码、一键生成 AI 代码报告、以及项目脉络梳理。 +

+ +
+
+
+ GitHave +
+
+
+
+ + +
+ +
+ + +
+
+
+

核心产品

+

打造全场景 AI 编程生态

+
+
+
+
+
+ +
+
+

GitHave

+

AI 编程助手

+
+
+

+ 面向开发者的 AI 工具链,通过 Web 门户、轻量级客户端或多端插件,享受开箱即用的 AI 辅助编码、一键生成 AI 代码报告、以及项目脉络梳理。 +

+
+ AI 辅助编码 + 代码报告生成 + 项目脉络梳理 + 多端插件 +
+
+
+
+
+ +
+
+

FlashMemory

+

分布式 AI 索引引擎

+
+
+

+ 去中心化分布式 AI 索引引擎,不仅能看懂你的代码,未来还能深度解析你本地的 PDF、图片、PPT 并作为知识库。 +

+
+ 代码理解 + 知识库构建 + 多格式解析 +
+
+
+
+
+ + +
+
+
+

产品定位

+

对标国际主流 AI 编程产品

+
+
+ Google CodeWiki + DeepWiki-Open + Context7 + Zread.ai + Open Code +
+
+
+ +

开箱即用

+

无需复杂配置,立即享受 AI 辅助编码体验

+
+
+ +

代码报告

+

一键生成完整的 AI 代码分析报告

+
+
+ +

脉络梳理

+

智能解析项目结构,理清代码逻辑

+
+
+
+
+ + +
+
+
+ 社区支持 +
+

加入 ZetaZeroHub 开源社区

+
+ ZetaZeroHub +
+

+ 遇到使用 Bug 或想对产品吐槽,欢迎联系我们。等后面各方面成熟好玩了,拉感兴趣的小伙伴加入开源社区交流群。 +

+ + +
+
+ + + + + + diff --git a/projects0.html b/projects0.html index 341013a..72297bf 100644 --- a/projects0.html +++ b/projects0.html @@ -1,120 +1,26 @@ - - - - - - - - 项目与成果 | UESTC IA + + + + + + 椤圭洰妗f | UESTC IA - - - + + - - - -
- -
-

Projects & Achievements

-

打破壁垒,协同共创,见证解决真实世界问题的创新力量。

-
- - -
-
-

- 创新实验室 (In Progress) -

- 显示部分精选项目 -
- -
- -
-
- 招募中 -
-
Health Track
-

基于 EEG 的情绪识别系统

-

- 利用深度学习分析脑电信号,构建实时的情绪监测系统。目前需要熟悉 PyTorch 的同学加入模型优化组。 -

-
- 指导: 尧德中 教授 - 详情 → -
-
- - -
-
Engineering Track
-

具身智能机器人抓取算法

-

- 结合计算机视觉与强化学习,提升机械臂在非结构化环境下的抓取成功率。 -

-
- 团队: 5人 (满员) - 查看进度 -
-
- - -
-
- - -
-

- 荣誉榜单 -

- -
-
- -
-
- -
-
-

发表高水平学术论文 (IEEE TBME)

-

Paper: "Cross-subject EEG Emotion Recognition based on..."

-
-
2024.10
-
- - -
-
- -
-
-

全国大学生集成电路创新创业大赛 一等奖

-

Engineering 方向 - 芯片设计专项小组

-
-
2024.08
-
- - -
-
- -
-
-

软件著作权 2 项

-

智慧医疗辅助诊断系统 V1.0

-
-
2024.06
-
-
- -
-
- + + +
+
+
Project Archive

椤圭洰妗f

璁板綍鍗忎細鍘嗗彶椤圭洰涓庨樁娈垫垚鏋滐紝鐢ㄤ簬澶嶇洏涓庣粡楠屽鐢ㄣ€?/p>

+
+
+

Archive Item

+

鐮旈€斾俊浣匡紙棣栧彂鐗堬級

+

棣栦釜闈㈠悜鐮旂┒鐢熷満鏅殑淇℃伅鍔╂墜椤圭洰锛屽畬鎴愪粠闇€姹傝皟鐮斿埌 MVP 鍙戝竷銆?/p> + 鏌ョ湅褰掓。璇︽儏 +

- - \ No newline at end of file + + diff --git a/research.html b/research.html index 6df0e0c..168f3cc 100644 --- a/research.html +++ b/research.html @@ -1,224 +1,26 @@ - - - - - - - 核心方向 | UESTC IA - + + + + + 研究方向 | UESTC IA - - - + + - - - - -
- - -
-

Research Tracks

-

五大核心引擎,以人工智能为驱动,打破学科壁垒。

-
- -
- -
- - - - - - - - -
- - -
- - -
-
- Base Layer -

AI Methods | 技术底座

-
-

- 作为整个社团的技术核心,AI Methods 部负责组织人工智能核心技术的培训与工作坊。该部门致力于为其他各方向的活动与项目提供关键的方法论和技术支持,是推动AI创新实践的基石。 -

- -
-
-

核心职能

-
    -
  • • 提供人工智能核心技术培训与工作坊
  • -
  • • 为各跨学科项目提供方法论与技术支持
  • -
  • • 推动AI驱动的创新实践落地
  • -
-
-
-

技术栈

-
- PyTorch - LLM Fine-tuning - CUDA - XAI - Multi-modal AI -
-
-
-
- - -
-
- Application -

Science | 计算科学与基础研究

-
-

- Science 部聚焦于计算科学在基础研究领域的深层应用。部门通过策划专业的讲座、工作坊以及项目实践活动,组织成员探索科学前沿课题。 -

- -
-

核心课题

-
    -
  • • 探索蛋白质结构预测
  • -
  • • 开展新材料发现研究
  • -
  • • 组织计算科学基础研究领域的学术活动与实践
  • -
-
- -
-
-

学术活动

-

定期举办计算科学前沿讲座,邀请校内外专家学者分享最新研究成果。

-
-
-

实践项目

-

组织跨学科研究小组,参与国家重大科研项目,培养科研能力。

-
-
-
- - -
-
- Application -

Health | 智慧医疗与生命健康

-
-

- Health 部致力于推动智慧医疗创新,重点关注智能技术在医疗健康领域的应用。部门通过组织高水平的学术交流与实践项目,促进医学与AI的深度融合。 -

- -
-

核心方向

-
    -
  • • 推动智慧医疗创新实践
  • -
  • • 进行医学影像分析研究
  • -
  • • 探索智能医疗与可穿戴设备应用
  • -
-
- -
-
-

医疗合作

-

与附属医院合作,开展真实医疗场景下的AI应用研究与验证。

-
-
-

技术研发

-

开发医学影像分析算法,提升疾病早期诊断的准确性和效率。

-
-
-
- - -
-
- Application -

Engineering | 工程应用与硬科技

-
-

- Engineering 部面向具体的工程应用领域,旨在联合校内优势力量解决实际工程难题。部门通过组织前沿分享会与科创项目,推动工程技术突破。 -

- -
-

核心领域

-
    -
  • • 联合攻关解决工程难题
  • -
  • • 探索具身智能前沿技术
  • -
  • • 开展芯片设计与通信系统研究
  • -
-
- -
-
-

具身智能

-

研发智能机器人系统,实现环境感知、决策规划与精准执行的完整技术链。

-
-
-

芯片技术

-

参与芯片设计项目,从架构设计到验证测试,培养全栈芯片研发能力。

-
-
-
- - -
-
- Application -

Finance | 金融科技与计算金融

-
-

- Finance 部专注于现代计算方法在金融管理中的应用。部门通过组织专业的讲座与深入的案例分析,致力于培养成员的金融科技素养。 -

- -
-

核心职能

-
    -
  • • 培养复合型金融科技素养
  • -
  • • 研究现代计算方法在金融管理中的应用
  • -
  • • 进行金融科技案例分析与研讨
  • -
-
- -
-
-

量化分析

-

运用机器学习算法进行金融市场预测、风险评估和投资组合优化。

-
-
-

风险管理

-

开发智能风控系统,实时监测金融风险,提升金融机构的风险管理能力。

-
-
-
-
-
+ + +
+
Research Tracks

研究方向

围绕 AI for Science 的跨学科问题,形成方法、工程与应用三层协同。

+ +
+

AI Methods

AI 方法论

聚焦多模态建模、参数高效微调、可解释学习与稳健评估。

PyTorchLLMXAI
+

Science

科学智能

将机器学习方法用于生物、材料和复杂系统中的数据驱动发现。

Data MiningSimulationDiscovery
+

Health

健康与医学

在神经信号分析、医学影像与健康监测中推进算法落地。

EEGMedical AIMonitoring
+

Engineering

工程系统

强调端到端工程化能力,包括数据管线、部署、评测与迭代。

MLOpsDeploymentHardware
+

Finance

金融智能

研究风险识别、时序建模与知识增强决策支持。

Time SeriesRiskDecision
+
- - \ No newline at end of file + +