portosaurus 1.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.
- package/LICENSE +674 -0
- package/README.md +116 -0
- package/bin/portosaurus.js +337 -0
- package/internal/notes/index.md +10 -0
- package/internal/sidebars.js +20 -0
- package/internal/src/components/AboutSection/index.js +67 -0
- package/internal/src/components/AboutSection/styles.module.css +492 -0
- package/internal/src/components/ContactSection/index.js +94 -0
- package/internal/src/components/ContactSection/styles.module.css +327 -0
- package/internal/src/components/ExperienceSection/index.js +25 -0
- package/internal/src/components/ExperienceSection/styles.module.css +180 -0
- package/internal/src/components/HeroSection/index.js +61 -0
- package/internal/src/components/HeroSection/styles.module.css +471 -0
- package/internal/src/components/NoteIndex/index.js +127 -0
- package/internal/src/components/NoteIndex/styles.module.css +143 -0
- package/internal/src/components/ProjectsSection/index.js +529 -0
- package/internal/src/components/ProjectsSection/styles.module.css +830 -0
- package/internal/src/components/ScrollToTop/index.js +98 -0
- package/internal/src/components/ScrollToTop/styles.module.css +96 -0
- package/internal/src/components/SocialLinks/index.js +129 -0
- package/internal/src/components/SocialLinks/styles.module.css +55 -0
- package/internal/src/components/Tooltip/index.js +30 -0
- package/internal/src/components/Tooltip/styles.module.css +92 -0
- package/internal/src/config/iconMappings.js +329 -0
- package/internal/src/config/metaTags.js +240 -0
- package/internal/src/config/prism.js +179 -0
- package/internal/src/config/sidebar.js +20 -0
- package/internal/src/css/bootstrap.css +6 -0
- package/internal/src/css/catppuccin.css +632 -0
- package/internal/src/css/custom.css +186 -0
- package/internal/src/css/tasks.css +868 -0
- package/internal/src/pages/index.js +98 -0
- package/internal/src/pages/notes.js +88 -0
- package/internal/src/pages/tasks.js +310 -0
- package/internal/src/utils/HashNavigation.js +250 -0
- package/internal/src/utils/appVersion.js +27 -0
- package/internal/src/utils/compileConfig.js +82 -0
- package/internal/src/utils/cssUtils.js +99 -0
- package/internal/src/utils/filterEnabledItems.js +21 -0
- package/internal/src/utils/generateFavicon.js +256 -0
- package/internal/src/utils/generateRobotsTxt.js +97 -0
- package/internal/src/utils/iconExtractor.js +159 -0
- package/internal/src/utils/imageDownloader.js +88 -0
- package/internal/src/utils/imageProcessor.js +134 -0
- package/internal/src/utils/linkShortner.js +0 -0
- package/internal/src/utils/updateTitle.js +107 -0
- package/package.json +51 -0
- package/template/.github/workflows/deploy.yml +57 -0
- package/template/README.md +70 -0
- package/template/blog/authors.yml +5 -0
- package/template/blog/welcome.md +10 -0
- package/template/config.js +233 -0
- package/template/notes/getting-started.md +7 -0
- package/template/static/README.md +33 -0
- package/utils/createConfig.js +227 -0
- package/utils/logger.js +19 -0
- package/utils/packageManager.js +88 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
const sharp = require('sharp');
|
|
2
|
+
|
|
3
|
+
// AI GENERATED
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Reshapes an image to various predefined shapes
|
|
7
|
+
*
|
|
8
|
+
* @param {string} imagePath - Path to the input image
|
|
9
|
+
* @param {string} outputPath - Path to save the processed image
|
|
10
|
+
* @param {string} [shape='circle'] - Shape to apply ('circle', 'square', 'rounded', 'hexagon', 'shield')
|
|
11
|
+
* @param {number} [roundedCornerRadius=50] - Corner radius for rounded shape (percentage)
|
|
12
|
+
* @returns {Promise<string>} - A promise that resolves with the path to the processed image
|
|
13
|
+
*/
|
|
14
|
+
async function reshapeImage(imagePath, outputPath, shape = 'circle', roundedCornerRadius = 50) {
|
|
15
|
+
console.log(`[INFO] Processing image to ${shape} shape...`);
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
// Get image dimensions
|
|
19
|
+
const metadata = await sharp(imagePath).metadata();
|
|
20
|
+
const size = Math.min(metadata.width, metadata.height);
|
|
21
|
+
|
|
22
|
+
let shapeMask;
|
|
23
|
+
|
|
24
|
+
switch (shape.toLowerCase()) {
|
|
25
|
+
case 'circle':
|
|
26
|
+
shapeMask = Buffer.from(
|
|
27
|
+
`<svg><circle cx="${size/2}" cy="${size/2}" r="${size/2}" fill="white"/></svg>`
|
|
28
|
+
);
|
|
29
|
+
break;
|
|
30
|
+
|
|
31
|
+
case 'square':
|
|
32
|
+
// No mask needed for square, just resize to equal width/height
|
|
33
|
+
await sharp(imagePath)
|
|
34
|
+
.resize(size, size, { fit: 'cover' })
|
|
35
|
+
.toFile(outputPath);
|
|
36
|
+
return outputPath;
|
|
37
|
+
|
|
38
|
+
case 'rounded':
|
|
39
|
+
// Convert percentage to actual pixels (e.g., 50% becomes size/4)
|
|
40
|
+
const radius = Math.min(100, Math.max(0, roundedCornerRadius)) * size / 200;
|
|
41
|
+
shapeMask = Buffer.from(
|
|
42
|
+
`<svg><rect x="0" y="0" width="${size}" height="${size}" rx="${radius}" ry="${radius}" fill="white"/></svg>`
|
|
43
|
+
);
|
|
44
|
+
break;
|
|
45
|
+
|
|
46
|
+
case 'hexagon':
|
|
47
|
+
// Calculate hexagon points
|
|
48
|
+
const centerX = size / 2;
|
|
49
|
+
const centerY = size / 2;
|
|
50
|
+
const hexRadius = size / 2;
|
|
51
|
+
let points = '';
|
|
52
|
+
for (let i = 0; i < 6; i++) {
|
|
53
|
+
const angleDeg = 60 * i - 30;
|
|
54
|
+
const angleRad = Math.PI / 180 * angleDeg;
|
|
55
|
+
const x = centerX + hexRadius * Math.cos(angleRad);
|
|
56
|
+
const y = centerY + hexRadius * Math.sin(angleRad);
|
|
57
|
+
points += `${x},${y} `;
|
|
58
|
+
}
|
|
59
|
+
shapeMask = Buffer.from(
|
|
60
|
+
`<svg><polygon points="${points}" fill="white"/></svg>`
|
|
61
|
+
);
|
|
62
|
+
break;
|
|
63
|
+
|
|
64
|
+
case 'shield':
|
|
65
|
+
const shieldWidth = size;
|
|
66
|
+
const shieldHeight = size;
|
|
67
|
+
const bottomCurve = size / 3;
|
|
68
|
+
shapeMask = Buffer.from(
|
|
69
|
+
`<svg>
|
|
70
|
+
<path d="M ${shieldWidth/2},0
|
|
71
|
+
L ${shieldWidth},${shieldHeight/3}
|
|
72
|
+
C ${shieldWidth},${shieldHeight-bottomCurve} ${shieldWidth/2},${shieldHeight} ${shieldWidth/2},${shieldHeight}
|
|
73
|
+
C ${shieldWidth/2},${shieldHeight} 0,${shieldHeight-bottomCurve} 0,${shieldHeight/3}
|
|
74
|
+
L ${shieldWidth/2},0 Z"
|
|
75
|
+
fill="white"/>
|
|
76
|
+
</svg>`
|
|
77
|
+
);
|
|
78
|
+
break;
|
|
79
|
+
|
|
80
|
+
default:
|
|
81
|
+
// Default to circle if shape is not recognized
|
|
82
|
+
console.warn(`Shape "${shape}" not recognized, defaulting to circle`);
|
|
83
|
+
shapeMask = Buffer.from(
|
|
84
|
+
`<svg><circle cx="${size/2}" cy="${size/2}" r="${size/2}" fill="white"/></svg>`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Apply the mask and save the final image
|
|
89
|
+
await sharp(imagePath)
|
|
90
|
+
.resize(size, size, { fit: 'cover' })
|
|
91
|
+
.composite([
|
|
92
|
+
{
|
|
93
|
+
input: shapeMask,
|
|
94
|
+
blend: 'dest-in'
|
|
95
|
+
}
|
|
96
|
+
])
|
|
97
|
+
.png()
|
|
98
|
+
.toFile(outputPath);
|
|
99
|
+
|
|
100
|
+
return outputPath;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
console.error(`Error reshaping image to ${shape}:`, error);
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Resizes an image while maintaining aspect ratio
|
|
109
|
+
*
|
|
110
|
+
* @param {string} imagePath - Path to the input image
|
|
111
|
+
* @param {string} outputPath - Path to save the processed image
|
|
112
|
+
* @param {number} maxWidth - Maximum width of the output image
|
|
113
|
+
* @param {number} maxHeight - Maximum height of the output image
|
|
114
|
+
* @returns {Promise<string>} - A promise that resolves with the path to the processed image
|
|
115
|
+
*/
|
|
116
|
+
async function resizeImage(imagePath, outputPath, maxWidth, maxHeight) {
|
|
117
|
+
console.log(`Resizing image to max ${maxWidth}x${maxHeight}...`);
|
|
118
|
+
|
|
119
|
+
await sharp(imagePath)
|
|
120
|
+
.resize(maxWidth, maxHeight, {
|
|
121
|
+
fit: 'inside',
|
|
122
|
+
withoutEnlargement: true
|
|
123
|
+
})
|
|
124
|
+
.toFile(outputPath);
|
|
125
|
+
|
|
126
|
+
return outputPath;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
module.exports = {
|
|
132
|
+
reshapeImage,
|
|
133
|
+
resizeImage,
|
|
134
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useLocation } from '@docusaurus/router';
|
|
3
|
+
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
|
4
|
+
|
|
5
|
+
// AI Generated
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* UpdateTitle component that changes the page title based on the section in view
|
|
9
|
+
* @param {Object} props - Component props
|
|
10
|
+
* @param {Object} props.sections - Map of section IDs to their corresponding titles
|
|
11
|
+
* @param {string} props.defaultTitle - Default title to use when no section is prominently visible
|
|
12
|
+
* @param {boolean} props.enabled - Whether the dynamic title functionality is enabled
|
|
13
|
+
* @returns {null} This component doesn't render anything visible
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
export default function UpdateTitle({
|
|
18
|
+
sections = {},
|
|
19
|
+
defaultTitle = null,
|
|
20
|
+
enabled = true
|
|
21
|
+
}) {
|
|
22
|
+
const location = useLocation();
|
|
23
|
+
const { siteConfig } = useDocusaurusContext();
|
|
24
|
+
const [currentTitle, setCurrentTitle] = useState(null);
|
|
25
|
+
|
|
26
|
+
// Use the provided default title or fall back to site title
|
|
27
|
+
const effectiveDefaultTitle = defaultTitle || siteConfig.title;
|
|
28
|
+
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
|
|
31
|
+
// Only run if enabled
|
|
32
|
+
if (!enabled) return;
|
|
33
|
+
|
|
34
|
+
// Use provided sections or default to empty object
|
|
35
|
+
const sectionTitles = Object.keys(sections).length > 0
|
|
36
|
+
? sections
|
|
37
|
+
: {};
|
|
38
|
+
|
|
39
|
+
const updateTitle = () => {
|
|
40
|
+
// Get all sections we want to track
|
|
41
|
+
const sectionsToTrack = Object.keys(sectionTitles)
|
|
42
|
+
.map(id => document.getElementById(id))
|
|
43
|
+
.filter(Boolean);
|
|
44
|
+
|
|
45
|
+
if (sectionsToTrack.length === 0) {
|
|
46
|
+
// No sections found, use default title
|
|
47
|
+
setCurrentTitle(effectiveDefaultTitle);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Calculate which section is most visible
|
|
52
|
+
const viewportHeight = window.innerHeight;
|
|
53
|
+
let maxVisibleSection = null;
|
|
54
|
+
let maxVisibleArea = 0;
|
|
55
|
+
|
|
56
|
+
sectionsToTrack.forEach(section => {
|
|
57
|
+
const rect = section.getBoundingClientRect();
|
|
58
|
+
const visibleTop = Math.max(0, rect.top);
|
|
59
|
+
const visibleBottom = Math.min(viewportHeight, rect.bottom);
|
|
60
|
+
const visibleArea = Math.max(0, visibleBottom - visibleTop);
|
|
61
|
+
|
|
62
|
+
if (visibleArea > maxVisibleArea) {
|
|
63
|
+
maxVisibleArea = visibleArea;
|
|
64
|
+
maxVisibleSection = section.id;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Update title state based on visible section
|
|
69
|
+
if (maxVisibleSection && sectionTitles[maxVisibleSection]) {
|
|
70
|
+
setCurrentTitle(sectionTitles[maxVisibleSection]);
|
|
71
|
+
} else {
|
|
72
|
+
setCurrentTitle(effectiveDefaultTitle);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// Add scroll event listener with throttling
|
|
77
|
+
let isScrolling = false;
|
|
78
|
+
const handleScroll = () => {
|
|
79
|
+
if (!isScrolling) {
|
|
80
|
+
window.requestAnimationFrame(() => {
|
|
81
|
+
updateTitle();
|
|
82
|
+
isScrolling = false;
|
|
83
|
+
});
|
|
84
|
+
isScrolling = true;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
window.addEventListener('scroll', handleScroll);
|
|
89
|
+
|
|
90
|
+
// Initial call
|
|
91
|
+
updateTitle();
|
|
92
|
+
|
|
93
|
+
// Clean up
|
|
94
|
+
return () => {
|
|
95
|
+
window.removeEventListener('scroll', handleScroll);
|
|
96
|
+
};
|
|
97
|
+
}, [location.pathname, sections, effectiveDefaultTitle, enabled]);
|
|
98
|
+
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
if (currentTitle) {
|
|
101
|
+
document.title = currentTitle;
|
|
102
|
+
}
|
|
103
|
+
}, [currentTitle]);
|
|
104
|
+
|
|
105
|
+
// Component doesn't render anything visible
|
|
106
|
+
return null;
|
|
107
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "portosaurus",
|
|
3
|
+
"version": "1.14.0",
|
|
4
|
+
"author": "soymadip",
|
|
5
|
+
"license": "GPL-3.0-only",
|
|
6
|
+
"description": "Complete portfolio cum personal website solution for your digital personality.",
|
|
7
|
+
"homepage": "https://github.com/soymadip/portosaurus#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/soymadip/portosaurus.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/soymadip/portosaurus/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"portfolio",
|
|
17
|
+
"docusaurus",
|
|
18
|
+
"cli",
|
|
19
|
+
"static-site-generator",
|
|
20
|
+
"documentation",
|
|
21
|
+
"blog"
|
|
22
|
+
],
|
|
23
|
+
"type": "module",
|
|
24
|
+
"bin": {
|
|
25
|
+
"portosaurus": "bin/portosaurus.js"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"bin/",
|
|
29
|
+
"internal/",
|
|
30
|
+
"template/",
|
|
31
|
+
"utils/"
|
|
32
|
+
],
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@docusaurus/core": "^3.9.2",
|
|
35
|
+
"@docusaurus/preset-classic": "^3.9.2",
|
|
36
|
+
"chalk": "^5.6.2",
|
|
37
|
+
"commander": "^12.1.0",
|
|
38
|
+
"fs-extra": "^11.3.3",
|
|
39
|
+
"prompts": "^2.4.2",
|
|
40
|
+
"react": "^18.3.1",
|
|
41
|
+
"react-dom": "^18.3.1",
|
|
42
|
+
"react-icons": "^5.4.0",
|
|
43
|
+
"react-slick": "^0.30.2",
|
|
44
|
+
"slick-carousel": "^1.8.1",
|
|
45
|
+
"clsx": "^2.1.1",
|
|
46
|
+
"prism-react-renderer": "^2.4.1",
|
|
47
|
+
"favicons": "^7.2.0",
|
|
48
|
+
"plugin-image-zoom": "github:flexanalytics/plugin-image-zoom",
|
|
49
|
+
"@easyops-cn/docusaurus-search-local": "^0.52.1"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
name: Deploy to GitHub Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
pages: write
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: pages
|
|
15
|
+
cancel-in-progress: false
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- name: Checkout
|
|
22
|
+
uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- name: Setup Bun
|
|
25
|
+
uses: oven-sh/setup-bun@v2
|
|
26
|
+
with:
|
|
27
|
+
bun-version: latest
|
|
28
|
+
|
|
29
|
+
- name: Cache Bun dependencies
|
|
30
|
+
uses: actions/cache@v4
|
|
31
|
+
with:
|
|
32
|
+
path: ~/.bun/install/cache
|
|
33
|
+
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }}
|
|
34
|
+
restore-keys: |
|
|
35
|
+
${{ runner.os }}-bun-
|
|
36
|
+
|
|
37
|
+
- name: Install dependencies
|
|
38
|
+
run: bun install
|
|
39
|
+
|
|
40
|
+
- name: Build site
|
|
41
|
+
run: bun run build
|
|
42
|
+
|
|
43
|
+
- name: Upload artifact
|
|
44
|
+
uses: actions/upload-pages-artifact@v3
|
|
45
|
+
with:
|
|
46
|
+
path: build/
|
|
47
|
+
|
|
48
|
+
deploy:
|
|
49
|
+
needs: build
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
environment:
|
|
52
|
+
name: github-pages
|
|
53
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
54
|
+
steps:
|
|
55
|
+
- name: Deploy to GitHub Pages
|
|
56
|
+
id: deployment
|
|
57
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Portosaurus Project
|
|
2
|
+
|
|
3
|
+
A portfolio website built with [Portosaurus](https://github.com/soymadip/portosaurus).
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
### Development
|
|
8
|
+
|
|
9
|
+
Start the development server:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# With Bun
|
|
13
|
+
bun run start
|
|
14
|
+
|
|
15
|
+
# With npm
|
|
16
|
+
npm run start
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The site will be available at `http://localhost:3000`.
|
|
20
|
+
|
|
21
|
+
### Build
|
|
22
|
+
|
|
23
|
+
Build the static site:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# With Bun
|
|
27
|
+
bun run build
|
|
28
|
+
|
|
29
|
+
# With npm
|
|
30
|
+
npm run build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The output will be in the `build/` directory.
|
|
34
|
+
|
|
35
|
+
## Project Structure
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
.
|
|
39
|
+
├── config.js # Site configuration
|
|
40
|
+
├── blog/ # Blog posts (Markdown)
|
|
41
|
+
├── notes/ # Documentation (Markdown)
|
|
42
|
+
├── static/ # Static assets (images, files)
|
|
43
|
+
└── package.json # Dependencies
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Configuration
|
|
47
|
+
|
|
48
|
+
Edit `config.js` to customize your site. See the [Portosaurus documentation](https://github.com/soymadip/portosaurus) for all available options.
|
|
49
|
+
|
|
50
|
+
## Deployment
|
|
51
|
+
|
|
52
|
+
### GitHub Pages
|
|
53
|
+
|
|
54
|
+
1. Push your project to GitHub
|
|
55
|
+
2. Go to Settings > Pages
|
|
56
|
+
3. Set Source to "GitHub Actions"
|
|
57
|
+
4. The site will deploy automatically on push
|
|
58
|
+
|
|
59
|
+
### Other Platforms
|
|
60
|
+
|
|
61
|
+
The `build/` directory contains a static site that can be deployed to:
|
|
62
|
+
|
|
63
|
+
- Vercel
|
|
64
|
+
- Netlify
|
|
65
|
+
- Cloudflare Pages
|
|
66
|
+
- Any static hosting service
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
Made with [Portosaurus](https://github.com/soymadip/portosaurus)
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
exports.usrConf = {
|
|
2
|
+
|
|
3
|
+
auto_update: true,
|
|
4
|
+
|
|
5
|
+
dark_mode: true,
|
|
6
|
+
|
|
7
|
+
site_url: "auto",
|
|
8
|
+
site_path: "auto",
|
|
9
|
+
|
|
10
|
+
srt_url: "${site_url}${site_path}/l",
|
|
11
|
+
|
|
12
|
+
rebots_txt: true,
|
|
13
|
+
social_card: "img/social-card.jpeg",
|
|
14
|
+
colapsable_sidebar: true,
|
|
15
|
+
hide_navbar_on_scroll: true,
|
|
16
|
+
disable_theme_switch: false,
|
|
17
|
+
rss: true,
|
|
18
|
+
|
|
19
|
+
hero_section: {
|
|
20
|
+
title: "Your Name",
|
|
21
|
+
profession: "Your Profession",
|
|
22
|
+
description: "Short description about you, your passion, your goals etc.",
|
|
23
|
+
profile_pic: "https://raw.githubusercontent.com/soymadip/portosaurus/refs/heads/compiler/static/img/icon.png",
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
about_me: {
|
|
27
|
+
enable: true,
|
|
28
|
+
|
|
29
|
+
image: "${hero_section.profile_pic}",
|
|
30
|
+
|
|
31
|
+
description: [
|
|
32
|
+
"I'm a passionate FOSS developer with expertise in designing and building solutions for real-world problems.",
|
|
33
|
+
"My journey in software development started with a simple desire to automate repetitive tasks, specially in my PC.",
|
|
34
|
+
],
|
|
35
|
+
|
|
36
|
+
skills: [
|
|
37
|
+
"skill 1",
|
|
38
|
+
"Skill 2",
|
|
39
|
+
"Skill 3",
|
|
40
|
+
],
|
|
41
|
+
resume_link: "https://exapmple.com/resume",
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
project_shelf: {
|
|
45
|
+
enable: true,
|
|
46
|
+
projects: [
|
|
47
|
+
{
|
|
48
|
+
title: "Your Awesome Project",
|
|
49
|
+
featured: true,
|
|
50
|
+
state: "active",
|
|
51
|
+
desc: "Desctiption about your awesome project.",
|
|
52
|
+
image: "https://raw.githubusercontent.com/soymadip/portosaurus/refs/heads/compiler/static/img/icon.png",
|
|
53
|
+
website: null,
|
|
54
|
+
github: "https://github.com/soymadip/portosaurus",
|
|
55
|
+
Demo: "https://soymadip.github.io",
|
|
56
|
+
tags: ["your project's topic", "this is a tag", "another tag"],
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
social_links: {
|
|
63
|
+
|
|
64
|
+
enable: true,
|
|
65
|
+
links: [
|
|
66
|
+
{
|
|
67
|
+
name: "Email",
|
|
68
|
+
icon: "mail",
|
|
69
|
+
desc: "Send me an email",
|
|
70
|
+
url: "${srt_url}/mail",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "LinkedIn",
|
|
74
|
+
icon: "linkedin",
|
|
75
|
+
desc: "Connect on LinkedIn",
|
|
76
|
+
url: "${srt_url}/linkedin",
|
|
77
|
+
pin: true,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "Telegram",
|
|
81
|
+
icon: "telegram",
|
|
82
|
+
desc: "Reach me on Telegram",
|
|
83
|
+
url: "${srt_url}/telegram",
|
|
84
|
+
pin: true,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "Instagram",
|
|
88
|
+
icon: "instagram",
|
|
89
|
+
desc: "Reach me on Instagram",
|
|
90
|
+
url: "/instagram",
|
|
91
|
+
pin: true,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
link_shortener: {
|
|
97
|
+
// Uses StaticShort
|
|
98
|
+
|
|
99
|
+
enable: true,
|
|
100
|
+
deploy_path: "/l",
|
|
101
|
+
|
|
102
|
+
short_links: {
|
|
103
|
+
mail: "mailto://you@yourDomain.com",
|
|
104
|
+
github: "https://github.com/yourUserName",
|
|
105
|
+
gitlab: "https://gitlab.com/yourUserName",
|
|
106
|
+
linkedin: "https://linkedin.com/in/yourUserName",
|
|
107
|
+
telegram: "https://telegram.me/yourUserName",
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
experience: {
|
|
112
|
+
enable: false,
|
|
113
|
+
list: [
|
|
114
|
+
{
|
|
115
|
+
company: "Company A",
|
|
116
|
+
position: "Software Engineer",
|
|
117
|
+
duration: "Jan 2020 - Present",
|
|
118
|
+
description: [
|
|
119
|
+
"Developed and maintained web applications using JavaScript, HTML, and CSS.",
|
|
120
|
+
"Collaborated with cross-functional teams to define, design, and ship new features.",
|
|
121
|
+
"Identified and fixed bugs to improve application performance.",
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
company: "Company B",
|
|
126
|
+
position: "Intern",
|
|
127
|
+
duration: "Jun 2019 - Dec 2019",
|
|
128
|
+
description: [
|
|
129
|
+
"Assisted in the development of internal tools using Python and Bash.",
|
|
130
|
+
"Participated in code reviews and provided feedback to improve code quality.",
|
|
131
|
+
"Conducted research and provided recommendations for new technologies.",
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
tasks_page: {
|
|
139
|
+
enable: true,
|
|
140
|
+
tasks: [
|
|
141
|
+
{
|
|
142
|
+
title: "Add more Callouts",
|
|
143
|
+
description: "like question..",
|
|
144
|
+
status: "pending",
|
|
145
|
+
priority: "medium",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
title: "Add colors to Markdown Headings",
|
|
149
|
+
description: "Take from Obsidian",
|
|
150
|
+
status: "pending",
|
|
151
|
+
priority: "high",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
title: "Improve the Note card Icon extractor",
|
|
155
|
+
description:
|
|
156
|
+
"make it strip number before dir name, currently It shows blank icon(default book).",
|
|
157
|
+
status: "completed",
|
|
158
|
+
priority: "high",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
title: "Improve Roadmap page",
|
|
162
|
+
description:
|
|
163
|
+
"add sub todos, shift from vibe code to orignal code, make mobile friendly",
|
|
164
|
+
status: "pending",
|
|
165
|
+
priority: "low",
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
title: "Fix Mermaid Diagram support",
|
|
169
|
+
description:
|
|
170
|
+
"showing: Hook is called outside the <ColorModeProvider>. Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.",
|
|
171
|
+
status: "pending",
|
|
172
|
+
priority: "medium",
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
title: "check prism js, dark and light background swap",
|
|
176
|
+
status: "completed",
|
|
177
|
+
description: "Looking better now.",
|
|
178
|
+
priority: "low",
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
title: "Make standalone Project.",
|
|
182
|
+
description: "Convert to Portosaurus project. remove personal stuff.",
|
|
183
|
+
priority: "high",
|
|
184
|
+
status: "active",
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
title: "Separate portfolio config",
|
|
188
|
+
description: "Separate portfolio specific settings to config.js.",
|
|
189
|
+
priority: "high",
|
|
190
|
+
status: "completed",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
title: "make shortlinks icon field optional",
|
|
194
|
+
description:
|
|
195
|
+
"lower the title, then match in mapping. if icon key is defined, use it.",
|
|
196
|
+
priority: "low",
|
|
197
|
+
status: "pending",
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
title: "Rearrange the config.js",
|
|
201
|
+
description:
|
|
202
|
+
"Rearrange config, make more abstract. Add hero section configs.",
|
|
203
|
+
status: "active",
|
|
204
|
+
priority: "high",
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
title: "Fix favicon logic",
|
|
208
|
+
description:
|
|
209
|
+
"Fix favicon gen failed even if given diff value in usrConf.favicon, also when usrConf.hero_section.profile_pic to /img/some-pic.png",
|
|
210
|
+
status: "active",
|
|
211
|
+
priority: "high",
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
title: "Fix project shelf image placing",
|
|
215
|
+
description: "The image should align in the middle of card. Then fill the space if needed.",
|
|
216
|
+
status: "active",
|
|
217
|
+
priority: "low",
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
title: "Add shortlink generation",
|
|
221
|
+
description: "setup StaticShort while compiling portosaurus.",
|
|
222
|
+
status: "active",
|
|
223
|
+
priority: "normal",
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
title: "Add placeholder notice When no note is there",
|
|
227
|
+
description: null,
|
|
228
|
+
status: "active",
|
|
229
|
+
priority: "low",
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
}
|
|
233
|
+
}
|