added alt and title attributes to images for better accessibility and SEO.

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-05-01 16:44:39 +08:00
parent e6a2bdad0b
commit cab45fef93
7 changed files with 467 additions and 7 deletions

387
.opencode/package-lock.json generated Normal file
View File

@@ -0,0 +1,387 @@
{
"name": ".opencode",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"dependencies": {
"@kilocode/plugin": "7.2.31",
"@opencode-ai/plugin": "1.0.11"
}
},
"node_modules/@kilocode/plugin": {
"version": "7.2.31",
"resolved": "https://registry.npmjs.org/@kilocode/plugin/-/plugin-7.2.31.tgz",
"integrity": "sha512-KmKTTIly7hRlJdXKhqZ/j/brvTPh0z0UTjWSjJWq5fqf4pATgYGn7G0g3ZjILnN7MUkkZXuljgqExTEeQJHGkQ==",
"license": "MIT",
"dependencies": {
"@kilocode/sdk": "7.2.31",
"effect": "4.0.0-beta.48",
"zod": "4.1.8"
},
"peerDependencies": {
"@opentui/core": ">=0.1.100",
"@opentui/solid": ">=0.1.100"
},
"peerDependenciesMeta": {
"@opentui/core": {
"optional": true
},
"@opentui/solid": {
"optional": true
}
}
},
"node_modules/@kilocode/sdk": {
"version": "7.2.31",
"resolved": "https://registry.npmjs.org/@kilocode/sdk/-/sdk-7.2.31.tgz",
"integrity": "sha512-Sx05yv+3TIlc6M4Ze+YGgKCLoIg8B0WRE15JXDriVncT+wz7M6+e+4mjNWkwfsuywdeOTYPfeFViqX8iO7ckKA==",
"license": "MIT",
"dependencies": {
"cross-spawn": "7.0.6"
}
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz",
"integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz",
"integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz",
"integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz",
"integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz",
"integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz",
"integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@opencode-ai/plugin": {
"version": "1.0.11",
"dependencies": {
"@opencode-ai/sdk": "1.0.11",
"zod": "4.1.8"
}
},
"node_modules/@opencode-ai/sdk": {
"version": "1.0.11"
},
"node_modules/@standard-schema/spec": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
"license": "MIT"
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"license": "Apache-2.0",
"optional": true,
"engines": {
"node": ">=8"
}
},
"node_modules/effect": {
"version": "4.0.0-beta.48",
"resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.48.tgz",
"integrity": "sha512-MMAM/ZabuNdNmgXiin+BAanQXK7qM8mlt7nfXDoJ/Gn9V8i89JlCq+2N0AiWmqFLXjGLA0u3FjiOjSOYQk5uMw==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.1.0",
"fast-check": "^4.6.0",
"find-my-way-ts": "^0.1.6",
"ini": "^6.0.0",
"kubernetes-types": "^1.30.0",
"msgpackr": "^1.11.9",
"multipasta": "^0.2.7",
"toml": "^4.1.1",
"uuid": "^13.0.0",
"yaml": "^2.8.3"
}
},
"node_modules/fast-check": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.7.0.tgz",
"integrity": "sha512-NsZRtqvSSoCP0HbNjUD+r1JH8zqZalyp6gLY9e7OYs7NK9b6AHOs2baBFeBG7bVNsuoukh89x2Yg3rPsul8ziQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/dubzzz"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
],
"license": "MIT",
"dependencies": {
"pure-rand": "^8.0.0"
},
"engines": {
"node": ">=12.17.0"
}
},
"node_modules/find-my-way-ts": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz",
"integrity": "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==",
"license": "MIT"
},
"node_modules/ini": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz",
"integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==",
"license": "ISC",
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"license": "ISC"
},
"node_modules/kubernetes-types": {
"version": "1.30.0",
"resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.30.0.tgz",
"integrity": "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==",
"license": "Apache-2.0"
},
"node_modules/msgpackr": {
"version": "1.11.10",
"resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.10.tgz",
"integrity": "sha512-iCZNq+HszvF+fC3anCm4nBmWEnbeIAfpDs6IStAEKhQ2YSgkjzVG2FF9XJqwwQh5bH3N9OUTUt4QwVN6MLMLtA==",
"license": "MIT",
"optionalDependencies": {
"msgpackr-extract": "^3.0.2"
}
},
"node_modules/msgpackr-extract": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz",
"integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"dependencies": {
"node-gyp-build-optional-packages": "5.2.2"
},
"bin": {
"download-msgpackr-prebuilds": "bin/download-prebuilds.js"
},
"optionalDependencies": {
"@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3",
"@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3",
"@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3",
"@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3",
"@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3",
"@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3"
}
},
"node_modules/multipasta": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.7.tgz",
"integrity": "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==",
"license": "MIT"
},
"node_modules/node-gyp-build-optional-packages": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
"integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
"license": "MIT",
"optional": true,
"dependencies": {
"detect-libc": "^2.0.1"
},
"bin": {
"node-gyp-build-optional-packages": "bin.js",
"node-gyp-build-optional-packages-optional": "optional.js",
"node-gyp-build-optional-packages-test": "build-test.js"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/pure-rand": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.0.tgz",
"integrity": "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/dubzzz"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
],
"license": "MIT"
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/toml": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/toml/-/toml-4.1.1.tgz",
"integrity": "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw==",
"license": "MIT",
"engines": {
"node": ">=20"
}
},
"node_modules/uuid": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.1.tgz",
"integrity": "sha512-9ezox2roIft6ExBVTVqibSd5dc5/47Sw/uY6b4SjQUT2TzQ0tltNquWA46y4xPQmdZYqvnio22SgWd41M86+jw==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"license": "MIT",
"bin": {
"uuid": "dist-node/bin/uuid"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/yaml": {
"version": "2.8.3",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
"integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
"node": ">= 14.6"
},
"funding": {
"url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/zod": {
"version": "4.1.8",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
}
}
}

