├── .gitignore
├── vercel.json
├── .DS_Store
├── next.config.js
├── docs
└── readme.png
├── public
├── .DS_Store
├── favicon.ico
└── images
│ ├── .DS_Store
│ ├── Profile.jpeg
│ ├── books
│ ├── cleanCode.jpg
│ └── useJsHead.webp
│ ├── works
│ ├── nlwSetup.png
│ ├── thumbHabits.png
│ ├── thumbTodoWeb.png
│ ├── habitsForPhone.png
│ ├── thumbFigmaJam.png
│ ├── thumbTodoMobile.png
│ ├── thumbIgniteFeedWeb.png
│ └── thumbIgniteFeedMobile.png
│ └── profile-linkedIn.jfif
├── components
├── .DS_Store
├── paragraph.js
├── fonts.js
├── bio.js
├── footer.js
├── icons
│ ├── heart.js
│ └── refresh-cw.js
├── section.js
├── chakra.js
├── dog.js
├── work.js
├── voxel-dog-loader.js
├── logo.js
├── layouts
│ ├── article.js
│ └── main.js
├── theme-toggle-button.js
├── grid-item.js
└── navbar.js
├── services
└── PostService
│ └── getPosts.js
├── prettier.config.js
├── lib
├── mocks
│ ├── postsData.js
│ └── bookData.js
├── model.js
└── theme.js
├── pages
├── _document.js
├── 404.js
├── _app.js
├── posts.js
├── books.js
├── works
│ ├── figma-jam.js
│ ├── ignite-feed.js
│ ├── todo-list.js
│ └── habits.js
├── works.js
└── index.js
├── package.json
├── LICENSE
├── README.md
└── styles
└── dog.style.css
/.gitignore:
--------------------------------------------------------------------------------
1 | .next
2 | node_modules
3 | package-lock.json
4 | yarn.lock
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "github": {
3 | "silent": true
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/.DS_Store
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | reactStrictMode: true,
3 | swcMinify: true
4 | }
5 |
--------------------------------------------------------------------------------
/docs/readme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/docs/readme.png
--------------------------------------------------------------------------------
/public/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/.DS_Store
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/components/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/components/.DS_Store
--------------------------------------------------------------------------------
/public/images/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/.DS_Store
--------------------------------------------------------------------------------
/public/images/Profile.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/Profile.jpeg
--------------------------------------------------------------------------------
/public/images/books/cleanCode.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/books/cleanCode.jpg
--------------------------------------------------------------------------------
/public/images/works/nlwSetup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/works/nlwSetup.png
--------------------------------------------------------------------------------
/public/images/books/useJsHead.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/books/useJsHead.webp
--------------------------------------------------------------------------------
/public/images/profile-linkedIn.jfif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/profile-linkedIn.jfif
--------------------------------------------------------------------------------
/public/images/works/thumbHabits.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/works/thumbHabits.png
--------------------------------------------------------------------------------
/public/images/works/thumbTodoWeb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/works/thumbTodoWeb.png
--------------------------------------------------------------------------------
/public/images/works/habitsForPhone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/works/habitsForPhone.png
--------------------------------------------------------------------------------
/public/images/works/thumbFigmaJam.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/works/thumbFigmaJam.png
--------------------------------------------------------------------------------
/public/images/works/thumbTodoMobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/works/thumbTodoMobile.png
--------------------------------------------------------------------------------
/public/images/works/thumbIgniteFeedWeb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/works/thumbIgniteFeedWeb.png
--------------------------------------------------------------------------------
/public/images/works/thumbIgniteFeedMobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JoyceFatima/homepage-for-developers/HEAD/public/images/works/thumbIgniteFeedMobile.png
--------------------------------------------------------------------------------
/components/paragraph.js:
--------------------------------------------------------------------------------
1 | import styled from '@emotion/styled'
2 |
3 | const Paragraph = styled.p`
4 | text-align: justify;
5 | `
6 |
7 | export default Paragraph
8 |
--------------------------------------------------------------------------------
/services/PostService/getPosts.js:
--------------------------------------------------------------------------------
1 | import postsData from '../../lib/mocks/postsData';
2 |
3 | const getPosts = () => {
4 | const response = postsData;
5 |
6 | return response;
7 | };
8 |
9 | export default getPosts;
--------------------------------------------------------------------------------
/components/fonts.js:
--------------------------------------------------------------------------------
1 | const Fonts = () => (
2 |
5 | )
6 | export default Fonts
7 |
--------------------------------------------------------------------------------
/prettier.config.js:
--------------------------------------------------------------------------------
1 | const options = {
2 | arrowParens: 'avoid',
3 | singleQuote: true,
4 | bracketSpacing: true,
5 | endOfLine: 'lf',
6 | semi: false,
7 | tabWidth: 2,
8 | trailingComma: 'none'
9 | }
10 |
11 | module.exports = options
12 |
--------------------------------------------------------------------------------
/components/bio.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@chakra-ui/react'
2 | import styled from '@emotion/styled'
3 |
4 | export const BioSection = styled(Box)`
5 | padding-left: 3.4em;
6 | text-indent: -3.4em;
7 | `
8 |
9 | export const BioYear = styled.span`
10 | font-weight: bold;
11 | margin-right: 1em;
12 | `
13 |
--------------------------------------------------------------------------------
/components/footer.js:
--------------------------------------------------------------------------------
1 | import { Box } from '@chakra-ui/react'
2 |
3 | const Footer = () => {
4 | return (
5 |
6 | © {new Date().getFullYear()} Joyce de Fátima Costa Santos. All Rights Reserved.
7 |
8 | )
9 | }
10 |
11 | export default Footer
12 |
--------------------------------------------------------------------------------
/lib/mocks/postsData.js:
--------------------------------------------------------------------------------
1 | import { v4 } from 'uuid';
2 |
3 | export default [
4 | // {
5 | // id: v4(),
6 | // title: "",
7 | // thumbnail: thumbFrontinsampa,
8 | // url: "https://www.linkedin.com/feed/update/urn:li:share:6955628974353825794?utm_source=linkedin_share&utm_medium=member_desktop_share&utm_content=post",
9 | // },
10 | ]
--------------------------------------------------------------------------------
/lib/mocks/bookData.js:
--------------------------------------------------------------------------------
1 | import CleanCode from "../../public/images/books/cleanCode.jpg";
2 | import UseJsHead from "../../public/images/books/useJsHead.webp";
3 |
4 | export default [
5 | {
6 | bookID: '00',
7 | bookName: 'Clean Code',
8 | bookAuthor: "Robert C.Martin",
9 | bookImage: CleanCode,
10 | },
11 | {
12 | bookID: '01',
13 | bookName: 'Use JavaScript Head',
14 | bookAuthor: "Morrison",
15 | bookImage: UseJsHead,
16 | },
17 | ];
--------------------------------------------------------------------------------
/components/icons/heart.js:
--------------------------------------------------------------------------------
1 | const Heart = props => (
2 |
14 |
15 |
16 | )
17 |
18 | export default Heart
19 |
--------------------------------------------------------------------------------
/pages/_document.js:
--------------------------------------------------------------------------------
1 | import { ColorModeScript } from '@chakra-ui/react'
2 | import NextDocument, { Html, Head, Main, NextScript } from 'next/document'
3 | import theme from '../lib/theme'
4 |
5 | export default class Document extends NextDocument {
6 | render() {
7 | return (
8 |
9 |
11 |
12 |
13 |
14 |
15 |
16 | )
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/components/icons/refresh-cw.js:
--------------------------------------------------------------------------------
1 | const RefreshCWIcon = props => (
2 |
14 |
15 |
16 |
17 |
18 | )
19 |
20 | export default RefreshCWIcon
21 |
--------------------------------------------------------------------------------
/components/section.js:
--------------------------------------------------------------------------------
1 | import { motion } from 'framer-motion'
2 | import { chakra, shouldForwardProp } from '@chakra-ui/react'
3 |
4 | const StyledDiv = chakra(motion.div, {
5 | shouldForwardProp: prop => {
6 | return shouldForwardProp(prop) || prop === 'transition'
7 | }
8 | })
9 |
10 | const Section = ({ children, delay = 0 }) => (
11 |
17 | {children}
18 |
19 | )
20 |
21 | export default Section
22 |
--------------------------------------------------------------------------------
/pages/404.js:
--------------------------------------------------------------------------------
1 | import NextLink from 'next/link'
2 | import {
3 | Box,
4 | Heading,
5 | Text,
6 | Container,
7 | Divider,
8 | Button
9 | } from '@chakra-ui/react'
10 |
11 | const NotFound = () => {
12 | return (
13 |
14 | Not found
15 | The page you're looking for was not found.
16 |
17 |
18 |
19 | Return to home
20 |
21 |
22 |
23 | )
24 | }
25 |
26 | export default NotFound
27 |
--------------------------------------------------------------------------------
/components/chakra.js:
--------------------------------------------------------------------------------
1 | import {
2 | ChakraProvider,
3 | cookieStorageManager,
4 | localStorageManager
5 | } from '@chakra-ui/react'
6 | import theme from '../lib/theme'
7 |
8 | export default function Chakra({ cookies, children }) {
9 | const colorModeManager =
10 | typeof cookies === 'string'
11 | ? cookieStorageManager(cookies)
12 | : localStorageManager
13 |
14 | return (
15 |
16 | {children}
17 |
18 | )
19 | }
20 |
21 | export async function getServerSideProps({ req }) {
22 | return {
23 | props: {
24 | cookies: req.headers.cookie ?? ''
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/components/dog.js:
--------------------------------------------------------------------------------
1 | const Dog = () => {
2 | return (
3 |
4 |
5 |
6 |
10 |
11 |
15 |
16 |
17 |
21 |
22 |
23 | )
24 | }
25 |
26 | export default Dog
27 |
--------------------------------------------------------------------------------
/components/work.js:
--------------------------------------------------------------------------------
1 | import NextLink from 'next/link'
2 | import { Heading, Box, Image, Link, Badge } from '@chakra-ui/react'
3 | import { ChevronRightIcon } from '@chakra-ui/icons'
4 |
5 | export const Title = ({ children }) => (
6 |
7 |
8 | Works
9 |
10 |
11 | {' '}
12 | {' '}
13 |
14 |
15 | {children}
16 |
17 |
18 | )
19 |
20 | export const WorkImage = ({ src, alt }) => (
21 |
22 | )
23 |
24 | export const Meta = ({ children }) => (
25 |
26 | {children}
27 |
28 | )
29 |
--------------------------------------------------------------------------------
/components/voxel-dog-loader.js:
--------------------------------------------------------------------------------
1 | import { forwardRef } from 'react'
2 | import { Box, Spinner } from '@chakra-ui/react'
3 |
4 | export const DogSpinner = () => (
5 |
13 | )
14 |
15 | export const DogContainer = forwardRef(({ children }, ref) => (
16 |
26 | {children}
27 |
28 | ))
29 |
30 | const Loader = () => {
31 | return (
32 |
33 |
34 |
35 | )
36 | }
37 |
38 | export default Loader
39 |
--------------------------------------------------------------------------------
/pages/_app.js:
--------------------------------------------------------------------------------
1 | import Layout from '../components/layouts/main'
2 | import Fonts from '../components/fonts'
3 | import { AnimatePresence } from 'framer-motion'
4 | import Chakra from '../components/chakra'
5 |
6 | import '../styles/dog.style.css'
7 |
8 | const handleToExit = () => (typeof window !== 'undefined') && window.scrollTo({ top: 0 })
9 |
10 | if (typeof window !== 'undefined') window.history.scrollRestoration = 'manual'
11 |
12 | function Website({ Component, pageProps, router }) {
13 | return (
14 |
15 |
16 |
17 |
22 |
23 |
24 |
25 |
26 | )
27 | }
28 |
29 | export default Website
30 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "lucasbercejesus",
3 | "version": "1.0.0",
4 | "description": "Joyce de Fátima Costa Santos website",
5 | "scripts": {
6 | "dev": "next dev -H 0.0.0.0",
7 | "build": "next build",
8 | "start": "next start",
9 | "prettier": "prettier --write .",
10 | "lint": "next lint"
11 | },
12 | "keywords": [],
13 | "author": "Joyce de Fátima Costa Santos",
14 | "license": "MIT",
15 | "dependencies": {
16 | "@chakra-ui/icons": "^1.1.7",
17 | "@chakra-ui/react": "^1.8.8",
18 | "@emotion/react": "^11.9.0",
19 | "@emotion/styled": "^11.8.1",
20 | "framer-motion": "^6.3.0",
21 | "next": "^12.1.5",
22 | "react": "^17.0.2",
23 | "react-dom": "^17.0.2",
24 | "react-icons": "^4.3.1",
25 | "three": "^0.139.2",
26 | "uuid": "^9.0.0"
27 | },
28 | "devDependencies": {
29 | "eslint": "^8.13.0",
30 | "eslint-config-next": "^12.1.5",
31 | "prettier": "^2.6.2"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/components/logo.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 | import { Text, useColorModeValue } from '@chakra-ui/react'
3 | import styled from '@emotion/styled'
4 |
5 | const LogoBox = styled.span`
6 | font-weight: bold;
7 | font-size: 18px;
8 | display: inline-flex;
9 | align-items: center;
10 | height: 30px;
11 | line-height: 20px;
12 | padding: 10px;
13 |
14 | img {
15 | transition: 200ms ease;
16 | }
17 |
18 | &:hover img {
19 | transform: rotate(20deg);
20 | }
21 | `
22 |
23 | const Logo = () => {
24 | return (
25 |
26 |
27 |
28 |
34 | Joyce de Fátima
35 |
36 |
37 |
38 |
39 | )
40 | }
41 |
42 | export default Logo
43 |
--------------------------------------------------------------------------------
/lib/model.js:
--------------------------------------------------------------------------------
1 | import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
2 |
3 | export function loadGLTFModel(
4 | scene,
5 | glbPath,
6 | options = { receiveShadow: true, castShadow: true }
7 | ) {
8 | const { receiveShadow, castShadow } = options
9 | return new Promise((resolve, reject) => {
10 | const loader = new GLTFLoader()
11 |
12 | loader.load(
13 | glbPath,
14 | gltf => {
15 | const obj = gltf.scene
16 | obj.name = 'dog'
17 | obj.position.y = 0
18 | obj.position.x = 0
19 | obj.receiveShadow = receiveShadow
20 | obj.castShadow = castShadow
21 | scene.add(obj)
22 |
23 | obj.traverse(function (child) {
24 | if (child.isMesh) {
25 | child.castShadow = castShadow
26 | child.receiveShadow = receiveShadow
27 | }
28 | })
29 | resolve(obj)
30 | },
31 | undefined,
32 | function (error) {
33 | reject(error)
34 | }
35 | )
36 | })
37 | }
38 |
--------------------------------------------------------------------------------
/components/layouts/article.js:
--------------------------------------------------------------------------------
1 | import { motion } from 'framer-motion'
2 | import Head from 'next/head'
3 | import { GridItemStyle } from '../grid-item'
4 |
5 | const variants = {
6 | hidden: { opacity: 0, x: 0, y: 20 },
7 | enter: { opacity: 1, x: 0, y: 0 },
8 | exit: { opacity: 0, x: -0, y: 20 }
9 | }
10 |
11 | const Layout = ({ children, title }) => {
12 | const t = `${title} - Joyce de Fátima Costa Santos`
13 | return (
14 |
22 | <>
23 | {title && (
24 |
25 | {t}
26 |
27 |
28 |
29 | )}
30 | {children}
31 |
32 |
33 | >
34 |
35 | )
36 | }
37 |
38 | export default Layout
39 |
--------------------------------------------------------------------------------
/components/theme-toggle-button.js:
--------------------------------------------------------------------------------
1 | import { AnimatePresence, motion } from 'framer-motion'
2 | import { IconButton, useColorMode, useColorModeValue } from '@chakra-ui/react'
3 | import { SunIcon, MoonIcon } from '@chakra-ui/icons'
4 |
5 | const ThemeToggleButton = () => {
6 | const { toggleColorMode } = useColorMode()
7 |
8 | return (
9 |
10 |
18 | , )}
22 | onClick={toggleColorMode}
23 | >
24 |
25 |
26 | )
27 | }
28 |
29 | export default ThemeToggleButton
30 |
--------------------------------------------------------------------------------
/lib/theme.js:
--------------------------------------------------------------------------------
1 | import { extendTheme } from '@chakra-ui/react'
2 | import { mode } from '@chakra-ui/theme-tools'
3 |
4 | const styles = {
5 | global: props => ({
6 | body: {
7 | bg: mode('#f0e7db', '#202023')(props)
8 | }
9 | })
10 | }
11 |
12 | const components = {
13 | Heading: {
14 | variants: {
15 | 'section-title': {
16 | textDecoration: 'underline',
17 | fontSize: 20,
18 | textUnderlineOffset: 6,
19 | textDecorationColor: '#525252',
20 | textDecorationThickness: 4,
21 | marginTop: 3,
22 | marginBottom: 4
23 | }
24 | }
25 | },
26 | Link: {
27 | baseStyle: props => ({
28 | color: mode('#3d7aed', '#4299E1')(props),
29 | textUnderlineOffset: 3
30 | })
31 | }
32 | }
33 |
34 | const fonts = {
35 | heading: "'M PLUS Rounded 1c'"
36 | }
37 |
38 | const colors = {
39 | grassTeal: '#88ccca'
40 | }
41 |
42 | const config = {
43 | initialColorMode: 'dark',
44 | useSystemColorMode: true
45 | }
46 |
47 | const theme = extendTheme({ config, styles, components, fonts, colors })
48 | export default theme
49 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Joyce de Fatima
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Joyce Homepage
2 |
3 | [https://portifolio-joycefatima.vercel.app/](https://portifolio-joycefatima.vercel.app/)
4 |
5 | 
6 |
7 | ## Stack
8 |
9 | - [Next.js](https://nextjs.org/) - A React framework with hybrid static & server rendering, and route pre-fetching, etc.
10 | - [Chakra UI](https://chakra-ui.com/) - A simple, modular and accessible component library for React
11 | - [Three.js](https://threejs.org/) - 3D library for JavaScript
12 | - [Framer Motion](https://www.framer.com/motion/) - An animation library for React
13 |
14 | ## Project structure
15 |
16 | ```
17 | $PROJECT_ROOT
18 | │ # Page files
19 | ├── pages
20 | │ # React component files
21 | ├── components
22 | │ # Non-react modules
23 | ├── lib
24 | │ # Static files for images and 3d model file
25 | └── public
26 | ```
27 | ## License
28 |
29 | MIT License.
30 |
31 | You can create your own homepage for free without notifying me by forking this project under the following conditions:
32 |
33 | - Add a link to [my homepage](https://www.craftz.dog/)
34 | - Do not use the 3d voxel dog
35 |
36 | Check out [LICENSE](./LICENSE) for more detail.
37 |
--------------------------------------------------------------------------------
/pages/posts.js:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from 'react';
2 | import { Container, Heading, SimpleGrid } from '@chakra-ui/react';
3 |
4 | import Layout from '../components/layouts/article';
5 | import Section from '../components/section';
6 | import { GridItem } from '../components/grid-item';
7 |
8 | import getPosts from '../services/PostService/getPosts';
9 |
10 | const Posts = () => {
11 | const [posts, setPosts] = useState([]);
12 |
13 | useEffect(() => {
14 | setPosts(getPosts());
15 | }, []);
16 |
17 | return (
18 |
19 |
20 |
21 | Popular Posts
22 |
23 |
24 |
25 |
26 | {posts.map(post => (
27 |
33 | ))}
34 |
35 |
36 |
37 |
38 | )
39 | }
40 |
41 | export default Posts
42 | export { getServerSideProps } from '../components/chakra'
43 |
--------------------------------------------------------------------------------
/pages/books.js:
--------------------------------------------------------------------------------
1 | import React, { memo } from 'react';
2 |
3 | import { Container, Heading, SimpleGrid } from '@chakra-ui/react';
4 |
5 | import Layout from '../components/layouts/article';
6 | import Section from '../components/section';
7 | import { GridItem } from '../components/grid-item';
8 |
9 | import bookData from '../lib/mocks/bookData';
10 |
11 | const BookIRecomended = () => {
12 | return (
13 |
14 |
15 |
21 | Hello, in this area of my website, I recomended
22 | to you some books that I have read.
23 |
24 |
25 |
26 |
31 | {bookData?.map(book => (
32 |
37 | ))}
38 |
39 |
40 |
41 |
42 | )
43 | }
44 |
45 | export default memo(BookIRecomended);
--------------------------------------------------------------------------------
/components/layouts/main.js:
--------------------------------------------------------------------------------
1 | import Head from 'next/head'
2 | import dynamic from 'next/dynamic'
3 | import NavBar from '../navbar'
4 | import { Box, Container } from '@chakra-ui/react'
5 | import Footer from '../footer'
6 | import VoxelDogLoader from '../voxel-dog-loader'
7 | // import Dog from '../dog'
8 |
9 | const LazyAnimation = dynamic(() => import('../dog'), {
10 | ssr: false,
11 | loading: () =>
12 | })
13 |
14 | const Main = ({ children, router }) => {
15 | return (
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | Joyce de Fátima
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | {children}
34 |
35 |
36 |
37 |
38 | )
39 | }
40 |
41 | export default Main
42 |
--------------------------------------------------------------------------------
/components/grid-item.js:
--------------------------------------------------------------------------------
1 | import NextLink from 'next/link'
2 | import Image from 'next/image'
3 | import { Box, Text, LinkBox, LinkOverlay } from '@chakra-ui/react'
4 | import { Global } from '@emotion/react'
5 |
6 | export const GridItem = ({ children, href, title, thumbnail }) => (
7 |
8 |
9 |
16 |
17 | {title}
18 |
19 | {children}
20 |
21 |
22 | )
23 |
24 | export const WorkGridItem = ({ children, id, title, thumbnail }) => (
25 |
26 |
27 |
28 |
34 |
35 |
36 | {title}
37 |
38 |
39 | {children}
40 |
41 |
42 |
43 | )
44 |
45 | export const GridItemStyle = () => (
46 |
53 | )
54 |
--------------------------------------------------------------------------------
/pages/works/figma-jam.js:
--------------------------------------------------------------------------------
1 | import {
2 | Container,
3 | Badge,
4 | Link,
5 | List,
6 | ListItem,
7 | UnorderedList,
8 | Center,
9 | Image
10 | } from '@chakra-ui/react'
11 | import Layout from '../../components/layouts/article'
12 | import { Title, Meta } from '../../components/work'
13 | import P from '../../components/paragraph'
14 |
15 | const FigmaJam = () => (
16 |
17 |
18 |
19 | Figma Jam 2023
20 |
21 |
22 | Created to discover an interactive library and develop my creativity. It was a lot of fun to build this Layout and learn more new things.
23 |
24 |
25 |
26 |
27 | Platform
28 | Web
29 |
30 |
31 | Stack
32 | React
33 |
34 |
35 | Github:
36 |
37 | github code link here
38 |
39 |
40 |
41 | Youtube Video:
42 |
43 | youtube video link here
44 |
45 |
46 |
47 |
48 |
49 | Technologies used:
50 |
51 |
52 |
53 | HTML
54 | CSS
55 | Typecript
56 | React
57 | Tailwindcss
58 |
59 |
60 |
61 |
62 |
63 |
64 | )
65 |
66 | export default FigmaJam
67 | export { getServerSideProps } from '../../components/chakra'
68 |
--------------------------------------------------------------------------------
/pages/works.js:
--------------------------------------------------------------------------------
1 | import { Container, Heading, SimpleGrid } from '@chakra-ui/react'
2 | import Layout from '../components/layouts/article'
3 | import Section from '../components/section'
4 | import { WorkGridItem } from '../components/grid-item'
5 |
6 | import thumbHabits from '../public/images/works/thumbHabits.png'
7 | import thumbTodo from '../public/images/works/thumbTodoWeb.png'
8 | import thumbFeed from '../public/images/works/thumbIgniteFeedWeb.png'
9 | import thumbFigmaJam from '../public/images/works/thumbFigmaJam.png'
10 |
11 | const Works = () => (
12 |
13 |
14 |
15 | Works
16 |
17 |
18 |
19 |
20 |
25 | Project realized for notes of tasks.
26 |
27 |
28 |
29 |
34 | Made to represent a feed.
35 |
36 |
37 |
38 |
43 | The project is for time management and day-to-day usability.
44 |
45 |
46 |
47 |
52 | I used figma-jam as inspiration to create a simpler model using the React flow library to enhance interactive and custom diagrams.
53 |
54 |
55 |
56 |
57 |
58 | )
59 |
60 | export default Works
61 | export { getServerSideProps } from '../components/chakra'
62 |
--------------------------------------------------------------------------------
/pages/works/ignite-feed.js:
--------------------------------------------------------------------------------
1 | import {
2 | Container,
3 | Badge,
4 | Link,
5 | List,
6 | ListItem,
7 | UnorderedList,
8 | Center,
9 | Image
10 | } from '@chakra-ui/react'
11 | import Layout from '../../components/layouts/article'
12 | import { Title, Meta } from '../../components/work'
13 | import P from '../../components/paragraph'
14 |
15 | const Work = () => (
16 |
17 |
18 |
19 | Ignite Feed 2023
20 |
21 |
22 | Made to represent a feed with a responsive layout and thought about user
23 | usability. Aren't just beautiful, but enjoyable to use.
24 |
25 |
26 |
27 |
28 | Platform
29 | Web
30 |
31 |
32 | Stack
33 | React
34 |
35 |
36 | Github:
37 |
41 | github code link here
42 |
43 |
44 |
45 |
46 | Technologies used:
47 |
48 |
49 | ViteJs
50 | HTML
51 | CSS
52 | Typecript
53 | React
54 | Phosphor React
55 | Date Fns
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 | )
66 |
67 | export default Work
68 | export { getServerSideProps } from '../../components/chakra'
69 |
--------------------------------------------------------------------------------
/pages/works/todo-list.js:
--------------------------------------------------------------------------------
1 | import {
2 | Container,
3 | Badge,
4 | Link,
5 | List,
6 | ListItem,
7 | UnorderedList,
8 | Center,
9 | Image
10 | } from '@chakra-ui/react'
11 | import Layout from '../../components/layouts/article'
12 | import { Title, Meta } from '../../components/work'
13 | import P from '../../components/paragraph'
14 |
15 | const Work = () => (
16 |
17 |
18 |
19 | Todo List 2023
20 |
21 |
22 | Project realized for notes of tasks. It has the function of noting tasks
23 | to be done, identification of completion of tasks and removal of each
24 | task. Made with a responsive layout.
25 |
26 |
27 |
28 |
29 | Platform
30 | Web
31 |
32 |
33 | Stack
34 | React
35 |
36 |
37 | Github:
38 |
42 | github code link here
43 |
44 |
45 |
46 |
47 | Technologies used:
48 |
49 |
50 | ViteJs
51 | HTML
52 | CSS
53 | Typecript
54 | React
55 | React Hook Form
56 | Yup
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | )
67 |
68 | export default Work
69 | export { getServerSideProps } from '../../components/chakra'
70 |
--------------------------------------------------------------------------------
/pages/works/habits.js:
--------------------------------------------------------------------------------
1 | import {
2 | Container,
3 | Badge,
4 | Link,
5 | List,
6 | ListItem,
7 | UnorderedList,
8 | Center,
9 | Image
10 | } from '@chakra-ui/react'
11 | import Layout from '../../components/layouts/article'
12 | import { Title, Meta } from '../../components/work'
13 | import P from '../../components/paragraph'
14 |
15 | const Work = () => (
16 |
17 |
18 |
19 | Habits 2023
20 |
21 |
22 | Habits is a project I developed during Rocketseat NLW SETUP event
23 | in early 2023, using Typescript, React, React Native, Tailwindcss,
24 | Node, Fastify, Prisma, animations and much more. The project is for
25 | time management and day-to-day usability.
26 |
27 |
28 |
29 |
30 | Platform
31 | Windows/iOS/Android
32 |
33 |
34 | Stack
35 | React, React Native, NodeJS
36 |
37 |
38 | Github:
39 |
40 | github code link here
41 |
42 |
43 |
44 |
45 |
46 | Technologies used:
47 |
48 |
49 |
50 | ViteJs
51 | HTML
52 | CSS
53 | Typecript
54 | React
55 | React Native
56 | Tailwindcss
57 | Expo
58 | Node
59 | Fastify
60 | Prisma-orm
61 | ESlint
62 | Prettier
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | )
76 |
77 | export default Work
78 | export { getServerSideProps } from '../../components/chakra'
79 |
--------------------------------------------------------------------------------
/components/navbar.js:
--------------------------------------------------------------------------------
1 | import Logo from './logo'
2 | import NextLink from 'next/link'
3 | import {
4 | Container,
5 | Box,
6 | Link,
7 | Stack,
8 | Heading,
9 | Flex,
10 | Menu,
11 | MenuItem,
12 | MenuList,
13 | MenuButton,
14 | IconButton,
15 | useColorModeValue
16 | } from '@chakra-ui/react'
17 |
18 | import { HamburgerIcon } from '@chakra-ui/icons'
19 | import ThemeToggleButton from './theme-toggle-button'
20 | import { IoLogoGithub } from 'react-icons/io5'
21 |
22 | const LinkItem = ({ href, path, target, children, ...props }) => {
23 | const active = path === href
24 | const inactiveColor = useColorModeValue('gray200', 'whiteAlpha.900')
25 | return (
26 |
27 |
34 | {children}
35 |
36 |
37 | )
38 | }
39 |
40 | const Navbar = props => {
41 | const { path } = props
42 |
43 | return (
44 |
53 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
75 |
76 | Works
77 |
78 |
79 | Posts
80 |
81 |
82 | Books recomended
83 |
84 |
93 |
94 | Source
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
129 |
130 |
131 |
132 |
133 | )
134 | }
135 |
136 | export default Navbar
137 |
--------------------------------------------------------------------------------
/styles/dog.style.css:
--------------------------------------------------------------------------------
1 | .center {
2 | height: 100%;
3 | width: 100%;
4 | margin: 3rem 0;
5 | display: grid;
6 | grid-template-rows: 2rem 3rem 2rem 2rem;
7 | justify-self: center;
8 | }
9 | .dog {
10 | display: grid;
11 | justify-self: center;
12 | transform: translate(0, -50%);
13 | }
14 | .dog .ears2 {
15 | height: 0;
16 | width: 0;
17 | position: relative;
18 | left: 30px;
19 | border-bottom: 27px solid #F07E42;
20 | border-left: 23px solid transparent;
21 | border-right: 10px solid transparent;
22 | }
23 | .dog .ears2::before {
24 | display: block;
25 | content: "";
26 | height: 0;
27 | width: 0;
28 | position: relative;
29 | left: 33px;
30 | border-bottom: 27px solid #F07E42;
31 | border-left: 10px solid transparent;
32 | border-right: 23px solid transparent;
33 | }
34 | .dog .head2 {
35 | height: 74px;
36 | width: 140px;
37 | position: relative;
38 | z-index: 2;
39 | box-shadow: 8px 0 0 #F07E42;
40 | border-radius: 35px;
41 | background: #FFA852;
42 | }
43 | .dog .head2 .eyes2 {
44 | height: 12px;
45 | width: 12px;
46 | position: relative;
47 | top: 37px;
48 | left: 50px;
49 | border-radius: 100%;
50 | animation: 9s dogRead infinite;
51 | background: black;
52 | }
53 | .dog .head2 .eyes2::before {
54 | display: block;
55 | content: "";
56 | height: 12px;
57 | width: 12px;
58 | position: relative;
59 | left: 18px;
60 | border-radius: 100%;
61 | background: black;
62 | }
63 | .dog .head2 .nose2 {
64 | height: 30px;
65 | width: 48px;
66 | position: relative;
67 | top: 40px;
68 | left: 37px;
69 | border-radius: 20px;
70 | background: #FBF1D8;
71 | }
72 | .dog .head2 .nose2::before {
73 | display: block;
74 | content: "";
75 | height: 0;
76 | width: 0;
77 | position: relative;
78 | top: 3px;
79 | left: 9px;
80 | border-radius: 15px;
81 | border-top: 12px solid black;
82 | border-left: 12px solid transparent;
83 | border-right: 10px solid transparent;
84 | }
85 | .dog .body2 {
86 | height: 110px;
87 | width: 200px;
88 | position: relative;
89 | top: -30px;
90 | z-index: 1;
91 | border-radius: 55px;
92 | background: #FFA852;
93 | }
94 | .dog .body2 .left-paw2 {
95 | height: 25px;
96 | width: 37px;
97 | position: relative;
98 | top: 70px;
99 | left: 15px;
100 | border-radius: 12px;
101 | animation: 9s dogLeftType infinite;
102 | background: #FBF1D8;
103 | }
104 | .dog .body2 .right-paw2 {
105 | height: 25px;
106 | width: 37px;
107 | position: relative;
108 | top: 45px;
109 | left: 60px;
110 | border-radius: 12px;
111 | animation: 9s dogRightType infinite;
112 | background: #FBF1D8;
113 | }
114 | .dog .tail2 {
115 | height: 34px;
116 | width: 70px;
117 | position: relative;
118 | top: -64px;
119 | left: 150px;
120 | z-index: 0;
121 | border-radius: 0 17px 17px 0;
122 | background: #F07E42;
123 | }
124 | .dog .ORlaptop {
125 | position: relative;
126 | top: -161px;
127 | left: -103px;
128 | z-index: 2;
129 | }
130 | .dog .ORlaptop .ORscreen {
131 | height: 85px;
132 | width: 130px;
133 | border-radius: 8px;
134 | transform: skew(18deg);
135 | background: #FFCA95;
136 | }
137 | .dog .ORlaptop .ORscreen::before {
138 | display: block;
139 | content: "";
140 | height: 17px;
141 | width: 10px;
142 | position: relative;
143 | top: 38px;
144 | left: 50px;
145 | border-radius: 6px;
146 | background: #F07E42;
147 | }
148 | .dog .ORlaptop .ORscreen::after {
149 | display: block;
150 | content: "";
151 | height: 17px;
152 | width: 10px;
153 | position: relative;
154 | top: 21px;
155 | left: 64px;
156 | border-radius: 6px;
157 | background: #F07E42;
158 | }
159 | .dog .ORlaptop .ORkeyboard {
160 | height: 12px;
161 | width: 132px;
162 | position: relative;
163 | left: 14px;
164 | border-radius: 6px 0 0 6px;
165 | background: #F07E42;
166 | }
167 | .dog .ORlaptop .ORkeyboard::before {
168 | display: block;
169 | content: "";
170 | height: 12px;
171 | width: 72px;
172 | position: relative;
173 | left: 128px;
174 | border-radius: 6px;
175 | background: #FFCA95;
176 | }
177 | @keyframes dogLeftType {
178 | 50% {
179 | transform: none;
180 | }
181 | 52% {
182 | transform: translateY(-8px);
183 | }
184 | 56% {
185 | transform: none;
186 | }
187 | 58% {
188 | transform: translateY(-8px);
189 | }
190 | 60% {
191 | transform: none;
192 | }
193 | 64% {
194 | transform: translateY(-8px);
195 | }
196 | 66% {
197 | transform: none;
198 | }
199 | 68% {
200 | transform: translateY(-8px);
201 | }
202 | 70% {
203 | transform: none;
204 | }
205 | 72% {
206 | transform: translateY(-8px);
207 | }
208 | 76% {
209 | transform: none;
210 | }
211 | }
212 | @keyframes dogRightType {
213 | 54% {
214 | transform: none;
215 | }
216 | 56% {
217 | transform: translateY(-8px);
218 | }
219 | 58% {
220 | transform: none;
221 | }
222 | 60% {
223 | transform: translateY(-8px);
224 | }
225 | 62% {
226 | transform: none;
227 | }
228 | 66% {
229 | transform: translateY(-8px);
230 | }
231 | 68% {
232 | transform: none;
233 | }
234 | 70% {
235 | transform: translateY(-8px);
236 | }
237 | 72% {
238 | transform: none;
239 | }
240 | 74% {
241 | transform: translateY(-8px);
242 | }
243 | 78% {
244 | transform: none;
245 | }
246 | }
247 | @keyframes dogRead {
248 | 5% {
249 | transform: none;
250 | }
251 | 17% {
252 | transition-timing-function: ease-out;
253 | transform: translateX(-5px);
254 | }
255 | 25% {
256 | transform: none;
257 | }
258 | 37% {
259 | transition-timing-function: ease-out;
260 | transform: translateX(-5px);
261 | }
262 | 45% {
263 | transform: none;
264 | }
265 | }
266 |
--------------------------------------------------------------------------------
/pages/index.js:
--------------------------------------------------------------------------------
1 | import NextLink from 'next/link'
2 | import Image from 'next/image'
3 |
4 | import { IoLogoCodepen, IoLogoGithub, IoLogoLinkedin } from 'react-icons/io5'
5 |
6 | import { ChevronRightIcon } from '@chakra-ui/icons'
7 | import {
8 | Link,
9 | Container,
10 | Heading,
11 | Box,
12 | SimpleGrid,
13 | Button,
14 | List,
15 | ListItem,
16 | useColorModeValue,
17 | chakra
18 | } from '@chakra-ui/react'
19 |
20 | import { BioSection, BioYear } from '../components/bio'
21 | import { GridItem, WorkGridItem } from '../components/grid-item'
22 | import Paragraph from '../components/paragraph'
23 | import Layout from '../components/layouts/article'
24 | import Section from '../components/section'
25 |
26 | import thumbHabits from '../public/images/works/thumbHabits.png'
27 | import thumbTodo from '../public/images/works/thumbTodoWeb.png'
28 |
29 | const ProfileImage = chakra(Image, {
30 | shouldForwardProp: prop => ['width', 'height', 'src', 'alt'].includes(prop)
31 | })
32 |
33 | const Home = () => (
34 |
35 |
36 |
44 | I’m a Software Engineer. I'm always learning. Passionate about creating
45 | solutions to real-world problems.
46 |
47 |
48 |
49 |
50 |
51 | Joyce de Fátima Costa Santos
52 |
53 |
54 | Full Stack Engineer (JavaScript, TypeScript, React, React Native,
55 | Node)
56 |
57 |
58 |
64 |
74 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | Work
88 |
89 |
90 | I've been a software developer for 1 year, with experience in
91 | frontend web, mobile and backend development, working most of my
92 | career with JavaScript/TypeScript.
93 |
94 |
95 |
96 | } colorScheme="blue">
97 | My Projects
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 | Bio
106 |
107 |
108 | 2002
109 | Born in São Paulo, Brasil.
110 |
111 |
112 | 2022
113 | Beginning of the Faculty of Information Systems at Universidade
114 | Paulista
115 |
116 |
117 | 2022
118 | Frontend Developer at Qodeless - Brasil;
119 |
120 |
121 | 2023
122 | Beginning of studies at Rocketseat
123 |
124 |
125 |
126 |
127 |
128 | I ♥
129 |
130 |
131 | Going out, spending time with family, having fun with friends, games,
132 | coding.
133 |
134 |
135 |
136 |
137 |
138 | On the web
139 |
140 |
141 |
142 |
147 | }
151 | >
152 | @JoyceFatima
153 |
154 |
155 |
156 |
157 |
162 | }
166 | >
167 | @JoyceFatima
168 |
169 |
170 |
171 |
172 |
177 | }
181 | >
182 | @JoyceFatima (Codepen.io)
183 |
184 |
185 |
186 |
187 |
188 |
189 |
196 |
203 |
204 |
205 |
206 |
207 | } colorScheme="blue">
208 | Popular works
209 |
210 |
211 |
212 |
213 |
214 |
215 | )
216 |
217 | export default Home
218 |
219 | export { getServerSideProps } from '../components/chakra'
220 |
--------------------------------------------------------------------------------