portosaurus 0.14.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.

Potentially problematic release.


This version of portosaurus might be problematic. Click here for more details.

Files changed (64) hide show
  1. package/.vscode/snippets.code-snippets +79 -0
  2. package/AGENTS.md +37 -0
  3. package/GG/config.js +233 -0
  4. package/GG/package.json +14 -0
  5. package/GG/static/.nojekyll +0 -0
  6. package/GG/static/docusaurus-snippet.css +3 -0
  7. package/GG/static/img/icon-bg.png +0 -0
  8. package/GG/static/img/icon-old.png +0 -0
  9. package/GG/static/img/icon.png +0 -0
  10. package/GG/static/img/project-blank.png +0 -0
  11. package/GG/static/img/social-card.jpeg +0 -0
  12. package/LICENSE +674 -0
  13. package/README.md +57 -0
  14. package/bin/portosaurus.js +136 -0
  15. package/package.json +36 -0
  16. package/src/config/iconMappings.js +329 -0
  17. package/src/config/metaTags.js +240 -0
  18. package/src/config/prism.js +179 -0
  19. package/src/config/sidebar.js +20 -0
  20. package/src/configLoader.js +99 -0
  21. package/src/index.js +79 -0
  22. package/src/pages/index.js +98 -0
  23. package/src/pages/notes.js +88 -0
  24. package/src/pages/tasks.js +251 -0
  25. package/src/theme/components/AboutSection/index.js +67 -0
  26. package/src/theme/components/AboutSection/styles.module.css +492 -0
  27. package/src/theme/components/ContactSection/index.js +87 -0
  28. package/src/theme/components/ContactSection/styles.module.css +327 -0
  29. package/src/theme/components/ExperienceSection/index.js +25 -0
  30. package/src/theme/components/ExperienceSection/styles.module.css +180 -0
  31. package/src/theme/components/HeroSection/index.js +63 -0
  32. package/src/theme/components/HeroSection/styles.module.css +471 -0
  33. package/src/theme/components/NoteIndex/index.js +119 -0
  34. package/src/theme/components/NoteIndex/styles.module.css +143 -0
  35. package/src/theme/components/ProjectsSection/index.js +529 -0
  36. package/src/theme/components/ProjectsSection/styles.module.css +830 -0
  37. package/src/theme/components/ScrollToTop/index.js +98 -0
  38. package/src/theme/components/ScrollToTop/styles.module.css +96 -0
  39. package/src/theme/components/SocialLinks/index.js +129 -0
  40. package/src/theme/components/SocialLinks/styles.module.css +55 -0
  41. package/src/theme/components/Tooltip/index.js +30 -0
  42. package/src/theme/components/Tooltip/styles.module.css +92 -0
  43. package/src/theme/css/bootstrap.css +6 -0
  44. package/src/theme/css/catppuccin.css +632 -0
  45. package/src/theme/css/custom.css +186 -0
  46. package/src/theme/css/tasks.css +868 -0
  47. package/src/theme/staticLink/.nojekyll +0 -0
  48. package/src/theme/staticLink/docusaurus-snippet.css +3 -0
  49. package/src/theme/staticLink/img/icon-bg.png +0 -0
  50. package/src/theme/staticLink/img/icon-old.png +0 -0
  51. package/src/theme/staticLink/img/icon.png +0 -0
  52. package/src/theme/staticLink/img/project-blank.png +0 -0
  53. package/src/theme/staticLink/img/social-card.jpeg +0 -0
  54. package/src/utils/HashNavigation.js +250 -0
  55. package/src/utils/appVersion.js +27 -0
  56. package/src/utils/cssUtils.js +99 -0
  57. package/src/utils/filterEnabledItems.js +21 -0
  58. package/src/utils/generateFavicon.js +256 -0
  59. package/src/utils/generateRobotsTxt.js +97 -0
  60. package/src/utils/iconExtractor.js +159 -0
  61. package/src/utils/imageDownloader.js +88 -0
  62. package/src/utils/imageProcessor.js +134 -0
  63. package/src/utils/linkShortner.js +0 -0
  64. package/src/utils/updateTitle.js +107 -0
