Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 16 additions & 22 deletions .cache/contributors.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"updated_at": "2026-07-15T05:53:30.409Z",
"total": 170,
"updated_at": "2026-07-17T07:34:29.610Z",
"total": 169,
"contributors": [
{
"username": "whybeyoung",
Expand Down Expand Up @@ -35,7 +35,7 @@
{
"username": "dongmucat",
"avatar_url": "https://avatars.githubusercontent.com/u/70678707?v=4",
"contributions": 317,
"contributions": 318,
"profile_url": "https://github.com/dongmucat"
},
{
Expand All @@ -53,7 +53,7 @@
{
"username": "FenjuFu",
"avatar_url": "https://avatars.githubusercontent.com/u/92919259?v=4",
"contributions": 164,
"contributions": 169,
"profile_url": "https://github.com/FenjuFu"
},
{
Expand Down Expand Up @@ -98,18 +98,18 @@
"contributions": 99,
"profile_url": "https://github.com/doctorbruce"
},
{
"username": "dongjiang1989",
"avatar_url": "https://avatars.githubusercontent.com/u/5010507?v=4",
"contributions": 93,
"profile_url": "https://github.com/dongjiang1989"
},
{
"username": "Kexinist",
"avatar_url": "https://avatars.githubusercontent.com/u/108705088?v=4",
"contributions": 93,
"profile_url": "https://github.com/Kexinist"
},
{
"username": "dongjiang1989",
"avatar_url": "https://avatars.githubusercontent.com/u/5010507?v=4",
"contributions": 91,
"profile_url": "https://github.com/dongjiang1989"
},
{
"username": "xuehaoweng",
"avatar_url": "https://avatars.githubusercontent.com/u/73582376?v=4",
Expand Down Expand Up @@ -386,12 +386,6 @@
"contributions": 13,
"profile_url": "https://github.com/gaozhenfeng1"
},
{
"username": "OLDyade",
"avatar_url": "https://avatars.githubusercontent.com/u/75075125?v=4",
"contributions": 13,
"profile_url": "https://github.com/OLDyade"
},
{
"username": "tap-top",
"avatar_url": "https://avatars.githubusercontent.com/u/9601223?v=4",
Expand Down Expand Up @@ -735,10 +729,10 @@
"profile_url": "https://github.com/fangdudu"
},
{
"username": "Rsweater",
"avatar_url": "https://avatars.githubusercontent.com/u/49091147?v=4",
"username": "myml",
"avatar_url": "https://avatars.githubusercontent.com/u/13045857?v=4",
"contributions": 2,
"profile_url": "https://github.com/Rsweater"
"profile_url": "https://github.com/myml"
},
{
"username": "tenten-shih",
Expand All @@ -747,10 +741,10 @@
"profile_url": "https://github.com/tenten-shih"
},
{
"username": "myml",
"avatar_url": "https://avatars.githubusercontent.com/u/13045857?v=4",
"username": "Rsweater",
"avatar_url": "https://avatars.githubusercontent.com/u/49091147?v=4",
"contributions": 2,
"profile_url": "https://github.com/myml"
"profile_url": "https://github.com/Rsweater"
},
{
"username": "Xparadigm-jay",
Expand Down
28 changes: 14 additions & 14 deletions .cache/project-stats.json
Original file line number Diff line number Diff line change
@@ -1,50 +1,50 @@
{
"updated_at": "2026-07-16T19:03:59.458Z",
"updated_at": "2026-07-17T07:33:43.505Z",
"repos": {
"iflytek/astron-agent": {
"stars": 8621,
"forks": 864,
"updated_at": "2026-07-16T19:03:57.903Z"
"updated_at": "2026-07-17T07:33:39.124Z"
},
"iflytek/astron-rpa": {
"stars": 5214,
"stars": 5215,
"forks": 585,
"updated_at": "2026-07-16T19:03:58.098Z"
"updated_at": "2026-07-17T07:33:39.706Z"
},
"iflytek/astronclaw-tutorial": {
"stars": 418,
"forks": 43,
"updated_at": "2026-07-16T19:03:58.279Z"
"updated_at": "2026-07-17T07:33:40.256Z"
},
"iflytek/domux": {
"stars": 17,
"forks": 2,
"updated_at": "2026-07-16T19:03:58.501Z"
"updated_at": "2026-07-17T07:33:40.844Z"
},
"harnessclaw/harnessclaw-engine": {
"stars": 272,
"forks": 91,
"updated_at": "2026-07-16T19:03:58.696Z"
"updated_at": "2026-07-17T07:33:41.370Z"
},
"harnessclaw/harnessclaw": {
"stars": 332,
"forks": 89,
"updated_at": "2026-07-16T19:03:58.893Z"
"updated_at": "2026-07-17T07:33:41.885Z"
},
"iflytek/iFly-Skills": {
"stars": 202,
"forks": 24,
"updated_at": "2026-07-16T19:03:59.083Z"
"updated_at": "2026-07-17T07:33:42.430Z"
},
"iflytek/memflywheel": {
"stars": 20,
"stars": 21,
"forks": 3,
"updated_at": "2026-07-16T19:03:59.271Z"
"updated_at": "2026-07-17T07:33:42.976Z"
},
"iflytek/skillhub": {
"stars": 3964,
"forks": 674,
"updated_at": "2026-07-16T19:03:59.458Z"
"stars": 3974,
"forks": 634,
"updated_at": "2026-07-17T07:33:43.505Z"
}
}
}
12 changes: 11 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,24 @@ All notable changes to this project will be documented in this file.

## [Unreleased]

## [0.4.0] - 2026-07-17

### Added

- **Hugging Face Icon Asset**: Download official Hugging Face SVG logo to `src/assets/images/hugging-face.svg`; replace inline placeholder SVGs in `ProjectCard.astro` and `[slug].astro` with `<img src={hfIcon.src}>`
- **Blog Post Language Variants**: Posts can declare `lang` and `translationId` frontmatter to link zh/en versions — the site language toggle switches between variants on post pages (`data-translation-url` navigation in `BasicScripts.astro`), list/grid cards render both variants and swap via `.i18n-zh`/`.i18n-en` classes, and translated variants are excluded from pagination, RSS, related and adjacent posts (`fetchPosts` vs `fetchAllPosts` in `blog.ts`). First bilingual post: Astron SkillHub joining AAIF as Associate Member (news, zh + en)

### Changed

- **Search Index Blog Deduplication**: `search-index.json.ts` now groups blog posts by `translationId` — bilingual pairs merge into a single entry carrying `title`/`titleEn`, `excerpt`/`excerptEn`, and both `url`/`urlEn`; monolingual posts remain as single entries. Index shrinks from 11 to 9 blog entries for 7 monolingual + 2 bilingual pairs
- **SearchModal Language-Aware URLs**: `SearchModal.astro` selects `item.urlEn` when system language is English, so search result clicks navigate to the correct language variant of the blog post
- **PostNavigation Language-Aware**: `PostNavigation.astro` receives the current `post` and uses `display()` helper to show prev/next titles and URLs matching the page language — bilingual posts show the translation title + URL, monolingual posts show their native content
- **TableOfContents i18n**: TOC sidebar heading "目录" replaced with `data-i18n="blog.tableOfContents"` — shows "Table of Contents" in English mode; translation key added to `translations.ts`

### Fixed

- **CI Auto-Update Workflows**: Scheduled workflows (`Update Project Stats`, `Update Contributors`) failed with GH013 because `GITHUB_TOKEN` cannot bypass the "Protect default branch" ruleset — replaced with `ADMIN_PAT` secret (repo admin added to ruleset bypass list)
- **Observer Redeclaration on View Transitions**: `const Observer` in `BasicScripts.astro` top-level `is:inline` script caused `SyntaxError: Identifier 'Observer' has already been declared` when Astro client router swapped pages — wrapped in IIFE `(() => { ... })()` to create function scope
- **Observer Redeclaration on View Transitions**: `const Observer` in `BasicScripts.astro` top-level `is:inline` script caused `SyntaxError: Identifier 'Observer' has already been declared` when Astro client router swapped pages — wrapped in IIFE `(() => { ... })()` to create function scope, exposed as `window.Observer` so the theme toggle script block can access `Observer.removeAnimationDelay()`

## [0.3.0] - 2026-07-03

Expand Down Expand Up @@ -53,6 +62,7 @@ All notable changes to this project will be documented in this file.

### Fixed

- **Landscape Arrow Label Overlap & Title Truncation**: SVG relationship arrow labels ("触发 RPA"/"提供 API") overlapped section titles; narrow column titles (AGENT-MANAGEMENT) were truncated — rotated labels vertical (`rotate(-90)`), added `whitespace-nowrap` and reduced title font 13→12px for all 8 section headers
- **Search View Transitions**: `const` DOM refs became stale after page swap — changed to `let` with `refreshRefs()` + `attachElementListeners()` called in `astro:after-swap`
- **Adopter Multi-Cycle Failure**: Modal broke after multiple open/close/navigation cycles — fixed by calling `loadAdopterData()` in every `openModal()`, `syncHash()`, and `astro:after-swap` handler
- **Adopter Direct URL Hash**: Navigating to `/adopters#adopter-xxx` didn't show card when DOM wasn't ready — fixed with retry mechanism (20 attempts × 50ms)
Expand Down
15 changes: 13 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@iflytek/website",
"version": "0.3.0",
"version": "0.4.0",
"description": "iFLYTEK Open Source Website - Showcasing open source projects, blog, events and community contributions.",
"type": "module",
"private": true,
Expand Down
20 changes: 15 additions & 5 deletions src/components/blog/PostNavigation.astro
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,36 @@
import type { Post } from '~/types';

export interface Props {
post: Post;
prev?: Post;
next?: Post;
}

const { prev, next } = Astro.props;
const { post, prev, next } = Astro.props;
const currentLang = post.lang || 'zh';

/** Pick the title/permalink that matches the current page language. */
const display = (p: Post) => {
if (currentLang === 'en' && p.translation && p.translation.lang === 'en') {
return { title: p.translation.title, href: '/' + p.translation.permalink };
}
return { title: p.title, href: '/' + p.permalink };
};
---

<div class="mx-auto px-6 sm:px-6 max-w-6xl pt-8 md:pt-4 pb-12 md:pb-20">
<div class="flex justify-between gap-4">
{
prev ? (
<a
href={'/' + prev.permalink}
href={display(prev).href}
class="group flex-1 block p-4 rounded-lg border border-gray-200 dark:border-gray-700 hover:border-primary dark:hover:border-blue-400 transition-colors"
>
<span class="text-xs text-gray-400 dark:text-gray-500">
← <span data-i18n="blog.prevPost">上一篇</span>
</span>
<p class="mt-1 font-semibold text-gray-900 dark:text-white group-hover:text-primary dark:group-hover:text-blue-400 transition-colors line-clamp-2">
{prev.title}
{display(prev).title}
</p>
</a>
) : (
Expand All @@ -31,14 +41,14 @@ const { prev, next } = Astro.props;
{
next ? (
<a
href={'/' + next.permalink}
href={display(next).href}
class="group flex-1 block p-4 rounded-lg border border-gray-200 dark:border-gray-700 hover:border-primary dark:hover:border-blue-400 transition-colors text-right"
>
<span class="text-xs text-gray-400 dark:text-gray-500">
<span data-i18n="blog.nextPost">下一篇</span> →
</span>
<p class="mt-1 font-semibold text-gray-900 dark:text-white group-hover:text-primary dark:group-hover:text-blue-400 transition-colors line-clamp-2">
{next.title}
{display(next).title}
</p>
</a>
) : (
Expand Down
4 changes: 3 additions & 1 deletion src/components/blog/TableOfContents.astro
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ const tocHeadings = headings.filter((h) => h.depth >= 2 && h.depth <= 3);
{
tocHeadings.length > 0 && (
<nav class="hidden lg:block sticky top-24 self-start w-52 shrink-0" aria-label="Table of Contents">
<h4 class="text-xs font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500 mb-3">目录</h4>
<h4 class="text-xs font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500 mb-3">
<span data-i18n="blog.tableOfContents">目录</span>
</h4>
<ul class="space-y-0.5 text-sm">
{tocHeadings.map((h) => (
<li class={h.depth === 3 ? 'ml-4' : ''}>
Expand Down
2 changes: 1 addition & 1 deletion src/components/common/BasicScripts.astro
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ import { translations } from '~/utils/translations';
<script is:inline>
/* Inspired by: https://github.com/heidkaemper/tailwindcss-intersect */
(() => {
const Observer = {
window.Observer = {
observer: null,
delayBetweenAnimations: 100,
animationCounter: 0,
Expand Down
4 changes: 3 additions & 1 deletion src/components/common/SearchModal.astro
Original file line number Diff line number Diff line change
Expand Up @@ -322,10 +322,12 @@
const excerptIndices = getMatchIndices(r.matches, lang === 'en' ? 'excerptEn' : 'excerpt');
const colorClass = TYPE_COLORS[item.type] || '';

const itemUrl = lang === 'en' && item.urlEn ? item.urlEn : item.url;

html += '<li>';
html +=
'<a href="' +
escapeHtml(item.url) +
escapeHtml(itemUrl) +
'" class="search-result-item block rounded-lg px-3 py-2.5 transition-colors" data-search-index="' +
flatIdx +
'">';
Expand Down
Loading
Loading