Package Exports
- dev-portfolio
- dev-portfolio/dist/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (dev-portfolio) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
dev-porfolio
dev-portfolio is React library that helps you develop your web portfolio easily and quickly.

List
Install
Install only dev-portfolio library.
npm i dev-portfolio --saveInstall boiler-plate code by using
npx.
If you want to see README.md of boiler-plate, go to the create-dev-portfolio.npx create-dev-portfolio <YOUR_APP_NAME>
Usage
import { Header, Intro, Contact, ... } from 'dev-portfolio';
const App = () => {
return (
// The 'className' in the <div> tag surrounding the components of 'dev-portfolio' must be 'App'.
// Only then can the SideBar in the <Header> component recognize id props and automatically assign all components into the SideBar.
<div className="App">
<Header />
<Intro />
<Contact />
...
</div>
);
}
export default App;Components
- Header
- Channel
- Channels
- Intro
- Skill
- TechStackList
- Experience
- Carousel
- Gallery
- Masonry
- Image
- Item
- Card
- Contact
- VisitorCounter
- VisitorComment
Header
import { Header } from 'dev-portfolio';
const logoOption = { ... };
const channels = [ ... ];
const sideBarOption = { ... };
const App = () => {
return (
<Header
id="Header Component"
headerHeight="80px"
headerWidth="100%"
headerBackgroundColor="whitesmoke"
logoOption={logoOption}
channels={channels}
sideBarOption={sideBarOption}
/>
);
}
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
headerHeight |
string | Header Height | 80px | |
headerWidth |
string | Header Width | 100% | |
headerBackgroundColor |
string | CSS for Background color of Header Component | white | |
logoOption |
LogoOptionPropsType | Logo & Header_Title only props | See "More about Header's Props" | |
channels |
ChannelType[] | Channel-only props such as Github and LinkedIn, etc | See "More about Header's Props" | |
sideBarOption |
SideBarOptionPropsType | Sidebar-only props such as Sidebar's Icon, etc | See "More about Header's Props" |
More about Header's props
- logoOption example
const logoOption = {
redirectUrl: '/',
logoImg: 'logo.png',
logoHidden: false,
title: 'dev-portfolio',
logoMargin: '0px 16px 0px 16px',
logoWidth: '50px',
logoHeight: '50px',
titleColor: 'black',
titleSize: '24px',
titleWeight: '800',
};- channels example
For an example of channels, see: channels example
- sideBarOption example
Way to change the sidebar icon, use iconName props.
Refer to the guidelines.
const sideBarOption = {
mainTitle: 'dev-portfolio',
mainTitleSize: '24px',
mainTitleColor: 'white',
mainTitleAlign: 'left',
mainTitleBorderColor: 'white',
iconName: 'ant-design:menu-fold-outlined', //Refer to the guidelines.
iconSize: '28px',
iconColor: '#434521',
iconMargin: '0px 12px 0px 12px',
itemTextColor: 'white',
itemTextAlign: 'left',
itemBackgroundColor: '#434521',
itemHoverdBackgroundColor: 'black',
backgroundColor: '#434521',
};Channel
import { Channel } from 'dev-portfolio';
const App = () => {
return (
<Channel
redirectUrl="/"
name="github"
color="black"
size="24px"
margin="0px 6px"
padding="0px"
/>
);
}
export default App;| props | type | description | default | note |
|---|---|---|---|---|
redirectUrl |
string | URL you want to redirect when clicked | / | |
name |
string | Channel name | github | |
color |
string | Channel icon color style | black | |
size |
string | Channel icon size style | 24px | |
margin |
string | Channel margin style | 0px 6px | |
padding |
string | Channel padding style | 0px |
Channels
import { Channels } from 'dev-portfolio';
const channels = [ ... ];
const App = () => {
return (
<Channels
channels={channels}
/>
);
}
export default App;| props | type | description | default | note |
|---|---|---|---|---|
channels |
ChannelType[] | Channel-only props such as Github and LinkedIn, etc | See "More about Channels's Props" |
More about Channels Props
- channels example
const channels = [
{
redirectUrl: '/',
name: 'github',
color: 'black',
size: '24px',
margin: '0px 6px',
padding: '0px',
},
{
redirectUrl: '/',
name: 'youtube',
color: '#e03b35',
size: '24px',
margin: '0px 6px',
padding: '0px',
},
{
redirectUrl: '/',
name: 'linkedin',
color: '#1295cd',
size: '24px',
margin: '0px 6px',
padding: '0px',
},
];Intro
import { Intro } from 'dev-portfolio';
const introOption = [ ... ];
const App = () => {
return (
<Intro
id="Intro Component"
textAlign="left"
backgroundColor="whitesmoke"
title="Introduction"
shortIntro="Hello I am a developer enjoys growing up!"
description="My name is OOO, BE developer good at Nodejs bla bla..."
/>
);
}
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
textAlign |
string | Intro Text align | center | |
backgroundColor |
string | Intro Background color | whitesmoke | |
title |
string | Core of your introduction | Intro | |
shortIntro |
string | a brief introduction | shortIntro that will captivate people | |
description |
string | Introduce yourself | This props name is description.\nPlease write down your brief introduction here. If you want to change the line, type backslash-n between the letters. Also you want to move the letters to the center, change textAlign to center. code your dreams! |
Skill
import { Skill } from 'dev-portfolio';
const App = () => {
return (
<Skill
title="Javascript"
titleSize="24px"
isHiddenTitle={false}
iconName="ion:logo-javascript"
iconSize="40px"
iconColor="#F0DB4F"
margin="0px"
padding="0px"
/>
);
}
export default App;| props | type | description | default | note |
|---|---|---|---|---|
title |
string | Main text that expresses the skill | javascript | |
titleSize |
string | Title size style | 24px | |
isHiddenTitle |
boolean | If this value is set to True, you can hide the title. | false | |
iconName |
string | Enter the name of the icon you searched on the following site. | ion:logo-javascript | See Guideline to add icon |
iconSize |
string | Icon size style | 40px | |
iconColor |
string | Icon color style | #F0DB4F | |
margin |
string | Skill margin style | 0px | |
padding |
string | Skill padding style | 0px |
TechStackList