35
AGENTS.md Normal file
View File

@@ -0,0 +1,35 @@
# AGENTS.md
## Project
React + TypeScript + Vite landing page for a healthy-oil product. Uses Chakra UI v3 and TanStack Router. No test suite.
## Commands
- `npm run dev` — Dev server on port 3000
- `npm run build``tsc -b && vite build`
- `npm run lint` — ESLint only, no typecheck script
- `npm run preview` — Preview production build on port 3000
## Architecture
- **Entry:** `src/main.tsx``src/router.tsx``src/pages/*`
- **Old UI (root `/`):** `src/App.tsx` with components in `src/components/*`
- **New UI (`/40plus`):** `src/pages/main.tsx` with components in `src/components/new_ui/*`
- **Layout wrapper:** `src/components/layout.tsx` switches footer based on route
- **Router:** Hash-based routing for FTP server compatibility
- **Path alias:** `@/*` maps to `./src/*`
## Style Conventions
- Component filenames: lowercase (`hero1.tsx`, `oil_info.tsx`)
- Use **function declarations** for components, not arrow functions
- Chakra UI props for responsive design (`base`, `sm`, `md`, `lg`, `xl`)
- Framer Motion for animations
- `colors.tsx` exports color tokens; `colors.css` and `fonts.css` for global styles
## TypeScript
- Strict mode with `noUnusedLocals` and `noUnusedParameters` — unused vars will error
- `tsconfig.json` uses project references (`tsconfig.app.json` + `tsconfig.node.json`)
## Important Constraints
- **No tests** — there is no `test`, `vitest`, or `jest` config. Do not try to run tests.
- **No typecheck script** — run `npx tsc --noEmit` if you need a standalone typecheck.
- **Build order matters:** `build` runs `tsc -b` first, then `vite build`.
- **Images** live in `public/images/`; reference them with absolute paths like `/images/new/...`

View File

