Skip to content

[add] Hero Carousel component with Aurora Gradient style in Home page#72

Merged
TechQuery merged 10 commits intomainfrom
labor-hackathon-2026
May 2, 2026
Merged

[add] Hero Carousel component with Aurora Gradient style in Home page#72
TechQuery merged 10 commits intomainfrom
labor-hackathon-2026

Conversation

@dethan3
Copy link
Copy Markdown
Member

@dethan3 dethan3 commented Apr 30, 2026

PR-72 PR-72 PR-72 Powered by Pull Request Badge

Checklist(清单):

  • Labels
  • Assignees
  • Reviewers
  1. 增加首页活动横幅
  2. pnpm-lock.yaml 有变动导致 eslint.config.ts:29@next/next 插件类型不匹配

Summary by CodeRabbit

发布说明

  • 新功能

  • 改进

    • 首页改为在服务端获取并注入活动数据,提升首屏加载体验。
    • 优化导航栏样式,防止品牌名称和顶级链接文本换行,确保导航布局稳定。
    • 增强轮播样式与响应式表现(指示器、控件、卡片、按钮与描述适配不同屏幕)。

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 30, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

首页在 PageHead 后渲染新加入的 HeroCarousel,该轮播由服务端通过 getServerSideProps 传入最多 3 条活动数据;新增响应式 Less 模块与组件渲染/交互逻辑;导航栏品牌与顶级链接添加 text-nowrap 以防换行;Activity 模型调整了非 database 链接的返回值处理。

Changes

Hero 轮播(服务端供给数据)

Layer / File(s) Summary
接口/页面 props
pages/index.tsx
新增 HomePagePropsgetServerSideProps 调用 new ActivityModel().getList({}, 1, 3) 并把 activities 注入页面 props。
组件签名/数据传入
components/Activity/HeroCarousel.tsx, pages/index.tsx
HeroCarousel 从内部加载改为接受 activities: Activity[] 作为 prop;pages/index.tsx<PageHead /> 之后渲染 <HeroCarousel activities={activities} />
渲染/交互逻辑
components/Activity/HeroCarousel.tsx
根据传入活动数组渲染 fade Carousel(仅当活动数>1 显示指示器/控制),为空时返回 null;新增时间格式化、位置/描述回退、hosts 截断、图片来源选择、--hero-carousel-offset CSS 变量同步(通过 ResizeObserver)和描述行数的窗口 resize 适配。
样式
components/Activity/HeroCarousel.module.less
新增样式模块,定义 .heroCarousel、响应式 min-height(使用 --hero-carousel-offset)、指示器/控制样式、渐变覆盖、.actionButton 交互与移动端调整。
公开常量
components/Activity/HeroCarousel.tsx
导出 export const HERO_CAROUSEL_ITEMS = 3(组件使用或文档依赖该常量)。

导航栏和模型微调

Layer / File(s) Summary
导航样式
components/Navigator/MainNavigator.tsx
Navbar.Brand 与顶级非下拉 Nav.Link 添加 text-nowrap 类以禁止换行;现有激活样式逻辑保持不变。
模型行为
models/Activity.ts
ActivityModel.getLink 在非 database 分支由 link + '' 改为 link?.toString(),当 linknull/undefined 时将返回 undefined(原先会返回字符串 'null'/'undefined')。

Sequence Diagram(s)

sequenceDiagram
    participant Page as Page (pages/index)
    participant Hero as HeroCarousel
    participant API as ActivityModel/API
    participant DOM as Browser DOM
    participant Img as LarkImage

    Page->>Hero: render with props activities[]
    activate Hero
    Hero->>Hero: if activities.length === 0 -> return null
    Hero->>DOM: read nav height (ResizeObserver / getBoundingClientRect)
    activate DOM
    DOM-->>Hero: nav height
    deactivate DOM
    Hero->>Hero: set CSS var --hero-carousel-offset
    Hero->>Hero: format dates, build badges, pick images
    loop per activity
        Hero->>Img: render/lazy-load image
        activate Img
        Img-->>Hero: image ready/rendered
        deactivate Img
        Hero->>DOM: render slide (badges, desc, action link via ActivityModel.getLink)
    end
    Hero->>DOM: listen window.resize -> adjust description rows
    deactivate Hero
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