import { TechStackList } from 'dev-portfolio';
const techStackList = [ ... ];
const App = () => {
return (
<TechStackList
id="Tech Stack Component"
gap="normal" // 'narrower' | 'narrow' | 'normal' | 'wide' | 'wider'
techStackList={techStackList}
/>
);
}
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
gap |
TechStackGapType | Spacing between TechStacks in TechStackList | normal | |
techStackList |
TechStackPropsType[] | TechStack-only props such as tech name, tech logo, and progressbar, etc | See "More about TechStackList's Props" |
More about TechStackList's props
- techStackList example
const techStackList = [
{
nameOption: { name: 'Javascript', logoName: 'Javascript', fontSize: '18px', logoSize: '24px' },
progressBarOption: {
rate: '45%',
isHiddenRateText: false,
colorTo: '#E2D784',
colorFrom: 'whitesmoke',
width: '100%',
height: '40px',
},
},
{
nameOption: { name: 'HTML5', logoName: 'HTML-5', fontSize: '18px', logoSize: '24px' },
progressBarOption: {
rate: '30%',
isHiddenRateText: false,
colorTo: '#E34F26',
colorFrom: 'whitesmoke',
width: '100%',
height: '40px',
},
},
{
nameOption: { name: 'Nodejs', logoName: 'Nodejs', fontSize: '18px', logoSize: '24px' },
progressBarOption: {
rate: '85%',
isHiddenRateText: true,
colorTo: '#339933',
colorFrom: 'whitesmoke',
width: '100%',
height: '40px',
},
},
];- gap example
// 'narrower' | 'narrow' | 'normal' | 'wide' | 'wider';
const gap = 'normal';Experience
import { Experience } from 'dev-portfolio';
const historyList = [ ... ];
const App = () => {
return (
<Experience
id="Experience Component"
title="Experience Title"
textAlign="left"
theme="vertical" // 'basic' | 'box' | 'vertical'
titleColor="black"
shape="square" // 'square' | 'round-square'
historyList={historyList}
/>
);
}
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
title |
string | Main title text of Experience Component | Experience | |
textAlign |
string | Experience Text align | left | |
theme |
ExperienceThemeType | You can decorate your experience with a variety of theme such as 'basic', 'box', 'vertical'. | basic | |
titleColor |
string | Color of title specially used in 'vertical' theme | black | |
shape |
ExperienceVerticalOptionType | Shape of card specially used in 'vertical' theme such as 'square', 'round-square'. | square | |
historyList |
ExperienceHistoryListType[] | You can add your history data such as date, title, description, etc. | See "More about Experience's Props" |
More about Experience's props
- historyList example
const historyList = [
{
startDate: '2022.01.01',
endDate: '2022.03.10',
title: 'this is title',
des: 'This prop name is des.\nWrite down the additional explanation you want here.\nYou can break the line to backslash-n.',
},
{
startDate: '2020.02',
title: 'this is title',
des: `If you just want to write the date and time without the text,\ndon't worry !\nYou can write a des props just by emptying it.\nAn example is shown below.`,
},
{
startDate: '2018',
endDate: '2019.12',
title: 'this is title',
},
];Carousel