@@ -19,6 +19,8 @@ interface CyclingImageProps {
showControls?: boolean // Show play/pause and speed controls showControls?: boolean // Show play/pause and speed controls
autoStart?: boolean // Auto-start animation autoStart?: boolean // Auto-start animation
style?: CSSProperties // Additional CSS styles style?: CSSProperties // Additional CSS styles
alt?: string
title?: string
} }
const CyclingImage = ({ const CyclingImage = ({
@@ -38,7 +40,9 @@ const CyclingImage = ({
timingFunction = 'ease-in-out', timingFunction = 'ease-in-out',
showControls = false, showControls = false,
autoStart = true, autoStart = true,
style = {} style = {},
alt,
title
}: CyclingImageProps) => { }: CyclingImageProps) => {
const [isPlaying, setIsPlaying] = useState(autoStart) const [isPlaying, setIsPlaying] = useState(autoStart)
const [speed, setSpeed] = useState(cycleDuration) const [speed, setSpeed] = useState(cycleDuration)
@@ -93,6 +97,8 @@ const CyclingImage = ({
<style>{animationStyle}</style> <style>{animationStyle}</style>
<Image <Image
src={currentImage} src={currentImage}
alt={alt}
title={title}
position={position} position={position}
w={w} w={w}
maxW={maxW} maxW={maxW}

View File

@@ -94,7 +94,10 @@ const info = [
**獅球嘜營萃護心油每食用份量含0克反式脂肪**,有助減少壞膽固醇,減低患心臟病嘅風險。`, **獅球嘜營萃護心油每食用份量含0克反式脂肪**,有助減少壞膽固醇,減低患心臟病嘅風險。`,
image: "/images/new/1.webp", image: "/images/new/1.webp",
titleImage: "/images/new/adv_img1.webp", titleImage: "/images/new/adv_img1.webp",
titleImage2: "/images/new/adv1.webp" titleImage2: "/images/new/adv1.webp",
alt: "零反式脂肪",
titleSEO: "零反式脂肪"
}, },
{ {
id: 2, id: 2,
@@ -105,7 +108,9 @@ const info = [
獅球嘜營萃護心油就係根據呢個原則調配出符合**世衛黃金比例**嘅配方²,幫助身體攝取每日必需脂肪酸,並促進**脂溶性維他命A、D、E、K**嘅吸收,全面支援日常健康所需。 `, 獅球嘜營萃護心油就係根據呢個原則調配出符合**世衛黃金比例**嘅配方²,幫助身體攝取每日必需脂肪酸,並促進**脂溶性維他命A、D、E、K**嘅吸收,全面支援日常健康所需。 `,
image: "/images/new/2.webp", image: "/images/new/2.webp",
titleImage: "/images/new/adv_img2.webp", titleImage: "/images/new/adv_img2.webp",
titleImage2: "/images/new/adv2.webp" titleImage2: "/images/new/adv2.webp",
alt: "不飽和脂肪,健康比例",
titleSEO: "不飽和脂肪,健康比例"
}, },
{ {
id: 3, id: 3,
@@ -115,7 +120,9 @@ const info = [
**獅球嘜營萃護心油內嘅Omega-3比例較一般花生油及粟米油高**,特別有助經常外出用餐嘅都市人平衡脂肪酸攝取比例,從而支援心血管健康。 `, **獅球嘜營萃護心油內嘅Omega-3比例較一般花生油及粟米油高**,特別有助經常外出用餐嘅都市人平衡脂肪酸攝取比例,從而支援心血管健康。 `,
image: "/images/new/3.webp", image: "/images/new/3.webp",
titleImage: "/images/new/adv_img3.webp", titleImage: "/images/new/adv_img3.webp",
titleImage2: "/images/new/adv3.webp" titleImage2: "/images/new/adv3.webp",
alt: "Omega3",
titleSEO: "Omega3"
}, },
{ {
id: 4, id: 4,
@@ -123,7 +130,10 @@ const info = [
description: "", description: "",
image: "/images/new/4.webp", image: "/images/new/4.webp",
titleImage: "/images/new/adv_img4.webp", titleImage: "/images/new/adv_img4.webp",
titleImage2: "/images/new/adv4.webp" titleImage2: "/images/new/adv4.webp",
alt: "獅球嘜營萃護心油",
titleSEO: "獅球嘜營萃護心油"
} }
]; ];
@@ -193,6 +203,8 @@ function Advantages() {
<Image <Image
src='/images/new/heart.webp' src='/images/new/heart.webp'
title="獅球嘜營萃護心油"
alt="獅球嘜營萃護心油"
w={{ base: '75vw', sm: '75vw', md: '40vw', lg: '40vw', xl: '40vw' }} w={{ base: '75vw', sm: '75vw', md: '40vw', lg: '40vw', xl: '40vw' }}
/> />
@@ -243,6 +255,8 @@ function Advantages() {
<MotionImage <MotionImage
w={{ base: '45vw', sm: '180px', md: '80px', lg: '110px', xl: '5vw' }} w={{ base: '45vw', sm: '180px', md: '80px', lg: '110px', xl: '5vw' }}
src={item.image} src={item.image}
alt={item.alt}
title={item.titleSEO}
initial={{ opacity: 0, scale: 0.8 }} initial={{ opacity: 0, scale: 0.8 }}
animate={isMainInView ? { opacity: 1, scale: 1 } : { opacity: 0, scale: 0.8 }} animate={isMainInView ? { opacity: 1, scale: 1 } : { opacity: 0, scale: 0.8 }}
transition={{ duration: 0.5, delay: index * 0.15 + 0.1, ease: "easeOut" }} transition={{ duration: 0.5, delay: index * 0.15 + 0.1, ease: "easeOut" }}
@@ -259,6 +273,8 @@ function Advantages() {
fit={'contain'} fit={'contain'}
w={contextTitleImageSize(index)} w={contextTitleImageSize(index)}
src={item.titleImage2} src={item.titleImage2}
alt={item.alt}
title={item.titleSEO}
initial={{ opacity: 0, scale: 0.9 }} initial={{ opacity: 0, scale: 0.9 }}
animate={isMainInView ? { opacity: 1, scale: 1 } : { opacity: 0, scale: 0.9 }} animate={isMainInView ? { opacity: 1, scale: 1 } : { opacity: 0, scale: 0.9 }}
transition={{ duration: 0.5, delay: index * 0.15 + 0.2, ease: "easeOut" }} transition={{ duration: 0.5, delay: index * 0.15 + 0.2, ease: "easeOut" }}
@@ -289,6 +305,8 @@ function Advantages() {
fit={'contain'} fit={'contain'}
mt={contextPeopleImageMt(index)} mt={contextPeopleImageMt(index)}
src={item.titleImage} src={item.titleImage}
alt={item.alt}
title={item.titleSEO}
initial={{ opacity: 0, y: 20 }} initial={{ opacity: 0, y: 20 }}
animate={isMainInView ? { opacity: 1, y: 0 } : { opacity: 0, y: 20 }} animate={isMainInView ? { opacity: 1, y: 0 } : { opacity: 0, y: 20 }}
transition={{ duration: 0.5, delay: index * 0.15 + 0.4, ease: "easeOut" }} transition={{ duration: 0.5, delay: index * 0.15 + 0.4, ease: "easeOut" }}

View File

@@ -111,7 +111,8 @@ function Hero1() {
left="50%" left="50%"
top={{ base: '80vw', sm: '80vw', md: '26vw', lg: '26vw', xl: '28vw' }} top={{ base: '80vw', sm: '80vw', md: '26vw', lg: '26vw', xl: '28vw' }}
maxW={{ base: "70vw", sm: "70vw", md: "40vw", lg: "50vw", xl: "35vw" }} maxW={{ base: "70vw", sm: "70vw", md: "40vw", lg: "50vw", xl: "35vw" }}
alt='hero title' alt="一到40歲身就問多多"
title="一到40歲身就問多多"
initial={{ opacity: 0, y: 30, x: '-50%' }} initial={{ opacity: 0, y: 30, x: '-50%' }}
whileInView={{ opacity: 1, y: 0, x: '-50%' }} whileInView={{ opacity: 1, y: 0, x: '-50%' }}
viewport={{ once: true, amount: 0.3 }} viewport={{ once: true, amount: 0.3 }}
@@ -364,6 +365,8 @@ function Hero1() {
w="100%" w="100%"
cycleDuration={3} cycleDuration={3}
intensity={0.1} intensity={0.1}
alt="三高"
title="三高"
/> />
</Box> </Box>
<Box <Box
@@ -382,6 +385,8 @@ function Hero1() {
w="100%" w="100%"
cycleDuration={3} cycleDuration={3}
intensity={0.1} intensity={0.1}
alt="脂肪肝"
title="脂肪肝"
/> />
</Box> </Box>
<Box <Box
@@ -400,6 +405,8 @@ function Hero1() {
w="100%" w="100%"
cycleDuration={3} cycleDuration={3}
intensity={0.1} intensity={0.1}
alt="中央肥胖"
title="中央肥胖"
/> />
</Box> </Box>
<Box <Box
@@ -418,6 +425,8 @@ function Hero1() {
w="100%" w="100%"
cycleDuration={3} cycleDuration={3}
intensity={0.1} intensity={0.1}
alt="脫髮"
title="脫髮"
/> />
</Box> </Box>

View File

@@ -29,6 +29,8 @@ function Hero2() {
src="/images/new/hero2title.webp" src="/images/new/hero2title.webp"
position={'absolute'} position={'absolute'}
left="50%" left="50%"
title="獅球嘜營萃護心油"
alt="獅球嘜營萃護心油"
top={{ base: "10px", sm: "20px", md: "30px", lg: "30px", xl: "40px" }} top={{ base: "10px", sm: "20px", md: "30px", lg: "30px", xl: "40px" }}
w={{ base: "70vw", sm: "70vw", md: "35vw", lg: "35vw", xl: "28vw" }} w={{ base: "70vw", sm: "70vw", md: "35vw", lg: "35vw", xl: "28vw" }}
initial={{ opacity: 0, y: -30, x: '-50%' }} initial={{ opacity: 0, y: -30, x: '-50%' }}
@@ -51,6 +53,8 @@ function Hero2() {
<MotionImage <MotionImage
src="/images/new/oil_new.webp" src="/images/new/oil_new.webp"
alt="獅球嘜營萃護心油"
title="獅球嘜營萃護心油"
zIndex={0} zIndex={0}
position={'absolute'} position={'absolute'}
left="50%" left="50%"

View File

@@ -61,7 +61,8 @@ function OilInfo() {
> >
<MotionImage <MotionImage
src='/images/cookmethods.webp' src='/images/cookmethods.webp'
alt='cooking methods' alt='烹調方法'
title='烹調方法'
w={{ base: '100%', sm: '90%', md: '85%' }} w={{ base: '100%', sm: '90%', md: '85%' }}
initial={{ opacity: 0, scale: 0.8 }} initial={{ opacity: 0, scale: 0.8 }}
animate={isMainInView ? { opacity: 1, scale: 1 } : { opacity: 0, scale: 0.8 }} animate={isMainInView ? { opacity: 1, scale: 1 } : { opacity: 0, scale: 0.8 }}