enhancement

Suggested reviewers

  • TechQuery

Poem

🎠 主页添轮播,三条活动列行,
渐变影层随屏动,文字稳不换行,
链接微调更干净,样式与交互齐心。

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed PR标题准确反映了主要变更:在首页添加了英雄轮播组件(Hero Carousel)并使用了Aurora渐变样式,与代码变更完全匹配。
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch labor-hackathon-2026

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@dethan3 dethan3 requested a review from TechQuery April 30, 2026 09:26
@dethan3 dethan3 added the feature New feature or request label Apr 30, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pages/index.tsx`:
- Line 69: Replace the hardcoded event name inside the span (className
styles.hackathonTopBarEventName) with a call to the i18n t() function and add a
corresponding translation key (e.g. "hackathon.eventName") to your locale files;
update pages/index.tsx to use t('hackathon.eventName') (or the chosen key) so
the visible text is localized and ensure the new key exists in all supported
locales.
- Around line 57-84: The top-banner uses raw HTML elements and a hard-coded
event name; replace the <aside>/<div>/<a>/<button>/<span> usage with React
Bootstrap components (e.g., Alert, Card, Button/CloseButton) while preserving
behavior tied to isHackathonTopBarVisible, hackathonTopBarStyle,
HackathonTopBarLink and the closeHackathonTopBar handler, and move the literal
"Labor AI Hackathon 2026" into i18n as home_hackathon_top_bar_event_name,
rendering it via t('home_hackathon_top_bar_event_name') alongside the existing
t('home_hackathon_top_bar_title'), t('home_hackathon_top_bar_description') and
t('home_hackathon_top_bar_action'); ensure aria-label/title still use
t('home_hackathon_top_bar_aria_label') and t('home_hackathon_top_bar_close').
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: afcd89f5-d1e7-40d2-bfc2-16789a915968

📥 Commits

Reviewing files that changed from the base of the PR and between b160b03 and 3b66c69.

⛔ Files ignored due to path filters (6)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml, !pnpm-lock.yaml and included by none
  • styles/Home.module.less is excluded by none and included by none
  • styles/globals.css is excluded by none and included by none
  • translation/en-US.ts is excluded by none and included by none
  • translation/zh-CN.ts is excluded by none and included by none
  • translation/zh-TW.ts is excluded by none and included by none
📒 Files selected for processing (1)
  • pages/index.tsx

Comment thread pages/index.tsx Outdated
Comment thread pages/index.tsx Outdated
Comment thread styles/globals.css Outdated
Comment thread translation/zh-CN.ts Outdated
Comment thread pages/index.tsx
- Replace raw HTML with Alert, Alert.Link, CloseButton

- Move complex styles from styled-jsx to PromoBar.module.less

- Add Bootstrap utility classes for layout

- Fetch activity name/link from Lark Bitable via ActivityModel

- Keep localStorage persistence commented out
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@components/Activity/PromoBar.tsx`:
- Around line 41-50: 在 useEffect 中对异步加载添加卸载保护:在 useEffect 里创建一个标志(例如 let mounted
= true 或使用 AbortController 如果 ActivityModel.getOne 支持取消),在 getOne
调用前保留该标志/控制器,并在 Promise resolve 前检查 mounted,只有 mounted 为 true 时才调用 setActivity;在
useEffect 返回的 cleanup 函数将 mounted 设为 false(或调用
controller.abort())以阻止组件卸载后继续更新或消耗请求资源。确保引用的符号为 useEffect、ActivityModel.getOne 和
setActivity。
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4a3b4906-bb3f-4728-9d11-7adac39ad05a

📥 Commits

Reviewing files that changed from the base of the PR and between 3b66c69 and ed2cf15.