import { Carousel, Image } from 'dev-portfolio';
const App = () => {
return (
<Carousel
id="Carousel Component"
width="65%"
transition={1000} // ms
autoplaySpeed={3000} // ms
slideToShow={1}
isArrowShow={true}
isAutoplay={false}
isAutoplayControl={true}
arrowLocation="mid-side" // 'bottom' | 'mid-side' | 'top' | 'bottom-side' | 'top-side'
playerLocation="bottom-mid" // 'bottom-mid' | 'bottom-left' | 'bottom-right' | 'top-mid' | 'top-left' | 'top-right'
prevArrowIcon={<YOUR_COMPONENT />} // ReactElement
nextArrowIcon={<YOUR_COMPONENT />} // ReactElement
startAutoplayIcon={<YOUR_COMPONENT />} // ReactElement
pauseAutoplayIcon={<YOUR_COMPONENT />} // ReactElement
>
// Must insert components customized
<YOUR_COMPONENT />
<Image src="anything.png" /> // Component of dev-portfolio ...
</Carousel>
);
};
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
width |
string | Carousel width | 100% | |
transition |
number | Transition animation speed | 1000 | Unit : ms |
autoplaySpeed |
number | Time to stay in a item | 3000 | Unit : ms |
slideToShow |
number | Number of item to show at once | 1 | |
isArrowShow |
boolean | Flag for whether to show buttons | true | |
isAutoplay |
boolean | Flag for play carousel automatically | false | |
isAutoplayControl |
boolean | Flag for whether to show carousel player | true | |
arrowPosition |
ArrowLocationType | Position of arrow icon | mid-side | |
playerLocation |
PlayerLocationType | Position of Play icon | bottom-mid | |
prevArrowIcon |
ReactElement | Icon Component for moving into previous item | <FiChevronLeft /> |
|
nextArrowIcon |
ReactElement | Icon Component for moving into next item | <FiChevronRight /> |
|
startAutoplayIcon |
ReactElement | Icon Component for starting autoplay | <TbPlayerPlay /> |
|
pauseAutoplayIcon |
ReactElement | Icon Component for pause autoplay | <TbPlayerPause /> |
Gallery
import { Gallery, Item } from 'dev-portfolio';
const App = () => {
return (
<Gallery
id="Gallery Component"
column={3}
gap="normal" // 'wider' | 'wide' | 'normal' | 'narrow' | 'narrower'
theme="mid-night" // 'mid-night' | 'blossom' | 'fruits' | 'bare-bare' | 'mint-chocolate'
padding="2em 10em"
>
// Must insert components customized
<YOUR_COMPONENT />
<Item /> // Component of dev-portfolio ...
</Gallery>
);
};
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
column |
number | Number of vertical lines | 3 | |
gap |
GalleryGapType | Spacing between items in Gallery | normal | |
theme |
GalleryThemeType | You can decorate your Gallery with a variety of theme such as 'mid-night', 'blossom', 'fruits', 'bare-bare', 'mint-chocolate'. | mid-night | |
padding |
string | Gallery padding | 2em 10em |
Masonry
import { Masonry, Image } from 'dev-portfolio';
const App = () => {
return (
<Masonry id="Masonry Component" column={4} padding="2em 4em">
/* Must insert components customized */
<YOUR_COMPONENT />
<Image src="anything.png" redirectURL="/" />
/* Component of dev-portfolio */
<Image src="https://picsum.photos/900/1100/?random" redirectURL="/" />
/* Component of dev-portfolio */
</Masonry>
);
};
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
column |
number | Number of vertical lines | 4 | |
padding |
string | Masonry padding | 2em 4em |
Image

import { Image } from 'dev-portfolio';
const App = () => {
return (
<Image
src="https://picsum.photos/500/600/?random"
head="Write your head"
subhead="Write your subhead"
redirectURL="/"
noShowHead={false}
zoomWhenHover={false}
/>
);
};
export default App;| props | type | description | default | note |
|---|---|---|---|---|
src |
string | Image source url | ||
head |
string | Main Title Text | Write your head | |
subhead |
string | Sub Title Text | Write your subhead | |
redirectURL |
string | URL to redirect | / | |
noShowHead |
boolean | Flag for whether to hide texts | false | |
zoomWhenHover |
boolean | Flag for whether to zoom image when hovered on item | false |
Item

