@kids-reporter/routing-ui 0.1.0-alpha.1
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/.prettierignore +17 -0
- package/babel.config.cjs +31 -0
- package/dist/components/button.d.ts +23 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +82 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +21 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/input.d.ts +20 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +143 -0
- package/dist/components/input.js.map +1 -0
- package/dist/constants/default-values.d.ts +12 -0
- package/dist/constants/default-values.d.ts.map +1 -0
- package/dist/constants/default-values.js +148 -0
- package/dist/constants/default-values.js.map +1 -0
- package/dist/footer.d.ts +10 -0
- package/dist/footer.d.ts.map +1 -0
- package/dist/footer.js +144 -0
- package/dist/footer.js.map +1 -0
- package/dist/header/desktop-header.d.ts +14 -0
- package/dist/header/desktop-header.d.ts.map +1 -0
- package/dist/header/desktop-header.js +85 -0
- package/dist/header/desktop-header.js.map +1 -0
- package/dist/header/header-context.d.ts +16 -0
- package/dist/header/header-context.d.ts.map +1 -0
- package/dist/header/header-context.js +37 -0
- package/dist/header/header-context.js.map +1 -0
- package/dist/header/index.d.ts +12 -0
- package/dist/header/index.d.ts.map +1 -0
- package/dist/header/index.js +72 -0
- package/dist/header/index.js.map +1 -0
- package/dist/header/menu/header-menu-item-group.d.ts +7 -0
- package/dist/header/menu/header-menu-item-group.d.ts.map +1 -0
- package/dist/header/menu/header-menu-item-group.js +31 -0
- package/dist/header/menu/header-menu-item-group.js.map +1 -0
- package/dist/header/menu/header-menu-item.d.ts +9 -0
- package/dist/header/menu/header-menu-item.d.ts.map +1 -0
- package/dist/header/menu/header-menu-item.js +92 -0
- package/dist/header/menu/header-menu-item.js.map +1 -0
- package/dist/header/menu/index.d.ts +15 -0
- package/dist/header/menu/index.d.ts.map +1 -0
- package/dist/header/menu/index.js +170 -0
- package/dist/header/menu/index.js.map +1 -0
- package/dist/header/mobile-header.d.ts +9 -0
- package/dist/header/mobile-header.d.ts.map +1 -0
- package/dist/header/mobile-header.js +46 -0
- package/dist/header/mobile-header.js.map +1 -0
- package/dist/header/post-title-setter.d.ts +6 -0
- package/dist/header/post-title-setter.d.ts.map +1 -0
- package/dist/header/post-title-setter.js +22 -0
- package/dist/header/post-title-setter.js.map +1 -0
- package/dist/header/shared-components.d.ts +31 -0
- package/dist/header/shared-components.d.ts.map +1 -0
- package/dist/header/shared-components.js +256 -0
- package/dist/header/shared-components.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +36 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/use-is-at-top.d.ts +3 -0
- package/dist/hooks/use-is-at-top.d.ts.map +1 -0
- package/dist/hooks/use-is-at-top.js +26 -0
- package/dist/hooks/use-is-at-top.js.map +1 -0
- package/dist/hooks/use-media-query.d.ts +7 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/hooks/use-media-query.js +47 -0
- package/dist/hooks/use-media-query.js.map +1 -0
- package/dist/hooks/use-scroll-level.d.ts +11 -0
- package/dist/hooks/use-scroll-level.d.ts.map +1 -0
- package/dist/hooks/use-scroll-level.js +53 -0
- package/dist/hooks/use-scroll-level.js.map +1 -0
- package/dist/icons/index.d.ts +17 -0
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +341 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +475 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/cn.d.ts +8 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +27 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/generate-social-media-config.d.ts +9 -0
- package/dist/utils/generate-social-media-config.d.ts.map +1 -0
- package/dist/utils/generate-social-media-config.js +55 -0
- package/dist/utils/generate-social-media-config.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +28 -0
- package/dist/utils/index.js.map +1 -0
- package/eslint.config.mjs +55 -0
- package/package.json +51 -0
- package/prettier.config.mjs +13 -0
- package/scripts/build.sh +18 -0
- package/src/components/button.tsx +108 -0
- package/src/components/index.tsx +2 -0
- package/src/components/input.tsx +171 -0
- package/src/constants/default-values.tsx +153 -0
- package/src/footer.tsx +151 -0
- package/src/header/desktop-header.tsx +128 -0
- package/src/header/header-context.tsx +56 -0
- package/src/header/index.tsx +96 -0
- package/src/header/menu/header-menu-item-group.tsx +37 -0
- package/src/header/menu/header-menu-item.tsx +132 -0
- package/src/header/menu/index.tsx +206 -0
- package/src/header/mobile-header.tsx +61 -0
- package/src/header/post-title-setter.tsx +22 -0
- package/src/header/shared-components.tsx +326 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/use-is-at-top.ts +23 -0
- package/src/hooks/use-media-query.ts +57 -0
- package/src/hooks/use-scroll-level.ts +52 -0
- package/src/icons/index.tsx +358 -0
- package/src/index.ts +9 -0
- package/src/styles.css +475 -0
- package/src/types/index.ts +10 -0
- package/src/utils/cn.ts +41 -0
- package/src/utils/generate-social-media-config.ts +75 -0
- package/src/utils/index.ts +2 -0
- package/tsconfig.json +33 -0
package/dist/footer.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
var _image = _interopRequireDefault(require("next/image"));
|
|
10
|
+
var _button = _interopRequireDefault(require("./components/button"));
|
|
11
|
+
var _defaultValues = require("./constants/default-values");
|
|
12
|
+
var _generateSocialMediaConfig = require("./utils/generate-social-media-config");
|
|
13
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
14
|
+
const Footer = ({
|
|
15
|
+
socialMediaHrefs = _defaultValues.SOCIAL_MEDIA_ITEMS.map(item => item.href),
|
|
16
|
+
additionalMenuItems = _defaultValues.ADDITIONAL_MENU_ITEMS,
|
|
17
|
+
donateUrl = _defaultValues.DONATE_URL,
|
|
18
|
+
privacyPolicyUrl = _defaultValues.PRIVACY_POLICY
|
|
19
|
+
}) => {
|
|
20
|
+
const socialMediaConfig = (0, _generateSocialMediaConfig.generateSocialMediaConfig)(socialMediaHrefs);
|
|
21
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("footer", {
|
|
22
|
+
className: "w-full bg-neutral-white",
|
|
23
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
24
|
+
className: "py-12 desktop:py-14 w-full bg-neutral-white px-(--margin-mobile) desktop:px-(--margin-desktop)",
|
|
25
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
26
|
+
className: "max-w-300 mx-auto",
|
|
27
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
28
|
+
className: "gap-8 flex flex-col items-center desktop:flex-row desktop:justify-between",
|
|
29
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
30
|
+
className: "max-w-100 gap-6 flex w-full flex-col items-center desktop:items-start",
|
|
31
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
32
|
+
className: "flex items-center",
|
|
33
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
34
|
+
href: "/",
|
|
35
|
+
className: "flex items-center",
|
|
36
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_image.default, {
|
|
37
|
+
src: "/assets/images/footer-logo.svg",
|
|
38
|
+
alt: "\u5C11\u5E74\u5831\u5C0E\u8005",
|
|
39
|
+
loading: "lazy",
|
|
40
|
+
width: 238,
|
|
41
|
+
height: 26
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
45
|
+
className: "prose-p2 w-full text-neutral-900",
|
|
46
|
+
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"
|
|
47
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_button.default, {
|
|
48
|
+
size: 44,
|
|
49
|
+
variant: "secondary",
|
|
50
|
+
asChild: true,
|
|
51
|
+
className: "w-75",
|
|
52
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
53
|
+
href: donateUrl,
|
|
54
|
+
target: "_blank",
|
|
55
|
+
rel: "noreferrer",
|
|
56
|
+
children: "\u8D0A\u52A9\u6211\u5011"
|
|
57
|
+
})
|
|
58
|
+
})]
|
|
59
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
60
|
+
className: "gap-6 flex flex-row",
|
|
61
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
62
|
+
className: "gap-2 flex flex-col",
|
|
63
|
+
children: additionalMenuItems.slice(0, 4).map(link => /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
64
|
+
href: link.href,
|
|
65
|
+
className: "prose-p2-bold min-w-30 text-neutral-900 transition-colors duration-200 hover:text-red-400",
|
|
66
|
+
target: link.external ? '_blank' : undefined,
|
|
67
|
+
rel: link.external ? 'noopener noreferrer' : undefined,
|
|
68
|
+
children: link.label
|
|
69
|
+
}, link.label))
|
|
70
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
71
|
+
className: "gap-2 flex flex-col",
|
|
72
|
+
children: additionalMenuItems.slice(4).map(link => /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
73
|
+
href: link.href,
|
|
74
|
+
className: "prose-p2-bold min-w-30 text-neutral-900 transition-colors duration-200 hover:text-red-400",
|
|
75
|
+
target: link.external ? '_blank' : undefined,
|
|
76
|
+
rel: link.external ? 'noopener noreferrer' : undefined,
|
|
77
|
+
children: link.label
|
|
78
|
+
}, link.label))
|
|
79
|
+
})]
|
|
80
|
+
})]
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
84
|
+
className: "py-6 w-full bg-red-400 px-(--margin-mobile) desktop:px-(--margin-desktop)",
|
|
85
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
86
|
+
className: "max-w-300 mx-auto",
|
|
87
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
88
|
+
className: "gap-5 desktop:gap-4 flex flex-col items-center desktop:flex-row desktop:justify-between",
|
|
89
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
90
|
+
className: "gap-4 order-1 flex items-center desktop:order-2",
|
|
91
|
+
children: socialMediaConfig.map(social => {
|
|
92
|
+
const IconComponent = social.icon;
|
|
93
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("a", {
|
|
94
|
+
href: social.href,
|
|
95
|
+
className: "relative text-neutral-white transition-colors duration-200 hover:text-neutral-200",
|
|
96
|
+
target: "_blank",
|
|
97
|
+
rel: "noopener noreferrer",
|
|
98
|
+
"aria-label": social.label,
|
|
99
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
100
|
+
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",
|
|
101
|
+
children: IconComponent && /*#__PURE__*/(0, _jsxRuntime.jsx)(IconComponent, {})
|
|
102
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
103
|
+
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"
|
|
104
|
+
})]
|
|
105
|
+
}, social.label);
|
|
106
|
+
})
|
|
107
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
108
|
+
className: "prose-p3 text-center text-neutral-white desktop:order-1 desktop:text-left",
|
|
109
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
110
|
+
className: "desktop:inline",
|
|
111
|
+
children: ["\u885B\u90E8\u6551\u5B57\u7B2C1131363879\u865F\uFF5C\u52F8\u52DF\u671F\u9593 2025/1/1~12/31", /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
112
|
+
className: "hidden desktop:inline",
|
|
113
|
+
children: "\uFF5C"
|
|
114
|
+
})]
|
|
115
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
116
|
+
className: "desktop:inline",
|
|
117
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
118
|
+
href: privacyPolicyUrl,
|
|
119
|
+
target: "_blank",
|
|
120
|
+
className: "desktop:ml-1 text-neutral-white underline",
|
|
121
|
+
rel: "noopener noreferrer",
|
|
122
|
+
children: "\u96B1\u79C1\u653F\u7B56"
|
|
123
|
+
}), "\uFF5C", /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
124
|
+
href: "https://www.twreporter.org/a/license-footer",
|
|
125
|
+
target: "_blank",
|
|
126
|
+
className: "desktop:ml-1 text-neutral-white underline",
|
|
127
|
+
rel: "noopener noreferrer",
|
|
128
|
+
children: "\u8A31\u53EF\u5354\u8B70"
|
|
129
|
+
})]
|
|
130
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
131
|
+
className: "hidden desktop:inline",
|
|
132
|
+
children: "\uFF5C"
|
|
133
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
134
|
+
className: "desktop:inline",
|
|
135
|
+
children: ["Copyright \xA9 ", new Date().getFullYear(), " The Reporter"]
|
|
136
|
+
})]
|
|
137
|
+
})]
|
|
138
|
+
})
|
|
139
|
+
})
|
|
140
|
+
})]
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
var _default = exports.default = Footer;
|
|
144
|
+
//# sourceMappingURL=footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","_image","_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 Image from 'next/image'\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 <Image\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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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MenuItem } from '../types';
|
|
2
|
+
type DesktopHeaderProps = {
|
|
3
|
+
onHamburgerOverlayOpen: () => void;
|
|
4
|
+
keywords: string[];
|
|
5
|
+
compactMode: boolean;
|
|
6
|
+
postTitle?: string;
|
|
7
|
+
hide: boolean;
|
|
8
|
+
searchPlaceholder: string;
|
|
9
|
+
subscribeUrl: string;
|
|
10
|
+
menuItems: MenuItem[];
|
|
11
|
+
};
|
|
12
|
+
export declare function DesktopHeader({ onHamburgerOverlayOpen, keywords, compactMode, postTitle, hide, searchPlaceholder, subscribeUrl, menuItems, }: DesktopHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=desktop-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-header.d.ts","sourceRoot":"","sources":["../../src/header/desktop-header.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AASxC,KAAK,kBAAkB,GAAG;IACxB,sBAAsB,EAAE,MAAM,IAAI,CAAA;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,iBAAiB,EAAE,MAAM,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAA;CACtB,CAAA;AAED,wBAAgB,aAAa,CAAC,EAC5B,sBAAsB,EACtB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,IAAI,EACJ,iBAAiB,EACjB,YAAY,EACZ,SAAS,GACV,EAAE,kBAAkB,2CA+FpB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.DesktopHeader = DesktopHeader;
|
|
8
|
+
var _icons = require("../icons");
|
|
9
|
+
var _cn = require("../utils/cn");
|
|
10
|
+
var _sharedComponents = require("./shared-components");
|
|
11
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
|
+
function DesktopHeader({
|
|
13
|
+
onHamburgerOverlayOpen,
|
|
14
|
+
keywords,
|
|
15
|
+
compactMode,
|
|
16
|
+
postTitle,
|
|
17
|
+
hide,
|
|
18
|
+
searchPlaceholder,
|
|
19
|
+
subscribeUrl,
|
|
20
|
+
menuItems
|
|
21
|
+
}) {
|
|
22
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
23
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
24
|
+
className: "hidden h-(--desktop-header-height) desktop:block"
|
|
25
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
26
|
+
className: (0, _cn.cn)('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', compactMode && 'bg-white', hide ? 'pointer-events-none -translate-y-full opacity-0' : 'translate-y-0 pointer-events-auto opacity-100'),
|
|
27
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
28
|
+
className: "px-12 hidden w-full bg-transparent desktop:block",
|
|
29
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
30
|
+
className: "max-w-300 mx-auto",
|
|
31
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
32
|
+
className: (0, _cn.cn)('px-4 flex items-center justify-between py-[18px]', compactMode && 'py-2.5'),
|
|
33
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
34
|
+
className: 'flex items-center',
|
|
35
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
36
|
+
className: (0, _cn.cn)('ease-in-out overflow-hidden transition-all duration-500', compactMode ? 'translate-x-0 max-w-12 mr-4 w-auto scale-100 opacity-100' : '-translate-x-2 w-0 max-w-0 pointer-events-none scale-95 opacity-0'),
|
|
37
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedComponents.HamburgerButton, {
|
|
38
|
+
onHamburgerOverlayOpen: onHamburgerOverlayOpen,
|
|
39
|
+
small: true
|
|
40
|
+
})
|
|
41
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
42
|
+
className: compactMode ? 'mr-12' : 'mr-8',
|
|
43
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedComponents.LogoLink, {
|
|
44
|
+
compactMode: compactMode
|
|
45
|
+
})
|
|
46
|
+
}), postTitle && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
47
|
+
className: "pr-12 block",
|
|
48
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
49
|
+
className: "prose-p2 font-medium tracking-wide max-w-124 overflow-hidden text-ellipsis whitespace-nowrap text-neutral-900",
|
|
50
|
+
children: postTitle
|
|
51
|
+
})
|
|
52
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
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
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
55
|
+
className: "prose-p2 font-medium translate-y-0 inline-block tracking-[2.2px]! text-nowrap text-neutral-900 opacity-100",
|
|
56
|
+
children: "\u7406\u89E3\u4E16\u754C \xD7 \u53C3\u8207\u672A\u4F86"
|
|
57
|
+
})
|
|
58
|
+
})]
|
|
59
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
60
|
+
className: "gap-4 flex items-center",
|
|
61
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedComponents.ActionButtons, {
|
|
62
|
+
tags: keywords,
|
|
63
|
+
hideCtaButtons: compactMode,
|
|
64
|
+
searchPlaceholder: searchPlaceholder,
|
|
65
|
+
subscribeUrl: subscribeUrl
|
|
66
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
67
|
+
href: "/login",
|
|
68
|
+
className: "w-8 h-8 flex items-center justify-center rounded-full text-red-400 transition-colors duration-200 hover:text-red-500",
|
|
69
|
+
"aria-label": "\u767B\u5165",
|
|
70
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.LoginIcon, {})
|
|
71
|
+
})]
|
|
72
|
+
})]
|
|
73
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
74
|
+
className: (0, _cn.cn)('ease-in-out overflow-hidden transition-all duration-500', compactMode ? 'h-0 -translate-y-4 opacity-0' : 'translate-y-0 h-auto opacity-100'),
|
|
75
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedComponents.BottomNavigation, {
|
|
76
|
+
onHamburgerOverlayOpen: onHamburgerOverlayOpen,
|
|
77
|
+
menuItems: menuItems
|
|
78
|
+
})
|
|
79
|
+
})]
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
})]
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=desktop-header.js.map
|
|
@@ -0,0 +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=\"prose-p2 font-medium tracking-wide max-w-124 overflow-hidden 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=\"prose-p2 font-medium translate-y-0 inline-block 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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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
type HeaderContextType = {
|
|
3
|
+
postTitle?: string;
|
|
4
|
+
setPostTitle: (title?: string) => void;
|
|
5
|
+
isMenuOpen: boolean;
|
|
6
|
+
openMenu: () => void;
|
|
7
|
+
closeMenu: () => void;
|
|
8
|
+
keywords: string[];
|
|
9
|
+
};
|
|
10
|
+
export declare function HeaderProvider({ children, keywords, }: {
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
keywords: string[];
|
|
13
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare function useHeaderContext(): HeaderContextType | undefined;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=header-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-context.d.ts","sourceRoot":"","sources":["../../src/header/header-context.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,SAAS,EAKV,MAAM,OAAO,CAAA;AAEd,KAAK,iBAAiB,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAID,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,2CAuBA;AAED,wBAAgB,gBAAgB,kCAG/B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.HeaderProvider = HeaderProvider;
|
|
8
|
+
exports.useHeaderContext = useHeaderContext;
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
|
+
const HeaderContext = /*#__PURE__*/(0, _react.createContext)(undefined);
|
|
12
|
+
function HeaderProvider({
|
|
13
|
+
children,
|
|
14
|
+
keywords
|
|
15
|
+
}) {
|
|
16
|
+
const [postTitle, setPostTitle] = (0, _react.useState)(undefined);
|
|
17
|
+
const [isMenuOpen, setIsMenuOpen] = (0, _react.useState)(false);
|
|
18
|
+
const openMenu = (0, _react.useCallback)(() => setIsMenuOpen(true), []);
|
|
19
|
+
const closeMenu = (0, _react.useCallback)(() => setIsMenuOpen(false), []);
|
|
20
|
+
const contextValue = (0, _react.useMemo)(() => ({
|
|
21
|
+
postTitle,
|
|
22
|
+
setPostTitle,
|
|
23
|
+
isMenuOpen,
|
|
24
|
+
openMenu,
|
|
25
|
+
closeMenu,
|
|
26
|
+
keywords
|
|
27
|
+
}), [postTitle, setPostTitle, isMenuOpen, openMenu, closeMenu, keywords]);
|
|
28
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(HeaderContext.Provider, {
|
|
29
|
+
value: contextValue,
|
|
30
|
+
children: children
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function useHeaderContext() {
|
|
34
|
+
const context = (0, _react.useContext)(HeaderContext);
|
|
35
|
+
return context;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=header-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-context.js","names":["Object","defineProperty","exports","value","HeaderProvider","useHeaderContext","_react","require","_jsxRuntime","HeaderContext","createContext","undefined","children","keywords","postTitle","setPostTitle","useState","isMenuOpen","setIsMenuOpen","openMenu","useCallback","closeMenu","contextValue","useMemo","jsx","Provider","context","useContext"],"sources":["../../src/header/header-context.tsx"],"sourcesContent":["'use client'\nimport {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from 'react'\n\ntype HeaderContextType = {\n postTitle?: string\n setPostTitle: (title?: string) => void\n isMenuOpen: boolean\n openMenu: () => void\n closeMenu: () => void\n keywords: string[]\n}\n\nconst HeaderContext = createContext<HeaderContextType | undefined>(undefined)\n\nexport function HeaderProvider({\n children,\n keywords,\n}: {\n children: ReactNode\n keywords: string[]\n}) {\n const [postTitle, setPostTitle] = useState<string | undefined>(undefined)\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const openMenu = useCallback(() => setIsMenuOpen(true), [])\n const closeMenu = useCallback(() => setIsMenuOpen(false), [])\n\n const contextValue = useMemo(\n () => ({\n postTitle,\n setPostTitle,\n isMenuOpen,\n openMenu,\n closeMenu,\n keywords,\n }),\n [postTitle, setPostTitle, isMenuOpen, openMenu, closeMenu, keywords]\n )\n\n return (\n <HeaderContext.Provider value={contextValue}>\n {children}\n </HeaderContext.Provider>\n )\n}\n\nexport function useHeaderContext() {\n const context = useContext(HeaderContext)\n return context\n}\n"],"mappings":";AAAA,YAAY;;AAAAA,MAAA,CAAAC,cAAA,CAAAC,OAAA;EAAAC,KAAA;AAAA;AAAAD,OAAA,CAAAE,cAAA,GAAAA,cAAA;AAAAF,OAAA,CAAAG,gBAAA,GAAAA,gBAAA;AACZ,IAAAC,MAAA,GAAAC,OAAA;AAOc,IAAAC,WAAA,GAAAD,OAAA;AAWd,MAAME,aAAa,gBAAG,IAAAC,oBAAa,EAAgCC,SAAS,CAAC;AAEtE,SAASP,cAAcA,CAAC;EAC7BQ,QAAQ;EACRC;AAIF,CAAC,EAAE;EACD,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAC,eAAQ,EAAqBL,SAAS,CAAC;EACzE,MAAM,CAACM,UAAU,EAAEC,aAAa,CAAC,GAAG,IAAAF,eAAQ,EAAC,KAAK,CAAC;EACnD,MAAMG,QAAQ,GAAG,IAAAC,kBAAW,EAAC,MAAMF,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;EAC3D,MAAMG,SAAS,GAAG,IAAAD,kBAAW,EAAC,MAAMF,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;EAE7D,MAAMI,YAAY,GAAG,IAAAC,cAAO,EAC1B,OAAO;IACLT,SAAS;IACTC,YAAY;IACZE,UAAU;IACVE,QAAQ;IACRE,SAAS;IACTR;EACF,CAAC,CAAC,EACF,CAACC,SAAS,EAAEC,YAAY,EAAEE,UAAU,EAAEE,QAAQ,EAAEE,SAAS,EAAER,QAAQ,CACrE,CAAC;EAED,oBACE,IAAAL,WAAA,CAAAgB,GAAA,EAACf,aAAa,CAACgB,QAAQ;IAACtB,KAAK,EAAEmB,YAAa;IAAAV,QAAA,EACzCA;EAAQ,CACa,CAAC;AAE7B;AAEO,SAASP,gBAAgBA,CAAA,EAAG;EACjC,MAAMqB,OAAO,GAAG,IAAAC,iBAAU,EAAClB,aAAa,CAAC;EACzC,OAAOiB,OAAO;AAChB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MenuItem, SocialMediaHrefs } from '../types';
|
|
2
|
+
type HeaderProps = {
|
|
3
|
+
menuItems?: MenuItem[];
|
|
4
|
+
additionalMenuItems?: MenuItem[];
|
|
5
|
+
socialMediaHrefs?: SocialMediaHrefs;
|
|
6
|
+
searchPlaceholder?: string;
|
|
7
|
+
subscribeUrl?: string;
|
|
8
|
+
donateUrl?: string;
|
|
9
|
+
};
|
|
10
|
+
declare function Header({ menuItems, additionalMenuItems, socialMediaHrefs, searchPlaceholder, subscribeUrl, donateUrl, }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export default Header;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/header/index.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAM1D,KAAK,WAAW,GAAG;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAA;IACtB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,CAAA;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,iBAAS,MAAM,CAAC,EACd,SAAsB,EACtB,mBAA2C,EAC3C,gBAA8D,EAC9D,iBAAsC,EACtC,YAA4B,EAC5B,SAAsB,GACvB,EAAE,WAAW,2CAwDb;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
var _defaultValues = require("../constants/default-values");
|
|
10
|
+
var _hooks = require("../hooks");
|
|
11
|
+
var _desktopHeader = require("./desktop-header");
|
|
12
|
+
var _headerContext = require("./header-context");
|
|
13
|
+
var _menu = _interopRequireDefault(require("./menu"));
|
|
14
|
+
var _mobileHeader = require("./mobile-header");
|
|
15
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
|
+
function Header({
|
|
17
|
+
menuItems = _defaultValues.MENU_ITEMS,
|
|
18
|
+
additionalMenuItems = _defaultValues.ADDITIONAL_MENU_ITEMS,
|
|
19
|
+
socialMediaHrefs = _defaultValues.SOCIAL_MEDIA_ITEMS.map(item => item.href),
|
|
20
|
+
searchPlaceholder = _defaultValues.SEARCH_PLACEHOLDER,
|
|
21
|
+
subscribeUrl = _defaultValues.SUBSCRIBE_URL,
|
|
22
|
+
donateUrl = _defaultValues.DONATE_URL
|
|
23
|
+
}) {
|
|
24
|
+
const context = (0, _headerContext.useHeaderContext)();
|
|
25
|
+
const postTitle = context?.postTitle;
|
|
26
|
+
const isMenuOpen = context?.isMenuOpen || false;
|
|
27
|
+
const openMenu = context?.openMenu;
|
|
28
|
+
const closeMenu = context?.closeMenu;
|
|
29
|
+
const keywords = context?.keywords || [];
|
|
30
|
+
const onHamburgerOverlayOpen = () => {
|
|
31
|
+
openMenu?.();
|
|
32
|
+
};
|
|
33
|
+
const onCloseMenu = () => {
|
|
34
|
+
closeMenu?.();
|
|
35
|
+
};
|
|
36
|
+
const isMobile = (0, _hooks.useMediaQuery)('(max-width: 768px)');
|
|
37
|
+
const isAtTop = (0, _hooks.useIsAtTop)();
|
|
38
|
+
const scrollingLevel = (0, _hooks.useScrollLevel)({
|
|
39
|
+
scrollDownDistance: 150,
|
|
40
|
+
throttleThreshold: 50
|
|
41
|
+
});
|
|
42
|
+
const isScrollingDown = scrollingLevel === _hooks.ScrollLevel.DOWN_HIDDEN;
|
|
43
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
44
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_desktopHeader.DesktopHeader, {
|
|
45
|
+
onHamburgerOverlayOpen: onHamburgerOverlayOpen,
|
|
46
|
+
keywords: keywords,
|
|
47
|
+
hide: isScrollingDown,
|
|
48
|
+
compactMode: !isAtTop,
|
|
49
|
+
postTitle: isAtTop ? undefined : postTitle,
|
|
50
|
+
searchPlaceholder: searchPlaceholder,
|
|
51
|
+
subscribeUrl: subscribeUrl,
|
|
52
|
+
menuItems: menuItems
|
|
53
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_mobileHeader.MobileHeader, {
|
|
54
|
+
onCloseMenu: onCloseMenu,
|
|
55
|
+
showCloseButtonWhenMenuOpen: isMobile,
|
|
56
|
+
onHamburgerOverlayOpen: onHamburgerOverlayOpen,
|
|
57
|
+
isMenuOpen: isMenuOpen
|
|
58
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_menu.default, {
|
|
59
|
+
isOpen: isMenuOpen,
|
|
60
|
+
onClose: closeMenu || (() => undefined),
|
|
61
|
+
keywords: keywords,
|
|
62
|
+
menuItems: menuItems,
|
|
63
|
+
additionalMenuItems: additionalMenuItems,
|
|
64
|
+
socialMediaHrefs: socialMediaHrefs,
|
|
65
|
+
donateUrl: donateUrl,
|
|
66
|
+
subscribeUrl: subscribeUrl,
|
|
67
|
+
searchPlaceholder: searchPlaceholder
|
|
68
|
+
})]
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
var _default = exports.default = Header;
|
|
72
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_interopRequireDefault","require","Object","defineProperty","exports","value","default","_defaultValues","_hooks","_desktopHeader","_headerContext","_menu","_mobileHeader","_jsxRuntime","Header","menuItems","MENU_ITEMS","additionalMenuItems","ADDITIONAL_MENU_ITEMS","socialMediaHrefs","SOCIAL_MEDIA_ITEMS","map","item","href","searchPlaceholder","SEARCH_PLACEHOLDER","subscribeUrl","SUBSCRIBE_URL","donateUrl","DONATE_URL","context","useHeaderContext","postTitle","isMenuOpen","openMenu","closeMenu","keywords","onHamburgerOverlayOpen","onCloseMenu","isMobile","useMediaQuery","isAtTop","useIsAtTop","scrollingLevel","useScrollLevel","scrollDownDistance","throttleThreshold","isScrollingDown","ScrollLevel","DOWN_HIDDEN","jsxs","Fragment","children","jsx","DesktopHeader","hide","compactMode","undefined","MobileHeader","showCloseButtonWhenMenuOpen","isOpen","onClose","_default"],"sources":["../../src/header/index.tsx"],"sourcesContent":["'use client'\nimport {\n ADDITIONAL_MENU_ITEMS,\n DONATE_URL,\n MENU_ITEMS,\n SEARCH_PLACEHOLDER,\n SOCIAL_MEDIA_ITEMS,\n SUBSCRIBE_URL,\n} from '../constants/default-values'\nimport {\n ScrollLevel,\n useIsAtTop,\n useMediaQuery,\n useScrollLevel,\n} from '../hooks'\nimport type { MenuItem, SocialMediaHrefs } from '../types'\nimport { DesktopHeader } from './desktop-header'\nimport { useHeaderContext } from './header-context'\nimport Menu from './menu'\nimport { MobileHeader } from './mobile-header'\n\ntype HeaderProps = {\n menuItems?: MenuItem[]\n additionalMenuItems?: MenuItem[]\n socialMediaHrefs?: SocialMediaHrefs\n searchPlaceholder?: string\n subscribeUrl?: string\n donateUrl?: string\n}\n\nfunction Header({\n menuItems = MENU_ITEMS,\n additionalMenuItems = ADDITIONAL_MENU_ITEMS,\n socialMediaHrefs = SOCIAL_MEDIA_ITEMS.map((item) => item.href),\n searchPlaceholder = SEARCH_PLACEHOLDER,\n subscribeUrl = SUBSCRIBE_URL,\n donateUrl = DONATE_URL,\n}: HeaderProps) {\n const context = useHeaderContext()\n const postTitle = context?.postTitle\n const isMenuOpen = context?.isMenuOpen || false\n const openMenu = context?.openMenu\n const closeMenu = context?.closeMenu\n const keywords = context?.keywords || []\n const onHamburgerOverlayOpen = () => {\n openMenu?.()\n }\n\n const onCloseMenu = () => {\n closeMenu?.()\n }\n\n const isMobile = useMediaQuery('(max-width: 768px)')\n\n const isAtTop = useIsAtTop()\n const scrollingLevel = useScrollLevel({\n scrollDownDistance: 150,\n throttleThreshold: 50,\n })\n\n const isScrollingDown = scrollingLevel === ScrollLevel.DOWN_HIDDEN\n\n return (\n <>\n <DesktopHeader\n onHamburgerOverlayOpen={onHamburgerOverlayOpen}\n keywords={keywords}\n hide={isScrollingDown}\n compactMode={!isAtTop}\n postTitle={isAtTop ? undefined : postTitle}\n searchPlaceholder={searchPlaceholder}\n subscribeUrl={subscribeUrl}\n menuItems={menuItems}\n />\n <MobileHeader\n onCloseMenu={onCloseMenu}\n showCloseButtonWhenMenuOpen={isMobile}\n onHamburgerOverlayOpen={onHamburgerOverlayOpen}\n isMenuOpen={isMenuOpen}\n />\n <Menu\n isOpen={isMenuOpen}\n onClose={closeMenu || (() => undefined)}\n keywords={keywords}\n menuItems={menuItems}\n additionalMenuItems={additionalMenuItems}\n socialMediaHrefs={socialMediaHrefs}\n donateUrl={donateUrl}\n subscribeUrl={subscribeUrl}\n searchPlaceholder={searchPlaceholder}\n />\n </>\n )\n}\n\nexport default Header\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MenuItem } from '../../types';
|
|
2
|
+
declare function MenuItemGroup({ isMenuOpen, menuItems, }: {
|
|
3
|
+
isMenuOpen: boolean;
|
|
4
|
+
menuItems: MenuItem[];
|
|
5
|
+
}): import("react/jsx-runtime").JSX.Element[];
|
|
6
|
+
export default MenuItemGroup;
|
|
7
|
+
//# sourceMappingURL=header-menu-item-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-menu-item-group.d.ts","sourceRoot":"","sources":["../../../src/header/menu/header-menu-item-group.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGtC,iBAAS,aAAa,CAAC,EACrB,UAAU,EACV,SAAS,GACV,EAAE;IACD,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,QAAQ,EAAE,CAAA;CACtB,6CAuBA;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
var _headerMenuItem = _interopRequireDefault(require("./header-menu-item"));
|
|
10
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
|
+
function MenuItemGroup({
|
|
12
|
+
isMenuOpen,
|
|
13
|
+
menuItems
|
|
14
|
+
}) {
|
|
15
|
+
const [currentExpandedItem, setCurrentExpandedItem] = (0, _react.useState)(null);
|
|
16
|
+
const handleClick = label => {
|
|
17
|
+
setCurrentExpandedItem(label);
|
|
18
|
+
};
|
|
19
|
+
(0, _react.useEffect)(() => {
|
|
20
|
+
if (!isMenuOpen) {
|
|
21
|
+
setCurrentExpandedItem(null);
|
|
22
|
+
}
|
|
23
|
+
}, [isMenuOpen]);
|
|
24
|
+
return menuItems.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_headerMenuItem.default, {
|
|
25
|
+
...item,
|
|
26
|
+
isExpanded: currentExpandedItem === item.label,
|
|
27
|
+
onExpand: handleClick
|
|
28
|
+
}, item.label));
|
|
29
|
+
}
|
|
30
|
+
var _default = exports.default = MenuItemGroup;
|
|
31
|
+
//# sourceMappingURL=header-menu-item-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-menu-item-group.js","names":["_react","require","_headerMenuItem","_interopRequireDefault","_jsxRuntime","MenuItemGroup","isMenuOpen","menuItems","currentExpandedItem","setCurrentExpandedItem","useState","handleClick","label","useEffect","map","item","jsx","default","isExpanded","onExpand","_default","exports"],"sources":["../../../src/header/menu/header-menu-item-group.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\n\nimport { MenuItem } from '../../types'\nimport HeaderMenuItem from './header-menu-item'\n\nfunction MenuItemGroup({\n isMenuOpen,\n menuItems,\n}: {\n isMenuOpen: boolean\n menuItems: MenuItem[]\n}) {\n const [currentExpandedItem, setCurrentExpandedItem] = useState<string | null>(\n null\n )\n\n const handleClick = (label: string | null) => {\n setCurrentExpandedItem(label)\n }\n\n useEffect(() => {\n if (!isMenuOpen) {\n setCurrentExpandedItem(null)\n }\n }, [isMenuOpen])\n\n return menuItems.map((item) => (\n <HeaderMenuItem\n key={item.label}\n {...item}\n isExpanded={currentExpandedItem === item.label}\n onExpand={handleClick}\n />\n ))\n}\n\nexport default MenuItemGroup\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAGA,IAAAC,eAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA+C,IAAAG,WAAA,GAAAH,OAAA;AAE/C,SAASI,aAAaA,CAAC;EACrBC,UAAU;EACVC;AAIF,CAAC,EAAE;EACD,MAAM,CAACC,mBAAmB,EAAEC,sBAAsB,CAAC,GAAG,IAAAC,eAAQ,EAC5D,IACF,CAAC;EAED,MAAMC,WAAW,GAAIC,KAAoB,IAAK;IAC5CH,sBAAsB,CAACG,KAAK,CAAC;EAC/B,CAAC;EAED,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAI,CAACP,UAAU,EAAE;MACfG,sBAAsB,CAAC,IAAI,CAAC;IAC9B;EACF,CAAC,EAAE,CAACH,UAAU,CAAC,CAAC;EAEhB,OAAOC,SAAS,CAACO,GAAG,CAAEC,IAAI,iBACxB,IAAAX,WAAA,CAAAY,GAAA,EAACd,eAAA,CAAAe,OAAc;IAAA,GAETF,IAAI;IACRG,UAAU,EAAEV,mBAAmB,KAAKO,IAAI,CAACH,KAAM;IAC/CO,QAAQ,EAAER;EAAY,GAHjBI,IAAI,CAACH,KAIX,CACF,CAAC;AACJ;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAAJ,OAAA,GAEcZ,aAAa"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MenuItem } from '../../types';
|
|
2
|
+
type HeaderMenuItemProps = {
|
|
3
|
+
contentClassName?: string;
|
|
4
|
+
isExpanded?: boolean;
|
|
5
|
+
onExpand?: (label: string | null) => void;
|
|
6
|
+
} & MenuItem;
|
|
7
|
+
declare function HeaderMenuItem({ label, href, subItems, external, showIcon, icon, isExpanded, contentClassName, onExpand, }: HeaderMenuItemProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default HeaderMenuItem;
|
|
9
|
+
//# sourceMappingURL=header-menu-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-menu-item.d.ts","sourceRoot":"","sources":["../../../src/header/menu/header-menu-item.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAItC,KAAK,mBAAmB,GAAG;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CAC1C,GAAG,QAAQ,CAAA;AAEZ,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,gBAAgB,EAChB,QAAQ,GACT,EAAE,mBAAmB,2CA6GrB;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _cn = require("../../utils/cn");
|
|
8
|
+
var _headerContext = require("../header-context");
|
|
9
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
|
+
function HeaderMenuItem({
|
|
11
|
+
label,
|
|
12
|
+
href,
|
|
13
|
+
subItems,
|
|
14
|
+
external,
|
|
15
|
+
showIcon,
|
|
16
|
+
icon,
|
|
17
|
+
isExpanded,
|
|
18
|
+
contentClassName,
|
|
19
|
+
onExpand
|
|
20
|
+
}) {
|
|
21
|
+
const hasSubItems = subItems && subItems.length > 0;
|
|
22
|
+
const context = (0, _headerContext.useHeaderContext)();
|
|
23
|
+
const closeMenu = context?.closeMenu;
|
|
24
|
+
const handleExpand = () => {
|
|
25
|
+
if (hasSubItems) {
|
|
26
|
+
onExpand?.(isExpanded ? null : label);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
30
|
+
className: (0, _cn.cn)('group flex w-full items-center justify-between text-neutral-900 transition-colors duration-100 group-hover:text-neutral-900', contentClassName),
|
|
31
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
32
|
+
className: "gap-2 flex items-center",
|
|
33
|
+
children: [showIcon && icon && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
34
|
+
className: "w-4 h-4 flex items-center justify-center",
|
|
35
|
+
children: icon
|
|
36
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
37
|
+
className: (0, _cn.cn)('prose-p1-bold', isExpanded && 'text-red-400 group-hover:text-red-400'),
|
|
38
|
+
children: label
|
|
39
|
+
})]
|
|
40
|
+
}), hasSubItems && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
41
|
+
className: (0, _cn.cn)('w-6 h-6 flex items-center justify-center transition-transform', isExpanded && 'rotate-180 text-red-400 group-hover:text-red-400'),
|
|
42
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
|
|
43
|
+
width: "14",
|
|
44
|
+
height: "7",
|
|
45
|
+
viewBox: "0 0 14 7",
|
|
46
|
+
fill: "none",
|
|
47
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
|
|
48
|
+
d: "M1 1L7 6L13 1",
|
|
49
|
+
stroke: "currentColor",
|
|
50
|
+
strokeWidth: "2.5",
|
|
51
|
+
strokeLinecap: "round",
|
|
52
|
+
strokeLinejoin: "round"
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
})]
|
|
56
|
+
});
|
|
57
|
+
if (hasSubItems) {
|
|
58
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
59
|
+
className: "w-full",
|
|
60
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
|
|
61
|
+
onClick: handleExpand,
|
|
62
|
+
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",
|
|
63
|
+
children: content
|
|
64
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
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
|
+
children: subItems.map((subItem, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
67
|
+
href: subItem.href,
|
|
68
|
+
className: "px-6 tablet:px-12 py-2 pl-12 prose-p2 font-medium block transition-colors duration-200 hover:bg-neutral-black/5 hover:text-neutral-900 active:bg-neutral-black/10",
|
|
69
|
+
onClick: closeMenu,
|
|
70
|
+
children: subItem.label
|
|
71
|
+
}, index))
|
|
72
|
+
})]
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (external) {
|
|
76
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
77
|
+
href: href,
|
|
78
|
+
target: "_blank",
|
|
79
|
+
rel: "noopener noreferrer",
|
|
80
|
+
className: 'px-6 tablet:px-8 py-2 block transition-colors duration-200 hover:bg-neutral-black/5 active:bg-neutral-black/10',
|
|
81
|
+
children: content
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
|
|
85
|
+
href: href,
|
|
86
|
+
className: 'px-6 tablet:px-8 py-2 block transition-colors duration-200 hover:bg-neutral-black/5 active:bg-neutral-black/10',
|
|
87
|
+
onClick: closeMenu,
|
|
88
|
+
children: content
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
var _default = exports.default = HeaderMenuItem;
|
|
92
|
+
//# sourceMappingURL=header-menu-item.js.map
|