📒 Files selected for processing (4)
  • components/Activity/PromoBar.module.less
  • components/Activity/PromoBar.tsx
  • components/Navigator/MainNavigator.tsx
  • pages/index.tsx
✅ Files skipped from review due to trivial changes (3)
  • pages/index.tsx
  • components/Activity/PromoBar.module.less
  • components/Navigator/MainNavigator.tsx

Comment thread components/Activity/PromoBar.tsx Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@components/Activity/HeroCarousel.module.less`:
- Around line 14-47: The stylelint error is caused by CSS Modules :global()
being treated as an unknown pseudo-class; update the linter config to allow it
by adding an exception for "global" to the selector-pseudo-class-no-unknown rule
(e.g., set "selector-pseudo-class-no-unknown": ["error", {
"ignorePseudoClasses": ["global"] }]) in .stylelintrc.json, or alternatively
enable Less parsing by adding customSyntax: "postcss-less" (and installing
postcss-less) so Less files and CSS Modules :global() are recognized; adjust the
config rather than changing components/Activity/HeroCarousel.module.less.

In `@components/Activity/HeroCarousel.tsx`:
- Around line 73-90: The useEffect in HeroCarousel (the async IIFE that
constructs ActivityModel, calls model.getAll(), filters/sorts/slices to
MAX_ITEMS and then calls setActivities) can update state after the component
unmounts; add an unmount guard: declare a local mounted/isActive flag before the
async work, check it before calling setActivities, and set the flag to false in
the effect cleanup returned function so the state update is skipped when the
component has been unmounted.
- Around line 103-107: Replace the native <section> root in HeroCarousel.tsx
with React Bootstrap's Container using as="section" to preserve semantics;
update the JSX root where the element with className={`${styles.heroCarousel}
position-relative`} aria-label={t('home_hackathon_top_bar_aria_label')}
style={heroStyle} is defined to use <Container as="section" ...> and the
matching closing tag, and add the Container import from 'react-bootstrap' if
missing so the component follows the project's React Bootstrap convention.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d51b74c7-7d3b-4b10-b791-0270372de013

📥 Commits

Reviewing files that changed from the base of the PR and between ed2cf15 and 51d09ee.

⛔ Files ignored due to path filters (1)
  • tsconfig.json is excluded by none and included by none
📒 Files selected for processing (3)
  • components/Activity/HeroCarousel.module.less
  • components/Activity/HeroCarousel.tsx
  • pages/index.tsx
✅ Files skipped from review due to trivial changes (1)
  • pages/index.tsx

Comment thread components/Activity/HeroCarousel.module.less
Comment thread components/Activity/HeroCarousel.tsx Outdated
Comment thread components/Activity/HeroCarousel.tsx Outdated
Comment thread components/Activity/HeroCarousel.module.less Outdated
Comment thread components/Activity/HeroCarousel.module.less
Comment thread tsconfig.json
Comment thread components/Activity/HeroCarousel.tsx Outdated
Comment thread components/Activity/HeroCarousel.tsx Outdated
Comment on lines +73 to +90
useEffect(() => {
(async () => {
try {
const model = new ActivityModel();
const data = await model.getAll();
const latestActivities = data
.filter(({ name }) => Boolean(name))
.sort(
({ startTime: left }, { startTime: right }) => timestampOf(right) - timestampOf(left),
)
.slice(0, MAX_ITEMS);

setActivities(latestActivities);
} catch (err) {
console.error('Failed to load activities:', err);
}
})();
}, []);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

数据从服务端加载最近几条,直接照抄我以前的开源代码:
https://github.com/kaiyuanshe/kaiyuanshe.github.io/blob/a9afddbee79d1e3fe501d491d2aa7f0699ac56c9/pages/index.tsx#L29-L50

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GPT 认为他写得更符合现在的项目

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GPT 认为他写得更符合现在的项目

是它更了解本项目,还是我更了解本项目?

我们为什么自己建站、不用飞书多维表格应用来开发?就是因为它是服务端渲染,可以很容易被搜索引擎和 AI 抓取。

而且你的代码为了显示“近期活动”,查询了所有活动,没有加分页参数,后面活动越来越多,这个加载性能有多差?

Comment thread components/Activity/HeroCarousel.tsx Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@components/Activity/HeroCarousel.module.less`:
- Around line 1-3: The Stylelint error comes from missing an empty line before
the background declaration inside the .heroCarousel rule; edit the .heroCarousel
block to insert a blank line after the custom property --hero-carousel-offset
and before the background declaration (or alternatively adjust the rule in
Stylelint config if intentionally omitting empty lines), ensuring the background
property is separated by an empty line from the custom property to satisfy
declaration-empty-line-before.

