@kids-reporter/routing-ui 0.1.0-alpha.2 → 0.1.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/constants/default-values.js +1 -1
- package/dist/constants/default-values.js.map +1 -1
- package/dist/footer.js +4 -4
- package/dist/footer.js.map +1 -1
- package/dist/header/desktop-header.js +2 -2
- package/dist/header/desktop-header.js.map +1 -1
- package/dist/header/menu/header-menu-item.js +1 -1
- package/dist/header/menu/header-menu-item.js.map +1 -1
- package/dist/header/menu/index.js +1 -1
- package/dist/header/menu/index.js.map +1 -1
- package/dist/header/shared-components.js +3 -3
- package/dist/header/shared-components.js.map +1 -1
- package/dist/styles.css +179 -294
- package/eslint.config.mjs +3 -2
- package/package.json +4 -1
- package/src/components/input.tsx +1 -1
- package/src/constants/default-values.tsx +1 -1
- package/src/footer.tsx +4 -4
- package/src/header/desktop-header.tsx +2 -2
- package/src/header/menu/header-menu-item.tsx +1 -1
- package/src/header/menu/index.tsx +1 -1
- package/src/header/shared-components.tsx +3 -3
- package/src/styles.css +179 -294
package/dist/components/input.js
CHANGED
|
@@ -35,7 +35,7 @@ const CloseIcon = ({
|
|
|
35
35
|
});
|
|
36
36
|
const inputVariants = (0, _classVarianceAuthority.cva)(
|
|
37
37
|
// Base styles
|
|
38
|
-
'
|
|
38
|
+
'desktop:bg-white! px-4 py-1.5 h-11 flex items-center rounded-full border border-transparent bg-neutral-100 prose-p1 transition-colors duration-200 hover:border-neutral-600', {
|
|
39
39
|
variants: {
|
|
40
40
|
state: {
|
|
41
41
|
default: 'border-transparent',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","names":["Object","defineProperty","exports","value","default","_classVarianceAuthority","require","_react","_icons","_cn","_jsxRuntime","CloseIcon","className","jsxs","width","height","viewBox","fill","xmlns","children","jsx","cx","cy","r","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","inputVariants","cva","variants","state","hover","focus","active","unfocus","error","defaultVariants","Input","forwardRef","placeholder","onChange","onClear","showClearButton","onFocus","onBlur","inputRef","props","ref","internalValue","setInternalValue","useState","isFocused","setIsFocused","isActive","setIsActive","innerInputRef","useRef","currentValue","undefined","hasValue","length","currentState","handleChange","e","newValue","target","handleFocus","handleBlur","handleClear","preventDefault","stopPropagation","currentRef","current","inputClasses","cn","SearchIconSmall","type","onClick","_default"],"sources":["../../src/components/input.tsx"],"sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { SearchIconSmall } from '../icons'\nimport { cn } from '../utils/cn'\n\n// Close icon component\nconst CloseIcon = ({ className }: { className?: string }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"currentColor\" />\n <path\n d=\"M7 7l6 6M13 7l-6 6\"\n stroke=\"white\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst inputVariants = cva(\n // Base styles\n '
|
|
1
|
+
{"version":3,"file":"input.js","names":["Object","defineProperty","exports","value","default","_classVarianceAuthority","require","_react","_icons","_cn","_jsxRuntime","CloseIcon","className","jsxs","width","height","viewBox","fill","xmlns","children","jsx","cx","cy","r","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","inputVariants","cva","variants","state","hover","focus","active","unfocus","error","defaultVariants","Input","forwardRef","placeholder","onChange","onClear","showClearButton","onFocus","onBlur","inputRef","props","ref","internalValue","setInternalValue","useState","isFocused","setIsFocused","isActive","setIsActive","innerInputRef","useRef","currentValue","undefined","hasValue","length","currentState","handleChange","e","newValue","target","handleFocus","handleBlur","handleClear","preventDefault","stopPropagation","currentRef","current","inputClasses","cn","SearchIconSmall","type","onClick","_default"],"sources":["../../src/components/input.tsx"],"sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport { forwardRef, useRef, useState } from 'react'\n\nimport { SearchIconSmall } from '../icons'\nimport { cn } from '../utils/cn'\n\n// Close icon component\nconst CloseIcon = ({ className }: { className?: string }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n className={className}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"10\" fill=\"currentColor\" />\n <path\n d=\"M7 7l6 6M13 7l-6 6\"\n stroke=\"white\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\nconst inputVariants = cva(\n // Base styles\n 'desktop:bg-white! px-4 py-1.5 h-11 flex items-center rounded-full border border-transparent bg-neutral-100 prose-p1 transition-colors duration-200 hover:border-neutral-600',\n {\n variants: {\n state: {\n default: 'border-transparent',\n hover: 'border-neutral-600',\n focus: 'border-neutral-600',\n active: 'border-neutral-600',\n unfocus: 'border-transparent',\n error: 'border-red-600',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n }\n)\n\nexport type InputProps = {\n placeholder?: string\n value?: string\n onChange?: (value: string) => void\n onClear?: () => void\n showClearButton?: boolean\n children?: React.ReactNode\n inputRef?: React.RefObject<HTMLInputElement>\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value'>\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n placeholder = '搜尋更多新聞、議題',\n value,\n onChange,\n onClear,\n showClearButton = true,\n className,\n onFocus,\n onBlur,\n inputRef,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = useState('')\n const [isFocused, setIsFocused] = useState(false)\n const [isActive, setIsActive] = useState(false)\n const innerInputRef = useRef<HTMLInputElement>(null)\n const currentValue = value !== undefined ? value : internalValue\n const hasValue = currentValue.length > 0\n\n // Determine current state\n const currentState = isFocused\n ? 'focus'\n : hasValue\n ? isActive\n ? 'active'\n : 'unfocus'\n : 'default'\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value\n if (onChange) {\n onChange(newValue)\n } else {\n setInternalValue(newValue)\n }\n setIsActive(true)\n }\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n if (onFocus) {\n onFocus(e)\n }\n setIsFocused(true)\n setIsActive(true)\n }\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (onBlur) {\n onBlur(e)\n }\n setIsFocused(false)\n setIsActive(false)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (onChange) {\n onChange('')\n } else {\n setInternalValue('')\n }\n if (onClear) {\n onClear()\n }\n\n const currentRef = inputRef ?? innerInputRef\n currentRef.current?.focus()\n }\n\n const inputClasses = cn(inputVariants({ state: currentState }), className)\n\n return (\n <div className=\"gap-2 flex flex-col\">\n <div className={inputClasses} ref={ref}>\n <div className=\"text-neutral-600\">\n <SearchIconSmall />\n </div>\n <input\n type=\"text\"\n value={currentValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n className=\"placeholder:font-medium ml-2 max-w-[72%] flex-1 flex-shrink-1 bg-transparent text-neutral-900 placeholder:text-neutral-400 focus:outline-none\"\n ref={inputRef ?? innerInputRef}\n {...props}\n />\n\n {showClearButton && hasValue && (\n <button\n type=\"button\"\n onClick={handleClear}\n className=\"p-1/2 ml-auto flex-shrink-0 cursor-pointer rounded-full text-neutral-400 transition-colors hover:text-neutral-600 active:bg-neutral-200\"\n aria-label=\"Clear input\"\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </div>\n )\n }\n)\n\nexport default Input\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-values.js","names":["_icons","require","_jsxRuntime","SUBSCRIBE_URL","exports","DONATE_URL","PRIVACY_POLICY","SEARCH_PLACEHOLDER","MENU_ITEMS","label","href","subItems","ADDITIONAL_MENU_ITEMS","showIcon","icon","jsx","SettingsIconSmall","external","SOCIAL_MEDIA_ITEMS"],"sources":["../../src/constants/default-values.tsx"],"sourcesContent":["import { SettingsIconSmall } from '../icons'\nimport { MenuItem } from '../types'\n\nexport const SUBSCRIBE_URL = 'https://solink.soundon.fm/kidstwreporter'\nexport const DONATE_URL = 'https://support.twreporter.org/'\nexport const PRIVACY_POLICY = 'https://www.twreporter.org/a/privacy-policy'\nexport const SEARCH_PLACEHOLDER = '搜尋更多新聞、議題'\n\nexport const MENU_ITEMS: MenuItem[] = [\n {\n label: '最新',\n href: '/all',\n subItems: [],\n },\n {\n label: '專題',\n href: '/topic/page',\n subItems: [],\n },\n {\n label: '新聞',\n href: '/category/news',\n subItems: [\n { label: '焦點新聞', href: '/category/news/times' },\n { label: '真的假的', href: '/category/news/knowledge' },\n { label: '人物故事', href: '/category/news/story' },\n { label: '文化報導', href: '/category/news/explore' },\n { label: '專欄', href: '/category/news/column' },\n { label: '英文新聞', href: '/categories/news/english-version' },\n ],\n },\n {\n label: '多媒體',\n href: '/category/comics',\n subItems: [\n { label: '圖解新聞', href: '/category/comics/times' },\n { label: '新聞遊戲', href: '/category/comics/test-news' },\n { label: '圖文故事', href: '/category/comics/graphic-story' },\n ],\n },\n {\n label: '校園',\n href: '/category/campus
|
|
1
|
+
{"version":3,"file":"default-values.js","names":["_icons","require","_jsxRuntime","SUBSCRIBE_URL","exports","DONATE_URL","PRIVACY_POLICY","SEARCH_PLACEHOLDER","MENU_ITEMS","label","href","subItems","ADDITIONAL_MENU_ITEMS","showIcon","icon","jsx","SettingsIconSmall","external","SOCIAL_MEDIA_ITEMS"],"sources":["../../src/constants/default-values.tsx"],"sourcesContent":["import { SettingsIconSmall } from '../icons'\nimport { MenuItem } from '../types'\n\nexport const SUBSCRIBE_URL = 'https://solink.soundon.fm/kidstwreporter'\nexport const DONATE_URL = 'https://support.twreporter.org/'\nexport const PRIVACY_POLICY = 'https://www.twreporter.org/a/privacy-policy'\nexport const SEARCH_PLACEHOLDER = '搜尋更多新聞、議題'\n\nexport const MENU_ITEMS: MenuItem[] = [\n {\n label: '最新',\n href: '/all',\n subItems: [],\n },\n {\n label: '專題',\n href: '/topic/page',\n subItems: [],\n },\n {\n label: '新聞',\n href: '/category/news',\n subItems: [\n { label: '焦點新聞', href: '/category/news/times' },\n { label: '真的假的', href: '/category/news/knowledge' },\n { label: '人物故事', href: '/category/news/story' },\n { label: '文化報導', href: '/category/news/explore' },\n { label: '專欄', href: '/category/news/column' },\n { label: '英文新聞', href: '/categories/news/english-version' },\n ],\n },\n {\n label: '多媒體',\n href: '/category/comics',\n subItems: [\n { label: '圖解新聞', href: '/category/comics/times' },\n { label: '新聞遊戲', href: '/category/comics/test-news' },\n { label: '圖文故事', href: '/category/comics/graphic-story' },\n ],\n },\n {\n label: '校園',\n href: '/category/campus',\n subItems: [\n { label: '校園寶可夢', href: '/category/campus/campus-pokemon' },\n { label: '上課好好玩', href: '/category/campus/teaching' },\n { label: '小讀者連線', href: '/category/campus/joining' },\n ],\n },\n {\n label: 'Podcast',\n href: '/category/listening-news',\n subItems: [\n {\n label: '小記者,問什麼?',\n href: '/category/listening-news/kids-reporter-ask',\n },\n {\n label: '新聞讀報',\n href: '/category/listening-news/multilingual-listening-news',\n },\n {\n label: '新聞關鍵字',\n href: '/category/listening-news/listening-news-keywords',\n },\n {\n label: '文化關鍵字',\n href: '/category/listening-news/listening-news-culture-keywords',\n },\n ],\n },\n {\n label: '教案',\n href: '/category/classroom',\n subItems: [],\n },\n]\n\nexport const ADDITIONAL_MENU_ITEMS: MenuItem[] = [\n {\n label: '閱讀探索設定',\n href: '/reading-settings',\n subItems: [],\n showIcon: true,\n icon: <SettingsIconSmall />,\n },\n {\n label: '關於我們',\n href: '/about',\n subItems: [],\n },\n {\n label: '呼叫報導仔流程',\n href: '/about#callkidsreporter',\n subItems: [],\n },\n {\n label: '投稿專區',\n href: 'https://forms.gle/49AEG8kFj7QWjgij8',\n subItems: [],\n external: true,\n },\n {\n label: '加入小記者',\n href: 'https://forms.gle/eGq5jagNTwriwSCX6',\n subItems: [],\n external: true,\n },\n {\n label: '訂閱Podcast',\n href: 'https://solink.soundon.fm/kidstwreporter',\n subItems: [],\n external: true,\n },\n {\n label: '聯絡我們',\n href: '/about#mail',\n subItems: [],\n },\n {\n label: '前往《報導者》',\n href: 'https://www.twreporter.org/',\n subItems: [],\n external: true,\n },\n]\n\nexport const SOCIAL_MEDIA_ITEMS = [\n {\n label: 'Facebook',\n href: 'https://www.facebook.com/twreporter/',\n },\n {\n label: 'Instagram',\n href: 'https://www.instagram.com/twreporter/',\n },\n {\n label: 'YouTube',\n href: 'https://www.youtube.com/@TwreporterOrg',\n },\n {\n label: 'Threads',\n href: 'https://www.threads.com/@twreporter',\n },\n {\n label: 'Medium',\n href: 'https://medium.com/twreporter',\n },\n {\n label: 'RSS',\n href: 'https://kids-storage.twreporter.org/rss/rss.xml',\n },\n]\n"],"mappings":"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"}
|
package/dist/footer.js
CHANGED
|
@@ -41,7 +41,7 @@ const Footer = ({
|
|
|
41
41
|
})
|
|
42
42
|
})
|
|
43
43
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
44
|
-
className: "prose-p2
|
|
44
|
+
className: "w-full prose-p2 text-neutral-900",
|
|
45
45
|
children: "\u300A\u5C11\u5E74\u5831\u5C0E\u8005\u300B\u662F\u7531\u975E\u71DF\u5229\u5A92\u9AD4\u300A\u5831\u5C0E\u8005\u300B\u91DD\u5C0D\u5152\u5C11\u6253\u9020\u7684\u6DF1\u5EA6\u65B0\u805E\u5831\u5C0E\u54C1\u724C\uFF0C\u8207\u5152\u7AE5\u548C\u5C11\u5E74\u4E00\u8D77\u7406\u89E3\u4E16\u754C\uFF0C\u53C3\u8207\u672A\u4F86\u3002"
|
|
46
46
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.default, {
|
|
47
47
|
size: 44,
|
|
@@ -61,7 +61,7 @@ const Footer = ({
|
|
|
61
61
|
className: "gap-2 flex flex-col",
|
|
62
62
|
children: additionalMenuItems.slice(0, 4).map(link => /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
63
63
|
href: link.href,
|
|
64
|
-
className: "prose-p2-bold
|
|
64
|
+
className: "min-w-30 prose-p2-bold text-neutral-900 transition-colors duration-200 hover:text-red-400",
|
|
65
65
|
target: link.external ? '_blank' : undefined,
|
|
66
66
|
rel: link.external ? 'noopener noreferrer' : undefined,
|
|
67
67
|
children: link.label
|
|
@@ -70,7 +70,7 @@ const Footer = ({
|
|
|
70
70
|
className: "gap-2 flex flex-col",
|
|
71
71
|
children: additionalMenuItems.slice(4).map(link => /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
72
72
|
href: link.href,
|
|
73
|
-
className: "prose-p2-bold
|
|
73
|
+
className: "min-w-30 prose-p2-bold text-neutral-900 transition-colors duration-200 hover:text-red-400",
|
|
74
74
|
target: link.external ? '_blank' : undefined,
|
|
75
75
|
rel: link.external ? 'noopener noreferrer' : undefined,
|
|
76
76
|
children: link.label
|
|
@@ -104,7 +104,7 @@ const Footer = ({
|
|
|
104
104
|
}, social.label);
|
|
105
105
|
})
|
|
106
106
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
107
|
-
className: "prose-p3 text-
|
|
107
|
+
className: "text-center prose-p3 text-neutral-white desktop:order-1 desktop:text-left",
|
|
108
108
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
109
109
|
className: "desktop:inline",
|
|
110
110
|
children: ["\u885B\u90E8\u6551\u5B57\u7B2C1131363879\u865F\uFF5C\u52F8\u52DF\u671F\u9593 2025/1/1~12/31", /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
package/dist/footer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"footer.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","_button","_defaultValues","_generateSocialMediaConfig","_jsxRuntime","Footer","socialMediaHrefs","SOCIAL_MEDIA_ITEMS","map","item","href","additionalMenuItems","ADDITIONAL_MENU_ITEMS","donateUrl","DONATE_URL","privacyPolicyUrl","PRIVACY_POLICY","socialMediaConfig","generateSocialMediaConfig","jsxs","className","children","jsx","src","alt","loading","width","height","size","variant","asChild","target","rel","slice","link","external","undefined","label","social","IconComponent","icon","Date","getFullYear","_default"],"sources":["../src/footer.tsx"],"sourcesContent":["'use client'\n\nimport Button from './components/button'\nimport {\n ADDITIONAL_MENU_ITEMS,\n DONATE_URL,\n PRIVACY_POLICY,\n SOCIAL_MEDIA_ITEMS,\n} from './constants/default-values'\nimport { MenuItem, SocialMediaHrefs } from './types'\nimport { generateSocialMediaConfig } from './utils/generate-social-media-config'\n\ntype FooterProps = {\n socialMediaHrefs?: SocialMediaHrefs\n additionalMenuItems?: MenuItem[]\n donateUrl?: string\n privacyPolicyUrl?: string\n}\n\nconst Footer = ({\n socialMediaHrefs = SOCIAL_MEDIA_ITEMS.map((item) => item.href),\n additionalMenuItems = ADDITIONAL_MENU_ITEMS,\n donateUrl = DONATE_URL,\n privacyPolicyUrl = PRIVACY_POLICY,\n}: FooterProps) => {\n const socialMediaConfig = generateSocialMediaConfig(socialMediaHrefs)\n\n return (\n <footer className=\"w-full bg-neutral-white\">\n {/* Main Footer Content */}\n <div className=\"py-12 desktop:py-14 w-full bg-neutral-white px-(--margin-mobile) desktop:px-(--margin-desktop)\">\n <div className=\"max-w-300 mx-auto\">\n <div className=\"gap-8 flex flex-col items-center desktop:flex-row desktop:justify-between\">\n {/* Logo and Description */}\n <div className=\"max-w-100 gap-6 flex w-full flex-col items-center desktop:items-start\">\n <div className=\"flex items-center\">\n <a href=\"/\" className=\"flex items-center\">\n <img\n src=\"/assets/images/footer-logo.svg\"\n alt=\"少年報導者\"\n loading=\"lazy\"\n width={238}\n height={26}\n />\n </a>\n </div>\n <p className=\"prose-p2 w-full text-neutral-900\">\n 《少年報導者》是由非營利媒體《報導者》針對兒少打造的深度新聞報導品牌,與兒童和少年一起理解世界,參與未來。\n </p>\n <Button size={44} variant=\"secondary\" asChild className=\"w-75\">\n <a href={donateUrl} target=\"_blank\" rel=\"noreferrer\">\n 贊助我們\n </a>\n </Button>\n </div>\n\n <div className=\"gap-6 flex flex-row\">\n <div className=\"gap-2 flex flex-col\">\n {additionalMenuItems.slice(0, 4).map((link) => (\n <a\n key={link.label}\n href={link.href}\n className=\"prose-p2-bold min-w-30 text-neutral-900 transition-colors duration-200 hover:text-red-400\"\n target={link.external ? '_blank' : undefined}\n rel={link.external ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n ))}\n </div>\n <div className=\"gap-2 flex flex-col\">\n {additionalMenuItems.slice(4).map((link) => (\n <a\n key={link.label}\n href={link.href}\n className=\"prose-p2-bold min-w-30 text-neutral-900 transition-colors duration-200 hover:text-red-400\"\n target={link.external ? '_blank' : undefined}\n rel={link.external ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"py-6 w-full bg-red-400 px-(--margin-mobile) desktop:px-(--margin-desktop)\">\n <div className=\"max-w-300 mx-auto\">\n <div className=\"gap-5 desktop:gap-4 flex flex-col items-center desktop:flex-row desktop:justify-between\">\n <div className=\"gap-4 order-1 flex items-center desktop:order-2\">\n {socialMediaConfig.map((social) => {\n const IconComponent = social.icon\n return (\n <a\n key={social.label}\n href={social.href}\n className=\"relative text-neutral-white transition-colors duration-200 hover:text-neutral-200\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={social.label}\n >\n <div className=\"peer w-6 h-6 relative z-10 flex items-center justify-center rounded-full text-neutral-white transition-all duration-200 hover:text-red-500\">\n {IconComponent && <IconComponent />}\n </div>\n <div className=\"p-2 peer-hover:bg-white absolute top-1/2 left-1/2 z-1 flex h-[23px] w-[23px] -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full transition-all duration-200\"></div>\n </a>\n )\n })}\n </div>\n\n <div className=\"prose-p3 text-center text-neutral-white desktop:order-1 desktop:text-left\">\n <p className=\"desktop:inline\">\n 衛部救字第1131363879號|勸募期間 2025/1/1~12/31\n <span className=\"hidden desktop:inline\">|</span>\n </p>\n <p className=\"desktop:inline\">\n <a\n href={privacyPolicyUrl}\n target=\"_blank\"\n className=\"desktop:ml-1 text-neutral-white underline\"\n rel=\"noopener noreferrer\"\n >\n 隱私政策\n </a>\n |\n <a\n href=\"https://www.twreporter.org/a/license-footer\"\n target=\"_blank\"\n className=\"desktop:ml-1 text-neutral-white underline\"\n rel=\"noopener noreferrer\"\n >\n 許可協議\n </a>\n </p>\n <p className=\"hidden desktop:inline\">|</p>\n <p className=\"desktop:inline\">\n Copyright © {new Date().getFullYear()} The Reporter\n </p>\n </div>\n </div>\n </div>\n </div>\n </footer>\n )\n}\n\nexport default Footer\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"footer.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","_button","_defaultValues","_generateSocialMediaConfig","_jsxRuntime","Footer","socialMediaHrefs","SOCIAL_MEDIA_ITEMS","map","item","href","additionalMenuItems","ADDITIONAL_MENU_ITEMS","donateUrl","DONATE_URL","privacyPolicyUrl","PRIVACY_POLICY","socialMediaConfig","generateSocialMediaConfig","jsxs","className","children","jsx","src","alt","loading","width","height","size","variant","asChild","target","rel","slice","link","external","undefined","label","social","IconComponent","icon","Date","getFullYear","_default"],"sources":["../src/footer.tsx"],"sourcesContent":["'use client'\n\nimport Button from './components/button'\nimport {\n ADDITIONAL_MENU_ITEMS,\n DONATE_URL,\n PRIVACY_POLICY,\n SOCIAL_MEDIA_ITEMS,\n} from './constants/default-values'\nimport { MenuItem, SocialMediaHrefs } from './types'\nimport { generateSocialMediaConfig } from './utils/generate-social-media-config'\n\ntype FooterProps = {\n socialMediaHrefs?: SocialMediaHrefs\n additionalMenuItems?: MenuItem[]\n donateUrl?: string\n privacyPolicyUrl?: string\n}\n\nconst Footer = ({\n socialMediaHrefs = SOCIAL_MEDIA_ITEMS.map((item) => item.href),\n additionalMenuItems = ADDITIONAL_MENU_ITEMS,\n donateUrl = DONATE_URL,\n privacyPolicyUrl = PRIVACY_POLICY,\n}: FooterProps) => {\n const socialMediaConfig = generateSocialMediaConfig(socialMediaHrefs)\n\n return (\n <footer className=\"w-full bg-neutral-white\">\n {/* Main Footer Content */}\n <div className=\"py-12 desktop:py-14 w-full bg-neutral-white px-(--margin-mobile) desktop:px-(--margin-desktop)\">\n <div className=\"max-w-300 mx-auto\">\n <div className=\"gap-8 flex flex-col items-center desktop:flex-row desktop:justify-between\">\n {/* Logo and Description */}\n <div className=\"max-w-100 gap-6 flex w-full flex-col items-center desktop:items-start\">\n <div className=\"flex items-center\">\n <a href=\"/\" className=\"flex items-center\">\n <img\n src=\"/assets/images/footer-logo.svg\"\n alt=\"少年報導者\"\n loading=\"lazy\"\n width={238}\n height={26}\n />\n </a>\n </div>\n <p className=\"w-full prose-p2 text-neutral-900\">\n 《少年報導者》是由非營利媒體《報導者》針對兒少打造的深度新聞報導品牌,與兒童和少年一起理解世界,參與未來。\n </p>\n <Button size={44} variant=\"secondary\" asChild className=\"w-75\">\n <a href={donateUrl} target=\"_blank\" rel=\"noreferrer\">\n 贊助我們\n </a>\n </Button>\n </div>\n\n <div className=\"gap-6 flex flex-row\">\n <div className=\"gap-2 flex flex-col\">\n {additionalMenuItems.slice(0, 4).map((link) => (\n <a\n key={link.label}\n href={link.href}\n className=\"min-w-30 prose-p2-bold text-neutral-900 transition-colors duration-200 hover:text-red-400\"\n target={link.external ? '_blank' : undefined}\n rel={link.external ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n ))}\n </div>\n <div className=\"gap-2 flex flex-col\">\n {additionalMenuItems.slice(4).map((link) => (\n <a\n key={link.label}\n href={link.href}\n className=\"min-w-30 prose-p2-bold text-neutral-900 transition-colors duration-200 hover:text-red-400\"\n target={link.external ? '_blank' : undefined}\n rel={link.external ? 'noopener noreferrer' : undefined}\n >\n {link.label}\n </a>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"py-6 w-full bg-red-400 px-(--margin-mobile) desktop:px-(--margin-desktop)\">\n <div className=\"max-w-300 mx-auto\">\n <div className=\"gap-5 desktop:gap-4 flex flex-col items-center desktop:flex-row desktop:justify-between\">\n <div className=\"gap-4 order-1 flex items-center desktop:order-2\">\n {socialMediaConfig.map((social) => {\n const IconComponent = social.icon\n return (\n <a\n key={social.label}\n href={social.href}\n className=\"relative text-neutral-white transition-colors duration-200 hover:text-neutral-200\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={social.label}\n >\n <div className=\"peer w-6 h-6 relative z-10 flex items-center justify-center rounded-full text-neutral-white transition-all duration-200 hover:text-red-500\">\n {IconComponent && <IconComponent />}\n </div>\n <div className=\"p-2 peer-hover:bg-white absolute top-1/2 left-1/2 z-1 flex h-[23px] w-[23px] -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full transition-all duration-200\"></div>\n </a>\n )\n })}\n </div>\n\n <div className=\"text-center prose-p3 text-neutral-white desktop:order-1 desktop:text-left\">\n <p className=\"desktop:inline\">\n 衛部救字第1131363879號|勸募期間 2025/1/1~12/31\n <span className=\"hidden desktop:inline\">|</span>\n </p>\n <p className=\"desktop:inline\">\n <a\n href={privacyPolicyUrl}\n target=\"_blank\"\n className=\"desktop:ml-1 text-neutral-white underline\"\n rel=\"noopener noreferrer\"\n >\n 隱私政策\n </a>\n |\n <a\n href=\"https://www.twreporter.org/a/license-footer\"\n target=\"_blank\"\n className=\"desktop:ml-1 text-neutral-white underline\"\n rel=\"noopener noreferrer\"\n >\n 許可協議\n </a>\n </p>\n <p className=\"hidden desktop:inline\">|</p>\n <p className=\"desktop:inline\">\n Copyright © {new Date().getFullYear()} The Reporter\n </p>\n </div>\n </div>\n </div>\n </div>\n </footer>\n )\n}\n\nexport default Footer\n"],"mappings":"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"}
|
|
@@ -46,13 +46,13 @@ function DesktopHeader({
|
|
|
46
46
|
}), postTitle && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
47
47
|
className: "pr-12 block",
|
|
48
48
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
49
|
-
className: "
|
|
49
|
+
className: "font-medium tracking-wide max-w-124 overflow-hidden prose-p2 text-ellipsis whitespace-nowrap text-neutral-900",
|
|
50
50
|
children: postTitle
|
|
51
51
|
})
|
|
52
52
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
53
53
|
className: (0, _cn.cn)('ease-in-out overflow-hidden transition-all duration-500', compactMode ? 'max-h-0 -translate-x-8 scale-95 opacity-0' : 'max-h-20 max-w-auto scale-100 opacity-100', postTitle && compactMode && 'max-w-0'),
|
|
54
54
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
55
|
-
className: "
|
|
55
|
+
className: "font-medium translate-y-0 inline-block prose-p2 tracking-[2.2px]! text-nowrap text-neutral-900 opacity-100",
|
|
56
56
|
children: "\u7406\u89E3\u4E16\u754C \xD7 \u53C3\u8207\u672A\u4F86"
|
|
57
57
|
})
|
|
58
58
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desktop-header.js","names":["Object","defineProperty","exports","value","DesktopHeader","_icons","require","_cn","_sharedComponents","_jsxRuntime","onHamburgerOverlayOpen","keywords","compactMode","postTitle","hide","searchPlaceholder","subscribeUrl","menuItems","jsxs","Fragment","children","jsx","className","cn","HamburgerButton","small","LogoLink","ActionButtons","tags","hideCtaButtons","href","LoginIcon","BottomNavigation"],"sources":["../../src/header/desktop-header.tsx"],"sourcesContent":["'use client'\n\nimport { LoginIcon } from '../icons'\nimport type { MenuItem } from '../types'\nimport { cn } from '../utils/cn'\nimport {\n ActionButtons,\n BottomNavigation,\n HamburgerButton,\n LogoLink,\n} from './shared-components'\n\ntype DesktopHeaderProps = {\n onHamburgerOverlayOpen: () => void\n keywords: string[]\n compactMode: boolean\n postTitle?: string\n hide: boolean\n searchPlaceholder: string\n subscribeUrl: string\n menuItems: MenuItem[]\n}\n\nexport function DesktopHeader({\n onHamburgerOverlayOpen,\n keywords,\n compactMode,\n postTitle,\n hide,\n searchPlaceholder,\n subscribeUrl,\n menuItems,\n}: DesktopHeaderProps) {\n return (\n <>\n <div className=\"hidden h-(--desktop-header-height) desktop:block\"></div>\n <div\n className={cn(\n 'top-0 ease-in-out fixed left-1/2 z-1000 hidden w-full -translate-x-1/2 transform transition-all duration-500 desktop:block',\n compactMode && 'bg-white',\n hide\n ? 'pointer-events-none -translate-y-full opacity-0'\n : 'translate-y-0 pointer-events-auto opacity-100'\n )}\n >\n <div className=\"px-12 hidden w-full bg-transparent desktop:block\">\n <div className=\"max-w-300 mx-auto\">\n <div\n className={cn(\n 'px-4 flex items-center justify-between py-[18px]',\n compactMode && 'py-2.5'\n )}\n >\n <div className={'flex items-center'}>\n <div\n className={cn(\n 'ease-in-out overflow-hidden transition-all duration-500',\n compactMode\n ? 'translate-x-0 max-w-12 mr-4 w-auto scale-100 opacity-100'\n : '-translate-x-2 w-0 max-w-0 pointer-events-none scale-95 opacity-0'\n )}\n >\n <HamburgerButton\n onHamburgerOverlayOpen={onHamburgerOverlayOpen}\n small\n />\n </div>\n <div className={compactMode ? 'mr-12' : 'mr-8'}>\n <LogoLink compactMode={compactMode} />\n </div>\n {postTitle && (\n <div className=\"pr-12 block\">\n <p className=\"
|
|
1
|
+
{"version":3,"file":"desktop-header.js","names":["Object","defineProperty","exports","value","DesktopHeader","_icons","require","_cn","_sharedComponents","_jsxRuntime","onHamburgerOverlayOpen","keywords","compactMode","postTitle","hide","searchPlaceholder","subscribeUrl","menuItems","jsxs","Fragment","children","jsx","className","cn","HamburgerButton","small","LogoLink","ActionButtons","tags","hideCtaButtons","href","LoginIcon","BottomNavigation"],"sources":["../../src/header/desktop-header.tsx"],"sourcesContent":["'use client'\n\nimport { LoginIcon } from '../icons'\nimport type { MenuItem } from '../types'\nimport { cn } from '../utils/cn'\nimport {\n ActionButtons,\n BottomNavigation,\n HamburgerButton,\n LogoLink,\n} from './shared-components'\n\ntype DesktopHeaderProps = {\n onHamburgerOverlayOpen: () => void\n keywords: string[]\n compactMode: boolean\n postTitle?: string\n hide: boolean\n searchPlaceholder: string\n subscribeUrl: string\n menuItems: MenuItem[]\n}\n\nexport function DesktopHeader({\n onHamburgerOverlayOpen,\n keywords,\n compactMode,\n postTitle,\n hide,\n searchPlaceholder,\n subscribeUrl,\n menuItems,\n}: DesktopHeaderProps) {\n return (\n <>\n <div className=\"hidden h-(--desktop-header-height) desktop:block\"></div>\n <div\n className={cn(\n 'top-0 ease-in-out fixed left-1/2 z-1000 hidden w-full -translate-x-1/2 transform transition-all duration-500 desktop:block',\n compactMode && 'bg-white',\n hide\n ? 'pointer-events-none -translate-y-full opacity-0'\n : 'translate-y-0 pointer-events-auto opacity-100'\n )}\n >\n <div className=\"px-12 hidden w-full bg-transparent desktop:block\">\n <div className=\"max-w-300 mx-auto\">\n <div\n className={cn(\n 'px-4 flex items-center justify-between py-[18px]',\n compactMode && 'py-2.5'\n )}\n >\n <div className={'flex items-center'}>\n <div\n className={cn(\n 'ease-in-out overflow-hidden transition-all duration-500',\n compactMode\n ? 'translate-x-0 max-w-12 mr-4 w-auto scale-100 opacity-100'\n : '-translate-x-2 w-0 max-w-0 pointer-events-none scale-95 opacity-0'\n )}\n >\n <HamburgerButton\n onHamburgerOverlayOpen={onHamburgerOverlayOpen}\n small\n />\n </div>\n <div className={compactMode ? 'mr-12' : 'mr-8'}>\n <LogoLink compactMode={compactMode} />\n </div>\n {postTitle && (\n <div className=\"pr-12 block\">\n <p className=\"font-medium tracking-wide max-w-124 overflow-hidden prose-p2 text-ellipsis whitespace-nowrap text-neutral-900\">\n {postTitle}\n </p>\n </div>\n )}\n <div\n className={cn(\n 'ease-in-out overflow-hidden transition-all duration-500',\n compactMode\n ? 'max-h-0 -translate-x-8 scale-95 opacity-0'\n : 'max-h-20 max-w-auto scale-100 opacity-100',\n postTitle && compactMode && 'max-w-0'\n )}\n >\n <span className=\"font-medium translate-y-0 inline-block prose-p2 tracking-[2.2px]! text-nowrap text-neutral-900 opacity-100\">\n 理解世界 × 參與未來\n </span>\n </div>\n </div>\n\n <div className=\"gap-4 flex items-center\">\n <ActionButtons\n tags={keywords}\n hideCtaButtons={compactMode}\n searchPlaceholder={searchPlaceholder}\n subscribeUrl={subscribeUrl}\n />\n <a\n href=\"/login\"\n className=\"w-8 h-8 flex items-center justify-center rounded-full text-red-400 transition-colors duration-200 hover:text-red-500\"\n aria-label=\"登入\"\n >\n <LoginIcon />\n </a>\n </div>\n </div>\n\n <div\n className={cn(\n 'ease-in-out overflow-hidden transition-all duration-500',\n compactMode\n ? 'h-0 -translate-y-4 opacity-0'\n : 'translate-y-0 h-auto opacity-100'\n )}\n >\n <BottomNavigation\n onHamburgerOverlayOpen={onHamburgerOverlayOpen}\n menuItems={menuItems}\n />\n </div>\n </div>\n </div>\n </div>\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -65,7 +65,7 @@ function HeaderMenuItem({
|
|
|
65
65
|
className: (0, _cn.cn)('ease-in-out overflow-hidden transition-all duration-300', isExpanded ? 'max-h-96 opacity-100' : 'max-h-0 opacity-0'),
|
|
66
66
|
children: subItems.map((subItem, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
67
67
|
href: subItem.href,
|
|
68
|
-
className: "px-6 tablet:px-12 py-2 pl-12
|
|
68
|
+
className: "px-6 tablet:px-12 py-2 pl-12 font-medium block prose-p2 transition-colors duration-200 hover:bg-neutral-black/5 hover:text-neutral-900 active:bg-neutral-black/10",
|
|
69
69
|
onClick: closeMenu,
|
|
70
70
|
children: subItem.label
|
|
71
71
|
}, index))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header-menu-item.js","names":["_cn","require","_headerContext","_jsxRuntime","HeaderMenuItem","label","href","subItems","external","showIcon","icon","isExpanded","contentClassName","onExpand","hasSubItems","length","context","useHeaderContext","closeMenu","handleExpand","content","jsxs","className","cn","children","jsx","width","height","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","onClick","map","subItem","index","target","rel","_default","exports","default"],"sources":["../../../src/header/menu/header-menu-item.tsx"],"sourcesContent":["import { MenuItem } from '../../types'\nimport { cn } from '../../utils/cn'\nimport { useHeaderContext } from '../header-context'\n\ntype HeaderMenuItemProps = {\n contentClassName?: string\n isExpanded?: boolean\n onExpand?: (label: string | null) => void\n} & MenuItem\n\nfunction HeaderMenuItem({\n label,\n href,\n subItems,\n external,\n showIcon,\n icon,\n isExpanded,\n contentClassName,\n onExpand,\n}: HeaderMenuItemProps) {\n const hasSubItems = subItems && subItems.length > 0\n const context = useHeaderContext()\n const closeMenu = context?.closeMenu\n\n const handleExpand = () => {\n if (hasSubItems) {\n onExpand?.(isExpanded ? null : label)\n }\n }\n\n const content = (\n <div\n className={cn(\n 'group flex w-full items-center justify-between text-neutral-900 transition-colors duration-100 group-hover:text-neutral-900',\n contentClassName\n )}\n >\n <div className=\"gap-2 flex items-center\">\n {showIcon && icon && (\n <div className=\"w-4 h-4 flex items-center justify-center\">{icon}</div>\n )}\n <span\n className={cn(\n 'prose-p1-bold',\n isExpanded && 'text-red-400 group-hover:text-red-400'\n )}\n >\n {label}\n </span>\n </div>\n\n {hasSubItems && (\n <div\n className={cn(\n 'w-6 h-6 flex items-center justify-center transition-transform',\n isExpanded && 'rotate-180 text-red-400 group-hover:text-red-400'\n )}\n >\n <svg width=\"14\" height=\"7\" viewBox=\"0 0 14 7\" fill=\"none\">\n <path\n d=\"M1 1L7 6L13 1\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n )\n\n if (hasSubItems) {\n return (\n <div className=\"w-full\">\n <button\n onClick={handleExpand}\n className=\"px-6 tablet:px-8 py-2 flex w-full cursor-pointer items-center justify-between transition-colors duration-200 hover:bg-neutral-black/5 active:bg-neutral-black/10\"\n >\n {content}\n </button>\n <div\n className={cn(\n 'ease-in-out overflow-hidden transition-all duration-300',\n isExpanded ? 'max-h-96 opacity-100' : 'max-h-0 opacity-0'\n )}\n >\n {subItems.map((subItem, index) => (\n <a\n key={index}\n href={subItem.href}\n className=\"px-6 tablet:px-12 py-2 pl-12
|
|
1
|
+
{"version":3,"file":"header-menu-item.js","names":["_cn","require","_headerContext","_jsxRuntime","HeaderMenuItem","label","href","subItems","external","showIcon","icon","isExpanded","contentClassName","onExpand","hasSubItems","length","context","useHeaderContext","closeMenu","handleExpand","content","jsxs","className","cn","children","jsx","width","height","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","onClick","map","subItem","index","target","rel","_default","exports","default"],"sources":["../../../src/header/menu/header-menu-item.tsx"],"sourcesContent":["import { MenuItem } from '../../types'\nimport { cn } from '../../utils/cn'\nimport { useHeaderContext } from '../header-context'\n\ntype HeaderMenuItemProps = {\n contentClassName?: string\n isExpanded?: boolean\n onExpand?: (label: string | null) => void\n} & MenuItem\n\nfunction HeaderMenuItem({\n label,\n href,\n subItems,\n external,\n showIcon,\n icon,\n isExpanded,\n contentClassName,\n onExpand,\n}: HeaderMenuItemProps) {\n const hasSubItems = subItems && subItems.length > 0\n const context = useHeaderContext()\n const closeMenu = context?.closeMenu\n\n const handleExpand = () => {\n if (hasSubItems) {\n onExpand?.(isExpanded ? null : label)\n }\n }\n\n const content = (\n <div\n className={cn(\n 'group flex w-full items-center justify-between text-neutral-900 transition-colors duration-100 group-hover:text-neutral-900',\n contentClassName\n )}\n >\n <div className=\"gap-2 flex items-center\">\n {showIcon && icon && (\n <div className=\"w-4 h-4 flex items-center justify-center\">{icon}</div>\n )}\n <span\n className={cn(\n 'prose-p1-bold',\n isExpanded && 'text-red-400 group-hover:text-red-400'\n )}\n >\n {label}\n </span>\n </div>\n\n {hasSubItems && (\n <div\n className={cn(\n 'w-6 h-6 flex items-center justify-center transition-transform',\n isExpanded && 'rotate-180 text-red-400 group-hover:text-red-400'\n )}\n >\n <svg width=\"14\" height=\"7\" viewBox=\"0 0 14 7\" fill=\"none\">\n <path\n d=\"M1 1L7 6L13 1\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n )}\n </div>\n )\n\n if (hasSubItems) {\n return (\n <div className=\"w-full\">\n <button\n onClick={handleExpand}\n className=\"px-6 tablet:px-8 py-2 flex w-full cursor-pointer items-center justify-between transition-colors duration-200 hover:bg-neutral-black/5 active:bg-neutral-black/10\"\n >\n {content}\n </button>\n <div\n className={cn(\n 'ease-in-out overflow-hidden transition-all duration-300',\n isExpanded ? 'max-h-96 opacity-100' : 'max-h-0 opacity-0'\n )}\n >\n {subItems.map((subItem, index) => (\n <a\n key={index}\n href={subItem.href}\n className=\"px-6 tablet:px-12 py-2 pl-12 font-medium block prose-p2 transition-colors duration-200 hover:bg-neutral-black/5 hover:text-neutral-900 active:bg-neutral-black/10\"\n onClick={closeMenu}\n >\n {subItem.label}\n </a>\n ))}\n </div>\n </div>\n )\n }\n\n if (external) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={\n 'px-6 tablet:px-8 py-2 block transition-colors duration-200 hover:bg-neutral-black/5 active:bg-neutral-black/10'\n }\n >\n {content}\n </a>\n )\n }\n\n return (\n <a\n href={href}\n className={\n 'px-6 tablet:px-8 py-2 block transition-colors duration-200 hover:bg-neutral-black/5 active:bg-neutral-black/10'\n }\n onClick={closeMenu}\n >\n {content}\n </a>\n )\n}\n\nexport default HeaderMenuItem\n"],"mappings":"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"}
|
|
@@ -63,7 +63,7 @@ function Menu({
|
|
|
63
63
|
className: (0, _cn.cn)('inset-0 fixed z-1001 bg-neutral-500/50 transition-opacity duration-300', isOpen ? 'opacity-100' : 'pointer-events-none opacity-0'),
|
|
64
64
|
onClick: onClose
|
|
65
65
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
66
|
-
className: (0, _cn.cn)('top-0 left-0 tablet:w-80 bg-white shadow-2xl ease-in-out
|
|
66
|
+
className: (0, _cn.cn)('top-0 left-0 tablet:w-80 bg-white shadow-2xl ease-in-out tablet:pt-0 fixed z-1001 h-full scrollbar-thin w-full transform pt-(--mobile-header-height) transition-transform duration-300', isOpen ? 'translate-x-0' : '-translate-x-full'),
|
|
67
67
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
68
68
|
className: "flex h-full flex-col overflow-y-auto",
|
|
69
69
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","_react","_button","_icons","_cn","_generateSocialMediaConfig","_sharedComponents","_headerMenuItem","_headerMenuItemGroup","_jsxRuntime","Divider","jsx","className","children","Menu","isOpen","onClose","keywords","menuItems","additionalMenuItems","socialMediaHrefs","donateUrl","subscribeUrl","searchPlaceholder","socialMediaConfig","generateSocialMediaConfig","useEffect","document","body","classList","add","remove","handleEscape","e","key","addEventListener","removeEventListener","jsxs","Fragment","cn","onClick","href","src","alt","height","width","loading","ClearIcon","SearchInputSection","mode","tags","isMenuOpen","contentClassName","slice","map","item","index","label","external","target","rel","icon","variant","size","asChild","_default"],"sources":["../../../src/header/menu/index.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect } from 'react'\n\nimport Button from '../../components/button'\nimport { ClearIcon } from '../../icons'\nimport type { MenuItem, SocialMediaHrefs } from '../../types'\nimport { cn } from '../../utils/cn'\nimport { generateSocialMediaConfig } from '../../utils/generate-social-media-config'\nimport { SearchInputSection } from '../shared-components'\nimport HeaderMenuItem from './header-menu-item'\nimport HeaderMenuItemGroup from './header-menu-item-group'\n\ntype MenuProps = {\n isOpen: boolean\n onClose: () => void\n keywords: string[]\n menuItems: MenuItem[]\n additionalMenuItems: MenuItem[]\n socialMediaHrefs: SocialMediaHrefs\n donateUrl: string\n subscribeUrl: string\n searchPlaceholder: string\n}\n\nfunction Divider() {\n return (\n <div className=\"px-6 tablet:px-8 py-4 w-full\">\n <div className=\"h-px w-full bg-neutral-300\"></div>\n </div>\n )\n}\n\nfunction Menu({\n isOpen,\n onClose,\n keywords,\n menuItems,\n additionalMenuItems,\n socialMediaHrefs,\n donateUrl,\n subscribeUrl,\n searchPlaceholder,\n}: MenuProps) {\n const socialMediaConfig = generateSocialMediaConfig(socialMediaHrefs)\n\n useEffect(() => {\n if (isOpen) {\n document.body.classList.add('no-scroll')\n } else {\n document.body.classList.remove('no-scroll')\n }\n\n return () => {\n document.body.classList.remove('no-scroll')\n }\n }, [isOpen])\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape)\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen, onClose])\n\n return (\n <>\n {/* Overlay */}\n <div\n className={cn(\n 'inset-0 fixed z-1001 bg-neutral-500/50 transition-opacity duration-300',\n isOpen ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n onClick={onClose}\n />\n\n {/* Menu */}\n <div\n className={cn(\n 'top-0 left-0 tablet:w-80 bg-white shadow-2xl ease-in-out scrollbar-thin tablet:pt-0 fixed z-1001 h-full w-full transform pt-(--mobile-header-height) transition-transform duration-300',\n isOpen ? 'translate-x-0' : '-translate-x-full'\n )}\n >\n <div className=\"flex h-full flex-col overflow-y-auto\">\n <div className=\"px-6 tablet:px-8 py-4 mt-4 hidden items-center justify-between tablet:flex\">\n <div className=\"flex items-center\">\n <a href=\"/\">\n <img\n src=\"/assets/images/brand-icon.svg\"\n alt=\"少年報導者 The Reporter for Kids\"\n className=\"h-5\"\n height={20}\n width={183}\n loading=\"eager\"\n />\n </a>\n </div>\n <button\n onClick={onClose}\n className=\"w-8 h-8 flex cursor-pointer items-center justify-center rounded-full text-neutral-600 transition-colors duration-200 hover:text-neutral-800\"\n aria-label=\"關閉選單\"\n >\n <ClearIcon />\n </button>\n </div>\n\n <div className=\"px-6 tablet:px-8 pt-4 desktop:hidden\">\n <SearchInputSection\n mode=\"inline\"\n tags={keywords}\n searchPlaceholder={searchPlaceholder}\n />\n </div>\n\n <div className=\"py-4 flex-1\">\n <HeaderMenuItem {...menuItems?.[0]} />\n\n <Divider />\n\n {/* Categories */}\n <div className=\"py-2\">\n <HeaderMenuItemGroup isMenuOpen={isOpen} menuItems={menuItems} />\n </div>\n\n <Divider />\n\n {/* Reading Settings */}\n <HeaderMenuItem\n {...additionalMenuItems?.[0]}\n contentClassName=\"text-neutral-600 [&_span]:[font-family:var(--font-family-noto)] [&_span]:[font-size:var(--font-size-p2)] [&_span]:[font-weight:500] [&_span]:[line-height:var(--line-height-normal)] [&_span]:[letter-spacing:var(--letter-spacing-wide)] hover:text-neutral-900\"\n />\n\n <Divider />\n\n {/* About Us Section */}\n <div className=\"py-2\">\n {additionalMenuItems.slice(1).map((item, index) => (\n <HeaderMenuItem\n key={index}\n label={item.label}\n href={item.href}\n external={item.external}\n contentClassName=\"text-neutral-600 [&_span]:[font-family:var(--font-family-noto)] [&_span]:[font-size:var(--font-size-p2)] [&_span]:[font-weight:500] [&_span]:[line-height:var(--line-height-normal)] [&_span]:[letter-spacing:var(--letter-spacing-wide)] hover:text-neutral-900\"\n />\n ))}\n </div>\n\n <Divider />\n\n {/* Social Media */}\n <div className=\"px-6 tablet:px-8\">\n <div className=\"gap-4 tablet:gap-0 px-4 flex items-center justify-center tablet:justify-between\">\n {socialMediaConfig.map((item) => (\n <a\n key={item.label}\n href={item.href}\n className=\"text-neutral-900 transition-colors duration-200 hover:text-red-500\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={item.label}\n >\n <div className=\"w-6 h-6 flex items-center justify-center\">\n {item.icon && <item.icon />}\n </div>\n </a>\n ))}\n </div>\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"px-6 tablet:px-8 py-6 tablet:pt-6 tablet:pb-8\">\n <div className=\"gap-4 flex flex-col\">\n <Button variant=\"secondary\" size={44} asChild className=\"w-full\">\n <a\n href={subscribeUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 訂閱電子報\n </a>\n </Button>\n <Button variant=\"primary\" size={44} asChild className=\"w-full\">\n <a href={donateUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n 贊助我們\n </a>\n </Button>\n </div>\n </div>\n </div>\n </div>\n </>\n )\n}\n\nexport default Menu\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","_react","_button","_icons","_cn","_generateSocialMediaConfig","_sharedComponents","_headerMenuItem","_headerMenuItemGroup","_jsxRuntime","Divider","jsx","className","children","Menu","isOpen","onClose","keywords","menuItems","additionalMenuItems","socialMediaHrefs","donateUrl","subscribeUrl","searchPlaceholder","socialMediaConfig","generateSocialMediaConfig","useEffect","document","body","classList","add","remove","handleEscape","e","key","addEventListener","removeEventListener","jsxs","Fragment","cn","onClick","href","src","alt","height","width","loading","ClearIcon","SearchInputSection","mode","tags","isMenuOpen","contentClassName","slice","map","item","index","label","external","target","rel","icon","variant","size","asChild","_default"],"sources":["../../../src/header/menu/index.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect } from 'react'\n\nimport Button from '../../components/button'\nimport { ClearIcon } from '../../icons'\nimport type { MenuItem, SocialMediaHrefs } from '../../types'\nimport { cn } from '../../utils/cn'\nimport { generateSocialMediaConfig } from '../../utils/generate-social-media-config'\nimport { SearchInputSection } from '../shared-components'\nimport HeaderMenuItem from './header-menu-item'\nimport HeaderMenuItemGroup from './header-menu-item-group'\n\ntype MenuProps = {\n isOpen: boolean\n onClose: () => void\n keywords: string[]\n menuItems: MenuItem[]\n additionalMenuItems: MenuItem[]\n socialMediaHrefs: SocialMediaHrefs\n donateUrl: string\n subscribeUrl: string\n searchPlaceholder: string\n}\n\nfunction Divider() {\n return (\n <div className=\"px-6 tablet:px-8 py-4 w-full\">\n <div className=\"h-px w-full bg-neutral-300\"></div>\n </div>\n )\n}\n\nfunction Menu({\n isOpen,\n onClose,\n keywords,\n menuItems,\n additionalMenuItems,\n socialMediaHrefs,\n donateUrl,\n subscribeUrl,\n searchPlaceholder,\n}: MenuProps) {\n const socialMediaConfig = generateSocialMediaConfig(socialMediaHrefs)\n\n useEffect(() => {\n if (isOpen) {\n document.body.classList.add('no-scroll')\n } else {\n document.body.classList.remove('no-scroll')\n }\n\n return () => {\n document.body.classList.remove('no-scroll')\n }\n }, [isOpen])\n\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape)\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen, onClose])\n\n return (\n <>\n {/* Overlay */}\n <div\n className={cn(\n 'inset-0 fixed z-1001 bg-neutral-500/50 transition-opacity duration-300',\n isOpen ? 'opacity-100' : 'pointer-events-none opacity-0'\n )}\n onClick={onClose}\n />\n\n {/* Menu */}\n <div\n className={cn(\n 'top-0 left-0 tablet:w-80 bg-white shadow-2xl ease-in-out tablet:pt-0 fixed z-1001 h-full scrollbar-thin w-full transform pt-(--mobile-header-height) transition-transform duration-300',\n isOpen ? 'translate-x-0' : '-translate-x-full'\n )}\n >\n <div className=\"flex h-full flex-col overflow-y-auto\">\n <div className=\"px-6 tablet:px-8 py-4 mt-4 hidden items-center justify-between tablet:flex\">\n <div className=\"flex items-center\">\n <a href=\"/\">\n <img\n src=\"/assets/images/brand-icon.svg\"\n alt=\"少年報導者 The Reporter for Kids\"\n className=\"h-5\"\n height={20}\n width={183}\n loading=\"eager\"\n />\n </a>\n </div>\n <button\n onClick={onClose}\n className=\"w-8 h-8 flex cursor-pointer items-center justify-center rounded-full text-neutral-600 transition-colors duration-200 hover:text-neutral-800\"\n aria-label=\"關閉選單\"\n >\n <ClearIcon />\n </button>\n </div>\n\n <div className=\"px-6 tablet:px-8 pt-4 desktop:hidden\">\n <SearchInputSection\n mode=\"inline\"\n tags={keywords}\n searchPlaceholder={searchPlaceholder}\n />\n </div>\n\n <div className=\"py-4 flex-1\">\n <HeaderMenuItem {...menuItems?.[0]} />\n\n <Divider />\n\n {/* Categories */}\n <div className=\"py-2\">\n <HeaderMenuItemGroup isMenuOpen={isOpen} menuItems={menuItems} />\n </div>\n\n <Divider />\n\n {/* Reading Settings */}\n <HeaderMenuItem\n {...additionalMenuItems?.[0]}\n contentClassName=\"text-neutral-600 [&_span]:[font-family:var(--font-family-noto)] [&_span]:[font-size:var(--font-size-p2)] [&_span]:[font-weight:500] [&_span]:[line-height:var(--line-height-normal)] [&_span]:[letter-spacing:var(--letter-spacing-wide)] hover:text-neutral-900\"\n />\n\n <Divider />\n\n {/* About Us Section */}\n <div className=\"py-2\">\n {additionalMenuItems.slice(1).map((item, index) => (\n <HeaderMenuItem\n key={index}\n label={item.label}\n href={item.href}\n external={item.external}\n contentClassName=\"text-neutral-600 [&_span]:[font-family:var(--font-family-noto)] [&_span]:[font-size:var(--font-size-p2)] [&_span]:[font-weight:500] [&_span]:[line-height:var(--line-height-normal)] [&_span]:[letter-spacing:var(--letter-spacing-wide)] hover:text-neutral-900\"\n />\n ))}\n </div>\n\n <Divider />\n\n {/* Social Media */}\n <div className=\"px-6 tablet:px-8\">\n <div className=\"gap-4 tablet:gap-0 px-4 flex items-center justify-center tablet:justify-between\">\n {socialMediaConfig.map((item) => (\n <a\n key={item.label}\n href={item.href}\n className=\"text-neutral-900 transition-colors duration-200 hover:text-red-500\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={item.label}\n >\n <div className=\"w-6 h-6 flex items-center justify-center\">\n {item.icon && <item.icon />}\n </div>\n </a>\n ))}\n </div>\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"px-6 tablet:px-8 py-6 tablet:pt-6 tablet:pb-8\">\n <div className=\"gap-4 flex flex-col\">\n <Button variant=\"secondary\" size={44} asChild className=\"w-full\">\n <a\n href={subscribeUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 訂閱電子報\n </a>\n </Button>\n <Button variant=\"primary\" size={44} asChild className=\"w-full\">\n <a href={donateUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n 贊助我們\n </a>\n </Button>\n </div>\n </div>\n </div>\n </div>\n </>\n )\n}\n\nexport default Menu\n"],"mappings":";AAAA,YAAY;;AAAA,IAAAA,sBAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,OAAA;AAEZ,IAAAC,MAAA,GAAAN,OAAA;AAEA,IAAAO,OAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,MAAA,GAAAR,OAAA;AAEA,IAAAS,GAAA,GAAAT,OAAA;AACA,IAAAU,0BAAA,GAAAV,OAAA;AACA,IAAAW,iBAAA,GAAAX,OAAA;AACA,IAAAY,eAAA,GAAAb,sBAAA,CAAAC,OAAA;AACA,IAAAa,oBAAA,GAAAd,sBAAA,CAAAC,OAAA;AAA0D,IAAAc,WAAA,GAAAd,OAAA;AAc1D,SAASe,OAAOA,CAAA,EAAG;EACjB,oBACE,IAAAD,WAAA,CAAAE,GAAA;IAAKC,SAAS,EAAC,8BAA8B;IAAAC,QAAA,eAC3C,IAAAJ,WAAA,CAAAE,GAAA;MAAKC,SAAS,EAAC;IAA4B,CAAM;EAAC,CAC/C,CAAC;AAEV;AAEA,SAASE,IAAIA,CAAC;EACZC,MAAM;EACNC,OAAO;EACPC,QAAQ;EACRC,SAAS;EACTC,mBAAmB;EACnBC,gBAAgB;EAChBC,SAAS;EACTC,YAAY;EACZC;AACS,CAAC,EAAE;EACZ,MAAMC,iBAAiB,GAAG,IAAAC,oDAAyB,EAACL,gBAAgB,CAAC;EAErE,IAAAM,gBAAS,EAAC,MAAM;IACd,IAAIX,MAAM,EAAE;MACVY,QAAQ,CAACC,IAAI,CAACC,SAAS,CAACC,GAAG,CAAC,WAAW,CAAC;IAC1C,CAAC,MAAM;MACLH,QAAQ,CAACC,IAAI,CAACC,SAAS,CAACE,MAAM,CAAC,WAAW,CAAC;IAC7C;IAEA,OAAO,MAAM;MACXJ,QAAQ,CAACC,IAAI,CAACC,SAAS,CAACE,MAAM,CAAC,WAAW,CAAC;IAC7C,CAAC;EACH,CAAC,EAAE,CAAChB,MAAM,CAAC,CAAC;EAEZ,IAAAW,gBAAS,EAAC,MAAM;IACd,MAAMM,YAAY,GAAIC,CAAgB,IAAK;MACzC,IAAIA,CAAC,CAACC,GAAG,KAAK,QAAQ,EAAE;QACtBlB,OAAO,CAAC,CAAC;MACX;IACF,CAAC;IAED,IAAID,MAAM,EAAE;MACVY,QAAQ,CAACQ,gBAAgB,CAAC,SAAS,EAAEH,YAAY,CAAC;IACpD;IAEA,OAAO,MAAM;MACXL,QAAQ,CAACS,mBAAmB,CAAC,SAAS,EAAEJ,YAAY,CAAC;IACvD,CAAC;EACH,CAAC,EAAE,CAACjB,MAAM,EAAEC,OAAO,CAAC,CAAC;EAErB,oBACE,IAAAP,WAAA,CAAA4B,IAAA,EAAA5B,WAAA,CAAA6B,QAAA;IAAAzB,QAAA,gBAEE,IAAAJ,WAAA,CAAAE,GAAA;MACEC,SAAS,EAAE,IAAA2B,MAAE,EACX,wEAAwE,EACxExB,MAAM,GAAG,aAAa,GAAG,+BAC3B,CAAE;MACFyB,OAAO,EAAExB;IAAQ,CAClB,CAAC,eAGF,IAAAP,WAAA,CAAAE,GAAA;MACEC,SAAS,EAAE,IAAA2B,MAAE,EACX,wLAAwL,EACxLxB,MAAM,GAAG,eAAe,GAAG,mBAC7B,CAAE;MAAAF,QAAA,eAEF,IAAAJ,WAAA,CAAA4B,IAAA;QAAKzB,SAAS,EAAC,sCAAsC;QAAAC,QAAA,gBACnD,IAAAJ,WAAA,CAAA4B,IAAA;UAAKzB,SAAS,EAAC,4EAA4E;UAAAC,QAAA,gBACzF,IAAAJ,WAAA,CAAAE,GAAA;YAAKC,SAAS,EAAC,mBAAmB;YAAAC,QAAA,eAChC,IAAAJ,WAAA,CAAAE,GAAA;cAAG8B,IAAI,EAAC,GAAG;cAAA5B,QAAA,eACT,IAAAJ,WAAA,CAAAE,GAAA;gBACE+B,GAAG,EAAC,+BAA+B;gBACnCC,GAAG,EAAC,sDAA6B;gBACjC/B,SAAS,EAAC,KAAK;gBACfgC,MAAM,EAAE,EAAG;gBACXC,KAAK,EAAE,GAAI;gBACXC,OAAO,EAAC;cAAO,CAChB;YAAC,CACD;UAAC,CACD,CAAC,eACN,IAAArC,WAAA,CAAAE,GAAA;YACE6B,OAAO,EAAExB,OAAQ;YACjBJ,SAAS,EAAC,6IAA6I;YACvJ,cAAW,0BAAM;YAAAC,QAAA,eAEjB,IAAAJ,WAAA,CAAAE,GAAA,EAACR,MAAA,CAAA4C,SAAS,IAAE;UAAC,CACP,CAAC;QAAA,CACN,CAAC,eAEN,IAAAtC,WAAA,CAAAE,GAAA;UAAKC,SAAS,EAAC,sCAAsC;UAAAC,QAAA,eACnD,IAAAJ,WAAA,CAAAE,GAAA,EAACL,iBAAA,CAAA0C,kBAAkB;YACjBC,IAAI,EAAC,QAAQ;YACbC,IAAI,EAAEjC,QAAS;YACfM,iBAAiB,EAAEA;UAAkB,CACtC;QAAC,CACC,CAAC,eAEN,IAAAd,WAAA,CAAA4B,IAAA;UAAKzB,SAAS,EAAC,aAAa;UAAAC,QAAA,gBAC1B,IAAAJ,WAAA,CAAAE,GAAA,EAACJ,eAAA,CAAAP,OAAc;YAAA,GAAKkB,SAAS,GAAG,CAAC;UAAC,CAAG,CAAC,eAEtC,IAAAT,WAAA,CAAAE,GAAA,EAACD,OAAO,IAAE,CAAC,eAGX,IAAAD,WAAA,CAAAE,GAAA;YAAKC,SAAS,EAAC,MAAM;YAAAC,QAAA,eACnB,IAAAJ,WAAA,CAAAE,GAAA,EAACH,oBAAA,CAAAR,OAAmB;cAACmD,UAAU,EAAEpC,MAAO;cAACG,SAAS,EAAEA;YAAU,CAAE;UAAC,CAC9D,CAAC,eAEN,IAAAT,WAAA,CAAAE,GAAA,EAACD,OAAO,IAAE,CAAC,eAGX,IAAAD,WAAA,CAAAE,GAAA,EAACJ,eAAA,CAAAP,OAAc;YAAA,GACTmB,mBAAmB,GAAG,CAAC,CAAC;YAC5BiC,gBAAgB,EAAC;UAAkQ,CACpR,CAAC,eAEF,IAAA3C,WAAA,CAAAE,GAAA,EAACD,OAAO,IAAE,CAAC,eAGX,IAAAD,WAAA,CAAAE,GAAA;YAAKC,SAAS,EAAC,MAAM;YAAAC,QAAA,EAClBM,mBAAmB,CAACkC,KAAK,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,CAACC,IAAI,EAAEC,KAAK,kBAC5C,IAAA/C,WAAA,CAAAE,GAAA,EAACJ,eAAA,CAAAP,OAAc;cAEbyD,KAAK,EAAEF,IAAI,CAACE,KAAM;cAClBhB,IAAI,EAAEc,IAAI,CAACd,IAAK;cAChBiB,QAAQ,EAAEH,IAAI,CAACG,QAAS;cACxBN,gBAAgB,EAAC;YAAkQ,GAJ9QI,KAKN,CACF;UAAC,CACC,CAAC,eAEN,IAAA/C,WAAA,CAAAE,GAAA,EAACD,OAAO,IAAE,CAAC,eAGX,IAAAD,WAAA,CAAAE,GAAA;YAAKC,SAAS,EAAC,kBAAkB;YAAAC,QAAA,eAC/B,IAAAJ,WAAA,CAAAE,GAAA;cAAKC,SAAS,EAAC,iFAAiF;cAAAC,QAAA,EAC7FW,iBAAiB,CAAC8B,GAAG,CAAEC,IAAI,iBAC1B,IAAA9C,WAAA,CAAAE,GAAA;gBAEE8B,IAAI,EAAEc,IAAI,CAACd,IAAK;gBAChB7B,SAAS,EAAC,oEAAoE;gBAC9E+C,MAAM,EAAC,QAAQ;gBACfC,GAAG,EAAC,qBAAqB;gBACzB,cAAYL,IAAI,CAACE,KAAM;gBAAA5C,QAAA,eAEvB,IAAAJ,WAAA,CAAAE,GAAA;kBAAKC,SAAS,EAAC,0CAA0C;kBAAAC,QAAA,EACtD0C,IAAI,CAACM,IAAI,iBAAI,IAAApD,WAAA,CAAAE,GAAA,EAAC4C,IAAI,CAACM,IAAI,IAAE;gBAAC,CACxB;cAAC,GATDN,IAAI,CAACE,KAUT,CACJ;YAAC,CACC;UAAC,CACH,CAAC;QAAA,CACH,CAAC,eAGN,IAAAhD,WAAA,CAAAE,GAAA;UAAKC,SAAS,EAAC,+CAA+C;UAAAC,QAAA,eAC5D,IAAAJ,WAAA,CAAA4B,IAAA;YAAKzB,SAAS,EAAC,qBAAqB;YAAAC,QAAA,gBAClC,IAAAJ,WAAA,CAAAE,GAAA,EAACT,OAAA,CAAAF,OAAM;cAAC8D,OAAO,EAAC,WAAW;cAACC,IAAI,EAAE,EAAG;cAACC,OAAO;cAACpD,SAAS,EAAC,QAAQ;cAAAC,QAAA,eAC9D,IAAAJ,WAAA,CAAAE,GAAA;gBACE8B,IAAI,EAAEnB,YAAa;gBACnBqC,MAAM,EAAC,QAAQ;gBACfC,GAAG,EAAC,qBAAqB;gBAAA/C,QAAA,EAC1B;cAED,CAAG;YAAC,CACE,CAAC,eACT,IAAAJ,WAAA,CAAAE,GAAA,EAACT,OAAA,CAAAF,OAAM;cAAC8D,OAAO,EAAC,SAAS;cAACC,IAAI,EAAE,EAAG;cAACC,OAAO;cAACpD,SAAS,EAAC,QAAQ;cAAAC,QAAA,eAC5D,IAAAJ,WAAA,CAAAE,GAAA;gBAAG8B,IAAI,EAAEpB,SAAU;gBAACsC,MAAM,EAAC,QAAQ;gBAACC,GAAG,EAAC,qBAAqB;gBAAA/C,QAAA,EAAC;cAE9D,CAAG;YAAC,CACE,CAAC;UAAA,CACN;QAAC,CACH,CAAC;MAAA,CACH;IAAC,CACH,CAAC;EAAA,CACN,CAAC;AAEP;AAAC,IAAAoD,QAAA,GAAAnE,OAAA,CAAAE,OAAA,GAEcc,IAAI"}
|
|
@@ -137,12 +137,12 @@ function SearchInputSection(props) {
|
|
|
137
137
|
isFocused
|
|
138
138
|
}),
|
|
139
139
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h3", {
|
|
140
|
-
className: "
|
|
140
|
+
className: "font-bold mb-3 prose-p3 text-neutral-700",
|
|
141
141
|
children: "\u71B1\u9580\u641C\u5C0B"
|
|
142
142
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
143
143
|
className: "gap-2.5 flex flex-wrap",
|
|
144
144
|
children: tags.map(keyword => /*#__PURE__*/(0, _jsxRuntime.jsxs)("a", {
|
|
145
|
-
className: "px-3 py-1
|
|
145
|
+
className: "px-3 py-1 font-bold cursor-pointer rounded-full bg-neutral-200 prose-p2 text-neutral-900 transition-colors duration-200 hover:bg-red-500 hover:text-neutral-white",
|
|
146
146
|
href: `/search?q=${encodeURIComponent(keyword)}`,
|
|
147
147
|
children: ["#", keyword]
|
|
148
148
|
}, keyword))
|
|
@@ -232,7 +232,7 @@ function BottomNavigation({
|
|
|
232
232
|
className: "flex items-center",
|
|
233
233
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
234
234
|
href: item.href,
|
|
235
|
-
className: "py-1
|
|
235
|
+
className: "py-1 font-bold! h-6 flex items-center prose-p1 text-neutral-900 transition-colors hover:text-red-400",
|
|
236
236
|
children: item.label
|
|
237
237
|
})
|
|
238
238
|
}, item.label), ...(index < menuItems.length - 1 ? [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-components.js","names":["Object","defineProperty","exports","value","ActionButtons","BottomNavigation","HamburgerButton","LogoLink","SearchInputSection","_classVarianceAuthority","require","_react","_components","_icons","_cn","_jsxRuntime","searchFormVariants","cva","variants","mode","inline","popover","isSearchOpen","true","false","compoundVariants","class","searchDropdownVariants","isFocused","compactMode","jsx","href","className","rel","children","src","alt","loading","cn","width","height","props","ref","useRef","setIsFocused","useState","searchValue","setSearchValue","tags","searchPlaceholder","useEffect","current","focus","document","body","classList","add","remove","jsxs","onFocus","onBlur","role","method","action","undefined","Input","placeholder","name","title","inputRef","onChange","map","keyword","encodeURIComponent","hideCtaButtons","subscribeUrl","setIsSearchOpen","containerRef","buttonRef","handleClickOutside","event","containerElement","buttonElement","contains","target","addEventListener","removeEventListener","Button","variant","size","asChild","onClick","ClearIcon","SearchIcon","SettingsIcon","onHamburgerOverlayOpen","menuItems","small","reduce","acc","item","index","label","length","HamburgerIconSmall","HamburgerIcon"],"sources":["../../src/header/shared-components.tsx"],"sourcesContent":["'use client'\nimport { cva } from 'class-variance-authority'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { Button, Input } from '../components'\nimport {\n ClearIcon,\n HamburgerIcon,\n HamburgerIconSmall,\n SearchIcon,\n SettingsIcon,\n} from '../icons'\nimport type { MenuItem } from '../types'\nimport { cn } from '../utils/cn'\n\nconst searchFormVariants = cva(\n 'ease-in-out h-full transition-all duration-300',\n {\n variants: {\n mode: {\n inline: 'h-11 w-full',\n popover: 'top-0 -right-4 w-66 absolute overflow-hidden opacity-0',\n },\n isSearchOpen: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n mode: 'popover',\n isSearchOpen: true,\n class: 'w-66 pointer-events-auto opacity-100',\n },\n {\n mode: 'popover',\n isSearchOpen: false,\n class: 'pointer-events-none',\n },\n ],\n }\n)\n\nconst searchDropdownVariants = cva(\n 'rounded-xl mt-2 w-66 ease-in-out h-0 p-0 z-50 bg-neutral-white opacity-0 transition-all duration-200',\n {\n variants: {\n mode: {\n inline: '',\n popover: 'top-12 -right-4 shadow-custom p-4 absolute',\n },\n isSearchOpen: {\n true: '',\n false: '',\n },\n isFocused: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n mode: 'popover',\n isSearchOpen: true,\n isFocused: true,\n class: 'p-4 h-min opacity-100',\n },\n {\n mode: 'popover',\n isSearchOpen: false,\n class: 'pointer-events-none',\n },\n {\n mode: 'inline',\n isFocused: true,\n class:\n 'translate-y-0 pt-6 mt-0 bg-neutral-transparent h-min w-full opacity-100',\n },\n {\n mode: 'inline',\n isFocused: false,\n class: '-translate-y-3 pointer-events-none w-full',\n },\n ],\n }\n)\n\nexport function LogoLink({ compactMode = false }: { compactMode?: boolean }) {\n return (\n <a href=\"/\" className=\"flex items-center\" rel=\"home\">\n <img\n src=\"/assets/images/brand-icon.svg\"\n alt=\"少年報導者 The Reporter for Kids\"\n loading=\"eager\"\n className={cn(\n 'h-5 tablet:h-6 desktop:h-8 ease-in-out w-auto transition-all duration-500',\n compactMode && 'desktop:h-[26px]'\n )}\n width={293}\n height={32}\n />\n </a>\n )\n}\n\ntype SearchInputSectionProps =\n | {\n mode: 'popover'\n isSearchOpen: boolean\n tags: string[]\n searchPlaceholder: string\n }\n | {\n mode: 'inline'\n tags: string[]\n searchPlaceholder: string\n }\n\nexport function SearchInputSection(props: SearchInputSectionProps) {\n const ref = useRef<HTMLInputElement>(null)\n const [isFocused, setIsFocused] = useState(false)\n const [searchValue, setSearchValue] = useState('')\n\n const mode = props.mode\n const isSearchOpen = mode === 'popover' && props.isSearchOpen\n const tags = props.tags\n const searchPlaceholder = props.searchPlaceholder\n\n useEffect(() => {\n if (mode === 'inline') {\n return\n }\n if (isSearchOpen) {\n ref.current?.focus()\n setIsFocused(true)\n document.body.classList.add('no-scroll')\n return\n }\n setIsFocused(false)\n document.body.classList.remove('no-scroll')\n }, [mode, isSearchOpen])\n\n return (\n <div\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n className={mode === 'inline' ? 'relative w-full' : 'h-11'}\n >\n <form\n role=\"search\"\n method=\"get\"\n action=\"/search\"\n className={searchFormVariants({\n mode,\n isSearchOpen: mode === 'popover' ? isSearchOpen : undefined,\n })}\n >\n <Input\n placeholder={searchPlaceholder}\n name=\"q\"\n title=\"Search for...\"\n aria-label=\"Search for...\"\n className=\"w-[99%]\"\n inputRef={ref}\n onChange={setSearchValue}\n value={searchValue}\n />\n </form>\n <div\n className={searchDropdownVariants({\n mode,\n isSearchOpen: mode === 'popover' ? isSearchOpen : undefined,\n isFocused,\n })}\n >\n <h3 className=\"prose-p3 font-bold mb-3 text-neutral-700\">熱門搜尋</h3>\n <div className=\"gap-2.5 flex flex-wrap\">\n {tags.map((keyword) => (\n <a\n key={keyword}\n className=\"px-3 py-1 prose-p2 font-bold cursor-pointer rounded-full bg-neutral-200 text-neutral-900 transition-colors duration-200 hover:bg-red-500 hover:text-neutral-white\"\n href={`/search?q=${encodeURIComponent(keyword)}`}\n >\n #{keyword}\n </a>\n ))}\n </div>\n </div>\n </div>\n )\n}\n\nexport function ActionButtons({\n hideCtaButtons = false,\n tags,\n searchPlaceholder,\n subscribeUrl,\n}: {\n hideCtaButtons?: boolean\n tags: string[]\n searchPlaceholder: string\n subscribeUrl: string\n}) {\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n\n const containerRef = useRef<HTMLDivElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const containerElement = containerRef.current\n const buttonElement = buttonRef.current\n if (!containerElement || !buttonElement) return\n if (\n !containerElement.contains(event.target as Node) &&\n !buttonElement.contains(event.target as Node)\n ) {\n setIsSearchOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [])\n\n return (\n <div className=\"relative flex items-center\">\n <div className=\"mr-6 relative flex items-center\" ref={containerRef}>\n {/* CTA Buttons - Base layer */}\n {!hideCtaButtons && !isSearchOpen && (\n <div className=\"gap-4 flex items-center\">\n <Button variant=\"secondary\" size={32} asChild>\n <a href=\"/about#post\">投稿</a>\n </Button>\n <Button variant=\"primary\" size={32} asChild>\n <a href={subscribeUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n 訂閱\n </a>\n </Button>\n </div>\n )}\n\n <SearchInputSection\n isSearchOpen={isSearchOpen}\n mode=\"popover\"\n tags={tags}\n searchPlaceholder={searchPlaceholder}\n />\n </div>\n\n <button\n className=\"w-8 h-8 mr-4 flex cursor-pointer items-center justify-center rounded-full text-neutral-600 transition-all duration-200 hover:text-neutral-800\"\n aria-label=\"搜尋\"\n onClick={() => setIsSearchOpen(!isSearchOpen)}\n ref={buttonRef}\n >\n {isSearchOpen ? <ClearIcon /> : <SearchIcon />}\n </button>\n <button\n className=\"w-8 h-8 flex cursor-pointer items-center justify-center rounded-full text-neutral-600 transition-all duration-200 hover:text-neutral-800\"\n aria-label=\"設定\"\n >\n <SettingsIcon />\n </button>\n </div>\n )\n}\n\nexport function BottomNavigation({\n onHamburgerOverlayOpen,\n menuItems,\n}: {\n onHamburgerOverlayOpen: () => void\n menuItems: MenuItem[]\n}) {\n return (\n <div className=\"py-2 px-4 flex w-full items-center justify-between border-y border-neutral-border\">\n <HamburgerButton onHamburgerOverlayOpen={onHamburgerOverlayOpen} small />\n\n {menuItems.reduce((acc, item, index) => {\n return [\n ...acc,\n <div key={item.label} className=\"flex items-center\">\n <a\n href={item.href}\n className=\"py-1 prose-p1 font-bold! h-6 flex items-center text-neutral-900 transition-colors hover:text-red-400\"\n >\n {item.label}\n </a>\n </div>,\n ...(index < menuItems.length - 1\n ? [\n <div\n key={`separator-${index}`}\n className=\"h-4 mx-2 w-px bg-neutral-border\"\n />,\n ]\n : []),\n ]\n }, [] as React.ReactNode[])}\n </div>\n )\n}\n\nexport function HamburgerButton({\n onHamburgerOverlayOpen,\n small = false,\n}: {\n onHamburgerOverlayOpen: () => void\n small?: boolean\n}) {\n return (\n <button\n className={cn(\n 'rounded-sm ease-in-out flex cursor-pointer items-center justify-center transition-all duration-300 hover:[&>svg>path:nth-child(1)]:fill-blue-500 hover:[&>svg>path:nth-child(2)]:fill-red-500 hover:[&>svg>path:nth-child(3)]:fill-yellow-500 hover:[&>svg>rect:nth-child(1)]:fill-blue-500 hover:[&>svg>rect:nth-child(2)]:fill-red-500 hover:[&>svg>rect:nth-child(3)]:fill-yellow-500',\n small ? 'w-6 h-6' : 'w-8 h-8'\n )}\n onClick={onHamburgerOverlayOpen}\n >\n {small ? <HamburgerIconSmall /> : <HamburgerIcon />}\n </button>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-components.js","names":["Object","defineProperty","exports","value","ActionButtons","BottomNavigation","HamburgerButton","LogoLink","SearchInputSection","_classVarianceAuthority","require","_react","_components","_icons","_cn","_jsxRuntime","searchFormVariants","cva","variants","mode","inline","popover","isSearchOpen","true","false","compoundVariants","class","searchDropdownVariants","isFocused","compactMode","jsx","href","className","rel","children","src","alt","loading","cn","width","height","props","ref","useRef","setIsFocused","useState","searchValue","setSearchValue","tags","searchPlaceholder","useEffect","current","focus","document","body","classList","add","remove","jsxs","onFocus","onBlur","role","method","action","undefined","Input","placeholder","name","title","inputRef","onChange","map","keyword","encodeURIComponent","hideCtaButtons","subscribeUrl","setIsSearchOpen","containerRef","buttonRef","handleClickOutside","event","containerElement","buttonElement","contains","target","addEventListener","removeEventListener","Button","variant","size","asChild","onClick","ClearIcon","SearchIcon","SettingsIcon","onHamburgerOverlayOpen","menuItems","small","reduce","acc","item","index","label","length","HamburgerIconSmall","HamburgerIcon"],"sources":["../../src/header/shared-components.tsx"],"sourcesContent":["'use client'\nimport { cva } from 'class-variance-authority'\nimport { useEffect, useRef, useState } from 'react'\n\nimport { Button, Input } from '../components'\nimport {\n ClearIcon,\n HamburgerIcon,\n HamburgerIconSmall,\n SearchIcon,\n SettingsIcon,\n} from '../icons'\nimport type { MenuItem } from '../types'\nimport { cn } from '../utils/cn'\n\nconst searchFormVariants = cva(\n 'ease-in-out h-full transition-all duration-300',\n {\n variants: {\n mode: {\n inline: 'h-11 w-full',\n popover: 'top-0 -right-4 w-66 absolute overflow-hidden opacity-0',\n },\n isSearchOpen: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n mode: 'popover',\n isSearchOpen: true,\n class: 'w-66 pointer-events-auto opacity-100',\n },\n {\n mode: 'popover',\n isSearchOpen: false,\n class: 'pointer-events-none',\n },\n ],\n }\n)\n\nconst searchDropdownVariants = cva(\n 'rounded-xl mt-2 w-66 ease-in-out h-0 p-0 z-50 bg-neutral-white opacity-0 transition-all duration-200',\n {\n variants: {\n mode: {\n inline: '',\n popover: 'top-12 -right-4 shadow-custom p-4 absolute',\n },\n isSearchOpen: {\n true: '',\n false: '',\n },\n isFocused: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n {\n mode: 'popover',\n isSearchOpen: true,\n isFocused: true,\n class: 'p-4 h-min opacity-100',\n },\n {\n mode: 'popover',\n isSearchOpen: false,\n class: 'pointer-events-none',\n },\n {\n mode: 'inline',\n isFocused: true,\n class:\n 'translate-y-0 pt-6 mt-0 bg-neutral-transparent h-min w-full opacity-100',\n },\n {\n mode: 'inline',\n isFocused: false,\n class: '-translate-y-3 pointer-events-none w-full',\n },\n ],\n }\n)\n\nexport function LogoLink({ compactMode = false }: { compactMode?: boolean }) {\n return (\n <a href=\"/\" className=\"flex items-center\" rel=\"home\">\n <img\n src=\"/assets/images/brand-icon.svg\"\n alt=\"少年報導者 The Reporter for Kids\"\n loading=\"eager\"\n className={cn(\n 'h-5 tablet:h-6 desktop:h-8 ease-in-out w-auto transition-all duration-500',\n compactMode && 'desktop:h-[26px]'\n )}\n width={293}\n height={32}\n />\n </a>\n )\n}\n\ntype SearchInputSectionProps =\n | {\n mode: 'popover'\n isSearchOpen: boolean\n tags: string[]\n searchPlaceholder: string\n }\n | {\n mode: 'inline'\n tags: string[]\n searchPlaceholder: string\n }\n\nexport function SearchInputSection(props: SearchInputSectionProps) {\n const ref = useRef<HTMLInputElement>(null)\n const [isFocused, setIsFocused] = useState(false)\n const [searchValue, setSearchValue] = useState('')\n\n const mode = props.mode\n const isSearchOpen = mode === 'popover' && props.isSearchOpen\n const tags = props.tags\n const searchPlaceholder = props.searchPlaceholder\n\n useEffect(() => {\n if (mode === 'inline') {\n return\n }\n if (isSearchOpen) {\n ref.current?.focus()\n setIsFocused(true)\n document.body.classList.add('no-scroll')\n return\n }\n setIsFocused(false)\n document.body.classList.remove('no-scroll')\n }, [mode, isSearchOpen])\n\n return (\n <div\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n className={mode === 'inline' ? 'relative w-full' : 'h-11'}\n >\n <form\n role=\"search\"\n method=\"get\"\n action=\"/search\"\n className={searchFormVariants({\n mode,\n isSearchOpen: mode === 'popover' ? isSearchOpen : undefined,\n })}\n >\n <Input\n placeholder={searchPlaceholder}\n name=\"q\"\n title=\"Search for...\"\n aria-label=\"Search for...\"\n className=\"w-[99%]\"\n inputRef={ref}\n onChange={setSearchValue}\n value={searchValue}\n />\n </form>\n <div\n className={searchDropdownVariants({\n mode,\n isSearchOpen: mode === 'popover' ? isSearchOpen : undefined,\n isFocused,\n })}\n >\n <h3 className=\"font-bold mb-3 prose-p3 text-neutral-700\">熱門搜尋</h3>\n <div className=\"gap-2.5 flex flex-wrap\">\n {tags.map((keyword) => (\n <a\n key={keyword}\n className=\"px-3 py-1 font-bold cursor-pointer rounded-full bg-neutral-200 prose-p2 text-neutral-900 transition-colors duration-200 hover:bg-red-500 hover:text-neutral-white\"\n href={`/search?q=${encodeURIComponent(keyword)}`}\n >\n #{keyword}\n </a>\n ))}\n </div>\n </div>\n </div>\n )\n}\n\nexport function ActionButtons({\n hideCtaButtons = false,\n tags,\n searchPlaceholder,\n subscribeUrl,\n}: {\n hideCtaButtons?: boolean\n tags: string[]\n searchPlaceholder: string\n subscribeUrl: string\n}) {\n const [isSearchOpen, setIsSearchOpen] = useState(false)\n\n const containerRef = useRef<HTMLDivElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const containerElement = containerRef.current\n const buttonElement = buttonRef.current\n if (!containerElement || !buttonElement) return\n if (\n !containerElement.contains(event.target as Node) &&\n !buttonElement.contains(event.target as Node)\n ) {\n setIsSearchOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [])\n\n return (\n <div className=\"relative flex items-center\">\n <div className=\"mr-6 relative flex items-center\" ref={containerRef}>\n {/* CTA Buttons - Base layer */}\n {!hideCtaButtons && !isSearchOpen && (\n <div className=\"gap-4 flex items-center\">\n <Button variant=\"secondary\" size={32} asChild>\n <a href=\"/about#post\">投稿</a>\n </Button>\n <Button variant=\"primary\" size={32} asChild>\n <a href={subscribeUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n 訂閱\n </a>\n </Button>\n </div>\n )}\n\n <SearchInputSection\n isSearchOpen={isSearchOpen}\n mode=\"popover\"\n tags={tags}\n searchPlaceholder={searchPlaceholder}\n />\n </div>\n\n <button\n className=\"w-8 h-8 mr-4 flex cursor-pointer items-center justify-center rounded-full text-neutral-600 transition-all duration-200 hover:text-neutral-800\"\n aria-label=\"搜尋\"\n onClick={() => setIsSearchOpen(!isSearchOpen)}\n ref={buttonRef}\n >\n {isSearchOpen ? <ClearIcon /> : <SearchIcon />}\n </button>\n <button\n className=\"w-8 h-8 flex cursor-pointer items-center justify-center rounded-full text-neutral-600 transition-all duration-200 hover:text-neutral-800\"\n aria-label=\"設定\"\n >\n <SettingsIcon />\n </button>\n </div>\n )\n}\n\nexport function BottomNavigation({\n onHamburgerOverlayOpen,\n menuItems,\n}: {\n onHamburgerOverlayOpen: () => void\n menuItems: MenuItem[]\n}) {\n return (\n <div className=\"py-2 px-4 flex w-full items-center justify-between border-y border-neutral-border\">\n <HamburgerButton onHamburgerOverlayOpen={onHamburgerOverlayOpen} small />\n\n {menuItems.reduce((acc, item, index) => {\n return [\n ...acc,\n <div key={item.label} className=\"flex items-center\">\n <a\n href={item.href}\n className=\"py-1 font-bold! h-6 flex items-center prose-p1 text-neutral-900 transition-colors hover:text-red-400\"\n >\n {item.label}\n </a>\n </div>,\n ...(index < menuItems.length - 1\n ? [\n <div\n key={`separator-${index}`}\n className=\"h-4 mx-2 w-px bg-neutral-border\"\n />,\n ]\n : []),\n ]\n }, [] as React.ReactNode[])}\n </div>\n )\n}\n\nexport function HamburgerButton({\n onHamburgerOverlayOpen,\n small = false,\n}: {\n onHamburgerOverlayOpen: () => void\n small?: boolean\n}) {\n return (\n <button\n className={cn(\n 'rounded-sm ease-in-out flex cursor-pointer items-center justify-center transition-all duration-300 hover:[&>svg>path:nth-child(1)]:fill-blue-500 hover:[&>svg>path:nth-child(2)]:fill-red-500 hover:[&>svg>path:nth-child(3)]:fill-yellow-500 hover:[&>svg>rect:nth-child(1)]:fill-blue-500 hover:[&>svg>rect:nth-child(2)]:fill-red-500 hover:[&>svg>rect:nth-child(3)]:fill-yellow-500',\n small ? 'w-6 h-6' : 'w-8 h-8'\n )}\n onClick={onHamburgerOverlayOpen}\n >\n {small ? <HamburgerIconSmall /> : <HamburgerIcon />}\n </button>\n )\n}\n"],"mappings":"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"}
|