portosaurus 2.0.3 → 2.1.0
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/bin/portosaurus.mjs +14 -327
- package/package.json +16 -11
- package/src/cli/build.mjs +43 -0
- package/src/cli/dev.mjs +31 -0
- package/src/cli/init.mjs +135 -0
- package/src/cli/serve.mjs +30 -0
- package/src/core/buildDocuConfig.mjs +664 -0
- package/src/core/{themePlugin.mjs → plugins/themePlugin.mjs} +1 -1
- package/src/template/.github/workflows/deploy.yml +52 -0
- package/src/template/.nojekyll +0 -0
- package/src/template/README.md +58 -0
- package/src/template/blog/authors.yml +1 -1
- package/src/template/blog/welcome.md +1 -1
- package/src/template/config.js +40 -23
- package/src/template/package.json +20 -0
- package/src/template/static/img/svg/icon-blog.svg +2 -0
- package/src/template/static/img/svg/icon-note.svg +2 -0
- package/src/{components → theme/components}/AboutSection/index.js +22 -13
- package/src/{components → theme/components}/AboutSection/styles.module.css +59 -48
- package/src/{components → theme/components}/ContactSection/index.js +31 -24
- package/src/{components → theme/components}/ContactSection/styles.module.css +31 -26
- package/src/{components → theme/components}/ExperienceSection/index.js +12 -7
- package/src/{components → theme/components}/ExperienceSection/styles.module.css +23 -20
- package/src/{components → theme/components}/HeroSection/index.js +9 -11
- package/src/{components → theme/components}/HeroSection/styles.module.css +44 -32
- package/src/{components → theme/components}/NoteIndex/index.js +10 -3
- package/src/{components → theme/components}/Preview/components/PreviewHeader.js +14 -8
- package/src/{components → theme/components}/Preview/components/Triggers/Pv.js +32 -7
- package/src/{components → theme/components}/Preview/components/Triggers/SrcPv.js +1 -5
- package/src/theme/components/Preview/index.js +3 -0
- package/src/{components → theme/components}/ProjectsSection/index.js +279 -224
- package/src/{components → theme/components}/ProjectsSection/styles.module.css +21 -17
- package/src/{components → theme/components}/ScrollToTop/index.js +18 -21
- package/src/{components → theme/components}/ScrollToTop/styles.module.css +10 -9
- package/src/theme/components/SocialLinks/index.js +125 -0
- package/src/{components → theme/components}/SocialLinks/styles.module.css +9 -7
- package/src/{components → theme/components}/Tooltip/index.js +4 -1
- package/src/theme/config/iconMappings.js +465 -0
- package/src/theme/config/metaTags.js +239 -0
- package/src/theme/config/prism.js +179 -0
- package/src/theme/config/sidebar.js +17 -0
- package/src/{css → theme/css}/bootstrap.css +0 -1
- package/src/theme/css/catppuccin.css +618 -0
- package/src/{css → theme/css}/custom.css +3 -9
- package/src/{css → theme/css}/tasks.css +43 -37
- package/src/theme/{MDXComponents.js → overrides/MDXComponents.js} +3 -3
- package/src/theme/{Root.js → overrides/Root.js} +2 -4
- package/src/{pages → theme/pages}/index.js +23 -39
- package/src/theme/pages/notes.js +83 -0
- package/src/{pages → theme/pages}/tasks.js +115 -56
- package/src/{core/client-utils → theme/utils}/HashNavigation.js +60 -49
- package/src/{core/client-utils → theme/utils}/updateTitle.js +21 -25
- package/src/{core/build-utils → utils/build}/cssUtils.mjs +5 -3
- package/src/{core/build-utils → utils/build}/generateFavicon.mjs +44 -12
- package/src/{core/build-utils → utils/build}/generateRobotsTxt.mjs +4 -3
- package/src/{core/build-utils → utils/build}/iconExtractor.mjs +7 -3
- package/src/utils/build/imageDownloader.mjs +159 -0
- package/src/{core/build-utils → utils/build}/imageProcessor.mjs +5 -6
- package/src/utils/helpers.mjs +153 -0
- package/src/utils/logger.mjs +53 -0
- package/src/utils/packageManager.mjs +88 -0
- package/src/components/Preview/index.js +0 -3
- package/src/components/SocialLinks/index.js +0 -130
- package/src/config/iconMappings.js +0 -329
- package/src/config/metaTags.js +0 -240
- package/src/config/prism.js +0 -179
- package/src/config/sidebar.js +0 -20
- package/src/core/build-utils/imageDownloader.mjs +0 -98
- package/src/core/createDocuConf.mjs +0 -472
- package/src/core/defaults.mjs +0 -67
- package/src/core/logger.mjs +0 -17
- package/src/core/packageManager.mjs +0 -72
- package/src/css/catppuccin.css +0 -632
- package/src/pages/notes.js +0 -87
- /package/src/template/notes/{welcome.md → welcome.mdx} +0 -0
- /package/src/{components → theme/components}/NoteIndex/styles.module.css +0 -0
- /package/src/{components → theme/components}/Preview/components/FeedbackStates.js +0 -0
- /package/src/{components → theme/components}/Preview/components/FileTabs.js +0 -0
- /package/src/{components → theme/components}/Preview/components/Triggers/index.js +0 -0
- /package/src/{components → theme/components}/Preview/components/ViewerWindow.js +0 -0
- /package/src/{components → theme/components}/Preview/hooks/useDeepLinkHash.js +0 -0
- /package/src/{components → theme/components}/Preview/hooks/useDockLayout.js +0 -0
- /package/src/{components → theme/components}/Preview/hooks/useFileFetch.js +0 -0
- /package/src/{components → theme/components}/Preview/renderers/CodeRenderer.js +0 -0
- /package/src/{components → theme/components}/Preview/renderers/ImageRenderer.js +0 -0
- /package/src/{components → theme/components}/Preview/renderers/PdfRenderer.js +0 -0
- /package/src/{components → theme/components}/Preview/renderers/WebRenderer.js +0 -0
- /package/src/{components → theme/components}/Preview/state/index.js +0 -0
- /package/src/{components → theme/components}/Preview/styles.module.css +0 -0
- /package/src/{components → theme/components}/Preview/utils/index.js +0 -0
- /package/src/{components → theme/components}/Tooltip/styles.module.css +0 -0
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
|
|
2
|
-
import { iconMap } from "
|
|
2
|
+
import { iconMap } from "../../config/iconMappings";
|
|
3
3
|
import { FaQuestionCircle } from "react-icons/fa";
|
|
4
|
-
import styles from
|
|
4
|
+
import styles from "./styles.module.css";
|
|
5
5
|
|
|
6
6
|
const sortEmail = (links) => {
|
|
7
7
|
return [...links].sort((a, b) => {
|
|
8
|
-
const isEmailA =
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const isEmailA =
|
|
9
|
+
a.url?.startsWith("mailto:") ||
|
|
10
|
+
a.icon?.toLowerCase().includes("email") ||
|
|
11
|
+
a.name?.toLowerCase().includes("email");
|
|
11
12
|
|
|
12
|
-
const isEmailB =
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
const isEmailB =
|
|
14
|
+
b.url?.startsWith("mailto:") ||
|
|
15
|
+
b.icon?.toLowerCase().includes("email") ||
|
|
16
|
+
b.name?.toLowerCase().includes("email");
|
|
15
17
|
|
|
16
18
|
if (isEmailA && !isEmailB) return -1;
|
|
17
19
|
if (!isEmailA && isEmailB) return 1;
|
|
@@ -24,31 +26,40 @@ export default function ContactSection({ id, className, title, subtitle }) {
|
|
|
24
26
|
const { siteConfig } = useDocusaurusContext();
|
|
25
27
|
const { customFields } = siteConfig;
|
|
26
28
|
let socialLinks = customFields.socialLinks.links || [];
|
|
27
|
-
|
|
29
|
+
|
|
28
30
|
socialLinks = sortEmail(socialLinks);
|
|
29
31
|
|
|
30
32
|
return (
|
|
31
|
-
<div
|
|
33
|
+
<div
|
|
34
|
+
id={id}
|
|
35
|
+
className={`${styles.contactSection} ${className || ""}`}
|
|
36
|
+
role="region"
|
|
37
|
+
aria-label="Contact section"
|
|
38
|
+
>
|
|
32
39
|
<div className={styles.contactContainer}>
|
|
33
40
|
<div className={styles.contactHeader}>
|
|
34
|
-
<h2 className={styles.contactTitle}>
|
|
35
|
-
{title || "Get In Touch"}
|
|
36
|
-
</h2>
|
|
41
|
+
<h2 className={styles.contactTitle}>{title || "Get In Touch"}</h2>
|
|
37
42
|
<p className={styles.contactSubtitle}>
|
|
38
|
-
{subtitle ||
|
|
43
|
+
{subtitle ||
|
|
44
|
+
"Feel free to reach out for collaborations, questions, or just to say hello!"}
|
|
39
45
|
</p>
|
|
40
46
|
</div>
|
|
41
|
-
|
|
47
|
+
|
|
42
48
|
{/* SocialCard */}
|
|
43
49
|
<div className={styles.gridWrapper}>
|
|
44
|
-
<div
|
|
50
|
+
<div
|
|
51
|
+
className={styles.socialGrid}
|
|
52
|
+
role="list"
|
|
53
|
+
aria-label="Social media and contact links"
|
|
54
|
+
>
|
|
45
55
|
{socialLinks.map((social, index) => {
|
|
46
56
|
const iconData = iconMap[social.icon] || {};
|
|
47
|
-
|
|
57
|
+
|
|
48
58
|
const name = social.name || "?";
|
|
49
59
|
const Icon = iconData.icon || FaQuestionCircle;
|
|
50
60
|
const iconColor = iconData.color || "var(--ifm-color-primary)";
|
|
51
|
-
const description =
|
|
61
|
+
const description =
|
|
62
|
+
name === "?" ? "" : social.desc || `Connect with me on ${name}`;
|
|
52
63
|
const url = social.url;
|
|
53
64
|
|
|
54
65
|
return (
|
|
@@ -70,12 +81,8 @@ export default function ContactSection({ id, className, title, subtitle }) {
|
|
|
70
81
|
<Icon aria-hidden="true" />
|
|
71
82
|
</div>
|
|
72
83
|
)}
|
|
73
|
-
<h3 className={styles.socialTitle}>
|
|
74
|
-
|
|
75
|
-
</h3>
|
|
76
|
-
<p className={styles.socialDesc}>
|
|
77
|
-
{description}
|
|
78
|
-
</p>
|
|
84
|
+
<h3 className={styles.socialTitle}>{name}</h3>
|
|
85
|
+
<p className={styles.socialDesc}>{description}</p>
|
|
79
86
|
</a>
|
|
80
87
|
);
|
|
81
88
|
})}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
|
|
2
1
|
/* Animations */
|
|
3
2
|
@keyframes slideUp {
|
|
4
|
-
from {
|
|
3
|
+
from {
|
|
5
4
|
opacity: 0;
|
|
6
|
-
transform: translateY(20px);
|
|
5
|
+
transform: translateY(20px);
|
|
7
6
|
}
|
|
8
|
-
to {
|
|
7
|
+
to {
|
|
9
8
|
opacity: 1;
|
|
10
|
-
transform: translateY(0);
|
|
9
|
+
transform: translateY(0);
|
|
11
10
|
}
|
|
12
11
|
}
|
|
13
12
|
|
|
@@ -22,7 +21,6 @@
|
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
|
|
26
24
|
/* Contact Section styles */
|
|
27
25
|
.contactSection {
|
|
28
26
|
scroll-margin-top: var(--ifm-scroll-margin-top);
|
|
@@ -70,7 +68,6 @@
|
|
|
70
68
|
animation: slideUp 0.5s ease-out 0.2s forwards;
|
|
71
69
|
}
|
|
72
70
|
|
|
73
|
-
|
|
74
71
|
/* SocialCard */
|
|
75
72
|
.gridWrapper {
|
|
76
73
|
display: flex;
|
|
@@ -98,7 +95,10 @@
|
|
|
98
95
|
padding: 1.3rem 1.2rem;
|
|
99
96
|
background-color: var(--ifm-card-background-color);
|
|
100
97
|
opacity: 0;
|
|
101
|
-
transition:
|
|
98
|
+
transition:
|
|
99
|
+
transform 0.3s ease,
|
|
100
|
+
box-shadow 0.3s ease,
|
|
101
|
+
background-color 0.3s ease;
|
|
102
102
|
animation: fadeIn 0.5s ease-out forwards;
|
|
103
103
|
animation-delay: calc(0.1s + (var(--card-index, 0) * 0.1s));
|
|
104
104
|
box-shadow: var(--ifm-global-shadow-lw);
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
.socialCard::after {
|
|
125
|
-
content:
|
|
125
|
+
content: "";
|
|
126
126
|
position: absolute;
|
|
127
127
|
bottom: 0;
|
|
128
128
|
left: 0;
|
|
@@ -140,7 +140,9 @@
|
|
|
140
140
|
font-size: 3.5rem;
|
|
141
141
|
margin-bottom: 0.3rem;
|
|
142
142
|
color: var(--ifm-color-primary);
|
|
143
|
-
transition:
|
|
143
|
+
transition:
|
|
144
|
+
color 0.3s ease,
|
|
145
|
+
transform 0.3s ease;
|
|
144
146
|
}
|
|
145
147
|
|
|
146
148
|
.socialCard:hover .socialIcon {
|
|
@@ -160,7 +162,7 @@
|
|
|
160
162
|
}
|
|
161
163
|
|
|
162
164
|
.socialTitle::after {
|
|
163
|
-
content:
|
|
165
|
+
content: "";
|
|
164
166
|
position: absolute;
|
|
165
167
|
bottom: 0;
|
|
166
168
|
left: 50%;
|
|
@@ -181,7 +183,8 @@
|
|
|
181
183
|
width: 100%;
|
|
182
184
|
}
|
|
183
185
|
|
|
184
|
-
.socialTitle:hover,
|
|
186
|
+
.socialTitle:hover,
|
|
187
|
+
.socialDesc:hover {
|
|
185
188
|
text-decoration: none;
|
|
186
189
|
}
|
|
187
190
|
|
|
@@ -190,7 +193,7 @@
|
|
|
190
193
|
.socialCard {
|
|
191
194
|
width: 140px;
|
|
192
195
|
}
|
|
193
|
-
|
|
196
|
+
|
|
194
197
|
.socialGrid {
|
|
195
198
|
gap: 1.1rem;
|
|
196
199
|
}
|
|
@@ -200,7 +203,7 @@
|
|
|
200
203
|
.socialCard {
|
|
201
204
|
width: 150px;
|
|
202
205
|
}
|
|
203
|
-
|
|
206
|
+
|
|
204
207
|
.socialGrid {
|
|
205
208
|
gap: 1rem;
|
|
206
209
|
max-width: 100%;
|
|
@@ -212,43 +215,43 @@
|
|
|
212
215
|
scroll-margin-top: 70px;
|
|
213
216
|
padding: 0.5rem 0 4rem;
|
|
214
217
|
}
|
|
215
|
-
|
|
218
|
+
|
|
216
219
|
.contactContainer {
|
|
217
220
|
padding: 0;
|
|
218
221
|
}
|
|
219
|
-
|
|
222
|
+
|
|
220
223
|
.contactHeader {
|
|
221
224
|
margin-bottom: 1.2rem;
|
|
222
225
|
margin-top: 0rem;
|
|
223
226
|
}
|
|
224
|
-
|
|
227
|
+
|
|
225
228
|
.contactTitle {
|
|
226
229
|
font-size: 2.2rem;
|
|
227
230
|
}
|
|
228
|
-
|
|
231
|
+
|
|
229
232
|
.contactSubtitle {
|
|
230
233
|
font-size: 0.9rem;
|
|
231
234
|
}
|
|
232
|
-
|
|
235
|
+
|
|
233
236
|
.socialCard {
|
|
234
237
|
width: 150px;
|
|
235
238
|
min-height: 150px;
|
|
236
239
|
padding: 1.2rem 1.2rem;
|
|
237
240
|
}
|
|
238
|
-
|
|
241
|
+
|
|
239
242
|
.socialIcon {
|
|
240
243
|
font-size: 3rem;
|
|
241
244
|
margin-bottom: 0.25rem;
|
|
242
245
|
}
|
|
243
|
-
|
|
246
|
+
|
|
244
247
|
.socialTitle {
|
|
245
248
|
font-size: 1.5rem;
|
|
246
249
|
}
|
|
247
|
-
|
|
250
|
+
|
|
248
251
|
.socialGrid {
|
|
249
252
|
padding: 0 1rem;
|
|
250
253
|
}
|
|
251
|
-
|
|
254
|
+
|
|
252
255
|
.gridWrapper {
|
|
253
256
|
margin-top: 1rem;
|
|
254
257
|
}
|
|
@@ -259,7 +262,7 @@
|
|
|
259
262
|
scroll-margin-top: var(--ifm-scroll-margin-top-mobile);
|
|
260
263
|
padding: 0rem 0 3rem;
|
|
261
264
|
}
|
|
262
|
-
|
|
265
|
+
|
|
263
266
|
.contactContainer {
|
|
264
267
|
padding: 0;
|
|
265
268
|
}
|
|
@@ -300,7 +303,7 @@
|
|
|
300
303
|
top: 1.5px;
|
|
301
304
|
}
|
|
302
305
|
|
|
303
|
-
.socialTitle,
|
|
306
|
+
.socialTitle,
|
|
304
307
|
.socialDesc,
|
|
305
308
|
.socialCard::after {
|
|
306
309
|
display: none;
|
|
@@ -316,7 +319,9 @@
|
|
|
316
319
|
}
|
|
317
320
|
|
|
318
321
|
@media (prefers-reduced-motion: reduce) {
|
|
319
|
-
.contactTitle,
|
|
322
|
+
.contactTitle,
|
|
323
|
+
.contactSubtitle,
|
|
324
|
+
.socialCard {
|
|
320
325
|
animation: none !important;
|
|
321
326
|
transition: none !important;
|
|
322
327
|
}
|
|
@@ -1,22 +1,27 @@
|
|
|
1
|
-
import styles from
|
|
1
|
+
import styles from "./styles.module.css";
|
|
2
2
|
|
|
3
3
|
export default function ExperienceSection({ id, className, title, subtitle }) {
|
|
4
4
|
return (
|
|
5
|
-
<div
|
|
5
|
+
<div
|
|
6
|
+
id={id}
|
|
7
|
+
className={`${styles.experienceSection} ${className || ""}`}
|
|
8
|
+
role="region"
|
|
9
|
+
aria-label="Experience section"
|
|
10
|
+
>
|
|
6
11
|
<div className={styles.experienceContainer}>
|
|
7
12
|
<div className={styles.experienceHeader}>
|
|
8
|
-
<h2 className={styles.experienceTitle}>
|
|
9
|
-
{title || "Experience"}
|
|
10
|
-
</h2>
|
|
13
|
+
<h2 className={styles.experienceTitle}>{title || "Experience"}</h2>
|
|
11
14
|
<p className={styles.experienceSubtitle}>
|
|
12
15
|
{subtitle || "My professional journey and work experience"}
|
|
13
16
|
</p>
|
|
14
17
|
</div>
|
|
15
|
-
|
|
18
|
+
|
|
16
19
|
<div className={styles.noticeWrapper}>
|
|
17
20
|
<div className={styles.noticeBox} role="status" aria-live="polite">
|
|
18
21
|
<p className={styles.noticeText}>Coming Soon!</p>
|
|
19
|
-
<p className={styles.noticeDesc}>
|
|
22
|
+
<p className={styles.noticeDesc}>
|
|
23
|
+
This section is under construction.
|
|
24
|
+
</p>
|
|
20
25
|
</div>
|
|
21
26
|
</div>
|
|
22
27
|
</div>
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
.experienceSection {
|
|
3
2
|
scroll-margin-top: var(--ifm-scroll-margin-top);
|
|
4
3
|
min-height: calc(100vh - 45px);
|
|
@@ -60,7 +59,9 @@
|
|
|
60
59
|
border: 1px solid var(--ifm-color-emphasis-300);
|
|
61
60
|
animation: fadeIn 0.5s ease-out 0.3s forwards;
|
|
62
61
|
opacity: 0;
|
|
63
|
-
transition:
|
|
62
|
+
transition:
|
|
63
|
+
transform 0.3s ease,
|
|
64
|
+
background-color 0.3s ease;
|
|
64
65
|
width: 100%;
|
|
65
66
|
max-width: 600px;
|
|
66
67
|
}
|
|
@@ -85,13 +86,13 @@
|
|
|
85
86
|
|
|
86
87
|
/* Animations */
|
|
87
88
|
@keyframes slideUp {
|
|
88
|
-
from {
|
|
89
|
+
from {
|
|
89
90
|
opacity: 0;
|
|
90
|
-
transform: translateY(20px);
|
|
91
|
+
transform: translateY(20px);
|
|
91
92
|
}
|
|
92
|
-
to {
|
|
93
|
+
to {
|
|
93
94
|
opacity: 1;
|
|
94
|
-
transform: translateY(0);
|
|
95
|
+
transform: translateY(0);
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
98
|
|
|
@@ -112,24 +113,24 @@
|
|
|
112
113
|
scroll-margin-top: 70px;
|
|
113
114
|
padding: 0.5rem 0 4rem;
|
|
114
115
|
}
|
|
115
|
-
|
|
116
|
+
|
|
116
117
|
.experienceContainer {
|
|
117
118
|
padding: 0 1.5rem;
|
|
118
119
|
}
|
|
119
|
-
|
|
120
|
+
|
|
120
121
|
.experienceHeader {
|
|
121
122
|
margin-bottom: 1.5rem;
|
|
122
|
-
margin-top: -2.5rem;
|
|
123
|
+
margin-top: -2.5rem;
|
|
123
124
|
}
|
|
124
|
-
|
|
125
|
+
|
|
125
126
|
.experienceTitle {
|
|
126
127
|
font-size: 2.2rem;
|
|
127
128
|
}
|
|
128
|
-
|
|
129
|
+
|
|
129
130
|
.experienceSubtitle {
|
|
130
131
|
font-size: 0.9rem;
|
|
131
132
|
}
|
|
132
|
-
|
|
133
|
+
|
|
133
134
|
.noticeText {
|
|
134
135
|
font-size: 1.8rem;
|
|
135
136
|
}
|
|
@@ -140,40 +141,42 @@
|
|
|
140
141
|
scroll-margin-top: var(--ifm-scroll-margin-top-mobile);
|
|
141
142
|
padding: 0rem 0 3rem;
|
|
142
143
|
}
|
|
143
|
-
|
|
144
|
+
|
|
144
145
|
.experienceContainer {
|
|
145
146
|
padding: 0 1rem;
|
|
146
147
|
}
|
|
147
|
-
|
|
148
|
+
|
|
148
149
|
.experienceHeader {
|
|
149
150
|
margin-bottom: 1.2rem;
|
|
150
151
|
margin-top: -2rem;
|
|
151
152
|
}
|
|
152
|
-
|
|
153
|
+
|
|
153
154
|
.experienceTitle {
|
|
154
155
|
font-size: 1.9rem;
|
|
155
156
|
}
|
|
156
|
-
|
|
157
|
+
|
|
157
158
|
.experienceSubtitle {
|
|
158
159
|
font-size: 0.9rem;
|
|
159
160
|
max-width: 90%;
|
|
160
161
|
}
|
|
161
|
-
|
|
162
|
+
|
|
162
163
|
.noticeText {
|
|
163
164
|
font-size: 1.5rem;
|
|
164
165
|
}
|
|
165
|
-
|
|
166
|
+
|
|
166
167
|
.noticeDesc {
|
|
167
168
|
font-size: 0.9rem;
|
|
168
169
|
}
|
|
169
170
|
}
|
|
170
171
|
|
|
171
172
|
@media (prefers-reduced-motion: reduce) {
|
|
172
|
-
.experienceTitle,
|
|
173
|
+
.experienceTitle,
|
|
174
|
+
.experienceSubtitle,
|
|
175
|
+
.noticeBox {
|
|
173
176
|
animation: none !important;
|
|
174
177
|
transition: none !important;
|
|
175
178
|
}
|
|
176
|
-
|
|
179
|
+
|
|
177
180
|
.noticeBox {
|
|
178
181
|
opacity: 1;
|
|
179
182
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
|
|
2
|
-
import SocialLinks from "
|
|
3
|
-
import styles from
|
|
2
|
+
import SocialLinks from "../SocialLinks/index.js";
|
|
3
|
+
import styles from "./styles.module.css";
|
|
4
4
|
|
|
5
5
|
export default function HeroSection({ id, className }) {
|
|
6
6
|
const { siteConfig } = useDocusaurusContext();
|
|
@@ -16,10 +16,10 @@ export default function HeroSection({ id, className }) {
|
|
|
16
16
|
|
|
17
17
|
return (
|
|
18
18
|
<div
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
className={`${styles.hero} ${className || ""}`}
|
|
20
|
+
id={id}
|
|
21
|
+
role="region"
|
|
22
|
+
aria-label="Hero section"
|
|
23
23
|
>
|
|
24
24
|
<div className={styles.container}>
|
|
25
25
|
<div className={styles.leftSection}>
|
|
@@ -33,17 +33,15 @@ export default function HeroSection({ id, className }) {
|
|
|
33
33
|
<h2 className={styles.profession}>{profession}</h2>
|
|
34
34
|
<span className={styles.subtitle}>.</span>
|
|
35
35
|
</div>
|
|
36
|
-
<p className={styles.description}>
|
|
37
|
-
{description}
|
|
38
|
-
</p>
|
|
36
|
+
<p className={styles.description}>{description}</p>
|
|
39
37
|
<div className={styles.actionRow}>
|
|
40
38
|
<div className={styles.cta}>
|
|
41
|
-
<a
|
|
39
|
+
<a
|
|
42
40
|
href="#about"
|
|
43
41
|
className={styles.ctaButton}
|
|
44
42
|
aria-label="Learn more about me"
|
|
45
43
|
>
|
|
46
|
-
{learnMoreButtonText}
|
|
44
|
+
{learnMoreButtonText}
|
|
47
45
|
</a>
|
|
48
46
|
</div>
|
|
49
47
|
<SocialLinks />
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
/* Animations */
|
|
2
2
|
@keyframes fadeIn {
|
|
3
|
-
from {
|
|
4
|
-
|
|
3
|
+
from {
|
|
4
|
+
opacity: 0;
|
|
5
|
+
}
|
|
6
|
+
to {
|
|
7
|
+
opacity: 1;
|
|
8
|
+
}
|
|
5
9
|
}
|
|
6
10
|
|
|
7
11
|
@keyframes slideUp {
|
|
8
|
-
from {
|
|
12
|
+
from {
|
|
9
13
|
opacity: 0;
|
|
10
|
-
transform: translateY(20px);
|
|
14
|
+
transform: translateY(20px);
|
|
11
15
|
}
|
|
12
|
-
to {
|
|
16
|
+
to {
|
|
13
17
|
opacity: 1;
|
|
14
|
-
transform: translateY(0);
|
|
18
|
+
transform: translateY(0);
|
|
15
19
|
}
|
|
16
20
|
}
|
|
17
21
|
|
|
@@ -48,7 +52,6 @@
|
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
|
|
51
|
-
|
|
52
55
|
/* Base layout */
|
|
53
56
|
.hero {
|
|
54
57
|
display: flex;
|
|
@@ -68,7 +71,7 @@
|
|
|
68
71
|
width: 90%;
|
|
69
72
|
margin: 0 auto;
|
|
70
73
|
margin-bottom: 2rem;
|
|
71
|
-
padding: 0 2rem;
|
|
74
|
+
padding: 0 2rem;
|
|
72
75
|
}
|
|
73
76
|
|
|
74
77
|
/* Left section */
|
|
@@ -76,7 +79,7 @@
|
|
|
76
79
|
flex: 1;
|
|
77
80
|
text-align: left;
|
|
78
81
|
padding-right: 3rem;
|
|
79
|
-
padding-left: 1rem;
|
|
82
|
+
padding-left: 1rem;
|
|
80
83
|
animation: slideInLeft 0.8s ease-out 0.2s both;
|
|
81
84
|
}
|
|
82
85
|
|
|
@@ -108,7 +111,7 @@
|
|
|
108
111
|
}
|
|
109
112
|
|
|
110
113
|
.title::after {
|
|
111
|
-
content:
|
|
114
|
+
content: "";
|
|
112
115
|
position: absolute;
|
|
113
116
|
width: 0;
|
|
114
117
|
height: 3px;
|
|
@@ -164,7 +167,7 @@
|
|
|
164
167
|
}
|
|
165
168
|
|
|
166
169
|
.profession::after {
|
|
167
|
-
content:
|
|
170
|
+
content: "";
|
|
168
171
|
position: absolute;
|
|
169
172
|
width: 0;
|
|
170
173
|
height: 3px;
|
|
@@ -207,13 +210,15 @@
|
|
|
207
210
|
.ctaButton {
|
|
208
211
|
display: inline-block;
|
|
209
212
|
padding: 0.5rem 1.2rem;
|
|
210
|
-
font-size: 0.95rem;
|
|
213
|
+
font-size: 0.95rem;
|
|
211
214
|
font-weight: 500;
|
|
212
215
|
text-decoration: none;
|
|
213
216
|
color: var(--ifm-background-color);
|
|
214
217
|
background-color: var(--ifm-color-primary);
|
|
215
218
|
border-radius: var(--ifm-global-radius);
|
|
216
|
-
transition:
|
|
219
|
+
transition:
|
|
220
|
+
all 0.3s ease,
|
|
221
|
+
transform 0.2s ease;
|
|
217
222
|
border: 2px solid var(--ifm-color-primary);
|
|
218
223
|
cursor: pointer;
|
|
219
224
|
outline: none;
|
|
@@ -242,18 +247,20 @@
|
|
|
242
247
|
display: flex;
|
|
243
248
|
justify-content: flex-end;
|
|
244
249
|
margin-top: 0;
|
|
245
|
-
padding-right: 2rem;
|
|
250
|
+
padding-right: 2rem;
|
|
246
251
|
animation: slideInRight 0.8s ease-out 0.3s both;
|
|
247
252
|
}
|
|
248
253
|
|
|
249
254
|
.profilePic {
|
|
250
|
-
height: 270px;
|
|
255
|
+
height: 270px;
|
|
251
256
|
border-radius: 20%;
|
|
252
257
|
object-fit: cover;
|
|
253
258
|
box-shadow: 0 10px 25px var(--ifm-shadow-color);
|
|
254
259
|
margin-top: -30px;
|
|
255
|
-
margin-right: 2rem;
|
|
256
|
-
transition:
|
|
260
|
+
margin-right: 2rem;
|
|
261
|
+
transition:
|
|
262
|
+
transform 0.5s ease,
|
|
263
|
+
box-shadow 0.5s ease;
|
|
257
264
|
animation: gentleAppear 0.8s ease-out both;
|
|
258
265
|
will-change: transform;
|
|
259
266
|
position: relative;
|
|
@@ -266,7 +273,6 @@
|
|
|
266
273
|
|
|
267
274
|
/* Responsive styles for sections */
|
|
268
275
|
@media (max-width: 768px) {
|
|
269
|
-
|
|
270
276
|
.intro {
|
|
271
277
|
animation: slideUp 0.6s ease-out 0.4s both;
|
|
272
278
|
}
|
|
@@ -393,19 +399,17 @@
|
|
|
393
399
|
width: 25px;
|
|
394
400
|
height: 25px;
|
|
395
401
|
}
|
|
396
|
-
|
|
397
402
|
}
|
|
398
403
|
|
|
399
404
|
/* Responsive styles for mobile devices */
|
|
400
405
|
@media (max-width: 480px) {
|
|
401
|
-
|
|
402
406
|
.hero {
|
|
403
407
|
min-height: calc(100vh);
|
|
404
408
|
padding: 0.5rem 0 2rem;
|
|
405
409
|
}
|
|
406
410
|
|
|
407
411
|
.rightSection {
|
|
408
|
-
margin-top: -
|
|
412
|
+
margin-top: -2rem;
|
|
409
413
|
margin-bottom: 0;
|
|
410
414
|
}
|
|
411
415
|
|
|
@@ -417,8 +421,8 @@
|
|
|
417
421
|
box-shadow: 0 6px 15px var(--ifm-shadow-color);
|
|
418
422
|
}
|
|
419
423
|
|
|
420
|
-
.title {
|
|
421
|
-
font-size: 2.3rem;
|
|
424
|
+
.title {
|
|
425
|
+
font-size: 2.3rem;
|
|
422
426
|
animation: slideUp 0.5s ease-out 0.3s both;
|
|
423
427
|
}
|
|
424
428
|
|
|
@@ -427,13 +431,13 @@
|
|
|
427
431
|
animation: slideUp 0.5s ease-out 0.3s both;
|
|
428
432
|
}
|
|
429
433
|
|
|
430
|
-
.subtitle {
|
|
431
|
-
font-size: 1rem;
|
|
432
|
-
margin-right: 0.3rem;
|
|
434
|
+
.subtitle {
|
|
435
|
+
font-size: 1rem;
|
|
436
|
+
margin-right: 0.3rem;
|
|
433
437
|
}
|
|
434
438
|
|
|
435
|
-
.profession {
|
|
436
|
-
font-size: 1.5rem;
|
|
439
|
+
.profession {
|
|
440
|
+
font-size: 1.5rem;
|
|
437
441
|
}
|
|
438
442
|
|
|
439
443
|
.description {
|
|
@@ -462,10 +466,18 @@
|
|
|
462
466
|
|
|
463
467
|
/* Consolidated Accessibility */
|
|
464
468
|
@media (prefers-reduced-motion: reduce) {
|
|
465
|
-
.hero,
|
|
466
|
-
.
|
|
467
|
-
.
|
|
469
|
+
.hero,
|
|
470
|
+
.leftSection,
|
|
471
|
+
.rightSection,
|
|
472
|
+
.profilePic,
|
|
473
|
+
.intro,
|
|
474
|
+
.title,
|
|
475
|
+
.titleComma,
|
|
476
|
+
.subtitleWrapper,
|
|
477
|
+
.description,
|
|
478
|
+
.actionRow,
|
|
479
|
+
.socialIcons a {
|
|
468
480
|
animation: none !important;
|
|
469
481
|
transition: none !important;
|
|
470
482
|
}
|
|
471
|
-
}
|
|
483
|
+
}
|
|
@@ -2,9 +2,9 @@ import { useRef, useState, useEffect } from "react";
|
|
|
2
2
|
import Link from "@docusaurus/Link";
|
|
3
3
|
import useBaseUrl from "@docusaurus/useBaseUrl";
|
|
4
4
|
import { usePluginData } from "@docusaurus/useGlobalData";
|
|
5
|
-
import { iconMap } from "
|
|
5
|
+
import { iconMap } from "../../config/iconMappings.js";
|
|
6
6
|
import DocCardList from "@theme/DocCardList";
|
|
7
|
-
import Tooltip from "
|
|
7
|
+
import Tooltip from "../Tooltip/index.js";
|
|
8
8
|
|
|
9
9
|
import { FaBook } from "react-icons/fa";
|
|
10
10
|
import styles from "./styles.module.css";
|
|
@@ -85,7 +85,14 @@ function NoteCard({
|
|
|
85
85
|
}}
|
|
86
86
|
>
|
|
87
87
|
<strong style={{ fontSize: "0.95em" }}>{title}</strong>
|
|
88
|
-
<span
|
|
88
|
+
<span
|
|
89
|
+
style={{
|
|
90
|
+
fontSize: "0.85em",
|
|
91
|
+
opacity: 0.85,
|
|
92
|
+
fontWeight: 400,
|
|
93
|
+
textAlign: "left",
|
|
94
|
+
}}
|
|
95
|
+
>
|
|
89
96
|
{description}
|
|
90
97
|
</span>
|
|
91
98
|
</span>
|