import { motion } from "framer-motion" import React, { useEffect, useState } from "react" import { Footer } from "../components/Footer" import { Navigation } from "../components/Navigation" import { parseChangelog } from "../utils/parseChangelog" // Format changelog item text with proper markdown link parsing function formatChangelogItem(text: string): React.ReactNode { // Parse markdown links [text](url) const parts = text.split(/(\[[^\]]+\]\([^)]+\))/g) return parts.map((part, index) => { const linkMatch = part.match(/\[([^\]]+)\]\(([^)]+)\)/) if (linkMatch) { const [, linkText, url] = linkMatch return ( {linkText} ) } // Parse bold text **text** const boldParts = part.split(/(\*\*[^*]+\*\*)/g) return boldParts.map((boldPart, boldIndex) => { if (boldPart.startsWith("**") && boldPart.endsWith("**")) { return {boldPart.slice(2, -2)} } return {boldPart} }) }) } interface VersionData { version: string date: string features: string[] fixes: string[] improvements: string[] breaking?: string[] } // Default versions for fallback const defaultVersions: VersionData[] = [ { version: "0.51.0", date: "2025-01-30", features: ["Централизованное управление версией приложения", "Оптимизация для GitHub Pages"], fixes: [ "Исправлена синхронизация версий между package.json, Cargo.toml и tauri.conf.json", "Оптимизирован промо-сайт для GitHub Pages", ], improvements: [], }, { version: "0.50.0", date: "2025-01-30", features: ["Добавлена ссылка Pricing в навигационное меню промо-сайта"], fixes: ["Исправлена ошибка SSR с window is not defined в UpdateService"], improvements: [], }, { version: "0.49.0", date: "2025-01-30", features: [ "Glassmorphism эффект на FAQ странице", "Унификация шрифтов на всех страницах промо-сайта", "Обновлен дизайн страницы Changelog с glassmorphism эффектом", ], fixes: [], improvements: ["Улучшен общий дизайн промо-сайта"], }, ] export const Changelog: React.FC = () => { const [versions, setVersions] = useState(defaultVersions) const [loading, setLoading] = useState(true) useEffect(() => { // Load changelog from markdown file fetch("/content/changelog/latest.md") .then((response) => { if (!response.ok) throw new Error("Failed to load changelog") return response.text() }) .then((markdown) => { const parsed = parseChangelog(markdown) if (parsed.length > 0) { // Take only the latest 10 versions for performance setVersions(parsed.slice(0, 10)) } }) .catch((error) => { console.error("Failed to load changelog:", error) // Keep default versions on error }) .finally(() => { setLoading(false) }) }, []) return (
{/* Hero Section */}
{/* Background gradient */}

Changelog

Track all updates and improvements to Timeline Studio

{/* Versions Grid */}
{loading ? (
) : (
{versions.map((version, index) => ( {/* Glass card for each version */}
{/* Glassmorphism background */}
{/* Border gradient */}
{/* Content */}
{/* Header */}

v{version.version}

{index === 0 && ( LATEST )}

{version.date}

{/* Features */} {version.features.length > 0 && (

🚀 New Features

    {version.features.map((feature, i) => ( • {formatChangelogItem(feature)} ))}
)} {/* Bug Fixes */} {version.fixes.length > 0 && (

🐛 Bug Fixes

    {version.fixes.map((fix, i) => ( • {formatChangelogItem(fix)} ))}
)} {/* Improvements */} {version.improvements.length > 0 && (

🔧 Improvements

    {version.improvements.map((improvement, i) => ( • {formatChangelogItem(improvement)} ))}
)} {/* Breaking Changes */} {version.breaking && version.breaking.length > 0 && (

⚠️ Breaking Changes

    {version.breaking.map((change, i) => ( • {formatChangelogItem(change)} ))}
)} {/* Download button */}
))}
)} {/* Load more / View all releases */} {!loading && ( View all releases on GitHub )}
) } export default Changelog