import { Item } from 'dev-portfolio';
const App = () => {
return (
<Item
src="https://picsum.photos/600/600/?random"
title="This is title"
description="description"
redirectURL="/"
textRisingSpeed={300}
isTextRising={false}
/>
);
};
export default App;| props | type | description | default | note |
|---|---|---|---|---|
src |
string | Image source url | https://picsum.photos/600/600/?random | |
title |
string | Main Title Text | This is title | |
description |
string | Description Text | description | |
redirectURL |
string | URL to redirect | / | |
textRisingSpeed |
number | 300 | ||
isTextRising |
boolean | false |
Card
import { Card } from 'dev-portfolio';
const App = () => {
return (
<Card
width="10em"
height="10em"
redirectURL="/"
shape="square" // 'square' | 'round-square' | 'round'
hover="none" // 'up' | 'down' | 'zoom'
/>
);
};
export default App;| props | type | description | default | note |
|---|---|---|---|---|
width |
string | Card width | 10em | |
height |
string | Card height | 10em | |
redirectURL |
string | URL to redirect | / | |
shape |
CardShapeType | You can decorate shape of Card a variety of theme such as 'square', 'round-square', 'round'. | square | |
hover |
CardHoverType | You can make an effect on Card a variety of theme such as 'up', 'down', 'zoom'. | none |
Contact
import { Contact } from 'dev-portfolio';
const channels = [ ... ];
const aboutMeInfos = [ ... ];
const App = () => {
return (
<Contact
id="Contact Component"
backgroundColor="whitesmoke"
title="Hello My name is OOO"
subTitle="If you're interested in me, please press the button below :D"
buttonText="Want to work with me?"
email="abc@dev-portfolio.com"
channels={channels}
aboutMeInfos={aboutMeInfos}
/>
);
};
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
backgroundColor |
string | Contact Background Color | whitesmoke | |
title |
string | Core of your contacts | Hello, my name is DEV_PORTFOLIO | |
subTitle |
string | Sub title text | If you're interested in me, please press the button below :D | |
email |
string | Your Email | abc@dev-portfolio.com | |
buttonText |
string | Text of button that function as a link to your email | Want to work with me? | |
channels |
ChannelType[] | Channel-only props such as Github and LinkedIn, etc | See "More about Contact's Props" | |
aboutMeInfos |
AboutMeInfoPropsType[] | Your personal information like TEL, Home etc | See "More about Contact's Props" |
More about Contact's props
- channels example
const channels = [
{ name: 'github', redirectUrl: 'https://', color: '#181717BB', size: '24px' },
{ name: 'naver', redirectUrl: 'https://', color: '#47A141BB', size: '24px' },
{ name: 'facebook', redirectUrl: 'https://', color: '#1877F2BB', size: '24px' },
{ name: 'youtube', redirectUrl: 'https://', color: '#FF0000BB', size: '24px' },
];- aboutMeInfos example
const aboutMeInfos = [
{
title: 'Where I live',
description: 'Gangdong-gu, Seoul, Republic of Korea',
},
{
title: 'Give me a call',
description: 'T. +82 (0)10 1234 5678',
},
{
title: 'Or, why don’t you email me?',
description: 'dev-portfolio@gmail.com',
},
],VisitorCounter
import { VisitorCounter } from 'dev-portfolio';
const App = () => {
return (
<VisitorCounter
title="hits"
theme="big-size" // 'default' | 'big-size' | 'simple'
todayVisitor={0} // Your fetched variable
totalVisitor={123} // Your fetched variable
todayTitle="today"
totalTitle="total"
backgroundColor="#91c230c4"
size="14px" // include: px
todayBoldColor="red"
totalBoldColor="red"
/>
);
};
export default App;| props | type | description | default | note |
|---|---|---|---|---|
title |
string | Hit title used in 'default' and 'big-size' | hits | |
theme |
VisitorCounterThemeType | Visitor Counter theme: 'default', 'big-size', 'simple' | default | |
todayVisitor |
number | Number of today's visitors | 0 | fetched variable |
totalVisitor |
number | Number of total's visitors | 123 | fetched variable |
todayTitle |
string | Title of today visit count used in 'big-size' and 'simple' | today | |
totalTitle |
string | Title of total visit count used in 'big-size' and 'simple' | total | |
backgroundColor |
string | Background color of todayTitle | #91c230c4 | |
size |
string | Font size and component size in the visitor counter component | 14px | Make sure to include 'px' |
todayBoldColor |
string | Color of today's visit count used in 'big-size' and 'simple' | red | |
totalBoldColor |
string | Color of total visit count used in 'big-size' and 'simple' | red |
More about VisitorCounter's props
- theme example
// 'default' | 'big-size' | 'simple'
const theme = 'default';- VisitorCounter example
const visitorCounter = {
title: 'hits',
todayTitle: 'today',
totalTitle: 'total',
};VisitorComment

