Merge branch 'master' of https://github.com/rahuldkjain/github-profile-readme-generator
This commit is contained in:
@@ -14,6 +14,15 @@
|
|||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"login": "Hardik0307",
|
||||||
|
"name": "Hardik Bagada",
|
||||||
|
"avatar_url": "https://avatars3.githubusercontent.com/u/41434099?v=4",
|
||||||
|
"profile": "https://github.com/Hardik0307",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"login": "antonkomarev",
|
"login": "antonkomarev",
|
||||||
"name": "Anton Komarev",
|
"name": "Anton Komarev",
|
||||||
@@ -22,6 +31,61 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"plugin"
|
"plugin"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "KKVANONYMOUS",
|
||||||
|
"name": "Kunal Kumar Verma",
|
||||||
|
"avatar_url": "https://avatars3.githubusercontent.com/u/58628586?v=4",
|
||||||
|
"profile": "https://kkvanonymous.github.io/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "jaideepghosh",
|
||||||
|
"name": "Jaideep Ghosh",
|
||||||
|
"avatar_url": "https://avatars2.githubusercontent.com/u/3909648?v=4",
|
||||||
|
"profile": "http://jaideepghosh.blogspot.com",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"login": "YashKandalkar",
|
||||||
|
"name": "yash",
|
||||||
|
"avatar_url": "https://avatars0.githubusercontent.com/u/35102959?v=4",
|
||||||
|
"profile": "http://yashkandalkar.github.io",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "abhijit-hota",
|
||||||
|
"name": "Abhijit Hota",
|
||||||
|
"avatar_url": "https://avatars0.githubusercontent.com/u/8116174?v=4",
|
||||||
|
"profile": "https://github.com/abhijit-hota",
|
||||||
|
"contributions": [
|
||||||
|
"code",
|
||||||
|
"test"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Maddoxx88",
|
||||||
|
"name": "Sunit Shirke",
|
||||||
|
"avatar_url": "https://avatars1.githubusercontent.com/u/34238672?v=4",
|
||||||
|
"profile": "https://maddoxx88.github.io/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"login": "g-savitha",
|
||||||
|
"name": "Savitha Gollamudi",
|
||||||
|
"avatar_url": "https://avatars0.githubusercontent.com/u/31612459?v=4",
|
||||||
|
"profile": "https://www.gsavitha.in",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
<!--
|
||||||
|
For Work In Progress Pull Requests, please use the Draft PR feature,
|
||||||
|
see https://github.blog/2019-02-14-introducing-draft-pull-requests/ for further details.
|
||||||
|
|
||||||
|
For a timely review/response, please avoid force-pushing additional
|
||||||
|
commits if your PR already received reviews or comments.
|
||||||
|
|
||||||
|
Before submitting a Pull Request, please ensure you've done the following:
|
||||||
|
- 📖 Read the Contributing Guide: https://github.com/rahuldkjain/github-profile-readme-generator/blob/master/CONTRIBUTING.md#create-a-pull-request.
|
||||||
|
- 📖 Read the Code of Conduct: https://github.com/rahuldkjain/github-profile-readme-generator/blob/master/CODE_OF_CONDUCT.md.
|
||||||
|
- 👷♀️ Create small PRs. In most cases this will be possible.
|
||||||
|
- ✅ Provide issue number with link.
|
||||||
|
- 📝 Use descriptive commit messages.
|
||||||
|
- 📗 Update any related documentation and include any relevant screenshots.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## What type of PR is this? (check all applicable)
|
||||||
|
|
||||||
|
- [ ] Refactor
|
||||||
|
- [ ] Feature
|
||||||
|
- [ ] Bug Fix
|
||||||
|
- [ ] Enhancement
|
||||||
|
- [ ] Documentation Update
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
## Related Tickets & Documents
|
||||||
|
|
||||||
|
## QA Instructions, Screenshots, Recordings
|
||||||
|
|
||||||
|
_Please replace this line with instructions on how to test your changes, as well
|
||||||
|
as any relevant images for UI changes._
|
||||||
|
|
||||||
|
<!-- ## Added tests?
|
||||||
|
|
||||||
|
- [ ] yes
|
||||||
|
- [ ] no, because they aren't needed
|
||||||
|
- [ ] no, because I need help -->
|
||||||
|
|
||||||
|
## Added to documentation?
|
||||||
|
|
||||||
|
- [ ] readme
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome
|
||||||
|
|
||||||
|
# Comment to be posted to on first time issues
|
||||||
|
newIssueWelcomeComment: >
|
||||||
|
Thanks for opening your first issue here! Your contribution means alot. 🙌 Join Discord Server (https://discord.gg/HHMs7Eg) for discussing issues, pull-requests, new features, etc.
|
||||||
|
|
||||||
|
# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome
|
||||||
|
|
||||||
|
# Comment to be posted to on PRs from first time contributors in your repository
|
||||||
|
newPRWelcomeComment: >
|
||||||
|
Thanks for opening this pull request! Make sure you have assigned an issue to this respective PR 😇
|
||||||
|
|
||||||
|
# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge
|
||||||
|
|
||||||
|
# Comment to be posted to on pull requests merged by a first time user
|
||||||
|
firstPRMergeComment: >
|
||||||
|
Congrats on merging your first pull request🎉! Thanks alot for your contribution. 🙏
|
||||||
@@ -157,7 +157,7 @@ Please read [`CONTRIBUTING`](CONTRIBUTING.md) for details on our [`CODE OF CONDU
|
|||||||
|
|
||||||
## Contributors ✨
|
## Contributors ✨
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||||
[](#contributors-)
|
[](#contributors-)
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||||
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||||
|
|
||||||
@@ -167,7 +167,14 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/sarbikbetal"><img src="https://avatars2.githubusercontent.com/u/41508422?v=4" width="100px;" alt=""/><br /><sub><b>Sarbik Betal</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=sarbikbetal" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/sarbikbetal"><img src="https://avatars2.githubusercontent.com/u/41508422?v=4" width="100px;" alt=""/><br /><sub><b>Sarbik Betal</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=sarbikbetal" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Hardik0307"><img src="https://avatars3.githubusercontent.com/u/41434099?v=4" width="100px;" alt=""/><br /><sub><b>Hardik Bagada</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=Hardik0307" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://komarev.com"><img src="https://avatars0.githubusercontent.com/u/1849174?v=4" width="100px;" alt=""/><br /><sub><b>Anton Komarev</b></sub></a><br /><a href="#plugin-antonkomarev" title="Plugin/utility libraries">🔌</a></td>
|
<td align="center"><a href="https://komarev.com"><img src="https://avatars0.githubusercontent.com/u/1849174?v=4" width="100px;" alt=""/><br /><sub><b>Anton Komarev</b></sub></a><br /><a href="#plugin-antonkomarev" title="Plugin/utility libraries">🔌</a></td>
|
||||||
|
<td align="center"><a href="https://kkvanonymous.github.io/"><img src="https://avatars3.githubusercontent.com/u/58628586?v=4" width="100px;" alt=""/><br /><sub><b>Kunal Kumar Verma</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=KKVANONYMOUS" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://jaideepghosh.blogspot.com"><img src="https://avatars2.githubusercontent.com/u/3909648?v=4" width="100px;" alt=""/><br /><sub><b>Jaideep Ghosh</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=jaideepghosh" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="http://yashkandalkar.github.io"><img src="https://avatars0.githubusercontent.com/u/35102959?v=4" width="100px;" alt=""/><br /><sub><b>yash</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=YashKandalkar" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/abhijit-hota"><img src="https://avatars0.githubusercontent.com/u/8116174?v=4" width="100px;" alt=""/><br /><sub><b>Abhijit Hota</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=abhijit-hota" title="Code">💻</a> <a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=abhijit-hota" title="Tests">⚠️</a></td>
|
||||||
|
<td align="center"><a href="https://maddoxx88.github.io/"><img src="https://avatars1.githubusercontent.com/u/34238672?v=4" width="100px;" alt=""/><br /><sub><b>Sunit Shirke</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=Maddoxx88" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://www.gsavitha.in"><img src="https://avatars0.githubusercontent.com/u/31612459?v=4" width="100px;" alt=""/><br /><sub><b>Savitha Gollamudi</b></sub></a><br /><a href="https://github.com/rahuldkjain/github-profile-readme-generator/commits?author=g-savitha" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
module.exports = "test-file-stub"
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
const React = require("react")
|
||||||
|
const gatsby = jest.requireActual("gatsby")
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
...gatsby,
|
||||||
|
graphql: jest.fn(),
|
||||||
|
Link: jest.fn().mockImplementation(
|
||||||
|
// these props are invalid for an `a` tag
|
||||||
|
({
|
||||||
|
activeClassName,
|
||||||
|
activeStyle,
|
||||||
|
getProps,
|
||||||
|
innerRef,
|
||||||
|
partiallyActive,
|
||||||
|
ref,
|
||||||
|
replace,
|
||||||
|
to,
|
||||||
|
...rest
|
||||||
|
}) =>
|
||||||
|
React.createElement("a", {
|
||||||
|
...rest,
|
||||||
|
href: to,
|
||||||
|
})
|
||||||
|
),
|
||||||
|
StaticQuery: jest.fn(),
|
||||||
|
useStaticQuery: jest.fn(),
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
const babelOptions = {
|
||||||
|
presets: ["babel-preset-gatsby"],
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = require("babel-jest").createTransformer(babelOptions)
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
module.exports = {
|
||||||
|
transform: {
|
||||||
|
"^.+\\.jsx?$": `<rootDir>/jest-preprocess.js`,
|
||||||
|
},
|
||||||
|
moduleNameMapper: {
|
||||||
|
".+\\.(css|styl|less|sass|scss)$": `identity-obj-proxy`,
|
||||||
|
".+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": `<rootDir>/__mocks__/file-mock.js`,
|
||||||
|
},
|
||||||
|
testPathIgnorePatterns: [`node_modules`, `\\.cache`, `<rootDir>.*/public`],
|
||||||
|
transformIgnorePatterns: [`node_modules/(?!(gatsby)/)`],
|
||||||
|
globals: {
|
||||||
|
__PATH_PREFIX__: ``,
|
||||||
|
},
|
||||||
|
setupFiles: [`<rootDir>/loadershim.js`],
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
global.___loader = {
|
||||||
|
enqueue: jest.fn(),
|
||||||
|
}
|
||||||
Generated
+7603
-376
File diff suppressed because it is too large
Load Diff
+6
-1
@@ -25,12 +25,17 @@
|
|||||||
"react-helmet": "^6.1.0"
|
"react-helmet": "^6.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"babel-jest": "26.3.0",
|
||||||
|
"babel-preset-gatsby": "0.5.11",
|
||||||
"gatsby-plugin-postcss": "^2.3.11",
|
"gatsby-plugin-postcss": "^2.3.11",
|
||||||
"gatsby-plugin-purgecss": "^5.0.0",
|
"gatsby-plugin-purgecss": "^5.0.0",
|
||||||
"gatsby-plugin-twitter": "^2.3.10",
|
"gatsby-plugin-twitter": "^2.3.10",
|
||||||
"gatsby-remark-embedder": "^3.0.0",
|
"gatsby-remark-embedder": "^3.0.0",
|
||||||
"gh-pages": "^3.1.0",
|
"gh-pages": "^3.1.0",
|
||||||
|
"identity-obj-proxy": "3.0.0",
|
||||||
|
"jest": "26.4.2",
|
||||||
"prettier": "2.0.5",
|
"prettier": "2.0.5",
|
||||||
|
"react-test-renderer": "16.13.1",
|
||||||
"tailwindcss": "^1.7.6"
|
"tailwindcss": "^1.7.6"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
@@ -44,7 +49,7 @@
|
|||||||
"start": "npm run develop",
|
"start": "npm run develop",
|
||||||
"serve": "gatsby serve",
|
"serve": "gatsby serve",
|
||||||
"clean": "gatsby clean",
|
"clean": "gatsby clean",
|
||||||
"test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1",
|
"test": "jest",
|
||||||
"deploy": "gatsby build --prefix-paths && gh-pages -d public -b master"
|
"deploy": "gatsby build --prefix-paths && gh-pages -d public -b master"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`Title renders correctly 1`] = `
|
||||||
|
<div
|
||||||
|
className="flex justify-center items-start flex-col w-full px-2 sm:px-6 mb-10"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="text-xl sm:text-2xl font-bold font-title mt-2 mb-2"
|
||||||
|
>
|
||||||
|
Title
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className="flex justify-start items-center w-full text-regular text-xs sm:text-lg"
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
className="outline-none w-24 sm:w-40 mr-10 border-t-0 border-l-0 border-r-0 border solid border-gray-900 py-1 px-2 focus:border-blue-700 prefix"
|
||||||
|
id="title-prefix"
|
||||||
|
onChange={[Function]}
|
||||||
|
value="Hi 👋, I'm"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
className="outline-none placeholder-gray-700 w-1/2 sm:w-1/3 border-t-0 border-l-0 border-r-0 border solid border-gray-900 py-1 px-2 focus:border-blue-700"
|
||||||
|
id="title-name"
|
||||||
|
onChange={[Function]}
|
||||||
|
placeholder="name"
|
||||||
|
value=""
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import React from "react"
|
||||||
|
import renderer from "react-test-renderer"
|
||||||
|
|
||||||
|
import Title from "../title"
|
||||||
|
|
||||||
|
describe("Title", () => {
|
||||||
|
it("renders correctly", () => {
|
||||||
|
const tree = renderer
|
||||||
|
.create(<Title prefix={{ title: "Hi 👋, I'm" }} data={{ title: "" }} />)
|
||||||
|
.toJSON()
|
||||||
|
expect(tree).toMatchSnapshot()
|
||||||
|
})
|
||||||
|
})
|
||||||
+136
-12
@@ -1,26 +1,110 @@
|
|||||||
import React from "react"
|
import React, { useState, useEffect } from "react"
|
||||||
import { withPrefix } from "gatsby"
|
import { withPrefix } from "gatsby"
|
||||||
import { latestBlogs } from "../utils/workflows"
|
import { latestBlogs } from "../utils/workflows"
|
||||||
import links from "../constants/page-links"
|
import links from "../constants/page-links"
|
||||||
import { isMediumUsernameValid } from "../utils/validation"
|
import { isMediumUsernameValid, isGitHubUsernameValid } from "../utils/validation"
|
||||||
|
import { ToolsIcon, XCircleIcon } from "@primer/octicons-react";
|
||||||
|
|
||||||
const AddonsItem = ({inputId, inputChecked, onInputChange, ...props}) => {
|
const AddonsItem = ({inputId, inputChecked, onInputChange, Icon, onIconClick, ...props}) => {
|
||||||
return (
|
return (
|
||||||
<div className="py-2 flex justify-start items-center text-sm sm:text-lg">
|
<div className="py-2 flex justify-start items-center text-sm sm:text-lg">
|
||||||
<label htmlFor={inputId} className="cursor-pointer flex items-center">
|
<label htmlFor={inputId} className="cursor-pointer flex items-center">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
id={inputId}
|
id={inputId}
|
||||||
checked={inputChecked}
|
checked={inputChecked}
|
||||||
onChange={onInputChange}
|
onChange={onInputChange}
|
||||||
|
/>
|
||||||
|
<span className="pl-4">{props.children}</span>
|
||||||
|
</label>
|
||||||
|
{
|
||||||
|
Icon?
|
||||||
|
<button onClick={onIconClick} className="flex ml-3 focus:bg-gray-400" style={{outline: "none"}}>
|
||||||
|
<Icon className="transform scale-100 md:scale-125" />
|
||||||
|
</button>
|
||||||
|
:''
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const CustomizeBadge = ({githubName, badgeOptions, onBadgeUpdate}) => {
|
||||||
|
return (
|
||||||
|
<div className={`border-2 border-solid border-gray-900 bg-gray-100 p-2 ml-8`} style={{maxWidth: '21rem'}}>
|
||||||
|
<header className="text-base sm:text-lg">Customize Badge</header>
|
||||||
|
<hr className="border-gray-500"/>
|
||||||
|
<div className="text-sm sm:text-lg flex flex-col mt-2 ml-0 md:ml-4">
|
||||||
|
<label htmlFor="badge-style">Style:
|
||||||
|
<select
|
||||||
|
id="badge-style"
|
||||||
|
onChange={(e) => onBadgeUpdate('badgeStyle', e.target.value)}
|
||||||
|
value = {badgeOptions.badgeStyle}
|
||||||
|
>
|
||||||
|
<option value="flat">Flat</option>
|
||||||
|
<option value="flat-square">Flat Square</option>
|
||||||
|
<option value="plastic">Plastic</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label htmlFor="badge-color">Color:
|
||||||
|
<input
|
||||||
|
type="color"
|
||||||
|
id="badge-color"
|
||||||
|
defaultValue={`#${badgeOptions.badgeColor}`}
|
||||||
|
className="w-6"
|
||||||
|
onChange={(e) => onBadgeUpdate('badgeColor', e.target.value.replace('#', ''))}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label htmlFor="badge-label-text">Label Text:
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="badge-label-text"
|
||||||
|
placeholder="Profile views"
|
||||||
|
className="w-2/4 bg-gray-300 pl-2"
|
||||||
|
onChange={(e) => onBadgeUpdate('badgeLabel', e.target.value.trim())}
|
||||||
|
defaultValue={badgeOptions.badgeLabel}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<span className="mt-2 flex items-center">
|
||||||
|
Preview:
|
||||||
|
{
|
||||||
|
isGitHubUsernameValid(githubName)?
|
||||||
|
<img
|
||||||
|
src={`https://komarev.com/ghpvc/`
|
||||||
|
+ `?username=${githubName}`
|
||||||
|
+ `&label=${encodeURI(badgeOptions.badgeLabel)}`
|
||||||
|
+ `&color=${badgeOptions.badgeColor}`
|
||||||
|
+ `&style=${badgeOptions.badgeStyle}`
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<span className="pl-4">{props.children}</span>
|
: <span className="text-xxs md:text-sm text-red-600">Invalid GitHub username</span>
|
||||||
</label>
|
}
|
||||||
|
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const Addons = props => {
|
const Addons = props => {
|
||||||
|
const [customizeBadgeOpen, setCustomizeOpen] = useState(false);
|
||||||
|
const [debounce, setDebounce] = useState(undefined);
|
||||||
|
const [badgeOptions, setBadgeOptions] = useState({
|
||||||
|
badgeStyle: props.data.badgeStyle,
|
||||||
|
badgeColor: props.data.badgeColor,
|
||||||
|
badgeLabel: props.data.badgeLabel
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setBadgeOptions({
|
||||||
|
badgeStyle: props.data.badgeStyle,
|
||||||
|
badgeColor: props.data.badgeColor,
|
||||||
|
badgeLabel: props.data.badgeLabel
|
||||||
|
})
|
||||||
|
}, [props.data.badgeStyle, props.data.badgeColor, props.data.badgeLabel])
|
||||||
|
|
||||||
const blogPostPorkflow = () => {
|
const blogPostPorkflow = () => {
|
||||||
let payload = {
|
let payload = {
|
||||||
dev: {
|
dev: {
|
||||||
@@ -48,6 +132,20 @@ const Addons = props => {
|
|||||||
tempElement.click()
|
tempElement.click()
|
||||||
document.body.removeChild(tempElement)
|
document.body.removeChild(tempElement)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const onCustomizeClick = () => {
|
||||||
|
setCustomizeOpen(!customizeBadgeOpen);
|
||||||
|
}
|
||||||
|
|
||||||
|
const onBadgeUpdate = (option, value) => {
|
||||||
|
const callback = () => {
|
||||||
|
let newVal = (option==='badgeLabel' && value==='')?'Profile views':value;
|
||||||
|
setBadgeOptions({...badgeOptions, [option]: newVal});
|
||||||
|
props.handleDataChange(option, {target: {value: newVal}})
|
||||||
|
}
|
||||||
|
clearTimeout(debounce);
|
||||||
|
setDebounce(setTimeout(callback, 300));
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<div className="flex justify-center items-start flex-col w-full px-2 sm:px-6 mb-10">
|
<div className="flex justify-center items-start flex-col w-full px-2 sm:px-6 mb-10">
|
||||||
<div className="text-xl sm:text-2xl font-bold font-title mt-2 mb-2">
|
<div className="text-xl sm:text-2xl font-bold font-title mt-2 mb-2">
|
||||||
@@ -57,9 +155,27 @@ const Addons = props => {
|
|||||||
inputId="visitors-count"
|
inputId="visitors-count"
|
||||||
inputChecked={props.data.visitorsBadge}
|
inputChecked={props.data.visitorsBadge}
|
||||||
onInputChange={() => props.handleCheckChange("visitorsBadge")}
|
onInputChange={() => props.handleCheckChange("visitorsBadge")}
|
||||||
|
Icon={ customizeBadgeOpen ? XCircleIcon : ToolsIcon }
|
||||||
|
onIconClick={onCustomizeClick}
|
||||||
>
|
>
|
||||||
display visitors count badge
|
display visitors count badge
|
||||||
</AddonsItem>
|
</AddonsItem>
|
||||||
|
{
|
||||||
|
customizeBadgeOpen?
|
||||||
|
<CustomizeBadge
|
||||||
|
githubName={props.social.github}
|
||||||
|
badgeOptions={badgeOptions}
|
||||||
|
onBadgeUpdate={onBadgeUpdate}
|
||||||
|
/>
|
||||||
|
: ''
|
||||||
|
}
|
||||||
|
<AddonsItem
|
||||||
|
inputId="github-profile-trophy"
|
||||||
|
inputChecked={props.data.githubProfileTrophy}
|
||||||
|
onInputChange={() => props.handleCheckChange("githubProfileTrophy")}
|
||||||
|
>
|
||||||
|
display github trophy
|
||||||
|
</AddonsItem>
|
||||||
<AddonsItem
|
<AddonsItem
|
||||||
inputId="github-stats"
|
inputId="github-stats"
|
||||||
inputChecked={props.data.githubStats}
|
inputChecked={props.data.githubStats}
|
||||||
@@ -74,6 +190,13 @@ const Addons = props => {
|
|||||||
>
|
>
|
||||||
display top skills
|
display top skills
|
||||||
</AddonsItem>
|
</AddonsItem>
|
||||||
|
<AddonsItem
|
||||||
|
inputId="twitter-badge"
|
||||||
|
inputChecked={props.data.twitterBadge}
|
||||||
|
onInputChange={() => props.handleCheckChange("twitterBadge")}
|
||||||
|
>
|
||||||
|
display twitter badge
|
||||||
|
</AddonsItem>
|
||||||
<AddonsItem
|
<AddonsItem
|
||||||
inputId="dev-dynamic-blogs"
|
inputId="dev-dynamic-blogs"
|
||||||
inputChecked={props.data.devDynamicBlogs}
|
inputChecked={props.data.devDynamicBlogs}
|
||||||
@@ -106,6 +229,7 @@ const Addons = props => {
|
|||||||
download
|
download
|
||||||
<span
|
<span
|
||||||
onClick={blogPostPorkflow}
|
onClick={blogPostPorkflow}
|
||||||
|
onKeyDown={(e) => e.keyCode === 13 && blogPostPorkflow()}
|
||||||
role="button"
|
role="button"
|
||||||
tabIndex="0"
|
tabIndex="0"
|
||||||
style={{ cursor: "pointer", color: "#002ead" }}
|
style={{ cursor: "pointer", color: "#002ead" }}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ import React from "react"
|
|||||||
const Donate = () => {
|
const Donate = () => {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="text-center text-4xl my-2">Support 🙏</div>
|
<div className="text-center text-4xl my-2">Support
|
||||||
|
<span role="img" aria-label="praying hand emoji">🙏</span>
|
||||||
|
</div>
|
||||||
<div className="flex flex-col sm:flex-row items-start justify-between">
|
<div className="flex flex-col sm:flex-row items-start justify-between">
|
||||||
<div className="w-full sm:w-2/3">
|
<div className="w-full sm:w-2/3">
|
||||||
<div className="text-2xl mb-2">
|
<div className="text-2xl mb-2">
|
||||||
@@ -28,12 +30,13 @@ const Donate = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full sm:w-1/3 flex flex-col justify-center items-center">
|
<div className="w-full sm:w-1/3 flex flex-col justify-center items-center">
|
||||||
Tip💰
|
<span>Tip<span role="img" aria-label="Dollar medal">💰</span></span>
|
||||||
{/* Ko-Fi */}
|
{/* Ko-Fi */}
|
||||||
<a
|
<a
|
||||||
href="https://ko-fi.com/A0A81XXSX"
|
href="https://ko-fi.com/A0A81XXSX"
|
||||||
className="flex items-center justify-evenly bg-red-500 text-white py-2 px-4 my-2"
|
className="flex items-center justify-evenly bg-red-500 text-white py-2 px-4 my-2"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
className="w-6 h-6 mr-2"
|
className="w-6 h-6 mr-2"
|
||||||
@@ -47,6 +50,7 @@ const Donate = () => {
|
|||||||
href="https://www.paypal.me/rahuldkjain/10"
|
href="https://www.paypal.me/rahuldkjain/10"
|
||||||
className="flex items-center justify-evenly bg-blue-500 text-white py-2 px-4 my-2"
|
className="flex items-center justify-evenly bg-blue-500 text-white py-2 px-4 my-2"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
className="w-6 h-6 mr-2"
|
className="w-6 h-6 mr-2"
|
||||||
@@ -60,6 +64,7 @@ const Donate = () => {
|
|||||||
href="https://www.buymeacoffee.com/rahuldkjain"
|
href="https://www.buymeacoffee.com/rahuldkjain"
|
||||||
className="flex items-center justify-evenly bg-orange-500 text-white py-2 px-4 my-2"
|
className="flex items-center justify-evenly bg-orange-500 text-white py-2 px-4 my-2"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
className="w-6 h-6 mr-2"
|
className="w-6 h-6 mr-2"
|
||||||
|
|||||||
@@ -80,7 +80,11 @@ const Markdown = props => {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
const VisitorsBadge = props => {
|
const VisitorsBadge = props => {
|
||||||
let link = "https://komarev.com/ghpvc/?username=" + props.github
|
let link = "https://komarev.com/ghpvc/?username="
|
||||||
|
+ props.github
|
||||||
|
+ `&label=${props.badgeOptions.badgeLabel}`
|
||||||
|
+ `&color=${props.badgeOptions.badgeColor}`
|
||||||
|
+ `&style=${props.badgeOptions.badgeStyle}`
|
||||||
if (props.show) {
|
if (props.show) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -92,6 +96,33 @@ const Markdown = props => {
|
|||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
const TwitterBadge = props => {
|
||||||
|
let link = "https://img.shields.io/twitter/follow/" + props.twitter + "?logo=twitter&style=for-the-badge"
|
||||||
|
if (props.show) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{`<p align="left"> <a href="${props.base}/${props.twitter}" target="blank"><img src="${link}" alt="${props.twitter}" /></a> </p>`}
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
const GithubProfileTrophy = props => {
|
||||||
|
let link =
|
||||||
|
"https://github-profile-trophy.vercel.app/?username=" + props.github
|
||||||
|
if (props.show) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{`<p align="left"> <a href="https://github.com/ryo-ma/github-profile-trophy"><img src="${link}" alt="${props.github}" /></a> </p>`}
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
const GitHubStats = props => {
|
const GitHubStats = props => {
|
||||||
let link =
|
let link =
|
||||||
"https://github-readme-stats.vercel.app/api?username=" +
|
"https://github-readme-stats.vercel.app/api?username=" +
|
||||||
@@ -209,6 +240,22 @@ const Markdown = props => {
|
|||||||
<VisitorsBadge
|
<VisitorsBadge
|
||||||
show={props.data.visitorsBadge}
|
show={props.data.visitorsBadge}
|
||||||
github={props.social.github}
|
github={props.social.github}
|
||||||
|
badgeOptions={{
|
||||||
|
badgeLabel: encodeURI(props.data.badgeLabel),
|
||||||
|
badgeColor: props.data.badgeColor,
|
||||||
|
badgeStyle: props.data.badgeStyle
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
<>
|
||||||
|
<GithubProfileTrophy
|
||||||
|
show={props.data.githubProfileTrophy}
|
||||||
|
github={props.social.github}
|
||||||
|
/>
|
||||||
|
<TwitterBadge
|
||||||
|
base="https://twitter.com"
|
||||||
|
show={props.data.twitterBadge}
|
||||||
|
twitter={props.social.twitter}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
<>
|
<>
|
||||||
@@ -256,6 +303,9 @@ const Markdown = props => {
|
|||||||
project={props.data.contact}
|
project={props.data.contact}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
|
<>
|
||||||
|
<DisplayWork prefix={props.prefix.resume} link={props.link.resume} />
|
||||||
|
</>
|
||||||
<>
|
<>
|
||||||
<DisplayWork
|
<DisplayWork
|
||||||
prefix={props.prefix.funFact}
|
prefix={props.prefix.funFact}
|
||||||
@@ -424,7 +474,15 @@ const Markdown = props => {
|
|||||||
username={props.social.rssurl}
|
username={props.social.rssurl}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
{isSocial(props.social) ? <>{`</p>`}<br/><br/></> : ""}
|
{isSocial(props.social) ? (
|
||||||
|
<>
|
||||||
|
{`</p>`}
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
""
|
||||||
|
)}
|
||||||
<>
|
<>
|
||||||
<DisplaySkills skills={props.skills} />
|
<DisplaySkills skills={props.skills} />
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ const MarkdownPreview = props => {
|
|||||||
<DisplayWork prefix={prefix.ama} project={data.ama} />
|
<DisplayWork prefix={prefix.ama} project={data.ama} />
|
||||||
<DisplayWork prefix={prefix.portfolio} link={link.portfolio} />
|
<DisplayWork prefix={prefix.portfolio} link={link.portfolio} />
|
||||||
<DisplayWork prefix={prefix.blog} link={link.blog} />
|
<DisplayWork prefix={prefix.blog} link={link.blog} />
|
||||||
|
<DisplayWork prefix={prefix.resume} link={link.resume} />
|
||||||
<DisplayWork prefix={prefix.contact} project={data.contact} />
|
<DisplayWork prefix={prefix.contact} project={data.contact} />
|
||||||
<DisplayWork prefix={prefix.funFact} project={data.funFact} />
|
<DisplayWork prefix={prefix.funFact} project={data.funFact} />
|
||||||
</>
|
</>
|
||||||
@@ -222,7 +223,11 @@ const MarkdownPreview = props => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
const VisitorsBadgePreview = props => {
|
const VisitorsBadgePreview = props => {
|
||||||
let link = "https://komarev.com/ghpvc/?username=" + props.github
|
let link = "https://komarev.com/ghpvc/?username="
|
||||||
|
+ props.github
|
||||||
|
+ `&label=${props.badgeOptions.badgeLabel}`
|
||||||
|
+ `&color=${props.badgeOptions.badgeColor}`
|
||||||
|
+ `&style=${props.badgeOptions.badgeStyle}`
|
||||||
if (props.show) {
|
if (props.show) {
|
||||||
return (
|
return (
|
||||||
<div className="text-left my-2">
|
<div className="text-left my-2">
|
||||||
@@ -233,6 +238,35 @@ const MarkdownPreview = props => {
|
|||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
const TwitterBadgePreview = props => {
|
||||||
|
let link = "https://img.shields.io/twitter/follow/" + props.twitter + "?logo=twitter&style=for-the-badge"
|
||||||
|
if (props.show) {
|
||||||
|
return (
|
||||||
|
<div className="text-left my-2">
|
||||||
|
{" "}
|
||||||
|
<a href="https://twitter.com/${props.twitter}" target="blank">
|
||||||
|
<img className="h-4 sm:h-6" src={link} alt={props.twitter} />
|
||||||
|
</a>{" "}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const GithubProfileTrophyPreview = props => {
|
||||||
|
let link =
|
||||||
|
"https://github-profile-trophy.vercel.app/?username=" + props.github
|
||||||
|
if (props.show) {
|
||||||
|
return (
|
||||||
|
<div className="text-left my-2">
|
||||||
|
{" "}
|
||||||
|
<a href="https://github.com/ryo-ma/github-profile-trophy">
|
||||||
|
<img src={link} alt={props.github} />
|
||||||
|
</a>{" "}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
const GitHubStatsPreview = props => {
|
const GitHubStatsPreview = props => {
|
||||||
let link =
|
let link =
|
||||||
"https://github-readme-stats.vercel.app/api?username=" +
|
"https://github-readme-stats.vercel.app/api?username=" +
|
||||||
@@ -266,7 +300,7 @@ const MarkdownPreview = props => {
|
|||||||
skills.forEach(skill => {
|
skills.forEach(skill => {
|
||||||
if (props.skills[skill]) {
|
if (props.skills[skill]) {
|
||||||
listSkills.push(
|
listSkills.push(
|
||||||
<a href={skillWebsites[skill]} target="_blank">
|
<a href={skillWebsites[skill]} target="_blank" rel="noreferrer">
|
||||||
<img
|
<img
|
||||||
className="mb-4 mr-4 h-6 w-6 sm:h-10 sm:w-10"
|
className="mb-4 mr-4 h-6 w-6 sm:h-10 sm:w-10"
|
||||||
key={skill}
|
key={skill}
|
||||||
@@ -293,6 +327,19 @@ const MarkdownPreview = props => {
|
|||||||
<VisitorsBadgePreview
|
<VisitorsBadgePreview
|
||||||
show={props.data.visitorsBadge}
|
show={props.data.visitorsBadge}
|
||||||
github={props.social.github}
|
github={props.social.github}
|
||||||
|
badgeOptions={{
|
||||||
|
badgeLabel: encodeURI(props.data.badgeLabel),
|
||||||
|
badgeColor: props.data.badgeColor,
|
||||||
|
badgeStyle: props.data.badgeStyle
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<GithubProfileTrophyPreview
|
||||||
|
show={props.data.githubProfileTrophy}
|
||||||
|
github={props.social.github}
|
||||||
|
/>
|
||||||
|
<TwitterBadgePreview
|
||||||
|
show={props.data.twitterBadge}
|
||||||
|
twitter={props.social.twitter}
|
||||||
/>
|
/>
|
||||||
<WorkPreview work={props} />
|
<WorkPreview work={props} />
|
||||||
<SocialPreview social={props.social} />
|
<SocialPreview social={props.social} />
|
||||||
|
|||||||
@@ -151,6 +151,22 @@ const Work = props => {
|
|||||||
onChange={event => props.handleLinkChange("blog", event)}
|
onChange={event => props.handleLinkChange("blog", event)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="text-xs sm:text-lg flex flex-col sm:flex-row mb-10 justify-center sm:justify-start items-center sm:items-start w-full px-4 sm:px-0">
|
||||||
|
<input
|
||||||
|
id="resume-prefix"
|
||||||
|
className="outline-none mr-8 w-full sm:w-1/3 border-t-0 border-l-0 border-r-0 border solid border-gray-900 py-1 px-2 focus:border-blue-700"
|
||||||
|
value={props.prefix.resume}
|
||||||
|
onChange={event => props.handlePrefixChange("resume", event)}
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
id="resume"
|
||||||
|
placeholder="resume link"
|
||||||
|
className="outline-none placeholder-gray-700 mr-8 sm:mr-0 text-blue-700 w-full sm:w-1/3 border-t-0 border-l-0 border-r-0 border solid border-gray-900 py-1 px-2 focus:border-blue-700"
|
||||||
|
value={props.link.resume}
|
||||||
|
onChange={event => props.handleLinkChange("resume", event)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="text-xs sm:text-lg flex flex-col sm:flex-row mb-10 justify-center sm:justify-start items-center sm:items-start w-full px-4 sm:px-0">
|
<div className="text-xs sm:text-lg flex flex-col sm:flex-row mb-10 justify-center sm:justify-start items-center sm:items-start w-full px-4 sm:px-0">
|
||||||
<input
|
<input
|
||||||
id="funFact-prefix"
|
id="funFact-prefix"
|
||||||
|
|||||||
+57
-4
@@ -11,6 +11,7 @@ const categorizedSkills = {
|
|||||||
"javascript",
|
"javascript",
|
||||||
"typescript",
|
"typescript",
|
||||||
"php",
|
"php",
|
||||||
|
"perl",
|
||||||
"ruby",
|
"ruby",
|
||||||
"scala",
|
"scala",
|
||||||
"python",
|
"python",
|
||||||
@@ -56,11 +57,13 @@ const categorizedSkills = {
|
|||||||
"nodejs",
|
"nodejs",
|
||||||
"spring",
|
"spring",
|
||||||
"express",
|
"express",
|
||||||
|
"graphql",
|
||||||
"kafka",
|
"kafka",
|
||||||
"solr",
|
"solr",
|
||||||
"rabbitMQ",
|
"rabbitMQ",
|
||||||
"hadoop",
|
"hadoop",
|
||||||
"nginx",
|
"nginx",
|
||||||
|
"openresty",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -96,7 +99,8 @@ const categorizedSkills = {
|
|||||||
"hive",
|
"hive",
|
||||||
"realm",
|
"realm",
|
||||||
"mariadb",
|
"mariadb",
|
||||||
"elasticsearch"
|
"cockroachdb",
|
||||||
|
"elasticsearch",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -158,6 +162,7 @@ const categorizedSkills = {
|
|||||||
skills: [
|
skills: [
|
||||||
"illustrator",
|
"illustrator",
|
||||||
"photoshop",
|
"photoshop",
|
||||||
|
"xd",
|
||||||
"figma",
|
"figma",
|
||||||
"blender",
|
"blender",
|
||||||
"sketch",
|
"sketch",
|
||||||
@@ -168,7 +173,24 @@ const categorizedSkills = {
|
|||||||
|
|
||||||
static_site_generator: {
|
static_site_generator: {
|
||||||
title: "Static Site Generators",
|
title: "Static Site Generators",
|
||||||
skills: ["gatsby", "gridsome", "hugo", "jekyll", "nextjs", "nuxtjs"],
|
skills: [
|
||||||
|
"gatsby",
|
||||||
|
"gridsome",
|
||||||
|
"hugo",
|
||||||
|
"jekyll",
|
||||||
|
"nextjs",
|
||||||
|
"nuxtjs",
|
||||||
|
"11ty",
|
||||||
|
"scully",
|
||||||
|
"sculpin",
|
||||||
|
"sapper",
|
||||||
|
"vuepress"
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
game_engines:{
|
||||||
|
title: "Game Engines",
|
||||||
|
skills: ["unity"],
|
||||||
},
|
},
|
||||||
|
|
||||||
other: {
|
other: {
|
||||||
@@ -217,6 +239,7 @@ const icons = {
|
|||||||
express:
|
express:
|
||||||
"https://devicons.github.io/devicon/devicon.git/icons/express/express-original-wordmark.svg",
|
"https://devicons.github.io/devicon/devicon.git/icons/express/express-original-wordmark.svg",
|
||||||
go: "https://devicons.github.io/devicon/devicon.git/icons/go/go-original.svg",
|
go: "https://devicons.github.io/devicon/devicon.git/icons/go/go-original.svg",
|
||||||
|
graphql: "https://www.vectorlogo.zone/logos/graphql/graphql-icon.svg",
|
||||||
gulp:
|
gulp:
|
||||||
"https://devicons.github.io/devicon/devicon.git/icons/gulp/gulp-plain.svg",
|
"https://devicons.github.io/devicon/devicon.git/icons/gulp/gulp-plain.svg",
|
||||||
html5:
|
html5:
|
||||||
@@ -239,12 +262,18 @@ const icons = {
|
|||||||
"https://devicons.github.io/devicon/devicon.git/icons/nginx/nginx-original.svg",
|
"https://devicons.github.io/devicon/devicon.git/icons/nginx/nginx-original.svg",
|
||||||
nodejs:
|
nodejs:
|
||||||
"https://devicons.github.io/devicon/devicon.git/icons/nodejs/nodejs-original-wordmark.svg",
|
"https://devicons.github.io/devicon/devicon.git/icons/nodejs/nodejs-original-wordmark.svg",
|
||||||
|
openresty:
|
||||||
|
"https://symbols-electrical.getvecta.com/stencil_25/66_openresty.403a21ca72.svg",
|
||||||
oracle:
|
oracle:
|
||||||
"https://devicons.github.io/devicon/devicon.git/icons/oracle/oracle-original.svg",
|
"https://devicons.github.io/devicon/devicon.git/icons/oracle/oracle-original.svg",
|
||||||
photoshop:
|
photoshop:
|
||||||
"https://devicons.github.io/devicon/devicon.git/icons/photoshop/photoshop-plain.svg",
|
"https://devicons.github.io/devicon/devicon.git/icons/photoshop/photoshop-plain.svg",
|
||||||
|
xd:
|
||||||
|
"https://cdn.worldvectorlogo.com/logos/adobe-xd.svg",
|
||||||
php:
|
php:
|
||||||
"https://devicons.github.io/devicon/devicon.git/icons/php/php-original.svg",
|
"https://devicons.github.io/devicon/devicon.git/icons/php/php-original.svg",
|
||||||
|
perl:
|
||||||
|
"https://api.iconify.design/logos-perl.svg",
|
||||||
postgresql:
|
postgresql:
|
||||||
"https://devicons.github.io/devicon/devicon.git/icons/postgresql/postgresql-original-wordmark.svg",
|
"https://devicons.github.io/devicon/devicon.git/icons/postgresql/postgresql-original-wordmark.svg",
|
||||||
python:
|
python:
|
||||||
@@ -332,6 +361,7 @@ const icons = {
|
|||||||
nextjs: "https://cdn.worldvectorlogo.com/logos/nextjs-3.svg",
|
nextjs: "https://cdn.worldvectorlogo.com/logos/nextjs-3.svg",
|
||||||
reactnative: "https://reactnative.dev/img/header_logo.svg",
|
reactnative: "https://reactnative.dev/img/header_logo.svg",
|
||||||
mariadb: "https://www.vectorlogo.zone/logos/mariadb/mariadb-icon.svg",
|
mariadb: "https://www.vectorlogo.zone/logos/mariadb/mariadb-icon.svg",
|
||||||
|
cockroachdb: "https://worldvectorlogo.com/es/download/cockroachdb.svg",
|
||||||
objectivec:
|
objectivec:
|
||||||
"https://www.vectorlogo.zone/logos/apple_objectivec/apple_objectivec-icon.svg",
|
"https://www.vectorlogo.zone/logos/apple_objectivec/apple_objectivec-icon.svg",
|
||||||
clojure:
|
clojure:
|
||||||
@@ -368,7 +398,19 @@ const icons = {
|
|||||||
elasticsearch:
|
elasticsearch:
|
||||||
"https://www.vectorlogo.zone/logos/elastic/elastic-icon.svg",
|
"https://www.vectorlogo.zone/logos/elastic/elastic-icon.svg",
|
||||||
circleci:
|
circleci:
|
||||||
"https://www.vectorlogo.zone/logos/circleci/circleci-icon.svg"
|
"https://www.vectorlogo.zone/logos/circleci/circleci-icon.svg",
|
||||||
|
scully:
|
||||||
|
"https://raw.githubusercontent.com/scullyio/scully/main/assets/logos/SVG/scullyio-icon.svg",
|
||||||
|
"11ty":
|
||||||
|
"https://gist.githubusercontent.com/vivek32ta/c7f7bf583c1fb1c58d89301ea40f37fd/raw/f4c85cce5790758286b8f155ef9a177710b995df/11ty.svg",
|
||||||
|
sculpin:
|
||||||
|
"https://gist.githubusercontent.com/vivek32ta/c7f7bf583c1fb1c58d89301ea40f37fd/raw/1782aef8672484698c0dd407f900c4a329ed5bc4/sculpin.svg",
|
||||||
|
sapper:
|
||||||
|
"https://raw.githubusercontent.com/bestofjs/bestofjs-webui/master/public/logos/sapper.svg",
|
||||||
|
vuepress:
|
||||||
|
"https://raw.githubusercontent.com/AliasIO/wappalyzer/master/src/drivers/webextension/images/icons/VuePress.svg",
|
||||||
|
unity:
|
||||||
|
"https://www.vectorlogo.zone/logos/unity3d/unity3d-icon.svg"
|
||||||
}
|
}
|
||||||
|
|
||||||
const skillWebsites = {
|
const skillWebsites = {
|
||||||
@@ -393,6 +435,7 @@ const skillWebsites = {
|
|||||||
electron: "https://www.electronjs.org",
|
electron: "https://www.electronjs.org",
|
||||||
express: "https://expressjs.com",
|
express: "https://expressjs.com",
|
||||||
go: "https://golang.org",
|
go: "https://golang.org",
|
||||||
|
graphql: "https://graphql.org",
|
||||||
gulp: "https://gulpjs.com",
|
gulp: "https://gulpjs.com",
|
||||||
html5: "https://www.w3.org/html/",
|
html5: "https://www.w3.org/html/",
|
||||||
hugo: "https://gohugo.io/",
|
hugo: "https://gohugo.io/",
|
||||||
@@ -405,9 +448,12 @@ const skillWebsites = {
|
|||||||
mysql: "https://www.mysql.com/",
|
mysql: "https://www.mysql.com/",
|
||||||
nginx: "https://www.nginx.com",
|
nginx: "https://www.nginx.com",
|
||||||
nodejs: "https://nodejs.org",
|
nodejs: "https://nodejs.org",
|
||||||
|
openresty: "https://openresty.org/",
|
||||||
oracle: "https://www.oracle.com/",
|
oracle: "https://www.oracle.com/",
|
||||||
photoshop: "https://www.photoshop.com/en",
|
photoshop: "https://www.photoshop.com/en",
|
||||||
|
xd: "https://www.adobe.com/products/xd.html",
|
||||||
php: "https://www.php.net",
|
php: "https://www.php.net",
|
||||||
|
perl: "https://www.perl.org/",
|
||||||
postgresql: "https://www.postgresql.org",
|
postgresql: "https://www.postgresql.org",
|
||||||
python: "https://www.python.org",
|
python: "https://www.python.org",
|
||||||
rails: "https://rubyonrails.org",
|
rails: "https://rubyonrails.org",
|
||||||
@@ -467,6 +513,7 @@ const skillWebsites = {
|
|||||||
nextjs: "https://nextjs.org/",
|
nextjs: "https://nextjs.org/",
|
||||||
reactnative: "https://reactnative.dev/",
|
reactnative: "https://reactnative.dev/",
|
||||||
mariadb: "https://mariadb.org/",
|
mariadb: "https://mariadb.org/",
|
||||||
|
cockroachdb: "https://www.cockroachlabs.com/product/cockroachdb/",
|
||||||
objectivec: "",
|
objectivec: "",
|
||||||
clojure: "",
|
clojure: "",
|
||||||
haskell: "",
|
haskell: "",
|
||||||
@@ -489,7 +536,13 @@ const skillWebsites = {
|
|||||||
kibana: "https://www.elastic.co/kibana",
|
kibana: "https://www.elastic.co/kibana",
|
||||||
grafana: "https://grafana.com",
|
grafana: "https://grafana.com",
|
||||||
elasticsearch: "https://www.elastic.co",
|
elasticsearch: "https://www.elastic.co",
|
||||||
circleci: "https://circleci.com"
|
circleci: "https://circleci.com",
|
||||||
|
scully: "https://scully.io/",
|
||||||
|
sculpin: "https://sculpin.io/",
|
||||||
|
"11ty": "https://www.11ty.dev/",
|
||||||
|
sapper: "https://sapper.svelte.dev/",
|
||||||
|
vuepress: "https://vuepress.vuejs.org/",
|
||||||
|
unity: "https://unity.com/"
|
||||||
}
|
}
|
||||||
|
|
||||||
const initialSkillState = {}
|
const initialSkillState = {}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 395 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 419 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 968 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" version="1"><rect width="28" height="28" x="-30" y="-30" fill="#26557c" rx="1.4" ry="1.4" transform="matrix(0,-1,-1,0,0,0)"/><path d="m8.0254 8.0001c-0.7825-0.0166-1.1494 0.5244-0.9883 1.457 0.052 0.3006 0.3152 0.7299 0.8828 1.4419 0.63122 0.7909 0.88514 1.2227 1.1602 1.9707 0.4336 1.1793 0.63403 1.5748 0.98633 1.9434 0.27366 0.2863 0.27369 0.28712 0.08984 0.87109-0.28507 0.90556-0.34407 2.7207-0.11523 3.5742 0.34248 1.2774 0.76402 1.8574 1.3516 1.8574 0.41968 0 0.76364-0.35092 0.88672-0.9043 0.04268-0.19186 0.12249-0.46607 0.17773-0.60938 0.09535-0.24728 0.12093-0.22818 0.49414 0.38086 0.21628 0.35296 0.62866 0.87861 0.91602 1.168 0.6638 0.66845 1.5749 1.4217 1.6406 1.3574 0.02775-0.02713-0.238-0.42177-0.58984-0.87891s-1.0151-1.5189-1.4746-2.3594c-0.53593-0.98029-0.8997-1.5286-1.0137-1.5293-0.37045-0.0025-0.71588 0.58004-0.91602 1.5469-0.23056 1.1138-0.63675 0.92708-0.9668-0.44531-0.19019-0.79085-0.09106-1.856 0.26367-2.8535 0.16137-0.45376 0.29297-0.87373 0.29297-0.93164s-0.25731-0.54348-0.57227-1.0801c-0.315-0.537-0.6851-1.297-0.822-1.69-0.3326-0.954-0.4905-1.232-1.1582-2.043-0.6879-0.8346-0.753-1.2203-0.2051-1.2166 0.42554 0.00281 1.1123 0.28944 1.8027 0.75391 0.4371 0.29404 0.58523 0.33398 1.2871 0.33398 0.88142 0 1.0709 0.0722 2.293 0.87695 1.2445 0.81958 2.1722 1.5813 2.8145 2.3125 0.5704 0.64937 0.88201 1.2138 2.5605 4.6562 0.64433 1.3214 1.2158 1.9593 2.0039 2.2324 1.2173 0.42185 1.6317 0.61314 2.168 0.99805l0.56641 0.40625-0.38086 0.07422c-0.2103 0.04033-0.66847 0.10616-1.0176 0.14648-0.72741 0.084-1.2031 0.38573-1.2031 0.76367 0 0.42592 1.4513 1.6453 2.9062 2.4414 0.69903 0.38247 1.3716 0.75927 1.4941 0.83789 0.32598 0.20922 0.41424 0.18389 0.33008-0.0918-0.17624-0.57738-0.77279-1.1398-2.4297-2.2949-0.97197-0.6776-0.98199-0.65244 0.31641-0.78125 0.925-0.091 1.392-0.249 1.392-0.472 0-0.102-0.47-0.644-1.045-1.203-0.9-0.876-1.204-1.094-2.195-1.577-1.35-0.656-1.842-1.177-2.153-2.283-0.464-1.649-1.712-3.587-3.371-5.23-1.712-1.696-3.347-2.6344-4.845-2.7814-0.609-0.0598-0.924-0.1522-1.239-0.3653-0.5332-0.3611-1.7717-0.7684-2.3766-0.7812zm2.9629 3.002c-0.12266-0.0079-0.22945 0.0085-0.30273 0.05859-0.27341 0.18699-0.24099 0.41504 0.08008 0.55664 0.15092 0.06656 0.36501 0.30147 0.47656 0.52148 0.3751 0.73978 0.94985 0.2445 0.69336-0.59766-0.08085-0.26546-0.5793-0.51547-0.94727-0.53906z" opacity=".2"/><path fill="#fff" d="m8.0254 7c-0.7825-0.0166-1.1494 0.5244-0.9883 1.457 0.052 0.3006 0.3152 0.7302 0.8828 1.4414 0.6312 0.7906 0.8852 1.2226 1.1602 1.9706 0.4336 1.179 0.634 1.575 0.9859 1.943 0.274 0.287 0.274 0.288 0.09 0.872-0.2848 0.905-0.3438 2.72-0.115 3.574 0.342 1.277 0.764 1.857 1.352 1.857 0.419 0 0.763-0.351 0.886-0.904 0.043-0.192 0.123-0.466 0.178-0.609 0.095-0.248 0.121-0.229 0.494 0.38 0.216 0.353 0.629 0.879 0.916 1.168 0.664 0.669 1.575 1.422 1.641 1.358 0.028-0.027-0.238-0.422-0.59-0.879s-1.015-1.519-1.475-2.359c-0.536-0.981-0.899-1.529-1.013-1.53-0.371-0.002-0.716 0.58-0.916 1.547-0.231 1.114-0.637 0.927-0.967-0.445-0.19-0.791-0.091-1.856 0.264-2.854 0.161-0.453 0.293-0.873 0.293-0.931s-0.258-0.544-0.573-1.08c-0.315-0.537-0.6851-1.297-0.822-1.69-0.3326-0.954-0.4905-1.232-1.1582-2.0429-0.6879-0.8348-0.753-1.2204-0.2051-1.2168 0.4255 0.0029 1.1123 0.2895 1.8023 0.7539 0.438 0.2941 0.586 0.334 1.288 0.334 0.881 0 1.07 0.0722 2.293 0.877 1.244 0.8198 2.172 1.5818 2.814 2.3128 0.57 0.649 0.882 1.214 2.561 4.656 0.644 1.321 1.215 1.959 2.003 2.232 1.218 0.422 1.632 0.613 2.168 0.998l0.567 0.407-0.381 0.074c-0.21 0.04-0.669 0.106-1.018 0.146-0.727 0.084-1.203 0.386-1.203 0.764 0 0.426 1.451 1.645 2.906 2.441 0.7 0.383 1.372 0.76 1.495 0.838 0.326 0.21 0.414 0.184 0.33-0.091-0.177-0.578-0.773-1.14-2.43-2.295-0.972-0.678-0.982-0.653 0.316-0.782 0.926-0.092 1.393-0.25 1.393-0.472 0-0.102-0.47-0.644-1.045-1.203-0.9-0.877-1.204-1.094-2.195-1.577-1.35-0.656-1.842-1.177-2.153-2.283-0.464-1.65-1.712-3.587-3.371-5.23-1.712-1.6965-3.347-2.6345-4.845-2.7815-0.609-0.0598-0.924-0.1522-1.239-0.3653-0.5332-0.3611-1.7717-0.7684-2.3766-0.7812zm2.9626 3.002c-0.122-0.0079-0.229 0.008-0.302 0.059-0.274 0.187-0.241 0.415 0.08 0.556 0.151 0.067 0.365 0.302 0.476 0.522 0.375 0.739 0.95 0.244 0.694-0.598-0.081-0.265-0.58-0.515-0.948-0.539z"/><path fill="#fff" d="m3.4004 2c-0.7756 0-1.4004 0.6248-1.4004 1.4004v1c0-0.7756 0.6248-1.4004 1.4004-1.4004h25.2c0.775 0 1.4 0.6248 1.4 1.4004v-1c0-0.7756-0.625-1.4004-1.4-1.4004h-25.2z" opacity=".1"/><path d="m2 28.6v1c0 0.775 0.6248 1.4 1.4004 1.4h25.2c0.775 0 1.4-0.625 1.4-1.4v-1c0 0.775-0.625 1.4-1.4 1.4h-25.2c-0.7752 0-1.4-0.625-1.4-1.4z" opacity=".2"/></svg>
|
||||||
|
After Width: | Height: | Size: 4.5 KiB |
+63
-40
@@ -27,6 +27,7 @@ import SEO from "../components/seo"
|
|||||||
import {
|
import {
|
||||||
isGitHubUsernameValid,
|
isGitHubUsernameValid,
|
||||||
isMediumUsernameValid,
|
isMediumUsernameValid,
|
||||||
|
isTwitterUsernameValid
|
||||||
} from "../utils/validation"
|
} from "../utils/validation"
|
||||||
import Layout from "../components/layout"
|
import Layout from "../components/layout"
|
||||||
|
|
||||||
@@ -38,9 +39,11 @@ const DEFAULT_PREFIX = {
|
|||||||
helpWith: "🤝 I’m looking for help with",
|
helpWith: "🤝 I’m looking for help with",
|
||||||
ama: "💬 Ask me about",
|
ama: "💬 Ask me about",
|
||||||
contact: "📫 How to reach me",
|
contact: "📫 How to reach me",
|
||||||
|
resume: "📄 Know about my experiences",
|
||||||
funFact: "⚡ Fun fact",
|
funFact: "⚡ Fun fact",
|
||||||
portfolio: "👨💻 All of my projects are available at",
|
portfolio: "👨💻 All of my projects are available at",
|
||||||
blog: "📝 I regulary write articles on",
|
blog: "📝 I regulary write articles on",
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const DEFAULT_DATA = {
|
const DEFAULT_DATA = {
|
||||||
@@ -53,7 +56,12 @@ const DEFAULT_DATA = {
|
|||||||
ama: "",
|
ama: "",
|
||||||
contact: "",
|
contact: "",
|
||||||
funFact: "",
|
funFact: "",
|
||||||
|
twitterBadge: false,
|
||||||
visitorsBadge: false,
|
visitorsBadge: false,
|
||||||
|
badgeStyle: "flat",
|
||||||
|
badgeColor: "0e75b6",
|
||||||
|
badgeLabel: "Profile views",
|
||||||
|
githubProfileTrophy: false,
|
||||||
githubStats: false,
|
githubStats: false,
|
||||||
topLanguages: false,
|
topLanguages: false,
|
||||||
devDynamicBlogs: false,
|
devDynamicBlogs: false,
|
||||||
@@ -67,6 +75,7 @@ const DEFAULT_LINK = {
|
|||||||
helpWith: "",
|
helpWith: "",
|
||||||
portfolio: "",
|
portfolio: "",
|
||||||
blog: "",
|
blog: "",
|
||||||
|
resume: "",
|
||||||
}
|
}
|
||||||
|
|
||||||
const DEFAULT_SOCIAL = {
|
const DEFAULT_SOCIAL = {
|
||||||
@@ -221,10 +230,19 @@ const IndexPage = () => {
|
|||||||
trimDataValues(social, setSocial)
|
trimDataValues(social, setSocial)
|
||||||
trimDataValues(link, setLink)
|
trimDataValues(link, setLink)
|
||||||
resetCopyMarkdownButton()
|
resetCopyMarkdownButton()
|
||||||
if (data.visitorsBadge || data.githubStats || data.topLanguages) {
|
if (
|
||||||
|
data.visitorsBadge ||
|
||||||
|
data.githubProfileTrophy ||
|
||||||
|
data.githubStats ||
|
||||||
|
data.topLanguages
|
||||||
|
) {
|
||||||
if (social.github && isGitHubUsernameValid(social.github)) {
|
if (social.github && isGitHubUsernameValid(social.github)) {
|
||||||
generate()
|
generate()
|
||||||
}
|
}
|
||||||
|
} else if (data.twitterBadge) {
|
||||||
|
if (social.twitter && isTwitterUsernameValid(social.twitter)) {
|
||||||
|
generate()
|
||||||
|
}
|
||||||
} else if (social.github) {
|
} else if (social.github) {
|
||||||
if (isGitHubUsernameValid(social.github)) {
|
if (isGitHubUsernameValid(social.github)) {
|
||||||
generate()
|
generate()
|
||||||
@@ -359,10 +377,10 @@ const IndexPage = () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
setPrefix(cache.prefix || DEFAULT_PREFIX)
|
setPrefix(cache.prefix ? {...DEFAULT_PREFIX, ...cache.prefix} : DEFAULT_PREFIX)
|
||||||
setData(cache.data || DEFAULT_DATA)
|
setData(cache.data ? {...DEFAULT_DATA, ...cache.data} : DEFAULT_DATA)
|
||||||
setLink(cache.link || DEFAULT_LINK)
|
setLink(cache.link ? {...DEFAULT_LINK, ...cache.link} : DEFAULT_LINK)
|
||||||
setSocial(cache.social || DEFAULT_SOCIAL)
|
setSocial(cache.social ? {...DEFAULT_SOCIAL, ...cache.social} : DEFAULT_SOCIAL)
|
||||||
|
|
||||||
const cacheSkills = mergeDefaultWithNewDataSkills(
|
const cacheSkills = mergeDefaultWithNewDataSkills(
|
||||||
DEFAULT_SKILLS,
|
DEFAULT_SKILLS,
|
||||||
@@ -464,9 +482,13 @@ const IndexPage = () => {
|
|||||||
data={data}
|
data={data}
|
||||||
social={social}
|
social={social}
|
||||||
handleCheckChange={handleCheckChange}
|
handleCheckChange={handleCheckChange}
|
||||||
|
handleDataChange={handleDataChange}
|
||||||
/>
|
/>
|
||||||
<div className="section">
|
<div className="section">
|
||||||
{(data.visitorsBadge || data.githubStats || data.topLanguages) &&
|
{(data.visitorsBadge ||
|
||||||
|
data.githubProfileTrophy ||
|
||||||
|
data.githubStats ||
|
||||||
|
data.topLanguages) &&
|
||||||
!social.github ? (
|
!social.github ? (
|
||||||
<div className="warning">
|
<div className="warning">
|
||||||
* Please add github username to use these add-ons
|
* Please add github username to use these add-ons
|
||||||
@@ -511,6 +533,20 @@ const IndexPage = () => {
|
|||||||
) : (
|
) : (
|
||||||
""
|
""
|
||||||
)}
|
)}
|
||||||
|
{data.twitterBadge && !social.twitter ? (
|
||||||
|
<div className="warning">
|
||||||
|
* Please add twitter username to use these add-ons
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
""
|
||||||
|
)}
|
||||||
|
{social.twitter && !isTwitterUsernameValid(social.twitter) ? (
|
||||||
|
<div className="warning">
|
||||||
|
* Twitter username is invalid, please add a valid username
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
""
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center justify-center w-full">
|
<div className="flex items-center justify-center w-full">
|
||||||
<div
|
<div
|
||||||
@@ -518,6 +554,7 @@ const IndexPage = () => {
|
|||||||
tabIndex="0"
|
tabIndex="0"
|
||||||
role="button"
|
role="button"
|
||||||
onClick={handleGenerate}
|
onClick={handleGenerate}
|
||||||
|
onKeyDown={(e) => e.keyCode === 13 && handleGenerate()}
|
||||||
>
|
>
|
||||||
Generate README
|
Generate README
|
||||||
</div>
|
</div>
|
||||||
@@ -529,21 +566,17 @@ const IndexPage = () => {
|
|||||||
{generateMarkdown || generatePreview ? (
|
{generateMarkdown || generatePreview ? (
|
||||||
<div className="markdown-section p-4 sm:py-4 sm:px-10">
|
<div className="markdown-section p-4 sm:py-4 sm:px-10">
|
||||||
<div className="w-full flex justify-between items-center">
|
<div className="w-full flex justify-between items-center">
|
||||||
<div
|
<button
|
||||||
className="cursor-pointer text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
className="text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
||||||
tabIndex="0"
|
|
||||||
role="button"
|
|
||||||
onClick={handleBackToEdit}
|
onClick={handleBackToEdit}
|
||||||
>
|
>
|
||||||
<ArrowLeftIcon size={16} />
|
<ArrowLeftIcon size={24} />
|
||||||
<span className="hidden sm:block"> back to edit</span>
|
<span className="hidden sm:block"> back to edit</span>
|
||||||
</div>
|
</button>
|
||||||
|
|
||||||
<div
|
<button
|
||||||
className="cursor-pointer text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
className="text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
||||||
tabIndex="0"
|
|
||||||
id="copy-button"
|
id="copy-button"
|
||||||
role="button"
|
|
||||||
onClick={handleCopyToClipboard}
|
onClick={handleCopyToClipboard}
|
||||||
>
|
>
|
||||||
{copyObj.isCopied === true ? (
|
{copyObj.isCopied === true ? (
|
||||||
@@ -554,38 +587,32 @@ const IndexPage = () => {
|
|||||||
<span className="hidden sm:block" id="copy-markdown">
|
<span className="hidden sm:block" id="copy-markdown">
|
||||||
{copyObj.copiedText}
|
{copyObj.copiedText}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</button>
|
||||||
|
|
||||||
<div
|
<button
|
||||||
className="cursor-pointer text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
className="text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
||||||
tabIndex="0"
|
|
||||||
id="download-md-button"
|
id="download-md-button"
|
||||||
role="button"
|
|
||||||
onClick={handleDownloadMarkdown}
|
onClick={handleDownloadMarkdown}
|
||||||
>
|
>
|
||||||
<DownloadIcon size={24} />
|
<DownloadIcon size={24} />
|
||||||
<span className="hidden sm:block" id="download-markdown">
|
<span className="hidden sm:block" id="download-markdown">
|
||||||
download markdown
|
download markdown
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</button>
|
||||||
|
|
||||||
<div
|
<button
|
||||||
className="cursor-pointer text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
className="text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
||||||
tabIndex="0"
|
|
||||||
id="download-json-button"
|
id="download-json-button"
|
||||||
role="button"
|
|
||||||
onClick={handleDownloadJson}
|
onClick={handleDownloadJson}
|
||||||
>
|
>
|
||||||
<FileCodeIcon size={24} />
|
<FileCodeIcon size={24} />
|
||||||
<span className="hidden sm:block" id="download-json">
|
<span className="hidden sm:block" id="download-json">
|
||||||
download backup
|
download backup
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</button>
|
||||||
|
|
||||||
<div
|
<button
|
||||||
className="cursor-pointer text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
className="text-base w-1/6 border-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center p-1"
|
||||||
tabIndex="0"
|
|
||||||
role="button"
|
|
||||||
onClick={handleGeneratePreview}
|
onClick={handleGeneratePreview}
|
||||||
>
|
>
|
||||||
{previewMarkdown.isPreview ? (
|
{previewMarkdown.isPreview ? (
|
||||||
@@ -596,7 +623,7 @@ const IndexPage = () => {
|
|||||||
<span className="hidden sm:block ml-1" id="preview-markdown">
|
<span className="hidden sm:block ml-1" id="preview-markdown">
|
||||||
{previewMarkdown.buttonText}
|
{previewMarkdown.buttonText}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-full flex justify-center items-center">
|
<div className="w-full flex justify-center items-center">
|
||||||
@@ -648,14 +675,12 @@ const IndexPage = () => {
|
|||||||
new feature
|
new feature
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<button
|
||||||
className="text-xxs sm:text-sm border-2 w-auto px-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center"
|
className="text-xxs sm:text-sm border-2 w-auto px-2 border-solid border-gray-900 bg-gray-100 flex items-center justify-center"
|
||||||
role="button"
|
|
||||||
tabIndex="0"
|
|
||||||
onClick={handleResetForm}
|
onClick={handleResetForm}
|
||||||
>
|
>
|
||||||
Reset form
|
Reset form
|
||||||
</div>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full flex justify-start items-center my-4">
|
<div className="w-full flex justify-start items-center my-4">
|
||||||
<input
|
<input
|
||||||
@@ -665,14 +690,12 @@ const IndexPage = () => {
|
|||||||
value={restore}
|
value={restore}
|
||||||
onChange={e => setRestore(e.target.value)}
|
onChange={e => setRestore(e.target.value)}
|
||||||
/>
|
/>
|
||||||
<div
|
<button
|
||||||
className="text-xxs sm:text-sm border-2 w-32 border-solid border-gray-900 bg-gray-100 flex items-center justify-center py-1"
|
className="text-xxs sm:text-sm border-2 w-32 border-solid border-gray-900 bg-gray-100 flex items-center justify-center py-1"
|
||||||
role="button"
|
|
||||||
tabIndex="0"
|
|
||||||
onClick={handleRestore}
|
onClick={handleRestore}
|
||||||
>
|
>
|
||||||
Restore
|
Restore
|
||||||
</div>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col items-start justify-center">
|
<div className="flex flex-col items-start justify-center">
|
||||||
<div className="text-green-700 font-medium">Tips</div>
|
<div className="text-green-700 font-medium">Tips</div>
|
||||||
|
|||||||
@@ -9,4 +9,9 @@ const isMediumUsernameValid = username => {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
export { isGitHubUsernameValid, isMediumUsernameValid }
|
const isTwitterUsernameValid = username => {
|
||||||
|
var pattern = /^[a-zA-Z0-9_]{1,15}$/
|
||||||
|
return pattern.test(username)
|
||||||
|
}
|
||||||
|
|
||||||
|
export { isGitHubUsernameValid, isMediumUsernameValid, isTwitterUsernameValid }
|
||||||
|
|||||||
Reference in New Issue
Block a user