In `@components/Activity/HeroCarousel.tsx`:
- Around line 124-125: The href computation can produce the literal string
'undefined' when activity.link is undefined and ActivityModel.getLink falls back
to concatenating link + '', causing <a href="undefined">; fix by ensuring href
is only set when a real URL exists: update the mapping in the activities loop
(where activities.map and const href = (activity.link as string) ||
ActivityModel.getLink(activity)) to check for truthy values and normalize
ActivityModel.getLink to return undefined/null (not the string 'undefined') when
no link/database is present; alternatively compute href as const href =
(activity.link as string) ?? ActivityModel.getLink(activity); then guard against
the string 'undefined' (e.g. set href = href === 'undefined' ? undefined : href)
and let Button render without an href or use a safe fallback, and also adjust
models/Activity.ts extractFields/getLink to avoid returning 'undefined' by not
doing link + '' when link is undefined.
- Around line 29-32: The formatDateLabel function currently hardcodes the locale
to 'zh-CN', violating i18n; change formatDateLabel to accept a locale parameter
(e.g., formatDateLabel(timestamp, locale)) and update all callers in
HeroCarousel to pass the current language from I18nContext (or the component's
locale prop) so Intl.DateTimeFormat uses that locale; ensure any user-facing
strings still go through t() where applicable and update the function signature
and usages (formatDateLabel) accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 8869b18d-13e5-4e0a-a897-c3b3372a4479

📥 Commits

Reviewing files that changed from the base of the PR and between 51d09ee and f527d0e.

⛔ Files ignored due to path filters (3)
  • .stylelintrc.json is excluded by none and included by none
  • package.json is excluded by none and included by none
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml, !pnpm-lock.yaml and included by none
📒 Files selected for processing (2)
  • components/Activity/HeroCarousel.module.less
  • components/Activity/HeroCarousel.tsx

