diff --git a/.github/scripts/transform-message.ts b/.github/scripts/transform-message.ts index 864b7d0..92cf75a 100644 --- a/.github/scripts/transform-message.ts +++ b/.github/scripts/transform-message.ts @@ -5,10 +5,8 @@ type GitHubSchema = components['schemas']; type GitHubUser = GitHubSchema['simple-user']; -interface GitHubAction extends Record< - 'event_name' | 'actor' | 'server_url' | 'repository', - string -> { +interface GitHubAction + extends Record<'event_name' | 'actor' | 'server_url' | 'repository', string> { action?: string; ref?: string; ref_name?: string; diff --git a/.github/workflows/self-scan.yml b/.github/workflows/self-scan.yml index 58aa0e5..bc67d9c 100644 --- a/.github/workflows/self-scan.yml +++ b/.github/workflows/self-scan.yml @@ -13,5 +13,5 @@ jobs: - uses: OWASP/cve-lite-cli@v1 with: - verbose: "true" + verbose: 'true' fail-on: high diff --git a/.husky/pre-commit b/.husky/pre-commit index 18de984..72c4429 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -npm test \ No newline at end of file +npm test diff --git a/.husky/pre-push b/.husky/pre-push index 10da9ff..d6cb288 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1 +1 @@ -npm run build \ No newline at end of file +npm run build diff --git a/components/Activity/Hackathon/Hero.tsx b/components/Activity/Hackathon/Hero.tsx index c64c1f9..8ce5b1f 100644 --- a/components/Activity/Hackathon/Hero.tsx +++ b/components/Activity/Hackathon/Hero.tsx @@ -18,15 +18,16 @@ export interface HackathonHeroAction extends HackathonHeroNavItem { export type HackathonHeroCard = Record<'title' | 'description' | 'eyebrow', string>; -export interface HackathonHeroProps extends Record< - | `visual${'Kicker' | 'Title' | 'Copy' | 'Chip'}` - | 'name' - | 'subtitle' - | 'description' - | 'locationText' - | 'imageFallback', - string -> { +export interface HackathonHeroProps + extends Record< + | `visual${'Kicker' | 'Title' | 'Copy' | 'Chip'}` + | 'name' + | 'subtitle' + | 'description' + | 'locationText' + | 'imageFallback', + string + > { agendaItems: Agenda[]; badges: ReactNode[]; bottomCard?: HackathonHeroCard; diff --git a/components/Activity/Hackathon/Resources.tsx b/components/Activity/Hackathon/Resources.tsx index 962e942..b168560 100644 --- a/components/Activity/Hackathon/Resources.tsx +++ b/components/Activity/Hackathon/Resources.tsx @@ -29,10 +29,8 @@ export interface HackathonProjectItem { title: string; } -export interface HackathonResourcesProps extends Record< - `project${'Subtitle' | 'Title'}` | `template${'Subtitle' | 'Title'}`, - string -> { +export interface HackathonResourcesProps + extends Record<`project${'Subtitle' | 'Title'}` | `template${'Subtitle' | 'Title'}`, string> { projectInitialVisible?: number; projectItems: HackathonProjectItem[]; showLessLabel?: string; diff --git a/components/Activity/Hackathon/Schedule.tsx b/components/Activity/Hackathon/Schedule.tsx index b70092f..94017dd 100644 --- a/components/Activity/Hackathon/Schedule.tsx +++ b/components/Activity/Hackathon/Schedule.tsx @@ -17,10 +17,8 @@ export interface HackathonScheduleFact extends HackathonAwardsMeta { meta: string; } -export interface HackathonScheduleItem extends Record< - 'id' | 'phase' | 'title' | 'description', - string -> { +export interface HackathonScheduleItem + extends Record<'id' | 'phase' | 'title' | 'description', string> { facts: HackathonScheduleFact[]; endedAt?: TimeData; @@ -29,10 +27,8 @@ export interface HackathonScheduleItem extends Record< tone: HackathonScheduleTone; } -export interface HackathonScheduleProps extends Record< - 'title' | 'subtitle' | 'lead' | 'kicker' | 'stageGoalLabel', - string -> { +export interface HackathonScheduleProps + extends Record<'title' | 'subtitle' | 'lead' | 'kicker' | 'stageGoalLabel', string> { items: HackathonScheduleItem[]; keyDates?: { label: string; diff --git a/components/Activity/Hackathon/theme.less b/components/Activity/Hackathon/theme.less index e2eece2..7472806 100644 --- a/components/Activity/Hackathon/theme.less +++ b/components/Activity/Hackathon/theme.less @@ -14,21 +14,17 @@ @body: 'Outfit', 'Avenir Next', 'Segoe UI', sans-serif; .panel-card() { + backdrop-filter: blur(18px); box-shadow: @shadow; border: 1px solid @border; border-radius: 28px; background: @panel; - backdrop-filter: blur(18px); } .section-shell() { position: relative; + background: linear-gradient(180deg, rgba(5, 8, 20, 0.98), rgba(7, 12, 26, 0.98)); padding: clamp(4rem, 7vw, 6rem) 0; - background: linear-gradient( - 180deg, - rgba(5, 8, 20, 0.98), - rgba(7, 12, 26, 0.98) - ); color: @copy; } @@ -55,8 +51,8 @@ } .section-header() { - text-align: center; margin-bottom: clamp(2.3rem, 4vw, 3rem); + text-align: center; } .section-title() { @@ -66,35 +62,35 @@ background-clip: text; -webkit-background-clip: text; color: transparent; - font-family: @heading; - font-size: clamp(1.9rem, 4vw, 2.6rem); font-weight: 900; + font-size: clamp(1.9rem, 4vw, 2.6rem); + font-family: @heading; letter-spacing: 0.12em; text-transform: uppercase; } .section-subtitle() { color: @muted; - font-family: @heading; - font-size: 0.75rem; font-weight: 700; + font-size: 0.75rem; + font-family: @heading; letter-spacing: 0.12em; text-transform: uppercase; } .accent-line() { - width: 72px; - height: 2px; margin: 1rem auto 0; + box-shadow: 0 0 14px rgba(44, 232, 255, 0.32); border-radius: 999px; background: linear-gradient(90deg, @cyan, @purple); - box-shadow: 0 0 14px rgba(44, 232, 255, 0.32); + width: 72px; + height: 2px; } .button-base() { display: inline-flex; - align-items: center; justify-content: center; + align-items: center; gap: 0.5rem; transition: transform 0.22s ease, @@ -105,9 +101,9 @@ border: 1px solid transparent; border-radius: 10px; padding: 0.9rem 1.35rem; - font-family: @heading; - font-size: 0.82rem; font-weight: 700; + font-size: 0.82rem; + font-family: @heading; letter-spacing: 0.08em; text-align: center; text-decoration: none; @@ -148,9 +144,9 @@ .eyebrow() { color: @muted; - font-family: @heading; - font-size: 0.75rem; font-weight: 700; + font-size: 0.75rem; + font-family: @heading; letter-spacing: 0.12em; text-transform: uppercase; } diff --git a/components/Layout/CardPage.tsx b/components/Layout/CardPage.tsx index 66ca2c6..fd97894 100644 --- a/components/Layout/CardPage.tsx +++ b/components/Layout/CardPage.tsx @@ -1,10 +1,11 @@ -import { ComponentClass, FC } from 'react'; +import { ComponentType, FC } from 'react'; import { Col, Pagination, Row } from 'react-bootstrap'; import { SearchPageMeta } from '../../models/System'; export interface CardPageProps extends SearchPageMeta { - Card: ComponentClass | FC; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Card: ComponentType; cardLinkOf?: (id: string) => string; pageLinkOf: (page: number) => string; } diff --git a/components/License/helper.ts b/components/License/helper.ts index 7fafefa..c559c19 100644 --- a/components/License/helper.ts +++ b/components/License/helper.ts @@ -50,4 +50,4 @@ export const licenseTips = ({ t }: typeof i18n): LicenseTips => ({ privacyLoophole: [{ text: t('tip_privacy_loophole') }], marketingEndorsement: [{ text: t('tip_marketing_endorsement') }], infectionRange: [{ text: t('tip_infection_range') }], -}); \ No newline at end of file +}); diff --git a/components/Map/ChinaMap.tsx b/components/Map/ChinaMap.tsx index 1e2c7c8..b5d49bd 100644 --- a/components/Map/ChinaMap.tsx +++ b/components/Map/ChinaMap.tsx @@ -2,9 +2,6 @@ import { OpenReactMap, OpenReactMapProps, TileLayer } from 'open-react-map'; import { FC } from 'react'; const ChinaMap: FC = props => ( - } - /> + } /> ); -export default ChinaMap; \ No newline at end of file +export default ChinaMap; diff --git a/components/Navigator/MainNavigator.tsx b/components/Navigator/MainNavigator.tsx index 943f739..25350fa 100644 --- a/components/Navigator/MainNavigator.tsx +++ b/components/Navigator/MainNavigator.tsx @@ -81,6 +81,10 @@ const topNavBarMenu = ({ t }: typeof i18n): MenuItem[] => [ { href: '/recipe', title: t('recipe') }, ], }, + { + href: '/open-library', + title: t('open_library'), + }, ]; export interface MainNavigatorProps { diff --git a/components/Navigator/SearchBar.tsx b/components/Navigator/SearchBar.tsx index dc8727f..41109ed 100644 --- a/components/Navigator/SearchBar.tsx +++ b/components/Navigator/SearchBar.tsx @@ -13,8 +13,7 @@ import { I18nContext } from '../../models/Translation'; import styles from './SearchBar.module.less'; export interface SearchBarProps - extends - Omit, + extends Omit, Pick, Pick { expanded?: boolean; diff --git a/components/Organization/Card.tsx b/components/Organization/Card.tsx index 42a0aaa..e7f9879 100644 --- a/components/Organization/Card.tsx +++ b/components/Organization/Card.tsx @@ -10,8 +10,7 @@ import { i18n, I18nContext } from '../../models/Translation'; import { Organization } from '../../models/Organization'; export interface OrganizationCardProps - extends - Pick, 'className' | 'style'>, + extends Pick, 'className' | 'style'>, Omit, CardProps { onSwitch?: (filter: Partial>) => any; diff --git a/components/open-library/BookCard.tsx b/components/open-library/BookCard.tsx new file mode 100644 index 0000000..32cb844 --- /dev/null +++ b/components/open-library/BookCard.tsx @@ -0,0 +1,89 @@ +import Link from 'next/link'; +import { observer } from 'mobx-react'; +import { FC, useContext } from 'react'; +import { Badge, Button, Card, CardProps } from 'react-bootstrap'; + +export type { Book } from '../../models/Book'; +import type { Book } from '../../models/Book'; +import { I18nContext } from '../../models/Translation'; + +export interface BookCardProps extends CardProps { + book: Book; + showStatus?: boolean; + variant?: 'featured' | 'catalog'; +} + +export const BookCard: FC = observer(({ + className = '', + book, + showStatus = false, + variant = 'featured', + ...cardProps +}) => { + const isFeatured = variant === 'featured'; + + const { t } = useContext(I18nContext); + + return ( + +
+ {showStatus && ( +
+ + {book.status === 'available' ? t('available') : t('borrowed')} + +
+ )} +
+ +
+
+ + + {book.title} + + + {book.author} + + {book.category && ( + + 🏷️ {book.category} + + )} +
+ + + +
+
+
+ ); +}); + +export default BookCard; diff --git a/components/open-library/FeaturedBooks.tsx b/components/open-library/FeaturedBooks.tsx new file mode 100644 index 0000000..25d3065 --- /dev/null +++ b/components/open-library/FeaturedBooks.tsx @@ -0,0 +1,72 @@ +import Link from 'next/link'; +import { observer } from 'mobx-react'; +import { FC, useContext } from 'react'; +import { Button, Col, Row } from 'react-bootstrap'; + +import { I18nContext } from '../../models/Translation'; +import BookCard, { Book } from './BookCard'; +import { ContentContainer } from './Layout'; + +interface FeaturedBooksProps { + books: Book[]; + title?: string; + subtitle?: string; + showViewAll?: boolean; + viewAllLink?: string; + viewAllText?: string; +} + +const FeaturedBooks: FC = observer( + ({ books, title, subtitle, showViewAll = true, viewAllLink = '/open-library/books', viewAllText }) => { + const { t } = useContext(I18nContext); + const resolvedTitle = title ?? t('featured_books'); + const resolvedSubtitle = subtitle ?? t('featured_books_subtitle'); + const resolvedViewAllText = viewAllText ?? t('view_all_books'); + + return ( +
+ +
+

+ {resolvedTitle} +
+
+
+

+

+ {resolvedSubtitle} +

+
+ + + {books.slice(0, 8).map(book => ( + + + + ))} + + + {showViewAll && ( +
+ + + +
+ )} +
+
+ ); + }, +); + +export default FeaturedBooks; diff --git a/components/open-library/Footer.tsx b/components/open-library/Footer.tsx new file mode 100644 index 0000000..b863bee --- /dev/null +++ b/components/open-library/Footer.tsx @@ -0,0 +1,93 @@ +import { observer } from 'mobx-react'; +import { useContext } from 'react'; +import { Col, Container, Nav, Row } from 'react-bootstrap'; + +import { I18nContext } from '../../models/Translation'; + +const FooterComponent = observer(() => { + const { t } = useContext(I18nContext); + + return ( +
+ + + +
{t('open_library')}
+

{t('footer_description')}

+ + + +
{t('quick_links_footer')}
+ + + +
{t('contact')}
+ + +
+ +
+ +
+ © {new Date().getFullYear()} {t('open_library')}. {t('all_rights_reserved')} +
+
+
+ ); +}); + +export default FooterComponent; diff --git a/components/open-library/HeroSection.tsx b/components/open-library/HeroSection.tsx new file mode 100644 index 0000000..982745a --- /dev/null +++ b/components/open-library/HeroSection.tsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { Button, Col, Image, Row } from 'react-bootstrap'; + +import { ContentContainer } from './Layout'; + +interface HeroSectionProps { + title: string; + subtitle: string; + ctaText: string; + ctaLink: string; + browseText: string; + browseLink?: string; + heroImage: string; + heroImageAlt: string; +} + +const HeroSection: React.FC = ({ + title, + subtitle, + ctaText, + ctaLink, + browseText, + browseLink = '/open-library/books', + heroImage, + heroImageAlt, +}) => ( +
+ + + +
+

{title}

+

{subtitle}

+
+ + +
+
+ + +
+ {heroImageAlt} +
+ +
+
+
+); + +export default HeroSection; diff --git a/components/open-library/HowItWorks.module.less b/components/open-library/HowItWorks.module.less new file mode 100644 index 0000000..ca6c35d --- /dev/null +++ b/components/open-library/HowItWorks.module.less @@ -0,0 +1,43 @@ +.sectionTitleMarker { + width: 60px; + height: 3px; +} + +.stepIconWrap { + height: 80px; +} + +.stepIcon { + background-color: var(--step-color); + width: 60px; + height: 60px; +} + +.stepNumber { + top: -10px; + right: calc(50% - 42px); + width: 24px; + height: 24px; + font-size: 0.75rem; +} + +.connector { + top: 30px; + left: calc(100% - 30px); + width: 60px; + height: 2px; +} + +.connectorArrow { + top: -4px; + right: -6px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 6px solid #6c757d; + width: 0; + height: 0; +} + +.subtitle { + max-width: 600px; +} diff --git a/components/open-library/HowItWorks.tsx b/components/open-library/HowItWorks.tsx new file mode 100644 index 0000000..61daaf9 --- /dev/null +++ b/components/open-library/HowItWorks.tsx @@ -0,0 +1,102 @@ +import Link from 'next/link'; +import { observer } from 'mobx-react'; +import { CSSProperties, FC, useContext } from 'react'; +import { Button, Col, Row } from 'react-bootstrap'; + +import { I18nContext } from '../../models/Translation'; +import { ContentContainer } from './Layout'; +import styles from './HowItWorks.module.less'; + +interface Step { + id: number; + title: string; + description: string; + icon: string; + color: string; +} + +interface HowItWorksProps { + title?: string; + subtitle?: string; + steps?: Step[]; + showLearnMore?: boolean; + learnMoreLink?: string; +} + +const HowItWorks: FC = observer(({ title, subtitle, steps, showLearnMore = true, learnMoreLink = '/open-library/how-to-borrow' }) => { + const { t } = useContext(I18nContext); + const resolvedTitle = title ?? t('how_it_works'); + const resolvedSubtitle = subtitle ?? t('how_it_works_description'); + const resolvedSteps: Step[] = steps ?? [ + { id: 1, title: t('step_1_find_book'), description: t('step_1_description'), icon: '�', color: '#6f42c1' }, + { id: 2, title: t('step_2_apply'), description: t('step_2_description'), icon: '📄', color: '#0d6efd' }, + { id: 3, title: t('step_3_receive'), description: t('step_3_description'), icon: '↔️', color: '#fd7e14' }, + ]; + + return ( +
+ +
+

+ {resolvedTitle} +
+
+
+

+

{resolvedSubtitle}

+
+ + + {resolvedSteps.map((step, index) => ( + +
+
+
+ {step.icon} +
+ + {step.id} + + {/* 连接线仅在大屏幕显示且不是最后一个 */} + {index < resolvedSteps.length - 1 && ( +
+
+
+ )} +
+

{step.title}

+

{step.description}

+
+ + ))} + + + {showLearnMore && ( +
+ + + +
+ )} + +
+ ); +}); + +export default HowItWorks; diff --git a/components/open-library/Layout.tsx b/components/open-library/Layout.tsx new file mode 100644 index 0000000..b11081f --- /dev/null +++ b/components/open-library/Layout.tsx @@ -0,0 +1,8 @@ +import { FC, PropsWithChildren } from 'react'; + +const ContentContainer: FC = ({ children }) => ( +
{children}
+); + +export default ContentContainer; +export { ContentContainer }; diff --git a/components/open-library/Navbar.tsx b/components/open-library/Navbar.tsx new file mode 100644 index 0000000..88b4587 --- /dev/null +++ b/components/open-library/Navbar.tsx @@ -0,0 +1,32 @@ +import { observer } from 'mobx-react'; +import { useContext } from 'react'; +import { Nav, Navbar } from 'react-bootstrap'; + +import { I18nContext } from '../../models/Translation'; +import LanguageMenu from '../Navigator/LanguageMenu'; + +export const LibraryNavbar = observer(() => { + const { t } = useContext(I18nContext); + + return ( + +
+ + {t('open_library')} + + + + + + + +
+
+ ); +}); + +export default LibraryNavbar; diff --git a/models/Book.ts b/models/Book.ts new file mode 100644 index 0000000..04425fa --- /dev/null +++ b/models/Book.ts @@ -0,0 +1,32 @@ +export interface BorrowHistory { + borrower: string; + borrowDate: string; + returnDate?: string; +} + +export interface BookReview { + reviewer: string; + rating: number; + comment: string; + date: string; +} + +export interface Book { + id: number; + title: string; + author: string; + cover?: string; + status: 'available' | 'borrowed'; + category: string; + language: string; + currentHolder?: string; + description?: string; + isbn?: string; + publisher?: string; + publishYear?: number; + pageCount?: number; + borrowHistory?: BorrowHistory[]; + reviews?: BookReview[]; + rating?: number; + tags?: string[]; +} diff --git a/package.json b/package.json index 8f0c9f1..e412ea8 100644 --- a/package.json +++ b/package.json @@ -111,6 +111,6 @@ ] }, "lint-staged": { - "*.{html,md,less,json,yml,js,mjs,ts,tsx}": "prettier --write" + "*.{html,md,less,scss,json,yml,js,mjs,ts,tsx}": "prettier --write" } } diff --git a/pages/_app.tsx b/pages/_app.tsx index b16c6f0..b73b61a 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -9,6 +9,8 @@ import { Image } from 'react-bootstrap'; import { MainNavigator } from '../components/Navigator/MainNavigator'; import { PageContent } from '../components/PageContent'; +import FooterComponent from '../components/open-library/Footer'; +import { LibraryNavbar } from '../components/open-library/Navbar'; import { isServer } from '../models/configuration'; import { createI18nStore, I18nContext, I18nProps, loadSSRLanguage } from '../models/Translation'; @@ -38,6 +40,68 @@ export default class CustomApp extends App { }); } + renderFooter(thisFullYear: number, t: (key: 'open_source_bazaar') => string) { + return ( +
+

+ + © 2021{thisFullYear === 2021 ? '' : `-${thisFullYear}`}{' '} + {t('open_source_bazaar')} + + + Powered by + + Vercel Logo + + +

+
+ ); + } + + renderPageContent(Component: typeof this.props.Component, pageProps: typeof this.props.pageProps) { + return ; + } + + renderOpenLibraryFrame( + Component: typeof this.props.Component, + pageProps: typeof this.props.pageProps, + ) { + return ( + <> + +
{this.renderPageContent(Component, pageProps)}
+ + + ); + } + + renderSiteFrame( + Component: typeof this.props.Component, + pageProps: typeof this.props.pageProps, + isArticlePage: boolean, + ) { + const content = this.renderPageContent(Component, pageProps); + + return ( + <> + + +
{isArticlePage ? {content} : content}
+ + ); + } + render() { const { Component, pageProps, router } = this.props, { t } = this.i18nStore; @@ -46,6 +110,9 @@ export default class CustomApp extends App { const isArticlePage = asPath.startsWith('/article/') || asPath.startsWith('/policy/'), isActivityPage = asPath.startsWith('/hackathon'); + // 检查是否是 Open Library 路径 + const isOpenLibraryPath = router.asPath.startsWith('/open-library'); + return ( @@ -54,41 +121,13 @@ export default class CustomApp extends App { {t('open_source_bazaar')} - {isActivityPage ? ( - - ) : ( - <> - - -
- {isArticlePage ? ( - - - - ) : ( - - )} -
- - )} -
-

- - © 2021{thisFullYear === 2021 ? '' : `-${thisFullYear}`} {t('open_source_bazaar')} - - - Powered by - - Vercel Logo - - -

-
+ {isActivityPage + ? this.renderPageContent(Component, pageProps) + : isOpenLibraryPath + ? this.renderOpenLibraryFrame(Component, pageProps) + : this.renderSiteFrame(Component, pageProps, isArticlePage)} + + {!isActivityPage && !isOpenLibraryPath && this.renderFooter(thisFullYear, t)}
); } diff --git a/pages/api/open-library/books.ts b/pages/api/open-library/books.ts new file mode 100644 index 0000000..844febe --- /dev/null +++ b/pages/api/open-library/books.ts @@ -0,0 +1,219 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; + +import type { Book } from '../../../models/Book'; + +export const openLibraryBooks: Book[] = [ + { + id: 1, + title: 'Clean Code', + author: 'Robert C. Martin', + cover: '/images/placeholder-book.svg', + category: 'Programming', + language: 'English', + status: 'available', + description: 'A handbook of agile software craftsmanship', + isbn: '9780132350884', + publisher: 'Prentice Hall', + publishYear: 2008, + pageCount: 464, + borrowHistory: [ + { + borrower: 'Wang Chen', + borrowDate: '2023-10-15', + returnDate: '2023-11-20', + }, + { + borrower: 'Li Mei', + borrowDate: '2023-08-01', + returnDate: '2023-09-05', + }, + ], + reviews: [ + { + reviewer: 'Wang Chen', + rating: 5, + comment: + 'This book completely changed how I approach writing code. Highly recommended for all developers!', + date: '2023-11-25', + }, + { + reviewer: 'Li Mei', + rating: 4, + comment: + 'Great principles that have stood the test of time. Some examples are a bit dated but the concepts are solid.', + date: '2023-09-10', + }, + ], + }, + { + id: 2, + title: 'Eloquent JavaScript', + author: 'Marijn Haverbeke', + cover: '/images/placeholder-book.svg', + category: 'Programming', + language: 'English', + status: 'borrowed', + currentHolder: 'Zhang Wei', + description: 'A modern introduction to programming', + isbn: '9781593279509', + publisher: 'No Starch Press', + publishYear: 2018, + pageCount: 472, + borrowHistory: [ + { + borrower: 'Zhang Wei', + borrowDate: '2024-03-10', + }, + ], + reviews: [ + { + reviewer: 'Liu Jie', + rating: 5, + comment: + 'Perfect for beginners and intermediate JavaScript developers. The exercises are particularly helpful.', + date: '2023-12-05', + }, + ], + }, + { + id: 3, + title: 'The Pragmatic Programmer', + author: 'Andrew Hunt & David Thomas', + cover: '/images/placeholder-book.svg', + category: 'Programming', + language: 'English', + status: 'available', + description: 'Your journey to mastery', + isbn: '9780201616224', + publisher: 'Addison-Wesley Professional', + publishYear: 1999, + pageCount: 352, + borrowHistory: [ + { + borrower: 'Chen Ming', + borrowDate: '2023-06-15', + returnDate: '2023-07-20', + }, + ], + reviews: [ + { + reviewer: 'Chen Ming', + rating: 4, + comment: + 'A classic that has stood the test of time. The advice is still practical for teams of all sizes.', + date: '2023-07-25', + }, + ], + }, + { + id: 4, + title: "You Don't Know JS", + author: 'Kyle Simpson', + cover: '/images/placeholder-book.svg', + category: 'Programming', + language: 'English', + status: 'borrowed', + currentHolder: 'Jane Smith', + description: 'A book series on JavaScript', + isbn: '9781491924464', + publisher: "O'Reilly Media", + publishYear: 2015, + pageCount: 278, + borrowHistory: [], + reviews: [], + }, + { + id: 5, + title: '深入理解计算机系统', + author: "Randal E. Bryant & David R. O'Hallaron", + cover: '/images/placeholder-book.svg', + category: 'Computer Science', + language: 'Chinese', + status: 'borrowed', + currentHolder: 'Li Mei', + description: "Computer Systems: A Programmer's Perspective (Chinese Edition)", + isbn: '9787111544937', + publisher: '机械工业出版社', + publishYear: 2016, + pageCount: 731, + borrowHistory: [ + { + borrower: 'Li Mei', + borrowDate: '2024-02-01', + }, + ], + reviews: [ + { + reviewer: 'Zhang Wei', + rating: 5, + comment: '这是一本非常全面的计算机系统书籍,对理解计算机底层工作原理非常有帮助。', + date: '2023-10-15', + }, + ], + }, + { + id: 6, + title: '算法导论', + author: 'Thomas H. Cormen et al.', + cover: '/images/placeholder-book.svg', + category: 'Computer Science', + language: 'Chinese', + status: 'available', + description: 'Introduction to Algorithms (Chinese Edition)', + isbn: '9787111407010', + publisher: '机械工业出版社', + publishYear: 2013, + pageCount: 780, + borrowHistory: [], + reviews: [], + }, + { + id: 7, + title: 'JavaScript高级程序设计', + author: 'Nicholas C. Zakas', + cover: '/images/placeholder-book.svg', + category: 'Programming', + language: 'Chinese', + status: 'available', + description: 'Professional JavaScript for Web Developers (Chinese Edition)', + isbn: '9787115545381', + publisher: '人民邮电出版社', + publishYear: 2020, + pageCount: 984, + borrowHistory: [], + reviews: [], + }, + { + id: 8, + title: 'CSS揭秘', + author: 'Lea Verou', + cover: '/images/placeholder-book.svg', + category: 'Web Development', + language: 'Chinese', + status: 'borrowed', + currentHolder: 'Wang Chen', + description: 'CSS Secrets (Chinese Edition)', + isbn: '9787115416940', + publisher: '人民邮电出版社', + publishYear: 2016, + pageCount: 288, + borrowHistory: [ + { + borrower: 'Wang Chen', + borrowDate: '2024-01-08', + }, + ], + reviews: [ + { + reviewer: 'Li Mei', + rating: 4, + comment: '案例很实用,适合前端开发者反复翻阅。', + date: '2023-12-18', + }, + ], + }, +]; + +export default function handler(_: NextApiRequest, response: NextApiResponse) { + response.status(200).json(openLibraryBooks); +} diff --git a/pages/open-library/book/[id].tsx b/pages/open-library/book/[id].tsx new file mode 100644 index 0000000..e697a87 --- /dev/null +++ b/pages/open-library/book/[id].tsx @@ -0,0 +1,225 @@ +import Image from 'next/image'; +import { GetServerSideProps } from 'next'; +import { observer } from 'mobx-react'; +import { useContext } from 'react'; +import { useRouter } from 'next/router'; +import { Badge, Button, Card, Col, Row, Tab, Table, Tabs } from 'react-bootstrap'; +import { formatDate } from 'web-utility'; + +import { PageHead } from '../../../components/Layout/PageHead'; +import { ContentContainer } from '../../../components/open-library/Layout'; +import type { Book } from '../../../models/Book'; +import { I18nContext } from '../../../models/Translation'; +import { openLibraryBooks } from '../../api/open-library/books'; + +interface BookDetailProps { + book: Book; +} + +export const getServerSideProps: GetServerSideProps = async ({ params }) => { + const id = Array.isArray(params?.id) ? params?.id[0] : params?.id, + bookId = Number(id); + const book = openLibraryBooks.find(({ id }) => id === bookId); + + if (!book) return { notFound: true }; + + return { props: { book } }; +}; + +const BookDetail = observer(({ book }: BookDetailProps) => { + const router = useRouter(); + const { t } = useContext(I18nContext); + + return ( + + + +
+ + + + + + + {book.title} +
+ + {book.status === 'available' ? t('available') : t('currently_borrowed')} + +
+ {book.status === 'borrowed' && book.currentHolder && ( +
+ {t('currently_with').replace('{0}', book.currentHolder)} +
+ )} + + +

{book.title}

+

+ {t('by_author').replace('{0}', '')} + {book.author} +

+ +
+ + {book.category} + + + {book.language} + +
+ +

{book.description}

+ + + +
ISBN
+
{book.isbn || t('not_available')}
+ + +
{t('book_publisher')}
+
{book.publisher || t('not_available')}
+ + +
{t('book_published_year')}
+
{book.publishYear || t('not_available')}
+ + +
{t('book_page_count')}
+
{book.pageCount || t('not_available')}
+ +
+ +
+ {book.status === 'available' ? ( + + ) : ( + + )} +
+ +
+
+
+ +
+ + + {book.reviews?.[0] ? ( + <> + {book.reviews.map((review, index) => ( + + +
+
{review.reviewer}
+
+ {[...Array(5)].map((_, i) => ( + + {i < review.rating ? '\u2605' : '\u2606'} + + ))} +
+
+ {review.comment} + + + {formatDate(review.date, 'YYYY-MM-DD')} + + +
+
+ ))} +
+ +
+ + ) : ( +
+

{t('be_first_to_review')}

+ +
+ )} +
+ + {book.borrowHistory?.[0] ? ( + + + + + + + + + + + {book.borrowHistory.map((history, index) => ( + + + + + + + ))} + +
{t('borrower')}{t('borrow_date')}{t('return_date')}{t('status')}
{history.borrower}{formatDate(history.borrowDate, 'YYYY-MM-DD')} + {history.returnDate ? formatDate(history.returnDate, 'YYYY-MM-DD') : '-'} + + {history.returnDate ? ( + {t('returned')} + ) : ( + + {t('active')} + + )} +
+ ) : ( +
+

{t('not_borrowed_yet')}

+
+ )} +
+
+
+
+
+ ); +}); + +export default BookDetail; diff --git a/pages/open-library/books/index.tsx b/pages/open-library/books/index.tsx new file mode 100644 index 0000000..1969374 --- /dev/null +++ b/pages/open-library/books/index.tsx @@ -0,0 +1,36 @@ +import { observer } from 'mobx-react'; +import { useContext } from 'react'; +import { Col, Row } from 'react-bootstrap'; + +import { PageHead } from '../../../components/Layout/PageHead'; +import BookCard from '../../../components/open-library/BookCard'; +import { ContentContainer } from '../../../components/open-library/Layout'; +import { I18nContext } from '../../../models/Translation'; +import { openLibraryBooks } from '../../api/open-library/books'; + +const BookCatalog = observer(() => { + const { t } = useContext(I18nContext); + + return ( + + + +
+
+

{t('book_catalog')}

+

{t('book_catalog_description')}

+
+ + + {openLibraryBooks.map(book => ( + + + + ))} + +
+
+ ); +}); + +export default BookCatalog; diff --git a/pages/open-library/how-to-borrow.tsx b/pages/open-library/how-to-borrow.tsx new file mode 100644 index 0000000..f73822f --- /dev/null +++ b/pages/open-library/how-to-borrow.tsx @@ -0,0 +1,235 @@ +import Link from 'next/link'; +import { observer } from 'mobx-react'; +import { useContext } from 'react'; +import { Button, Card, Col, ListGroup, Row } from 'react-bootstrap'; + +import { PageHead } from '../../components/Layout/PageHead'; +import { ContentContainer } from '../../components/open-library/Layout'; +import { I18nContext } from '../../models/Translation'; + +const catalogURL = + 'https://open-source-bazaar.feishu.cn/share/base/view/shrcnvT0Lyk8LKS8KtPbO9HPPHb'; +const borrowFormURL = + 'https://open-source-bazaar.feishu.cn/share/base/form/shrcnNiKwb9ApzFFGI3YkCXDdwe?prefill_%E6%93%8D%E4%BD%9C=%E5%80%9F%E5%85%A5'; +const handoffFormURL = + 'https://open-source-bazaar.feishu.cn/share/base/form/shrcnuDb3oOuhMjSaXNIHEPA4Ef?prefill_%E6%93%8D%E4%BD%9C=%E5%80%9F%E5%87%BA'; +const membershipFormURL = + 'https://open-source-bazaar.feishu.cn/share/base/form/shrcngQgMrhjTh6ycO1zcaEWZld'; + +const borrowSteps = [ + { + title: '查阅书籍', + description: ( + <> + 社区成员可以在{' '} + + fCC 成都社区图书馆 + {' '} + 中查找自己感兴趣的书籍,或者在我们的 书籍目录{' '} + 中浏览。 + + ), + }, + { + title: '申请借阅', + description: ( + <> + 找到心仪的书籍后,填写{' '} + + fCC 成都社区图书馆-书籍借入 + {' '} + 申请,与当前持书者取得联系。 + + ), + }, + { + title: '线下传递', + description: ( + <> + 双方约定时间和传递方式,通常可用快递传递书籍。请传递者填写{' '} + + fCC 成都社区图书馆-书籍传递 + + ,再将书籍传递出去。 + + ), + }, + { + title: '阅读与分享', + description: + '借阅者在阅读完毕后,可以分享自己的阅读感悟,并在社区推荐给下一位感兴趣的成员。我们鼓励借阅者在归还前写下简短的书评。', + }, + { + title: '继续传递', + description: '当有新的借阅者申请时,当前持书人将书籍传递给下一位读者,确保知识的持续流动。', + }, +]; + +const borrowRules = [ + ['借阅期限', '每本书的标准借阅期为 30 天,如需延长可与图书馆管理员联系。'], + ['借阅数量', '每位会员同时最多可借阅 3 本书。'], + ['书籍状态', '借阅者有责任保持书籍的良好状态,避免损坏、标记或丢失。'], + ['传递责任', '当前持书人负责将书籍安全传递给下一位借阅者,并承担相关的传递费用。'], + [ + '丢失或损坏', + '如果书籍在您借阅期间丢失或严重损坏,请联系图书馆管理员并考虑捐赠一本相同或类似的书籍作为替代。', + ], +]; + +const questions = [ + [ + '如何知道一本书是否可借?', + '您可以在飞书多维表格或我们的网站书籍目录中查看书籍的当前状态。如果标记为“可借阅”,则表示该书可以申请借阅。', + ], + [ + '我需要支付借阅费用吗?', + 'Open Library 不收取借阅费用,但借阅者需要承担书籍传递的相关费用(如快递费)。', + ], + [ + '如果当前没有人申请借我手中的书,我需要归还吗?', + '标准借阅期为 30 天。如果期满后没有新的借阅申请,您可以继续保留该书,但请随时准备传递给下一位申请者。', + ], + [ + '如何联系当前持书人?', + '当您提交借阅申请后,我们会为您提供当前持书人的联系方式,以便您们协商传递事宜。', + ], + [ + '如果我想长期保留一本书怎么办?', + 'Open Library 的宗旨是促进知识流动,我们鼓励书籍在会员之间传递。如果您特别喜欢某本书,建议购买一本自己的副本,或者考虑捐赠一本相同的书籍给图书馆。', + ], + [ + '我可以借阅电子书吗?', + '目前 Open Library 主要提供实体书的借阅服务。我们正在考虑未来增加电子书资源,敬请期待。', + ], +]; + +const HowToBorrowPage = observer(() => { + const { t } = useContext(I18nContext); + + return ( + + + +
+

{t('how_to_borrow_page')}

+ + +

{t('borrowing_and_passing')}

+

+ 在 Open Library,所有书籍均来自社区成员的捐赠,并由借阅者直接 + 传递给下一位借书人。 +

+

+ 我们采用的是一种独特的“无储存”借阅模式,让书籍在会员之间自由流转,而非集中存放。这种模式不仅节省了物理空间,更重要的是促进了社区成员之间的直接交流和互动。 +

+
+ + + + +

{t('borrowing_process')}

+ +
    + {borrowSteps.map(({ title, description }, index) => ( +
  1. + + {index + 1} + +
    +

    {title}

    +

    {description}

    +
    +
  2. + ))} +
+
+ + + + +

{t('borrowing_rules')}

+ + {borrowRules.map(([term, detail]) => ( + + {term}: + {detail} + + ))} + +
+ + +

{t('quick_links')}

+ +
+ +
+ + +

{t('faq')}

+ + {questions.map(([question, answer]) => ( + +
{question}
+
{answer}
+ + ))} +
+
+ +
+

{t('ready_to_borrow')}

+
+ + + + +
+
+
+
+ ); +}); + +export default HowToBorrowPage; diff --git a/pages/open-library/index.tsx b/pages/open-library/index.tsx new file mode 100644 index 0000000..81f63dd --- /dev/null +++ b/pages/open-library/index.tsx @@ -0,0 +1,147 @@ +import Link from 'next/link'; +import { observer } from 'mobx-react'; +import { useContext } from 'react'; +import { Button, Card, Col, Row } from 'react-bootstrap'; + +import { PageHead } from '../../components/Layout/PageHead'; +import FeaturedBooks from '../../components/open-library/FeaturedBooks'; +import HeroSection from '../../components/open-library/HeroSection'; +import HowItWorks from '../../components/open-library/HowItWorks'; +import { ContentContainer } from '../../components/open-library/Layout'; +import { I18nContext } from '../../models/Translation'; +import { openLibraryBooks } from '../api/open-library/books'; +import styles from '../../styles/open-library.module.scss'; + +const OpenLibraryHomepage = observer(() => { + const { t } = useContext(I18nContext); + const featuredBooks = openLibraryBooks.slice(0, 4); + const workflowSteps = [ + { + id: 1, + icon: '🔍', + title: t('step_1_find_book'), + description: t('step_1_description'), + color: '#6f42c1', + }, + { + id: 2, + icon: '📄', + title: t('step_2_apply'), + description: t('step_2_description'), + color: '#0d6efd', + }, + { + id: 3, + icon: '↔️', + title: t('step_3_receive'), + description: t('step_3_description'), + color: '#fd7e14', + }, + { + id: 4, + icon: '📚', + title: t('share_your_knowledge'), + description: t('learn_more_about_borrowing'), + color: '#198754', + }, + ]; + + return ( +
+ + + + + +
+
+

📚 {t('about_us_footer')}

+

{t('open_library_community_intro')}

+
+ + + + + +

🌟 {t('our_mission')}

+

{t('our_mission_text')}

+
+
+ + + + +

💡 {t('core_concepts')}

+
    +
  • + {t('knowledge_flow')} - {t('knowledge_flow_desc')} +
  • +
  • + {t('community_driven')} - {t('community_driven_desc')} +
  • +
  • + {t('open_sharing')} - {t('open_sharing_desc')} +
  • +
+
+
+ +
+
+
+ + + + + +
+ +
+

💖 {t('support_us')}

+

{t('support_us_description')}

+
+ + + + +
+
+
+
+ +
+ ); +}); + +export default OpenLibraryHomepage; diff --git a/pages/open-library/readme.md b/pages/open-library/readme.md new file mode 100644 index 0000000..b9d7c47 --- /dev/null +++ b/pages/open-library/readme.md @@ -0,0 +1,35 @@ +# 社区图书馆 + +## 简介 + +freeCodeCamp 成都社区「Open Library」是一个开放、共享的社区图书馆,旨在促进知识交流,推动社区成员之间的学习和成长,增强社区成员之间的互动与信任。我们深知知识的流动能够点燃创新的火花,因此,我们采用了一种独特的“无储存”借阅模式,让书籍在会员之间自由流转,而非集中存放。 + +## 申请会员 + +如果你热爱阅读,愿意分享知识,欢迎填写 fCC 成都社区图书馆-会员申请,加入 freeCodeCamp 成都社区「Open Library」,成为知识流动的一部分! + +## 书籍募捐 + +我们鼓励社区成员捐赠书籍,共同丰富书目资源。捐赠流程如下: + +1. **填写捐赠申请**:填写 fCC 成都社区图书馆-书籍捐赠。 + +2. **书籍登记**:如所捐赠书籍在「 fCC 成都社区图书馆」还未登记,请先填写 fCC 成都社区图书馆-书籍登记,然后回到第 1 步继续捐赠。建议在移动端设备上登记,方便扫描书籍 ISBN 码。 + +3. **书籍进入图书馆**:完成以上流程后,书籍正式进入 Open Library 的传递流程,开始流转于社区成员之间。 + +## 借阅与传递 + +在 Open Library,所有书籍均来自社区成员的捐赠,并由借阅者直接**传递**给下一位借书人。 + +借阅流程如下: + +1. **查阅书籍**:社区成员可以在 fCC 成都社区图书馆中查找自己感兴趣的书籍。 +2. **申请借阅**:填写 fCC 成都社区图书馆-书籍借入申请,与当前持书者取得联系。 +3. **线下传递**:双方约定时间和传递方式,通常可用快递传递书籍。请传递者填写 fCC 成都社区图书馆-书籍传递,再将书籍传递出去。 +4. **阅读与分享**:借阅者在阅读完毕后,可以分享自己的阅读感悟,并在社区推荐给下一位感兴趣的成员。 +5. **继续传递**:当有新的借阅者申请时,当前持书人将书籍传递给下一位读者,确保知识的持续流动。 + +## 未来 + +期待未来可以与更多开放空间合作,定期举办主题阅读会。 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c56da0..a770de0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,13 +1,9 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: false + autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - mobx-react-helper: ^0.5.1 - next: ^16.2.4 - importers: .: @@ -20,25 +16,25 @@ importers: version: 15.4.0(koa@3.2.0) '@mdx-js/loader': specifier: ^3.1.1 - version: 3.1.1 + version: 3.1.1(webpack@5.106.2) '@mdx-js/react': specifier: ^3.1.1 version: 3.1.1(@types/react@19.2.14)(react@19.2.5) '@next/mdx': specifier: ^16.2.4 - version: 16.2.4(@mdx-js/loader@3.1.1)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5)) + version: 16.2.4(@mdx-js/loader@3.1.1(webpack@5.106.2))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5)) core-js: specifier: ^3.49.0 version: 3.49.0 echarts-jsx: specifier: ^0.6.0 - version: 0.6.0(react@19.2.5)(typescript@5.9.3) + version: 0.6.0(element-internals-polyfill@3.0.2)(react@19.2.5)(typescript@5.9.3) file-type: specifier: ^22.0.1 version: 22.0.1 idea-react: specifier: ^2.2.2 - version: 2.2.2(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react-is@16.13.1)(react@19.2.5)(typescript@5.9.3) + version: 2.2.2(@types/react@19.2.14)(element-internals-polyfill@3.0.2)(react-dom@19.2.5(react@19.2.5))(react-is@16.13.1)(react@19.2.5)(typescript@5.9.3) jsonwebtoken: specifier: ^9.0.3 version: 9.0.3 @@ -50,7 +46,7 @@ importers: version: 4.0.4 koajax: specifier: ^3.3.0 - version: 3.3.0(core-js@3.49.0)(typescript@5.9.3) + version: 3.3.0(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3) license-filter: specifier: ^0.2.5 version: 0.2.5 @@ -65,43 +61,43 @@ importers: version: 6.15.0 mobx-github: specifier: ^0.6.2 - version: 0.6.2(core-js@3.49.0)(typescript@5.9.3) + version: 0.6.2(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3) mobx-i18n: specifier: ^0.7.2 - version: 0.7.2(mobx@6.15.0)(typescript@5.9.3) + version: 0.7.2(element-internals-polyfill@3.0.2)(mobx@6.15.0)(typescript@5.9.3) mobx-lark: specifier: ^2.8.1 - version: 2.8.1(core-js@3.49.0)(react@19.2.5)(typescript@5.9.3) + version: 2.8.1(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(react@19.2.5)(typescript@5.9.3) mobx-react: specifier: ^9.2.1 version: 9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) mobx-react-helper: specifier: ^0.5.1 - version: 0.5.1(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) + version: 0.5.1(element-internals-polyfill@3.0.2)(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) mobx-restful: specifier: ^2.1.4 - version: 2.1.4(core-js@3.49.0)(mobx@6.15.0)(typescript@5.9.3) + version: 2.1.4(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(mobx@6.15.0)(typescript@5.9.3) mobx-restful-table: specifier: ^2.6.3 - version: 2.6.3(@types/react@19.2.14)(core-js@3.49.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) + version: 2.6.3(@types/react@19.2.14)(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) mobx-strapi: specifier: ^0.8.1 - version: 0.8.1(core-js@3.49.0)(typescript@5.9.3) + version: 0.8.1(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3) next: specifier: ^16.2.4 version: 16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) next-pwa: specifier: ^5.6.0 - version: 5.6.0(@babel/core@7.29.0)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0)) + version: 5.6.0(@babel/core@7.29.0)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(webpack@5.106.2) next-ssr-middleware: specifier: ^1.1.0 - version: 1.1.0(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) + version: 1.1.0(element-internals-polyfill@3.0.2)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3) nodemailer: specifier: ^8.0.7 version: 8.0.7 open-react-map: specifier: ^0.9.1 - version: 0.9.1(core-js@3.49.0)(mobx-react@9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) + version: 0.9.1(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(mobx-react@9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) react: specifier: ^19.2.5 version: 19.2.5 @@ -122,7 +118,7 @@ importers: version: 5.2.0 web-utility: specifier: ^4.6.6 - version: 4.6.6(typescript@5.9.3) + version: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) yaml: specifier: ^2.8.4 version: 2.8.4 @@ -180,7 +176,7 @@ importers: version: 10.3.0(jiti@2.6.1) eslint-config-next: specifier: ^16.2.4 - version: 16.2.4(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3) + version: 16.2.4(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3) eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8(eslint@10.3.0(jiti@2.6.1)) @@ -204,13 +200,13 @@ importers: version: 4.6.4 less-loader: specifier: ^12.3.2 - version: 12.3.2(less@4.6.4) + version: 12.3.2(less@4.6.4)(webpack@5.106.2) lint-staged: specifier: ^16.4.0 version: 16.4.0 next-with-less: specifier: ^3.0.1 - version: 3.0.1(less-loader@12.3.2(less@4.6.4))(less@4.6.4)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0)) + version: 3.0.1(less-loader@12.3.2(less@4.6.4)(webpack@5.106.2))(less@4.6.4)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0)) prettier: specifier: ^3.8.3 version: 3.8.3 @@ -235,6 +231,21 @@ packages: peerDependencies: ajv: '>=8' + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} @@ -802,6 +813,10 @@ packages: '@borewit/text-codec@0.2.2': resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + '@codexteam/icons@0.0.4': resolution: {integrity: sha512-V8N/TY2TGyas4wLrPIFq7bcow68b3gu8DfDt1+rrHPtXxcexadKauRJL6eQgfG7Z0LCrN4boLRawR4S9gjIh/Q==} @@ -1037,6 +1052,42 @@ packages: resolution: {integrity: sha512-q+0pHQ8DbqjemyaOn/mTtBRbCuKDqhnsVbZ6J9zkTsxPgMpccjy0s5oLXwomfrrxMRBH+UcbERwtUmE+SbnoIQ==} engines: {node: '>=22.18.0'} + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + engines: {node: '>=20.19.0'} + + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-color-parser@4.1.1': + resolution: {integrity: sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.4': + resolution: {integrity: sha512-wgsqt92b7C7tQhIdPNxj0n9zuUbQlvAuI1exyzeNrOKOi62SD7ren8zqszmpVREjAOqg8cD2FqYhQfAuKjk4sw==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + '@editorjs/caret@1.1.0': resolution: {integrity: sha512-dzUjrPV7mtqM0HR/7IwT1/1PfyMxUfe5MRXo9joFmBRDIcrQ5ikbqVxSL9+Hy5tQ+BUWBwqLUgX1UKTJylWW9Q==} @@ -1100,6 +1151,15 @@ packages: resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@exodus/bytes@1.15.0': + resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@giscus/react@3.1.0': resolution: {integrity: sha512-0TCO2TvL43+oOdyVVGHDItwxD1UMKP2ZYpT6gXmhFOqfAJtZxTzJ9hkn34iAF/b6YzyJ4Um89QIt9z/ajmAEeg==} peerDependencies: @@ -1351,6 +1411,9 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@next/env@13.5.11': + resolution: {integrity: sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg==} + '@next/env@16.2.4': resolution: {integrity: sha512-dKkkOzOSwFYe5RX6y26fZgkSpVAlIOJKQHIiydQcrWH6y/97+RceSOAdjZ14Qa3zLduVUy0TXcn+EiM6t4rPgw==} @@ -1368,18 +1431,37 @@ packages: '@mdx-js/react': optional: true + '@next/swc-darwin-arm64@13.5.9': + resolution: {integrity: sha512-pVyd8/1y1l5atQRvOaLOvfbmRwefxLhqQOzYo/M7FQ5eaRwA1+wuCn7t39VwEgDd7Aw1+AIWwd+MURXUeXhwDw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-arm64@16.2.4': resolution: {integrity: sha512-OXTFFox5EKN1Ym08vfrz+OXxmCcEjT4SFMbNRsWZE99dMqt2Kcusl5MqPXcW232RYkMLQTy0hqgAMEsfEd/l2A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@next/swc-darwin-x64@13.5.9': + resolution: {integrity: sha512-DwdeJqP7v8wmoyTWPbPVodTwCybBZa02xjSJ6YQFIFZFZ7dFgrieKW4Eo0GoIcOJq5+JxkQyejmI+8zwDp3pwA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-darwin-x64@16.2.4': resolution: {integrity: sha512-XhpVnUfmYWvD3YrXu55XdcAkQtOnvaI6wtQa8fuF5fGoKoxIUZ0kWPtcOfqJEWngFF/lOS9l3+O9CcownhiQxQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-linux-arm64-gnu@13.5.9': + resolution: {integrity: sha512-wdQsKsIsGSNdFojvjW3Ozrh8Q00+GqL3wTaMjDkQxVtRbAqfFBtrLPO0IuWChVUP2UeuQcHpVeUvu0YgOP00+g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@next/swc-linux-arm64-gnu@16.2.4': resolution: {integrity: sha512-Mx/tjlNA3G8kg14QvuGAJ4xBwPk1tUHq56JxZ8CXnZwz1Etz714soCEzGQQzVMz4bEnGPowzkV6Xrp6wAkEWOQ==} engines: {node: '>= 10'} @@ -1387,6 +1469,13 @@ packages: os: [linux] libc: [glibc] + '@next/swc-linux-arm64-musl@13.5.9': + resolution: {integrity: sha512-6VpS+bodQqzOeCwGxoimlRoosiWlSc0C224I7SQWJZoyJuT1ChNCo+45QQH+/GtbR/s7nhaUqmiHdzZC9TXnXA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@next/swc-linux-arm64-musl@16.2.4': resolution: {integrity: sha512-iVMMp14514u7Nup2umQS03nT/bN9HurK8ufylC3FZNykrwjtx7V1A7+4kvhbDSCeonTVqV3Txnv0Lu+m2oDXNg==} engines: {node: '>= 10'} @@ -1394,6 +1483,13 @@ packages: os: [linux] libc: [musl] + '@next/swc-linux-x64-gnu@13.5.9': + resolution: {integrity: sha512-XxG3yj61WDd28NA8gFASIR+2viQaYZEFQagEodhI/R49gXWnYhiflTeeEmCn7Vgnxa/OfK81h1gvhUZ66lozpw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@next/swc-linux-x64-gnu@16.2.4': resolution: {integrity: sha512-EZOvm1aQWgnI/N/xcWOlnS3RQBk0VtVav5Zo7n4p0A7UKyTDx047k8opDbXgBpHl4CulRqRfbw3QrX2w5UOXMQ==} engines: {node: '>= 10'} @@ -1401,6 +1497,13 @@ packages: os: [linux] libc: [glibc] + '@next/swc-linux-x64-musl@13.5.9': + resolution: {integrity: sha512-/dnscWqfO3+U8asd+Fc6dwL2l9AZDl7eKtPNKW8mKLh4Y4wOpjJiamhe8Dx+D+Oq0GYVjuW0WwjIxYWVozt2bA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + '@next/swc-linux-x64-musl@16.2.4': resolution: {integrity: sha512-h9FxsngCm9cTBf71AR4fGznDEDx1hS7+kSEiIRjq5kO1oXWm07DxVGZjCvk0SGx7TSjlUqhI8oOyz7NfwAdPoA==} engines: {node: '>= 10'} @@ -1408,12 +1511,30 @@ packages: os: [linux] libc: [musl] + '@next/swc-win32-arm64-msvc@13.5.9': + resolution: {integrity: sha512-T/iPnyurOK5a4HRUcxAlss8uzoEf5h9tkd+W2dSWAfzxv8WLKlUgbfk+DH43JY3Gc2xK5URLuXrxDZ2mGfk/jw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-arm64-msvc@16.2.4': resolution: {integrity: sha512-3NdJV5OXMSOeJYijX+bjaLge3mJBlh4ybydbT4GFoB/2hAojWHtMhl3CYlYoMrjPuodp0nzFVi4Tj2+WaMg+Ow==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-ia32-msvc@13.5.9': + resolution: {integrity: sha512-BLiPKJomaPrTAb7ykjA0LPcuuNMLDVK177Z1xe0nAem33+9FIayU4k/OWrtSn9SAJW/U60+1hoey5z+KCHdRLQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@13.5.9': + resolution: {integrity: sha512-/72/dZfjXXNY/u+n8gqZDjI6rxKMpYsgBBYNZKWOQw0BpBF7WCnPflRy3ZtvQ2+IYI3ZH2bPyj7K+6a6wNk90Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@next/swc-win32-x64-msvc@16.2.4': resolution: {integrity: sha512-kMVGgsqhO5YTYODD9IPGGhA6iprWidQckK3LmPeW08PIFENRmgfb4MjXHO+p//d+ts2rpjvK5gXWzXSMrPl9cw==} engines: {node: '>= 10'} @@ -1635,6 +1756,9 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.2': + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + '@swc/helpers@0.5.21': resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} @@ -1672,6 +1796,12 @@ packages: '@types/eslint-config-prettier@6.11.3': resolution: {integrity: sha512-3wXCiM8croUnhg9LdtZUJQwNcQYGWxxdOWDjPe1ykCqJFPVpzAKfs/2dgSoCtAvdPeaponcWPI7mPcGGp9dkKQ==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -1864,6 +1994,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -1968,10 +2099,67 @@ packages: cpu: [x64] os: [win32] + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1988,6 +2176,11 @@ packages: ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} @@ -2146,6 +2339,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -2181,6 +2377,10 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -2219,6 +2419,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -2368,12 +2572,20 @@ packages: css-line-break@2.1.0: resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -2403,6 +2615,9 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} @@ -2497,6 +2712,9 @@ packages: electron-to-chromium@1.5.349: resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==} + element-internals-polyfill@3.0.2: + resolution: {integrity: sha512-uB0/Qube3lkwh8SmkTnGIyUgJ9YdqVSzIoHMRCEQjAbD4Y5UzsVbch1tIxjTgUe5k3gy1U0ZMKMJ90A81lqwig==} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2511,6 +2729,14 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + enhanced-resolve@5.21.3: + resolution: {integrity: sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==} + engines: {node: '>=10.13.0'} + + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + env-paths@4.0.0: resolution: {integrity: sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==} engines: {node: '>=20'} @@ -2539,6 +2765,9 @@ packages: resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} engines: {node: '>= 0.4'} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -2661,6 +2890,10 @@ packages: peerDependencies: eslint: '>=5.0.0' + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -2708,6 +2941,10 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -2746,6 +2983,10 @@ packages: eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -2901,6 +3142,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -2978,6 +3222,10 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html2canvas@1.4.1: resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} engines: {node: '>=8.0.0'} @@ -3192,6 +3440,9 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -3281,6 +3532,15 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3420,6 +3680,10 @@ packages: lit@3.3.2: resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} + engines: {node: '>=6.11.5'} + loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} @@ -3482,6 +3746,10 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3544,6 +3812,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -3707,6 +3978,12 @@ packages: peerDependencies: react: '>=16' + mobx-react-helper@0.4.1: + resolution: {integrity: sha512-+chcWzOznL5/c6n33iswIGKvFJI/afmWRMFZ5NjjJyD3DJuoGuaiayEEhL3FITVKpwOkPKF2K5Werz8vhk6xEA==} + peerDependencies: + mobx: '>=6.11' + react: '>=16' + mobx-react-helper@0.5.1: resolution: {integrity: sha512-8jwR6LbPmC5s0tcmPz6CjXs1uarAcKjeTD+Oqbd7Vk4Ce49yDxeUOxG07VAcWZVnjnJXE0n79oG3z9c2XEEWTw==} peerDependencies: @@ -3783,15 +4060,18 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-pwa@5.6.0: resolution: {integrity: sha512-XV8g8C6B7UmViXU8askMEYhWwQ4qc/XqJGnexbLV68hzKaGHZDMtHsm2TNxFcbR7+ypVuth/wwpiIlMwpRJJ5A==} peerDependencies: - next: ^16.2.4 + next: '>=9.0.0' next-ssr-middleware@1.1.0: resolution: {integrity: sha512-eYKTZExd+4yq4Cs2lrQ+XJlgegKAgmCvigy9Ro3ScaHjUNevyXovHO/bbdTYIvr4DtYDbZPJkw4VbYAaVZ5x7w==} peerDependencies: - next: ^16.2.4 + next: '>=9.3' react: '>=18' next-with-less@3.0.1: @@ -3799,7 +4079,22 @@ packages: peerDependencies: less: '*' less-loader: '>= 7.0.0' - next: ^16.2.4 + next: '>= 11.0.1' + + next@13.5.11: + resolution: {integrity: sha512-WUPJ6WbAX9tdC86kGTu92qkrRdgRqVrY++nwM+shmWQwmyxt4zhZfR59moXSI4N8GDYCBY3lIAqhzjDd4rTC8Q==} + engines: {node: '>=16.14.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true next@16.2.4: resolution: {integrity: sha512-kPvz56wF5frc+FxlHI5qnklCzbq53HTwORaWBGdT0vNoKh1Aya9XC8aPauH4NJxqtzbWsS5mAbctm4cr+EkQ2Q==} @@ -3938,6 +4233,9 @@ packages: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -4303,6 +4601,10 @@ packages: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -4442,6 +4744,10 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -4506,6 +4812,19 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -4536,10 +4855,17 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.11.12: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} @@ -4587,6 +4913,13 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tldts-core@7.0.30: + resolution: {integrity: sha512-uiHN8PIB1VmWyS98eZYja4xzlYqeFZVjb4OuYlJQnZAuJhMw4PbKQOKgHKhBdJR3FE/t5mUQ1Kd80++B+qhD1Q==} + + tldts@7.0.30: + resolution: {integrity: sha512-ELrFxuqsDdHUwoh0XxDbxuLD3Wnz49Z57IFvTtvWy1hJdcMZjXLIuonjilCiWHlT2GbE4Wlv1wKVTzDFnXH1aw==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4602,9 +4935,17 @@ packages: toml@3.0.0: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} + engines: {node: '>=16'} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4715,6 +5056,10 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@7.25.0: + resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} + engines: {node: '>=20.18.1'} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -4812,9 +5157,21 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + engines: {node: '>=10.13.0'} + web-streams-polyfill@4.2.0: resolution: {integrity: sha512-0rYDzGOh9EZpig92umN5g5D/9A1Kff7k0/mzPSSCY8jEQeYkgRMoY7LhbXtUCWzLCMX0TUE9aoHkjFNB7D9pfA==} engines: {node: '>= 8'} @@ -4828,9 +5185,35 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + webpack-sources@3.4.1: + resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} + engines: {node: '>=10.13.0'} + + webpack@5.106.2: + resolution: {integrity: sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -4927,6 +5310,13 @@ packages: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -4962,6 +5352,26 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 + '@asamuzakjp/css-color@5.1.11': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@asamuzakjp/dom-selector@7.1.1': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + + '@asamuzakjp/generational-cache@1.0.1': {} + + '@asamuzakjp/nwsapi@2.3.9': {} + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -5705,6 +6115,10 @@ snapshots: '@borewit/text-codec@0.2.2': {} + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + '@codexteam/icons@0.0.4': {} '@cspell/cspell-bundled-dicts@10.0.0': @@ -5929,6 +6343,30 @@ snapshots: '@cspell/url@10.0.0': {} + '@csstools/color-helpers@6.0.2': {} + + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-color-parser@4.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.0.2 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.4(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + '@editorjs/caret@1.1.0': dependencies: '@editorjs/dom': 1.1.0 @@ -6001,6 +6439,8 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 + '@exodus/bytes@1.15.0': {} + '@giscus/react@3.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: giscus: 1.6.0 @@ -6182,10 +6622,12 @@ snapshots: dependencies: '@lit-labs/ssr-dom-shim': 1.5.1 - '@mdx-js/loader@3.1.1': + '@mdx-js/loader@3.1.1(webpack@5.106.2)': dependencies: '@mdx-js/mdx': 3.1.1 source-map: 0.7.6 + optionalDependencies: + webpack: 5.106.2 transitivePeerDependencies: - supports-color @@ -6234,40 +6676,69 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@next/env@13.5.11': {} + '@next/env@16.2.4': {} '@next/eslint-plugin-next@16.2.4': dependencies: fast-glob: 3.3.1 - '@next/mdx@16.2.4(@mdx-js/loader@3.1.1)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5))': + '@next/mdx@16.2.4(@mdx-js/loader@3.1.1(webpack@5.106.2))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5))': dependencies: source-map: 0.7.6 optionalDependencies: - '@mdx-js/loader': 3.1.1 + '@mdx-js/loader': 3.1.1(webpack@5.106.2) '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.5) + '@next/swc-darwin-arm64@13.5.9': + optional: true + '@next/swc-darwin-arm64@16.2.4': optional: true + '@next/swc-darwin-x64@13.5.9': + optional: true + '@next/swc-darwin-x64@16.2.4': optional: true + '@next/swc-linux-arm64-gnu@13.5.9': + optional: true + '@next/swc-linux-arm64-gnu@16.2.4': optional: true + '@next/swc-linux-arm64-musl@13.5.9': + optional: true + '@next/swc-linux-arm64-musl@16.2.4': optional: true + '@next/swc-linux-x64-gnu@13.5.9': + optional: true + '@next/swc-linux-x64-gnu@16.2.4': optional: true + '@next/swc-linux-x64-musl@13.5.9': + optional: true + '@next/swc-linux-x64-musl@16.2.4': optional: true + '@next/swc-win32-arm64-msvc@13.5.9': + optional: true + '@next/swc-win32-arm64-msvc@16.2.4': optional: true + '@next/swc-win32-ia32-msvc@13.5.9': + optional: true + + '@next/swc-win32-x64-msvc@13.5.9': + optional: true + '@next/swc-win32-x64-msvc@16.2.4': optional: true @@ -6469,6 +6940,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@swc/helpers@0.5.2': + dependencies: + tslib: 2.8.1 + '@swc/helpers@0.5.21': dependencies: tslib: 2.8.1 @@ -6520,6 +6995,16 @@ snapshots: '@types/eslint-config-prettier@6.11.3': {} + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@types/esrecurse@4.3.1': {} '@types/estree-jsx@1.0.5': @@ -6607,15 +7092,13 @@ snapshots: '@types/node': 24.12.2 '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - next: 16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) + next: 13.5.11(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) workbox-build: 6.6.0 transitivePeerDependencies: - '@babel/core' - '@opentelemetry/api' - - '@playwright/test' - '@types/babel__core' - babel-plugin-macros - - babel-plugin-react-compiler - react - react-dom - sass @@ -6828,11 +7311,95 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 + acorn-import-phases@1.0.4(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -6844,8 +7411,8 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-formats@2.1.1: - dependencies: + ajv-formats@2.1.1(ajv@8.20.0): + optionalDependencies: ajv: 8.20.0 ajv-keywords@3.5.2(ajv@6.15.0): @@ -6982,13 +7549,14 @@ snapshots: axobject-query@4.1.0: {} - babel-loader@8.4.1(@babel/core@7.29.0): + babel-loader@8.4.1(@babel/core@7.29.0)(webpack@5.106.2): dependencies: '@babel/core': 7.29.0 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 + webpack: 5.106.2 babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): dependencies: @@ -7024,6 +7592,10 @@ snapshots: baseline-browser-mapping@2.10.25: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + big.js@5.2.2: {} brace-expansion@1.1.14: @@ -7059,6 +7631,10 @@ snapshots: builtin-modules@3.3.0: {} + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + bytes@3.1.2: {} call-bind-apply-helpers@1.0.2: @@ -7094,13 +7670,16 @@ snapshots: dependencies: readdirp: 4.1.2 + chrome-trace-event@1.0.4: {} + classnames@2.5.1: {} clean-stack@2.2.0: {} - clean-webpack-plugin@4.0.0: + clean-webpack-plugin@4.0.0(webpack@5.106.2): dependencies: del: 4.1.1 + webpack: 5.106.2 cli-cursor@5.0.0: dependencies: @@ -7253,10 +7832,22 @@ snapshots: dependencies: utrie: 1.0.2 + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + csstype@3.2.3: {} damerau-levenshtein@1.0.8: {} + data-urls@7.0.0: + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -7283,6 +7874,8 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.6.0: {} + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 @@ -7355,12 +7948,12 @@ snapshots: dependencies: safe-buffer: 5.2.1 - echarts-jsx@0.6.0(react@19.2.5)(typescript@5.9.3): + echarts-jsx@0.6.0(element-internals-polyfill@3.0.2)(react@19.2.5)(typescript@5.9.3): dependencies: echarts: 6.0.0 lodash: 4.18.1 react: 19.2.5 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - element-internals-polyfill - typescript @@ -7372,7 +7965,7 @@ snapshots: editorjs-html@4.0.5: {} - edkit@1.2.7(typescript@5.9.3): + edkit@1.2.7(element-internals-polyfill@3.0.2)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 '@types/turndown': 5.0.6 @@ -7381,7 +7974,7 @@ snapshots: regenerator-runtime: 0.14.1 turndown: 7.2.4 turndown-plugin-gfm: 1.0.2 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - element-internals-polyfill - typescript @@ -7394,6 +7987,8 @@ snapshots: electron-to-chromium@1.5.349: {} + element-internals-polyfill@3.0.2: {} + emoji-regex@10.6.0: {} emoji-regex@9.2.2: {} @@ -7402,6 +7997,13 @@ snapshots: encodeurl@2.0.0: {} + enhanced-resolve@5.21.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@8.0.0: {} + env-paths@4.0.0: dependencies: is-safe-filename: 0.1.1 @@ -7493,6 +8095,8 @@ snapshots: iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 + es-module-lexer@2.1.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -7536,13 +8140,13 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-next@16.2.4(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3): + eslint-config-next@16.2.4(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 16.2.4 eslint: 10.3.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.3.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@10.3.0(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@10.3.0(jiti@2.6.1)) eslint-plugin-react-hooks: 7.1.1(eslint@10.3.0(jiti@2.6.1)) @@ -7579,21 +8183,22 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3) eslint: 10.3.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.10 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@10.3.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -7604,7 +8209,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.3.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@10.3.0(jiti@2.6.1)) hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -7615,6 +8220,8 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.59.1(eslint@10.3.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -7676,6 +8283,11 @@ snapshots: dependencies: eslint: 10.3.0(jiti@2.6.1) + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 @@ -7748,6 +8360,8 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-util-attach-comments@3.0.0: @@ -7793,6 +8407,8 @@ snapshots: eventemitter3@5.0.4: {} + events@3.3.0: {} + extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -7960,6 +8576,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -8076,6 +8694,12 @@ snapshots: dependencies: hermes-estree: 0.25.1 + html-encoding-sniffer@6.0.0: + dependencies: + '@exodus/bytes': 1.15.0 + transitivePeerDependencies: + - '@noble/hashes' + html2canvas@1.4.1: dependencies: css-line-break: 2.1.0 @@ -8117,7 +8741,7 @@ snapshots: idb@7.1.1: {} - idea-react@2.2.2(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react-is@16.13.1)(react@19.2.5)(typescript@5.9.3): + idea-react@2.2.2(@types/react@19.2.14)(element-internals-polyfill@3.0.2)(react-dom@19.2.5(react@19.2.5))(react-is@16.13.1)(react@19.2.5)(typescript@5.9.3): dependencies: '@editorjs/editorjs': 2.31.6 '@editorjs/paragraph': 2.11.7 @@ -8130,7 +8754,7 @@ snapshots: lodash: 4.18.1 mobx: 6.15.0 mobx-react: 9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - mobx-react-helper: 0.5.1(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) + mobx-react-helper: 0.5.1(element-internals-polyfill@3.0.2)(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) prismjs: 1.30.0 react: 19.2.5 react-bootstrap: 2.10.10(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -8138,7 +8762,7 @@ snapshots: react-editor-js: 2.1.0(@editorjs/editorjs@2.31.6)(@editorjs/paragraph@2.11.7)(react@19.2.5) react-element-to-jsx-string: 17.0.1(react-dom@19.2.5(react@19.2.5))(react-is@16.13.1)(react@19.2.5) react-live: 4.1.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - '@types/react' - element-internals-polyfill @@ -8298,6 +8922,8 @@ snapshots: is-plain-object@5.0.0: {} + is-potential-custom-element-name@1.0.1: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -8386,6 +9012,32 @@ snapshots: js-tokens@4.0.0: {} + jsdom@29.1.1: + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.4(css-tree@3.2.1) + '@exodus/bytes': 1.15.0 + css-tree: 3.2.1 + data-urls: 7.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.3.6 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.1 + undici: 7.25.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -8482,13 +9134,14 @@ snapshots: type-is: 2.0.1 vary: 1.1.2 - koajax@3.3.0(core-js@3.49.0)(typescript@5.9.3): + koajax@3.3.0(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 core-js: 3.49.0 + jsdom: 29.1.1 regenerator-runtime: 0.14.1 web-streams-polyfill: 4.2.0 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - element-internals-polyfill - typescript @@ -8501,9 +9154,11 @@ snapshots: leaflet@1.9.4: {} - less-loader@12.3.2(less@4.6.4): + less-loader@12.3.2(less@4.6.4)(webpack@5.106.2): dependencies: less: 4.6.4 + optionalDependencies: + webpack: 5.106.2 less@4.6.4: dependencies: @@ -8565,6 +9220,8 @@ snapshots: lit-element: 4.2.2 lit-html: 3.3.2 + loader-runner@4.3.2: {} + loader-utils@2.0.4: dependencies: big.js: 5.2.2 @@ -8619,6 +9276,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + lru-cache@11.3.6: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -8755,6 +9414,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.27.1: {} + media-typer@0.3.0: {} media-typer@1.1.0: {} @@ -9014,57 +9675,68 @@ snapshots: minimist@1.2.8: {} - mobx-github@0.6.2(core-js@3.49.0)(typescript@5.9.3): + mobx-github@0.6.2(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3): dependencies: '@octokit/openapi-types': 26.0.0 '@swc/helpers': 0.5.21 '@types/lodash': 4.17.24 - koajax: 3.3.0(core-js@3.49.0)(typescript@5.9.3) + koajax: 3.3.0(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3) lodash: 4.18.1 mobx: 6.15.0 - mobx-restful: 2.1.4(core-js@3.49.0)(mobx@6.15.0)(typescript@5.9.3) - web-utility: 4.6.6(typescript@5.9.3) + mobx-restful: 2.1.4(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(mobx@6.15.0)(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - core-js - element-internals-polyfill - jsdom - typescript - mobx-i18n@0.7.2(mobx@6.15.0)(typescript@5.9.3): + mobx-i18n@0.7.2(element-internals-polyfill@3.0.2)(mobx@6.15.0)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 '@types/node': 22.19.17 mobx: 6.15.0 regenerator-runtime: 0.14.1 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - element-internals-polyfill - typescript - mobx-lark@2.8.1(core-js@3.49.0)(react@19.2.5)(typescript@5.9.3): + mobx-lark@2.8.1(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(react@19.2.5)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 '@types/react': 19.2.14 - koajax: 3.3.0(core-js@3.49.0)(typescript@5.9.3) + koajax: 3.3.0(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3) lodash.memoize: 4.1.2 mobx: 6.15.0 - mobx-restful: 2.1.4(core-js@3.49.0)(mobx@6.15.0)(typescript@5.9.3) + mobx-restful: 2.1.4(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(mobx@6.15.0)(typescript@5.9.3) react: 19.2.5 regenerator-runtime: 0.14.1 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - core-js - element-internals-polyfill - jsdom - typescript - mobx-react-helper@0.5.1(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3): + mobx-react-helper@0.4.1(element-internals-polyfill@3.0.2)(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 lodash.isequalwith: 4.4.0 mobx: 6.15.0 react: 19.2.5 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) + transitivePeerDependencies: + - element-internals-polyfill + - typescript + + mobx-react-helper@0.5.1(element-internals-polyfill@3.0.2)(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3): + dependencies: + '@swc/helpers': 0.5.21 + lodash.isequalwith: 4.4.0 + mobx: 6.15.0 + react: 19.2.5 + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - element-internals-polyfill - typescript @@ -9085,21 +9757,21 @@ snapshots: optionalDependencies: react-dom: 19.2.5(react@19.2.5) - mobx-restful-table@2.6.3(@types/react@19.2.14)(core-js@3.49.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3): + mobx-restful-table@2.6.3(@types/react@19.2.14)(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 classnames: 2.5.1 lodash: 4.18.1 mobx: 6.15.0 - mobx-i18n: 0.7.2(mobx@6.15.0)(typescript@5.9.3) + mobx-i18n: 0.7.2(element-internals-polyfill@3.0.2)(mobx@6.15.0)(typescript@5.9.3) mobx-react: 9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - mobx-react-helper: 0.5.1(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) - mobx-restful: 2.1.4(core-js@3.49.0)(mobx@6.15.0)(typescript@5.9.3) + mobx-react-helper: 0.5.1(element-internals-polyfill@3.0.2)(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) + mobx-restful: 2.1.4(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(mobx@6.15.0)(typescript@5.9.3) react: 19.2.5 react-bootstrap: 2.10.10(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react-bootstrap-editor: 2.1.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) + react-bootstrap-editor: 2.1.1(element-internals-polyfill@3.0.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3) regenerator-runtime: 0.14.1 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - '@types/react' - core-js @@ -9109,30 +9781,30 @@ snapshots: - react-native - typescript - mobx-restful@2.1.4(core-js@3.49.0)(mobx@6.15.0)(typescript@5.9.3): + mobx-restful@2.1.4(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(mobx@6.15.0)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 idb-keyval: 6.2.2 - koajax: 3.3.0(core-js@3.49.0)(typescript@5.9.3) + koajax: 3.3.0(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3) mobx: 6.15.0 regenerator-runtime: 0.14.1 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - core-js - element-internals-polyfill - jsdom - typescript - mobx-strapi@0.8.1(core-js@3.49.0)(typescript@5.9.3): + mobx-strapi@0.8.1(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 idb-keyval: 6.2.2 - koajax: 3.3.0(core-js@3.49.0)(typescript@5.9.3) + koajax: 3.3.0(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3) mobx: 6.15.0 - mobx-restful: 2.1.4(core-js@3.49.0)(mobx@6.15.0)(typescript@5.9.3) + mobx-restful: 2.1.4(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(mobx@6.15.0)(typescript@5.9.3) qs: 6.15.1 regenerator-runtime: 0.14.1 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - core-js - element-internals-polyfill @@ -9163,14 +9835,16 @@ snapshots: negotiator@0.6.3: {} - next-pwa@5.6.0(@babel/core@7.29.0)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0)): + neo-async@2.6.2: {} + + next-pwa@5.6.0(@babel/core@7.29.0)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(webpack@5.106.2): dependencies: - babel-loader: 8.4.1(@babel/core@7.29.0) - clean-webpack-plugin: 4.0.0 + babel-loader: 8.4.1(@babel/core@7.29.0)(webpack@5.106.2) + clean-webpack-plugin: 4.0.0(webpack@5.106.2) globby: 11.1.0 next: 16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) - terser-webpack-plugin: 5.5.0 - workbox-webpack-plugin: 6.6.0 + terser-webpack-plugin: 5.5.0(webpack@5.106.2) + workbox-webpack-plugin: 6.6.0(webpack@5.106.2) workbox-window: 6.6.0 transitivePeerDependencies: - '@babel/core' @@ -9181,7 +9855,7 @@ snapshots: - uglify-js - webpack - next-ssr-middleware@1.1.0(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): + next-ssr-middleware@1.1.0(element-internals-polyfill@3.0.2)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0))(react@19.2.5)(typescript@5.9.3): dependencies: '@koa/bodyparser': 6.1.0(koa@3.2.0) '@koa/router': 15.4.0(koa@3.2.0) @@ -9193,19 +9867,45 @@ snapshots: next: 16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) react: 19.2.5 tslib: 2.8.1 - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - element-internals-polyfill - supports-color - typescript - next-with-less@3.0.1(less-loader@12.3.2(less@4.6.4))(less@4.6.4)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0)): + next-with-less@3.0.1(less-loader@12.3.2(less@4.6.4)(webpack@5.106.2))(less@4.6.4)(next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0)): dependencies: clone-deep: 4.0.1 less: 4.6.4 - less-loader: 12.3.2(less@4.6.4) + less-loader: 12.3.2(less@4.6.4)(webpack@5.106.2) next: 16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0) + next@13.5.11(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0): + dependencies: + '@next/env': 13.5.11 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001791 + postcss: 8.4.31 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + styled-jsx: 5.1.1(@babel/core@7.29.0)(react@19.2.5) + watchpack: 2.4.0 + optionalDependencies: + '@next/swc-darwin-arm64': 13.5.9 + '@next/swc-darwin-x64': 13.5.9 + '@next/swc-linux-arm64-gnu': 13.5.9 + '@next/swc-linux-arm64-musl': 13.5.9 + '@next/swc-linux-x64-gnu': 13.5.9 + '@next/swc-linux-x64-musl': 13.5.9 + '@next/swc-win32-arm64-msvc': 13.5.9 + '@next/swc-win32-ia32-msvc': 13.5.9 + '@next/swc-win32-x64-msvc': 13.5.9 + sass: 1.99.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + next@16.2.4(@babel/core@7.29.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(sass@1.99.0): dependencies: '@next/env': 16.2.4 @@ -9299,19 +9999,19 @@ snapshots: dependencies: mimic-function: 5.0.1 - open-react-map@0.9.1(core-js@3.49.0)(mobx-react@9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3): + open-react-map@0.9.1(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(mobx-react@9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 '@types/leaflet': 1.9.21 - koajax: 3.3.0(core-js@3.49.0)(typescript@5.9.3) + koajax: 3.3.0(core-js@3.49.0)(element-internals-polyfill@3.0.2)(jsdom@29.1.1)(typescript@5.9.3) leaflet: 1.9.4 mobx: 6.15.0 mobx-react: 9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - mobx-react-helper: 0.5.1(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) + mobx-react-helper: 0.5.1(element-internals-polyfill@3.0.2)(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) react: 19.2.5 react-dom: 19.2.5(react@19.2.5) react-leaflet: 5.0.0(leaflet@1.9.4)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - core-js - element-internals-polyfill @@ -9378,6 +10078,10 @@ snapshots: parse-node-version@1.0.1: {} + parse5@8.0.1: + dependencies: + entities: 8.0.0 + parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -9505,16 +10209,16 @@ snapshots: react-stately: 3.46.0(react@19.2.5) use-sync-external-store: 1.6.0(react@19.2.5) - react-bootstrap-editor@2.1.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3): + react-bootstrap-editor@2.1.1(element-internals-polyfill@3.0.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 - edkit: 1.2.7(typescript@5.9.3) + edkit: 1.2.7(element-internals-polyfill@3.0.2)(typescript@5.9.3) mobx: 6.15.0 mobx-react: 9.2.1(mobx@6.15.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - mobx-react-helper: 0.5.1(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) + mobx-react-helper: 0.4.1(element-internals-polyfill@3.0.2)(mobx@6.15.0)(react@19.2.5)(typescript@5.9.3) react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - web-utility: 4.6.6(typescript@5.9.3) + web-utility: 4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3) transitivePeerDependencies: - element-internals-polyfill - react-native @@ -9819,6 +10523,10 @@ snapshots: sax@1.6.0: optional: true + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + scheduler@0.27.0: {} schema-utils@2.7.1: @@ -9831,7 +10539,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 ajv: 8.20.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) semver@5.7.2: @@ -9987,6 +10695,8 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + streamsearch@1.1.0: {} + string-argv@0.3.2: {} string-width@7.2.0: @@ -10081,6 +10791,13 @@ snapshots: dependencies: inline-style-parser: 0.2.7 + styled-jsx@5.1.1(@babel/core@7.29.0)(react@19.2.5): + dependencies: + client-only: 0.0.1 + react: 19.2.5 + optionalDependencies: + '@babel/core': 7.29.0 + styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.5): dependencies: client-only: 0.0.1 @@ -10108,10 +10825,14 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} + synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 + tapable@2.3.3: {} + temp-dir@2.0.0: {} tempy@0.6.0: @@ -10121,12 +10842,13 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 - terser-webpack-plugin@5.5.0: + terser-webpack-plugin@5.5.0(webpack@5.106.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.2 + webpack: 5.106.2 terser@5.46.2: dependencies: @@ -10154,6 +10876,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tldts-core@7.0.30: {} + + tldts@7.0.30: + dependencies: + tldts-core: 7.0.30 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -10168,10 +10896,18 @@ snapshots: toml@3.0.0: {} + tough-cookie@6.0.1: + dependencies: + tldts: 7.0.30 + tr46@1.0.1: dependencies: punycode: 2.3.1 + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -10293,6 +11029,8 @@ snapshots: undici-types@7.16.0: {} + undici@7.25.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -10423,25 +11161,85 @@ snapshots: vscode-uri@3.1.0: {} + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + warning@4.0.3: dependencies: loose-envify: 1.4.0 + watchpack@2.4.0: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + watchpack@2.5.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + web-streams-polyfill@4.2.0: {} - web-utility@4.6.6(typescript@5.9.3): + web-utility@4.6.6(element-internals-polyfill@3.0.2)(typescript@5.9.3): dependencies: '@swc/helpers': 0.5.21 + element-internals-polyfill: 3.0.2 regenerator-runtime: 0.14.1 typescript: 5.9.3 webidl-conversions@4.0.2: {} + webidl-conversions@8.0.1: {} + webpack-sources@1.4.3: dependencies: source-list-map: 2.0.1 source-map: 0.6.1 + webpack-sources@3.4.1: {} + + webpack@5.106.2: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.21.3 + es-module-lexer: 2.1.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + loader-runner: 4.3.2 + mime-db: 1.54.0 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + terser-webpack-plugin: 5.5.0(webpack@5.106.2) + watchpack: 2.5.1 + webpack-sources: 3.4.1 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-mimetype@5.0.0: {} + + whatwg-url@16.0.1: + dependencies: + '@exodus/bytes': 1.15.0 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 @@ -10603,11 +11401,12 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0: + workbox-webpack-plugin@6.6.0(webpack@5.106.2): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 + webpack: 5.106.2 webpack-sources: 1.4.3 workbox-build: 6.6.0 transitivePeerDependencies: @@ -10629,6 +11428,10 @@ snapshots: xdg-basedir@5.1.0: {} + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + yallist@3.1.1: {} yaml@2.8.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..1778080 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +allowBuilds: + '@parcel/watcher': set this to true or false + core-js: set this to true or false + sharp: set this to true or false + unrs-resolver: set this to true or false diff --git a/public/images/placeholder-book.svg b/public/images/placeholder-book.svg new file mode 100644 index 0000000..9437627 --- /dev/null +++ b/public/images/placeholder-book.svg @@ -0,0 +1,12 @@ + + Book Placeholder + A simple placeholder cover for Open Library books. + + + + + + + + + diff --git a/public/images/placeholder-hero.svg b/public/images/placeholder-hero.svg new file mode 100644 index 0000000..7fabd8a --- /dev/null +++ b/public/images/placeholder-hero.svg @@ -0,0 +1,29 @@ + + Open Library Hero Placeholder + An abstract illustration of people sharing books. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles/open-library.module.scss b/styles/open-library.module.scss new file mode 100644 index 0000000..eae5d96 --- /dev/null +++ b/styles/open-library.module.scss @@ -0,0 +1,11 @@ +.openLibrary { + margin: 0; + padding: 0; + width: 100%; + max-width: 100%; + overflow-x: hidden; +} + +.featureList { + list-style-type: '✦ '; +} diff --git a/translation/en-US.ts b/translation/en-US.ts index 4419cb6..4396e61 100644 --- a/translation/en-US.ts +++ b/translation/en-US.ts @@ -339,4 +339,188 @@ export default { team_members: 'Team Members', team_works: 'Team Works', no_news_yet: 'No news yet', + + // Open Library + open_library: 'Open Library', + + // Open Library Navigation + home: 'Home', + catalog: 'Catalog', + donate: 'Donate', + how_to_borrow: 'How to Borrow', + review: 'Review', + + // Open Library Home Page + featured_books: 'Featured Books', + view_all_books: 'Browse All Books', + browse_catalog: 'Browse Catalog', + testimonials: 'Testimonials', + join_community: 'Join Our Community', + become_member: 'Become a Member', + donate_books: 'Donate Books', + how_it_works: 'How It Works', + how_it_works_description: 'Three simple steps to borrow books from our community', + step_1_find_book: 'Find a Book', + step_1_description: + 'Browse our collection and find the book that interests you. Filter by category, author, or popularity.', + step_2_apply: 'Apply to Borrow', + step_2_description: + "Submit a simple request form. We'll connect you with the book owner and arrange the handover.", + step_3_receive: 'Receive and Pass It On', + step_3_description: + "Enjoy your book and return it when you're done. Consider donating your own books to keep knowledge flowing.", + learn_more_about_borrowing: 'Learn More About Borrowing', + community_voices: 'Community Voices', + community_voices_description: 'What our members say about Open Library', + read_more_reviews: 'Read More Reviews', + share_your_knowledge: 'Share Your Knowledge', + donate_a_book: 'Donate a Book', + stay_updated: 'Stay Updated', + newsletter_description: 'Subscribe to our newsletter for new book arrivals and community events.', + email_placeholder: 'Your email address', + subscribe: 'Subscribe', + + // Open Library Books Page + book_catalog: 'Book Catalog', + search_books: 'Search Books', + all_categories: 'All Categories', + all_languages: 'All Languages', + all_status: 'All Status', + available: 'Available', + borrowed: 'Borrowed', + reset_filters: 'Reset Filters', + showing_books: ({ shownCount, totalCount }: { shownCount: number; totalCount: number }) => + `Showing ${shownCount} of ${totalCount} books`, + no_books_found: 'No books found', + try_adjusting_filters: 'Try adjusting your search or filters', + reset_all_filters: 'Reset All Filters', + open_library_view_details: 'View Details', + currently_with: 'Currently with: {0}', + + // Open Library Book Detail Page + loading: 'Loading...', + book_not_found: 'Book Not Found', + return_to_catalog: 'Return to Catalog', + back: 'Back', + by_author: 'by {0}', + currently_borrowed: 'Currently Borrowed', + currently_unavailable: 'Currently Unavailable', + request_to_borrow: 'Request to Borrow', + reviews: 'Reviews', + borrow_history: 'Borrow History', + no_reviews_yet: 'No reviews yet', + be_first_to_review: 'Be the first to review this book!', + write_review: 'Write a Review', + add_your_review: 'Add Your Review', + borrower: 'Borrower', + borrow_date: 'Borrow Date', + return_date: 'Return Date', + status: 'Status', + returned: 'Returned', + active: 'Active', + not_borrowed_yet: 'This book has not been borrowed yet', + + // Open Library About Page + about_open_library: 'About Open Library', + our_mission: 'Our Mission', + our_values: 'Our Values', + our_features: 'Our Features', + our_team: 'Our Team', + join_us_open_library: 'Join Us', + + // Open Library Donate Page + book_donation: 'Book Donation', + why_donate: 'Why Donate Books?', + donation_process: 'Donation Process', + book_registration: 'Book Registration', + what_books_we_accept: 'What Books Do We Accept?', + we_welcome: 'We Welcome', + not_suitable: 'Not Suitable for Donation', + faq: 'Frequently Asked Questions', + ready_to_donate: 'Ready to Donate Books?', + fill_donation_form: 'Fill Donation Form', + apply_for_membership: 'Apply for Membership', + + // Open Library How to Borrow Page + how_to_borrow_page: 'How to Borrow', + borrowing_and_passing: 'Borrowing and Passing Model', + borrowing_process: 'Borrowing Process', + borrowing_rules: 'Borrowing Rules', + quick_links: 'Quick Links', + view_full_catalog: 'View Full Catalog', + fill_borrow_request: 'Fill Borrow Request', + fill_book_passing_form: 'Fill Book Passing Form', + browse_book_catalog: 'Browse Book Catalog', + ready_to_borrow: 'Ready to Borrow?', + + // BookCard + book_cover: 'Cover', + + // HowItWorks + learn_more_details: 'Learn More', + + // Books Page + book_catalog_description: 'Browse our community shared library and discover interesting books', + + // Homepage About & Support sections + open_library_community_intro: 'freeCodeCamp Chengdu Community Open Library', + our_mission_text: + 'Promote knowledge exchange, drive learning and growth among community members, and strengthen interaction and trust. We use a unique "no-storage" lending model to let books circulate freely among members.', + core_concepts: 'Core Concepts', + knowledge_flow: 'Knowledge Flow', + knowledge_flow_desc: 'Books circulate freely to promote knowledge sharing', + community_driven: 'Community Driven', + community_driven_desc: 'All books are donated by members', + open_sharing: 'Open Sharing', + open_sharing_desc: 'Promoting exchange and interaction', + support_us: 'Support Us', + support_us_description: + 'Open Library is completely supported by the passion and contributions of community members. If this project has been helpful to you, please support our development.', + share_your_book: 'Share Your Book', + + // Book Detail Page + book_publisher: 'Publisher', + book_published_year: 'Published', + book_page_count: 'Pages', + not_available: 'N/A', + + // Open Library Review Page + book_reviews: 'Book Reviews', + community_reviews: 'Community Reviews', + all_reviews: 'All Reviews', + recent_reviews: 'Recent Reviews', + top_reviews: 'Top Reviews', + write_your_review: 'Write Your Review', + review_guidelines: 'Review Guidelines', + how_to_write_helpful_review: 'How to Write a Helpful Review', + rating_reference: 'Rating Reference', + + // Homepage Hero Section + hero_title: 'Free knowledge flows here', + hero_subtitle: + "Share and borrow books in our open-source community. Join freeCodeCamp Chengdu's initiative to make learning accessible to everyone.", + + // Featured Books Section + featured_books_subtitle: 'Discover what our community is reading right now', + + // Donation Callout Section + donation_callout_subtitle: + 'Have books collecting dust on your shelf? Donate them to our community and help others learn and grow. Your contribution makes a difference!', + + // Footer + footer_description: + 'A community-driven library for sharing knowledge and stories. Built with open source. Powered by generosity.', + quick_links_footer: 'Quick Links', + home_footer: 'Home', + catalog_footer: 'Catalog', + about_us_footer: 'About Us', + donate_footer: 'Donate', + contact: 'Contact', + community_name: 'freeCodeCamp Chengdu Community', + community_location: 'Chengdu, Sichuan, China', + contact_email: 'team@fcc-cd.dev', + contact_address: 'Chengdu, Sichuan, China', + contact_wechat: 'freeCodeCamp 成都社区', + follow_us: 'Follow Us', + all_rights_reserved: 'All Rights Reserved', }; diff --git a/translation/zh-CN.ts b/translation/zh-CN.ts index ae27758..a443cd1 100644 --- a/translation/zh-CN.ts +++ b/translation/zh-CN.ts @@ -315,4 +315,184 @@ export default { team_members: '团队成员', team_works: '团队作品', no_news_yet: '暂无动态', + + // Open Library + open_library: '开源图书馆', + + // Open Library Navigation + home: '首页', + catalog: '书籍目录', + donate: '书籍募捐', + how_to_borrow: '如何借阅', + review: '书籍评价', + + // Open Library Home Page + featured_books: '精选书籍', + view_all_books: '浏览全部书籍', + browse_catalog: '浏览书目', + testimonials: '读者反馈', + join_community: '加入社区', + become_member: '成为会员', + donate_books: '捐赠书籍', + how_it_works: '运作方式', + how_it_works_description: '三个简单步骤借阅社区书籍', + step_1_find_book: '寻找书籍', + step_1_description: '浏览我们的藏书并找到您感兴趣的书籍。可按类别、作者或热度筛选。', + step_2_apply: '申请借阅', + step_2_description: '提交简单的申请表。我们将为您联系书籍所有者并安排交接。', + step_3_receive: '接收并传递', + step_3_description: '阅读完毕后归还书籍。考虑捐赠您自己的书籍,让知识持续流动。', + learn_more_about_borrowing: '了解更多借阅信息', + community_voices: '社区声音', + community_voices_description: '会员对开源图书馆的评价', + read_more_reviews: '阅读更多评价', + share_your_knowledge: '分享您的知识', + donate_a_book: '捐赠一本书', + stay_updated: '保持更新', + newsletter_description: '订阅我们的通讯,获取新书到达和社区活动信息。', + email_placeholder: '您的电子邮箱', + subscribe: '订阅', + + // Open Library Books Page + book_catalog: '书籍目录', + search_books: '搜索书籍', + all_categories: '所有分类', + all_languages: '所有语言', + all_status: '所有状态', + available: '可借阅', + borrowed: '已借出', + reset_filters: '重置筛选', + showing_books: ({ shownCount, totalCount }: { shownCount: number; totalCount: number }) => + `显示 ${shownCount} 本书,共 ${totalCount} 本`, + no_books_found: '未找到书籍', + try_adjusting_filters: '尝试调整筛选条件', + reset_all_filters: '重置所有筛选', + open_library_view_details: '查看详情', + currently_with: '当前持有者: {0}', + + // Open Library Book Detail Page + loading: '加载中...', + book_not_found: '未找到书籍', + return_to_catalog: '返回目录', + back: '返回', + by_author: '作者: {0}', + currently_borrowed: '当前已借出', + currently_unavailable: '当前不可用', + request_to_borrow: '申请借阅', + reviews: '评价', + borrow_history: '借阅历史', + no_reviews_yet: '暂无评价', + be_first_to_review: '成为第一个评价的人!', + write_review: '写评价', + add_your_review: '添加您的评价', + borrower: '借阅者', + borrow_date: '借阅日期', + return_date: '归还日期', + status: '状态', + returned: '已归还', + active: '借阅中', + not_borrowed_yet: '此书尚未被借阅过', + + // Open Library About Page + about_open_library: '关于社区图书馆', + our_mission: '我们的使命', + our_values: '我们的价值观', + our_features: '我们的特色', + our_team: '我们的团队', + join_us_open_library: '加入我们', + + // Open Library Donate Page + book_donation: '书籍募捐', + why_donate: '为什么捐赠书籍?', + donation_process: '捐赠流程', + book_registration: '书籍登记', + what_books_we_accept: '我们接受什么样的书籍?', + we_welcome: '我们欢迎', + not_suitable: '不适合捐赠', + faq: '常见问题', + ready_to_donate: '准备好捐赠书籍了吗?', + fill_donation_form: '填写捐赠申请', + apply_for_membership: '申请成为会员', + + // Open Library How to Borrow Page + how_to_borrow_page: '如何借阅', + borrowing_and_passing: '借阅与传递模式', + borrowing_process: '借阅流程', + borrowing_rules: '借阅规则', + quick_links: '快速链接', + view_full_catalog: '查看完整书籍目录', + fill_borrow_request: '填写借阅申请', + fill_book_passing_form: '填写书籍传递表', + browse_book_catalog: '浏览书籍目录', + ready_to_borrow: '准备好借阅了吗?', + + // BookCard + book_cover: '封面', + + // HowItWorks + learn_more_details: '了解详细流程', + + // Books Page + book_catalog_description: '浏览我们的社区共享图书馆,发现有趣的书籍', + + // Homepage About & Support sections + open_library_community_intro: 'freeCodeCamp 成都社区「Open Library」开放共享图书馆', + our_mission_text: + '促进知识交流,推动社区成员之间的学习和成长,增强社区成员之间的互动与信任。我们采用独特的"无储存"借阅模式,让书籍在会员之间自由流转。', + core_concepts: '核心理念', + knowledge_flow: '知识流动', + knowledge_flow_desc: '书籍自由流转,促进知识传播', + community_driven: '社区驱动', + community_driven_desc: '所有书籍来自成员捐赠', + open_sharing: '开放共享', + open_sharing_desc: '促进交流和互动', + support_us: '支持我们', + support_us_description: + 'Open Library 完全由社区成员的热情和贡献支撑。如果这个项目对你有帮助,欢迎通过以下方式支持我们的发展。', + share_your_book: '分享你的图书', + + // Book Detail Page + book_publisher: '出版社', + book_published_year: '出版年份', + book_page_count: '页数', + not_available: 'N/A', + + // Open Library Review Page + book_reviews: '书籍评价', + community_reviews: '社区书评', + all_reviews: '所有评价', + recent_reviews: '最新评价', + top_reviews: '高分评价', + write_your_review: '写下您的书评', + review_guidelines: '书评指南', + how_to_write_helpful_review: '如何写一篇有帮助的书评', + rating_reference: '评分参考', + + // Homepage Hero Section + hero_title: '知识在这里自由流动', + hero_subtitle: + '在我们的开源社区中分享和借阅书籍。加入 freeCodeCamp 成都社区的倡议,让学习对每个人都触手可及。', + + // Featured Books Section + featured_books_subtitle: '发现我们社区现在正在阅读的书籍', + + // Donation Callout Section + donation_callout_subtitle: + '您的书架上有积灰的书吗?将它们捐赠给我们的社区,帮助他人学习和成长。您的贡献会产生影响!', + + // Footer + footer_description: '一个由社区驱动的图书馆,用于分享知识和故事。开源构建。由慷慨驱动。', + quick_links_footer: '快速链接', + home_footer: '首页', + catalog_footer: '目录', + about_us_footer: '关于我们', + donate_footer: '捐赠', + contact: '联系我们', + community_name: 'freeCodeCamp 成都社区', + community_location: '中国四川成都', + contact_email: 'team@fcc-cd.dev', + contact_address: '中国四川成都', + contact_wechat: 'freeCodeCamp 成都社区', + follow_us: '关注我们', + all_rights_reserved: '版权所有', }; diff --git a/translation/zh-TW.ts b/translation/zh-TW.ts index a657e06..d9cbc53 100644 --- a/translation/zh-TW.ts +++ b/translation/zh-TW.ts @@ -315,4 +315,185 @@ export default { team_members: '團隊成員', team_works: '團隊作品', no_news_yet: '暫無動態', + + // Open Library + open_library: '開源圖書館', + + // Open Library Navigation + home: '首頁', + catalog: '目錄', + donate: '捐贈', + how_to_borrow: '如何借書', + review: '書評', + + // Open Library Home Page + featured_books: '特色書籍', + view_all_books: '查看所有書籍', + browse_catalog: '瀏覽目錄', + testimonials: '證言', + join_community: '加入社群', + become_member: '成為會員', + donate_books: '捐贈書籍', + how_it_works: '如何運作', + how_it_works_description: '九步驟加入社群圖書館', + step_1_find_book: '找書', + step_1_description: '瀏覽我們的書籍目錄,找到您想要的書籍。您可以按類別、作者或標題搜索。', + step_2_apply: '申請借書', + step_2_description: '填寫借書申請表格,我們會與您聯絡安排借書事宜。', + step_3_receive: '收書', + step_3_description: '書籍將會寄送到您指定的地址,請注意查收。', + learn_more_about_borrowing: '了解更多借書資訊', + community_voices: '社群聲音', + community_voices_description: '聽聽我們的社群成員怎麼說', + read_more_reviews: '閱讀更多書評', + share_your_knowledge: '分享您的知識', + donate_a_book: '捐贈一本書', + stay_updated: '保持更新', + newsletter_description: '訂閱我們的電子報,保持與社群圖書館的聯絡。', + email_placeholder: '您的電子郵件地址', + subscribe: '訂閱', + + // Open Library Books Page + book_catalog: '書籍目錄', + search_books: '搜尋書籍', + all_categories: '所有類別', + all_languages: '所有語言', + all_status: '所有狀態', + available: '可借', + borrowed: '已借出', + reset_filters: '重設篩選', + showing_books: ({ shownCount, totalCount }: { shownCount: number; totalCount: number }) => + `顯示 ${shownCount} 本書,共 ${totalCount} 本`, + no_books_found: '沒有找到書籍', + try_adjusting_filters: '試著調整篩選條件', + reset_all_filters: '重設所有篩選', + open_library_view_details: '查看詳情', + currently_with: '目前由 {0} 借出', + + // Open Library Book Detail Page + loading: '載入中...', + book_not_found: '沒有找到書籍', + return_to_catalog: '返回目錄', + back: '返回', + by_author: '作者:{0}', + currently_borrowed: '目前已借出', + currently_unavailable: '目前不可借', + request_to_borrow: '申請借書', + reviews: '書評', + borrow_history: '借書歷史', + no_reviews_yet: '尚無書評', + be_first_to_review: '成為第一個書評的人!', + write_review: '寫書評', + add_your_review: '新增您的書評', + borrower: '借書人', + borrow_date: '借書日期', + return_date: '歸還日期', + status: '狀態', + returned: '已歸還', + active: '借書中', + not_borrowed_yet: '尚未借出', + + // Open Library About Page + about_open_library: '關於開源圖書館', + our_mission: '我們的使命', + our_values: '我們的價值', + our_features: '我們的特色', + our_team: '我們的團隊', + join_us_open_library: '加入我們', + + // Open Library Donate Page + book_donation: '書籍捐贈', + why_donate: '為什麼捐贈?', + donation_process: '捐贈流程', + book_registration: '書籍登錄', + what_books_we_accept: '我們接受什麼書籍?', + we_welcome: '我們歡迎', + not_suitable: '不適合', + faq: '常見問題', + ready_to_donate: '準備捐贈書籍?', + fill_donation_form: '填寫捐贈表單', + apply_for_membership: '申請會員', + + // Open Library How to Borrow Page + how_to_borrow_page: '如何借書', + borrowing_and_passing: '借閱與傳遞模式', + borrowing_process: '借書流程', + borrowing_rules: '借書規則', + quick_links: '快速連結', + view_full_catalog: '查看完整目錄', + fill_borrow_request: '填寫借書申請', + fill_book_passing_form: '填寫書籍傳遞表單', + browse_book_catalog: '瀏覽書籍目錄', + ready_to_borrow: '準備好借書嗎?', + + // BookCard + book_cover: '封面', + + // HowItWorks + learn_more_details: '了解詳細流程', + + // Books Page + book_catalog_description: '瀏覽我們的社區共享圖書館,發現有趣的書籍', + + // Homepage About & Support sections + open_library_community_intro: 'freeCodeCamp 成都社區「Open Library」開放共享圖書館', + our_mission_text: + '促進知識交流,推動社區成員之間的學習和成長,增強社區成員之間的互動與信任。我們採用獨特的「無儲存」借閱模式,讓書籍在會員之間自由流轉。', + core_concepts: '核心理念', + knowledge_flow: '知識流動', + knowledge_flow_desc: '書籍自由流轉,促進知識傳播', + community_driven: '社區驅動', + community_driven_desc: '所有書籍來自成員捐贈', + open_sharing: '開放共享', + open_sharing_desc: '促進交流和互動', + support_us: '支持我們', + support_us_description: + 'Open Library 完全由社區成員的熱情和貢獻支撐。如果這個項目對你有幫助,歡迎通過以下方式支持我們的發展。', + share_your_book: '分享你的圖書', + + // Book Detail Page + book_publisher: '出版社', + book_published_year: '出版年份', + book_page_count: '頁數', + not_available: 'N/A', + + // Open Library Review Page + book_reviews: '書籍書評', + community_reviews: '社群書評', + all_reviews: '所有書評', + recent_reviews: '最新書評', + top_reviews: '最佳書評', + write_your_review: '寫您的書評', + review_guidelines: '書評指南', + how_to_write_helpful_review: '如何寫有用的書評', + rating_reference: '評分參考', + + // Homepage Hero Section + hero_title: '在我們的開源圖書館中探索', + hero_subtitle: + '在我們的社群圖書館中探索免費的書籍和資源。加入 freeCodeCamp 成為社群圖書館的一部分,學習和分享知識。', + + // Featured Books Section + featured_books_subtitle: '我們社群圖書館中最受歡迎的書籍', + + // Donation Callout Section + donation_callout_subtitle: + '您的捐贈將有助於我們的社群圖書館的發展。您的支持將有助於我們提供更多免費的書籍和資源給社群成員。', + + // Footer + footer_description: + '一個開源的社群圖書館,提供免費的書籍和資源給社群成員。開源。免費。無限可能。', + quick_links_footer: '快速連結', + home_footer: '首頁', + catalog_footer: '目錄', + about_us_footer: '關於我們', + donate_footer: '捐贈', + contact: '聯絡我們', + community_name: 'freeCodeCamp 成都社群', + community_location: '中國四川成都', + contact_email: 'team@fcc-cd.dev', + contact_address: '中國四川成都', + contact_wechat: 'freeCodeCamp 成都社群', + follow_us: '關注我們', + all_rights_reserved: '版權所有', };