import { VisitorComment } from 'dev-portfolio';
const commentList = [ ... ];
const App = () => {
return (
<VisitorComment
id="VisitorComment Component"
theme="basic" // 'basic' | 'box' | 'vertical'
backgroundColor="whitesmoke"
inputBackgroundColor="White"
userInputLineColor="#b4b4b4a2"
buttonColor="#1877f2"
progressbarColor="#5f5f5f"
isShowScrollDownIcon={true}
scrollDownIconColor='black'
commentInputPlacehoder={commentInputPlacehoder}
comment='this portfolio is very nice' // Your fetched variable
nickname='dev-portfolio' // Your fetched variable
password='1234' // Your fetched variable
commentList={commentList} // Your fetched variable
handleCreateComment={handleCreateComment} // Event handling variable
handleChangeDescription={handleChangeDescription} // Event handling variable
handleChangeNickname={handleChangeNickname} // Event handling variable
handleChangePassword={handleChangePassword} // Event handling variable
/>
);
}
export default App;| props | type | description | default | note |
|---|---|---|---|---|
id |
string | Name to be added to Sidebar | See Guideline to add icon | |
theme |
VisitorCommentThemeType | Visitor Comment theme: 'basic', 'box', 'vertical' | basic | |
backgroundColor |
string | VisitorComment background-color | whitesmoke | |
inputBackgroundColor |
string | Background color of guest book preparation column | White | |
userInputLineColor |
string | Underline color in the User Information field | #b4b4b4a2 | |
buttonColor |
string | Font color of send button | #1877f | |
progressbarColor |
string | The color of the progress bar that is generated when a scroll event occurs | #5f5f5f | |
isShowScrollDownIcon |
boolean | Whether to display icons that are generated when a scroll event occurs | true | |
scrollDownIconColor |
string | Color in ScrollDown Icon | black | Only works when isShowScrollDownIcon is true |
comment |
string | the text of visitor comment | this portfolio is very nice | fetched variable |
nickname |
string | the nickname of visitor comment | dev-portfolio | fetched variable |
password |
string | the password of visitor comment | 1234 | fetched variable |
commentInputPlacehoder |
CommentInputPlaceholderType | Placeholder in the input that you write in the visitor comment | See "More about VisitorComment's Props" | |
commentList |
VisitorCommentListType | Description, nickname, and date displayed in comment list | See "More about VisitorComment's Props" | fetched variable |
handleCreateComment |
(e?: React.MouseEvent |
Comments Props for event handling | ||
handleChangeDescription |
(e?: React.ChangeEvent |
Description Props for event handling | ||
handleChangeNickname |
(e?: React.ChangeEvent |
Nickname Props for event handling | ||
handleChangePassword |
(e?: React.ChangeEvent |
Password Props for event handling |
More about VisitorComment's props
- VisitorComment example
const visitorComment = {
theme: 'basic',
progressbarColor: '#5f5f5f',
isShowScrollDownIcon: true,
commentList: [
{
description: `The scroll customization method is the same as the teckstack component progress bar, so please use it!`,
nickname: 'woorim960',
date: '2022-08-26',
},
{
description: `Progress bar customization is also possible when creating a scroll.`,
nickname: 'seohyunsim',
date: '2022-08-26',
},
{
description: `Likewise, there are three types of themes: basic, box, and vertical.`,
nickname: 'jisu3817',
date: '2022-08-26',
},
{
description: 'Refer to dev-portfolio README.md for instructions on building a personal server.',
nickname: 'soonki-98',
date: '2022-08-26',
},
{
description: `A personal server can be built through environmental variables, and visitors can write their text and nicknames.`,
nickname: 'woorim960',
date: '2022-08-26',
},
{
description: 'By looking at your portfolio, visitors can leave a guest book.',
nickname: 'seohyunsim',
date: '2022-08-26',
},
],
};Example
Guidelines to input icons
Enter the name of the icon you searched on the following site.
(example: 'simple-icons:devdotto')
More about used props
- id example
const id = "['ID_NAME', 'ICON_NAME']"- iconName example
const iconName = 'ICON_NAME',License
MIT

