From c71fd166838c20fc19da606b2b9af31cca0bbaf0 Mon Sep 17 00:00:00 2001 From: Wendy Yuchen Sun Date: Sun, 22 Mar 2026 22:17:51 +0800 Subject: [PATCH 1/5] refactor: move Header into Home, add A8M logo, replace headlessui menus - Add @tabler/icons-react dependency - Add A8M logo SVG asset - Migrate header menus from headlessui to shared DropdownMenu component, replace heroicons with tabler icons, add title input and action buttons - Remove Header from shared Layout so each page owns its header - Update Home to render Header directly with import/export callbacks Co-Authored-By: Claude Sonnet 4.6 s --- package-lock.json | 25 +++++++ package.json | 1 + src/components/header/index.js | 47 +++++++++----- src/components/header/language-menu.js | 69 ++++++-------------- src/components/header/menu.js | 90 ++++++-------------------- src/components/layout.js | 15 +---- src/components/svg/a8m-logo.svg | 8 +++ src/pages/home/home.js | 62 ++++-------------- 8 files changed, 118 insertions(+), 199 deletions(-) create mode 100644 src/components/svg/a8m-logo.svg diff --git a/package-lock.json b/package-lock.json index afd75e1..095d263 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@coseeing/see-mark": "^1.5.0", "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", + "@tabler/icons-react": "^3.40.0", "classnames": "^2.3.2", "codemirror": "^6.0.1", "core-js": "^3.21.1", @@ -6451,6 +6452,30 @@ "node": ">=10" } }, + "node_modules/@tabler/icons": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.40.0.tgz", + "integrity": "sha512-V/Q4VgNPKubRTiLdmWjV/zscYcj5IIk+euicUtaVVqF6luSC9rDngYWgST5/yh3Mrg/mYUwRv1YVTk71Jp0twQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.40.0.tgz", + "integrity": "sha512-oO5+6QCnna4a//mYubx4euZfECtzQZFDGsDMIdzZUhbdyBCT+3bRVFBPueGIcemWld4Vb/0UQ39C/cmGfGylAg==", + "dependencies": { + "@tabler/icons": "3.40.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, "node_modules/@tanstack/react-virtual": { "version": "3.13.12", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz", diff --git a/package.json b/package.json index 988c235..5f50924 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "@coseeing/see-mark": "^1.5.0", "@headlessui/react": "^1.7.17", "@heroicons/react": "^2.0.18", + "@tabler/icons-react": "^3.40.0", "classnames": "^2.3.2", "codemirror": "^6.0.1", "core-js": "^3.21.1", diff --git a/src/components/header/index.js b/src/components/header/index.js index bb96878..a5c2427 100644 --- a/src/components/header/index.js +++ b/src/components/header/index.js @@ -1,32 +1,49 @@ import React, { useState } from 'react'; +import { ReactComponent as A8mLogo } from '@/components/svg/a8m-logo.svg'; import Menu from './menu'; import LanguageMenu from './language-menu'; import TipModal from '@/components/home/tip-modal'; -import { ReactComponent as QuestionCircleComponent } from '@/components/svg/question-circle.svg'; +import { IconBulb } from '@tabler/icons-react'; import { useTranslation } from '@/lib/i18n'; +import Button from '@/components/core/button'; -const Header = () => { +const Header = ({ onImportClick, onExportClick, displayConfig, setDisplayConfig }) => { const t = useTranslation('home'); const [showTipModal, setShowTipModal] = useState(false); return ( -
-
-

Access8Math

- -
-
-
- -
+
setShowTipModal(false)} />
diff --git a/src/components/header/language-menu.js b/src/components/header/language-menu.js index 9d20bd7..31e075d 100644 --- a/src/components/header/language-menu.js +++ b/src/components/header/language-menu.js @@ -1,9 +1,10 @@ -import React, { Fragment } from 'react'; -import { Menu, Transition } from '@headlessui/react'; -import { LanguageIcon } from '@heroicons/react/20/solid'; +import React from 'react'; +import { IconLanguage } from '@tabler/icons-react'; import i18n, { useTranslation } from '@/lib/i18n'; import { useLocaleContext } from '@/lib/locale-switch'; +import Button from '@/components/core/button'; +import DropdownMenu from '@/components/core/dropdown-menu'; const LANGUAGES = [ { locale: 'zh-TW' }, @@ -16,54 +17,22 @@ const LanguageMenu = () => { const t = useTranslation('common'); const { changeLocale } = useLocaleContext(); - return ( - - {({ open }) => ( - <> - - - {open &&
} + const items = LANGUAGES.map(({ locale }) => ({ + label: t(`locale.${locale}`), + onClick: () => changeLocale(locale), + })); - - -
-
- {LANGUAGES.map(({ locale }) => ( - - {({ active }) => { - return ( - - ); - }} - - ))} -
-
-
-
- - )} -
+ return ( + +