Comment thread components/Activity/HeroCarousel.module.less
Comment thread components/Activity/HeroCarousel.tsx Outdated
Comment thread components/Activity/HeroCarousel.tsx Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@components/Activity/HeroCarousel.tsx`:
- Around line 1-9: Reorder the top imports in HeroCarousel.tsx to satisfy
simple-import-sort/imports: group and alphabetize external package imports so
they read idea-react (TextTruncate) → mobx-lark (TableCellLocation) → react
(CSSProperties, FC, useContext, useEffect, useState) → react-bootstrap (Badge,
Button, Card, Carousel, Col, Container, Row, Stack); keep local imports
(Activity, ActivityModel, I18nContext, LarkImage, styles) after external
packages and preserve existing named imports and spacing.

In `@pages/index.tsx`:
- Around line 18-21: There are two fixes: add a blank line before the return in
getServerSideProps to satisfy the `@stylistic/padding-line-between-statements`
rule, and replace the magic number 3 passed to ActivityModel().getList({}, 1, 3)
with the exported HERO_CAROUSEL_ITEMS constant from HeroCarousel.tsx so the
server-side fetch matches the component; update the import list at the top to
import HERO_CAROUSEL_ITEMS and call getList({}, 1, HERO_CAROUSEL_ITEMS) inside
the getServerSideProps function.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: dd20e8d3-f609-48c4-a73d-4d8c2c9c01a9

📥 Commits

Reviewing files that changed from the base of the PR and between f527d0e and a5e8e6c.

📒 Files selected for processing (4)
  • components/Activity/HeroCarousel.module.less
  • components/Activity/HeroCarousel.tsx
  • models/Activity.ts
  • pages/index.tsx
✅ Files skipped from review due to trivial changes (1)
  • components/Activity/HeroCarousel.module.less

Comment on lines +1 to +9
import { CSSProperties, FC, useContext, useEffect, useState } from 'react';
import { TextTruncate } from 'idea-react';
import { TableCellLocation } from 'mobx-lark';
import { Badge, Button, Card, Carousel, Col, Container, Row, Stack } from 'react-bootstrap';

import { Activity, ActivityModel } from '../../models/Activity';
import { I18nContext } from '../../models/Translation';
import { LarkImage } from '../LarkImage';
import styles from './HeroCarousel.module.less';
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

修复 ESLint 报错:导入排序不符合 simple-import-sort/imports 规则。

该插件设计为配合 autofix 使用(eslint --fix 或编辑器 ESLint 扩展),可一键修复。外部包按字母序 idea-react → mobx-lark → react → react-bootstrap 排列即可通过 lint 检查。

🔧 建议修改
-import { CSSProperties, FC, useContext, useEffect, useState } from 'react';
-import { TextTruncate } from 'idea-react';
-import { TableCellLocation } from 'mobx-lark';
-import { Badge, Button, Card, Carousel, Col, Container, Row, Stack } from 'react-bootstrap';
+import { TextTruncate } from 'idea-react';
+import { TableCellLocation } from 'mobx-lark';
+import { CSSProperties, FC, useContext, useEffect, useState } from 'react';
+import { Badge, Button, Card, Carousel, Col, Container, Row, Stack } from 'react-bootstrap';
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import { CSSProperties, FC, useContext, useEffect, useState } from 'react';
import { TextTruncate } from 'idea-react';
import { TableCellLocation } from 'mobx-lark';
import { Badge, Button, Card, Carousel, Col, Container, Row, Stack } from 'react-bootstrap';
import { Activity, ActivityModel } from '../../models/Activity';
import { I18nContext } from '../../models/Translation';
import { LarkImage } from '../LarkImage';
import styles from './HeroCarousel.module.less';
import { TextTruncate } from 'idea-react';
import { TableCellLocation } from 'mobx-lark';
import { CSSProperties, FC, useContext, useEffect, useState } from 'react';
import { Badge, Button, Card, Carousel, Col, Container, Row, Stack } from 'react-bootstrap';
import { Activity, ActivityModel } from '../../models/Activity';
import { I18nContext } from '../../models/Translation';
import { LarkImage } from '../LarkImage';
import styles from './HeroCarousel.module.less';
🧰 Tools
🪛 ESLint

[error] 1-9: Run autofix to sort these imports!

(simple-import-sort/imports)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/Activity/HeroCarousel.tsx` around lines 1 - 9, Reorder the top
imports in HeroCarousel.tsx to satisfy simple-import-sort/imports: group and
alphabetize external package imports so they read idea-react (TextTruncate) →
mobx-lark (TableCellLocation) → react (CSSProperties, FC, useContext, useEffect,
useState) → react-bootstrap (Badge, Button, Card, Carousel, Col, Container, Row,
Stack); keep local imports (Activity, ActivityModel, I18nContext, LarkImage,
styles) after external packages and preserve existing named imports and spacing.

Comment thread pages/index.tsx Outdated
@TechQuery TechQuery changed the title refactor(home): redesign hackathon top bar with aurora gradient style [add] Hero Carousel component with Aurora Gradient style in Home page May 2, 2026
@TechQuery TechQuery merged commit 0d80652 into main May 2, 2026
4 checks passed
@TechQuery TechQuery deleted the labor-hackathon-2026 branch May 2, 2026 12:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

【开源市集】官网首页首屏添加“近期活动”轮播图

2 participants