@@ -0,0 +1,327 @@
1
+
2
+ /* Animations */
3
+ @keyframes slideUp {
4
+ from {
5
+ opacity: 0;
6
+ transform: translateY(20px);
7
+ }
8
+ to {
9
+ opacity: 1;
10
+ transform: translateY(0);
11
+ }
12
+ }
13
+
14
+ @keyframes fadeIn {
15
+ from {
16
+ opacity: 0;
17
+ transform: translateY(20px);
18
+ }
19
+ to {
20
+ opacity: 1;
21
+ transform: translateY(0);
22
+ }
23
+ }
24
+
25
+
26
+ /* Contact Section styles */
27
+ .contactSection {
28
+ scroll-margin-top: var(--ifm-scroll-margin-top);
29
+ scroll-margin-top: 90px;
30
+ min-height: calc(100vh - 60px);
31
+ margin-bottom: 0;
32
+ width: 100%;
33
+ padding: 0rem 0 5rem;
34
+ background-color: var(--ifm-background-color);
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: center;
38
+ }
39
+
40
+ .contactContainer {
41
+ max-width: 1300px;
42
+ margin: 0 auto;
43
+ padding: 0;
44
+ width: 100%;
45
+ position: relative;
46
+ z-index: 1;
47
+ }
48
+
49
+ .contactHeader {
50
+ text-align: center;
51
+ margin-bottom: 1.5rem;
52
+ margin-top: 0rem;
53
+ }
54
+
55
+ .contactTitle {
56
+ font-size: 2.5rem;
57
+ font-weight: 600;
58
+ color: var(--ifm-color-primary);
59
+ margin-bottom: 0.6rem;
60
+ animation: slideUp 0.5s ease-out forwards;
61
+ position: relative;
62
+ display: inline-block;
63
+ }
64
+
65
+ .contactSubtitle {
66
+ font-size: 0.95rem;
67
+ color: var(--ifm-font-color-tertiary);
68
+ max-width: 600px;
69
+ margin: 0.05rem auto 0;
70
+ animation: slideUp 0.5s ease-out 0.2s forwards;
71
+ }
72
+
73
+
74
+ /* SocialCard */
75
+ .gridWrapper {
76
+ display: flex;
77
+ justify-content: center;
78
+ width: 100%;
79
+ margin-top: 1.2rem;
80
+ }
81
+
82
+ .socialGrid {
83
+ display: flex;
84
+ flex-wrap: wrap;
85
+ gap: 1.2rem;
86
+ justify-content: center;
87
+ margin: 0 auto;
88
+ margin-top: 0.9rem;
89
+ max-width: 1300px;
90
+ width: 100%;
91
+ padding: 0 0.5rem;
92
+ }
93
+
94
+ .socialCard {
95
+ width: 150px;
96
+ min-height: 160px;
97
+ border-radius: 8px;
98
+ padding: 1.3rem 1.2rem;
99
+ background-color: var(--ifm-card-background-color);
100
+ opacity: 0;
101
+ transition: transform 0.3s ease, box-shadow 0.3s ease, background-color 0.3s ease;
102
+ animation: fadeIn 0.5s ease-out forwards;
103
+ animation-delay: calc(0.1s + (var(--card-index, 0) * 0.1s));
104
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.08);
105
+ text-decoration: none;
106
+ display: flex;
107
+ flex-direction: column;
108
+ align-items: center;
109
+ justify-content: flex-start;
110
+ cursor: pointer;
111
+ position: relative;
112
+ --icon-hover-color: var(--ifm-color-primary);
113
+ text-align: center;
114
+ overflow: hidden;
115
+ }
116
+
117
+ .socialCard:hover {
118
+ transform: translateY(-5px);
119
+ box-shadow: 0 8px 15px rgba(0, 0, 0, 0.12);
120
+ background-color: var(--ifm-shadow-color);
121
+ text-decoration: none;
122
+ }
123
+
124
+ .socialCard::after {
125
+ content: '';
126
+ position: absolute;
127
+ bottom: 0;
128
+ left: 0;
129
+ width: 0;
130
+ height: 2px;
131
+ background-color: var(--ifm-color-primary);
132
+ transition: width 0.3s ease;
133
+ }
134
+
135
+ .socialCard:hover::after {
136
+ width: 100%;
137
+ }
138
+
139
+ .socialIcon {
140
+ font-size: 3.5rem;
141
+ margin-bottom: 0.3rem;
142
+ color: var(--ifm-color-primary);
143
+ transition: color 0.3s ease, transform 0.3s ease;
144
+ }
145
+
146
+ .socialCard:hover .socialIcon {
147
+ transform: scale(1.1);
148
+ color: var(--icon-hover-color);
149
+ }
150
+
151
+ .socialTitle {
152
+ font-size: 1.6rem;
153
+ font-weight: 700;
154
+ margin-bottom: 0.5rem;
155
+ color: var(--ifm-color-primary);
156
+ letter-spacing: 0.5px;
157
+ position: relative;
158
+ display: inline-block;
159
+ padding-bottom: 3px;
160
+ }
161
+
162
+ .socialTitle::after {
163
+ content: '';
164
+ position: absolute;
165
+ bottom: 0;
166
+ left: 50%;
167
+ transform: translateX(-50%);
168
+ width: 70px;
169
+ height: 1px;
170
+ background-color: var(--ifm-color-gray-400);
171
+ opacity: 0.15;
172
+ }
173
+
174
+ .socialDesc {
175
+ color: var(--ifm-font-color-tertiary);
176
+ font-size: 0.9rem;
177
+ margin-top: 0.3rem;
178
+ margin-bottom: 0;
179
+ opacity: 0.8;
180
+ text-align: center;
181
+ width: 100%;
182
+ }
183
+
184
+ .socialTitle:hover, .socialDesc:hover {
185
+ text-decoration: none;
186
+ }
187
+
188
+ /* Responsive styles */
189
+ @media (max-width: 1200px) {
190
+ .socialCard {
191
+ width: 140px;
192
+ }
193
+
194
+ .socialGrid {
195
+ gap: 1.1rem;
196
+ }
197
+ }
198
+
199
+ @media (max-width: 1024px) {
200
+ .socialCard {
201
+ width: 150px;
202
+ }
203
+
204
+ .socialGrid {
205
+ gap: 1rem;
206
+ max-width: 100%;
207
+ }
208
+ }
209
+
210
+ @media (max-width: 768px) {
211
+ .contactSection {
212
+ scroll-margin-top: 70px;
213
+ padding: 0.5rem 0 4rem;
214
+ }
215
+
216
+ .contactContainer {
217
+ padding: 0;
218
+ }
219
+
220
+ .contactHeader {
221
+ margin-bottom: 1.2rem;
222
+ margin-top: 0rem;
223
+ }
224
+
225
+ .contactTitle {
226
+ font-size: 2.2rem;
227
+ }
228
+
229
+ .contactSubtitle {
230
+ font-size: 0.9rem;
231
+ }
232
+
233
+ .socialCard {
234
+ width: 150px;
235
+ min-height: 150px;
236
+ padding: 1.2rem 1.2rem;
237
+ }
238
+
239
+ .socialIcon {
240
+ font-size: 3rem;
241
+ margin-bottom: 0.25rem;
242
+ }
243
+
244
+ .socialTitle {
245
+ font-size: 1.5rem;
246
+ }
247
+
248
+ .socialGrid {
249
+ padding: 0 1rem;
250
+ }
251
+
252
+ .gridWrapper {
253
+ margin-top: 1rem;
254
+ }
255
+ }
256
+
257
+ @media (max-width: 480px) {
258
+ .contactSection {
259
+ scroll-margin-top: var(--ifm-scroll-margin-top-mobile);
260
+ padding: 0rem 0 3rem;
261
+ }
262
+
263
+ .contactContainer {
264
+ padding: 0;
265
+ }
266
+
267
+ .contactHeader {
268
+ margin-bottom: 1rem;
269
+ margin-top: 0rem;
270
+ }
271
+
272
+ .contactTitle {
273
+ font-size: 1.9rem;
274
+ }
275
+
276
+ .contactSubtitle {
277
+ font-size: 0.9rem;
278
+ max-width: 90%;
279
+ }
280
+
281
+ .socialGrid {
282
+ gap: 1rem;
283
+ padding: 0 0.5rem;
284
+ }
285
+
286
+ .socialCard {
287
+ width: 60px;
288
+ height: 60px;
289
+ min-height: unset;
290
+ padding: 0;
291
+ border-radius: 12px;
292
+ justify-content: center;
293
+ align-items: center;
294
+ }
295
+
296
+ .socialIcon {
297
+ font-size: 2.5rem;
298
+ margin: 3px 0 0;
299
+ position: relative;
300
+ top: 1.5px;
301
+ }
302
+
303
+ .socialTitle,
304
+ .socialDesc,
305
+ .socialCard::after {
306
+ display: none;
307
+ }
308
+
309
+ .socialCard:hover {
310
+ transform: translateY(-3px) scale(1.05);
311
+ }
312
+
313
+ .gridWrapper {
314
+ margin-top: 0.8rem;
315
+ }
316
+ }
317
+
318
+ @media (prefers-reduced-motion: reduce) {
319
+ .contactTitle, .contactSubtitle, .socialCard {
320
+ animation: none !important;
321
+ transition: none !important;
322
+ }
323
+
324
+ .socialCard {
325
+ opacity: 1;
326
+ }
327
+ }
@@ -0,0 +1,25 @@
1
+ import styles from './styles.module.css';
2
+
3
+ export default function ExperienceSection({ id, className, title, subtitle }) {
4
+ return (
5
+ <div id={id} className={`${styles.experienceSection} ${className || ''}`} role="region" aria-label="Experience section">
6
+ <div className={styles.experienceContainer}>
7
+ <div className={styles.experienceHeader}>
8
+ <h2 className={styles.experienceTitle}>
9
+ {title || "Experience"}
10
+ </h2>
11
+ <p className={styles.experienceSubtitle}>
12
+ {subtitle || "My professional journey and work experience"}
13
+ </p>
14
+ </div>
15
+
16
+ <div className={styles.noticeWrapper}>
17
+ <div className={styles.noticeBox} role="status" aria-live="polite">
18
+ <p className={styles.noticeText}>Coming Soon!</p>
19
+ <p className={styles.noticeDesc}>This section is under construction.</p>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ );
25
+ }
@@ -0,0 +1,180 @@
1
+
2
+ .experienceSection {
3
+ scroll-margin-top: var(--ifm-scroll-margin-top);
4
+ min-height: calc(100vh - 45px);
5
+ margin-bottom: 0;
6
+ width: 100%;
7
+ padding: 0.02rem 0 4.5rem;
8
+ background-color: var(--ifm-background-color);
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ }
13
+
14
+ .experienceContainer {
15
+ max-width: 1300px;
16
+ margin: 0 auto;
17
+ padding: 0;
18
+ width: 100%;
19
+ position: relative;
20
+ z-index: 1;
21
+ }
22
+
23
+ .experienceHeader {
24
+ text-align: center;
25
+ margin-bottom: 2rem;
26
+ margin-top: -14rem;
27
+ }
28
+
29
+ .experienceTitle {
30
+ font-size: 2.5rem;
31
+ font-weight: 600;
32
+ color: var(--ifm-color-primary);
33
+ margin-bottom: 0.3rem;
34
+ animation: slideUp 0.5s ease-out forwards;
35
+ position: relative;
36
+ display: inline-block;
37
+ }
38
+
39
+ .experienceSubtitle {
40
+ font-size: 0.95rem;
41
+ color: var(--ifm-font-color-tertiary);
42
+ max-width: 600px;
43
+ margin: 0rem auto 0;
44
+ animation: slideUp 0.5s ease-out 0.2s forwards;
45
+ }
46
+
47
+ /* Notice Box Styles */
48
+ .noticeWrapper {
49
+ display: flex;
50
+ justify-content: center;
51
+ align-items: center;
52
+ margin-top: 9rem;
53
+ }
54
+
55
+ .noticeBox {
56
+ text-align: center;
57
+ padding: 2rem;
58
+ border-radius: 8px;
59
+ background-color: var(--ifm-shadow-color);
60
+ border: 1px solid var(--ifm-color-emphasis-300);
61
+ animation: fadeIn 0.5s ease-out 0.3s forwards;
62
+ opacity: 0;
63
+ transition: transform 0.3s ease, background-color 0.3s ease;
64
+ width: 100%;
65
+ max-width: 600px;
66
+ }
67
+
68
+ .noticeBox:hover {
69
+ transform: translateY(-3px);
70
+ background-color: var(--ifm-card-background-color);
71
+ }
72
+
73
+ .noticeText {
74
+ font-size: 2rem;
75
+ font-weight: 600;
76
+ color: var(--ifm-color-primary-dark);
77
+ margin-bottom: 0.8rem;
78
+ }
79
+
80
+ .noticeDesc {
81
+ font-size: 1rem;
82
+ color: var(--ifm-font-color-tertiary);
83
+ line-height: 1.4;
84
+ }
85
+
86
+ /* Animations */
87
+ @keyframes slideUp {
88
+ from {
89
+ opacity: 0;
90
+ transform: translateY(20px);
91
+ }
92
+ to {
93
+ opacity: 1;
94
+ transform: translateY(0);
95
+ }
96
+ }
97
+
98
+ @keyframes fadeIn {
99
+ from {
100
+ opacity: 0;
101
+ transform: translateY(20px);
102
+ }
103
+ to {
104
+ opacity: 1;
105
+ transform: translateY(0);
106
+ }
107
+ }
108
+
109
+ /* Responsive styles */
110
+ @media (max-width: 768px) {
111
+ .experienceSection {
112
+ scroll-margin-top: 70px;
113
+ padding: 0.5rem 0 4rem;
114
+ }
115
+
116
+ .experienceContainer {
117
+ padding: 0 1.5rem;
118
+ }
119
+
120
+ .experienceHeader {
121
+ margin-bottom: 1.5rem;
122
+ margin-top: -2.5rem;
123
+ }
124
+
125
+ .experienceTitle {
126
+ font-size: 2.2rem;
127
+ }
128
+
129
+ .experienceSubtitle {
130
+ font-size: 0.9rem;
131
+ }
132
+
133
+ .noticeText {
134
+ font-size: 1.8rem;
135
+ }
136
+ }
137
+
138
+ @media (max-width: 480px) {
139
+ .experienceSection {
140
+ scroll-margin-top: var(--ifm-scroll-margin-top-mobile);
141
+ padding: 0rem 0 3rem;
142
+ }
143
+
144
+ .experienceContainer {
145
+ padding: 0 1rem;
146
+ }
147
+
148
+ .experienceHeader {
149
+ margin-bottom: 1.2rem;
150
+ margin-top: -2rem;
151
+ }
152
+
153
+ .experienceTitle {
154
+ font-size: 1.9rem;
155
+ }
156
+
157
+ .experienceSubtitle {
158
+ font-size: 0.9rem;
159
+ max-width: 90%;
160
+ }
161
+
162
+ .noticeText {
163
+ font-size: 1.5rem;
164
+ }
165
+
166
+ .noticeDesc {
167
+ font-size: 0.9rem;
168
+ }
169
+ }
170
+
171
+ @media (prefers-reduced-motion: reduce) {
172
+ .experienceTitle, .experienceSubtitle, .noticeBox {
173
+ animation: none !important;
174
+ transition: none !important;
175
+ }
176
+
177
+ .noticeBox {
178
+ opacity: 1;
179
+ }
180
+ }
@@ -0,0 +1,63 @@
1
+ import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
2
+ import SocialLinks from "@site/src/components/SocialLinks";
3
+ import styles from './styles.module.css';
4
+
5
+ export default function HeroSection({ id, className }) {
6
+ const { siteConfig } = useDocusaurusContext();
7
+ const { customFields } = siteConfig;
8
+
9
+ const intro = customFields.heroSection.intro;
10
+ const title = customFields.heroSection.title;
11
+ const subtitle = customFields.heroSection.subtitle;
12
+ const profession = customFields.heroSection.profession;
13
+ const description = customFields.heroSection.description;
14
+ const profilePic = customFields.heroSection.profilePic;
15
+ const learnMoreButtonText = customFields.heroSection.learnMoreButtonTxt;
16
+
17
+ return (
18
+ <div
19
+ className={`${styles.hero} ${className || ''}`}
20
+ id={id}
21
+ role="region"
22
+ aria-label="Hero section"
23
+ >
24
+ <div className={styles.container}>
25
+ <div className={styles.leftSection}>
26
+ <p className={styles.intro}>{intro}</p>
27
+ <h1 className={styles.title}>
28
+ {title}
29
+ <span className={styles.titleComma}>,</span>
30
+ </h1>
31
+ <div className={styles.subtitleWrapper}>
32
+ <span className={styles.subtitle}>{subtitle}</span>
33
+ <h2 className={styles.profession}>{profession}</h2>
34
+ <span className={styles.subtitle}>.</span>
35
+ </div>
36
+ <p className={styles.description}>
37
+ {description}
38
+ </p>
39
+ <div className={styles.actionRow}>
40
+ <div className={styles.cta}>
41
+ <a
42
+ href="#about"
43
+ className={styles.ctaButton}
44
+ aria-label="Learn more about me"
45
+ >
46
+ {learnMoreButtonText}
47
+ </a>
48
+ </div>
49
+ <SocialLinks />
50
+ </div>
51
+ </div>
52
+ <div className={styles.rightSection}>
53
+ <img
54
+ src={`${profilePic}`}
55
+ alt="profile"
56
+ className={styles.profilePic}
57
+ loading="lazy"
58
+ />
59
+ </div>
60
+ </div>
61
+ </div>
62
+ );
63
+ }