diff options
author | 2021-04-30 10:35:20 -0600 | |
---|---|---|
committer | 2021-04-30 10:35:20 -0600 | |
commit | f39a91e6ecbcf5c3c2f431fa8dfc3fbc9a71d89a (patch) | |
tree | 9ccc7a538aa3dd32369c80db81c0dac7d9ceab43 /examples/portfolio/src/components | |
parent | a79c63750f63eee9e8d32ba156c78a71b25dda12 (diff) | |
download | astro-f39a91e6ecbcf5c3c2f431fa8dfc3fbc9a71d89a.tar.gz astro-f39a91e6ecbcf5c3c2f431fa8dfc3fbc9a71d89a.tar.zst astro-f39a91e6ecbcf5c3c2f431fa8dfc3fbc9a71d89a.zip |
Add portfolio example (#140)
* Add portfolio example
* Feedback
Diffstat (limited to 'examples/portfolio/src/components')
9 files changed, 281 insertions, 0 deletions
diff --git a/examples/portfolio/src/components/Button/index.jsx b/examples/portfolio/src/components/Button/index.jsx new file mode 100644 index 000000000..0e1b6a4c8 --- /dev/null +++ b/examples/portfolio/src/components/Button/index.jsx @@ -0,0 +1,8 @@ +import { h } from 'preact'; +import Styles from './styles.module.scss'; + +function Button({ children }) { + return <span className={Styles.button}>{children}</span>; +} + +export default Button; diff --git a/examples/portfolio/src/components/Button/styles.module.scss b/examples/portfolio/src/components/Button/styles.module.scss new file mode 100644 index 000000000..67a343bdf --- /dev/null +++ b/examples/portfolio/src/components/Button/styles.module.scss @@ -0,0 +1,7 @@ +.button { + display: inline-block; + border: 3px solid currentColor; + padding: 0.5em 1em; + font-weight: 700; + text-transform: uppercase; +} diff --git a/examples/portfolio/src/components/Footer/index.jsx b/examples/portfolio/src/components/Footer/index.jsx new file mode 100644 index 000000000..8e15a2d8e --- /dev/null +++ b/examples/portfolio/src/components/Footer/index.jsx @@ -0,0 +1,12 @@ +import { h } from 'preact'; +import Styles from './styles.module.scss'; + +function Footer() { + return ( + <footer className={Styles.footer}> + © {new Date().getFullYear()} Jeanine White + <small className={Styles.byline}>🚀 Built by Astro</small> + </footer> + ); +} +export default Footer; diff --git a/examples/portfolio/src/components/Footer/styles.module.scss b/examples/portfolio/src/components/Footer/styles.module.scss new file mode 100644 index 000000000..0e77ee206 --- /dev/null +++ b/examples/portfolio/src/components/Footer/styles.module.scss @@ -0,0 +1,15 @@ +.footer { + text-align: center; + padding-top: 8rem; + padding-right: 2rem; + padding-bottom: 4rem; + padding-left: 2rem; +} + +.byline { + display: block; + margin-top: 1rem; + color: var(--t-subdue); + font-size: var(--f-d2); + text-transform: uppercase; +} diff --git a/examples/portfolio/src/components/MainHead.astro b/examples/portfolio/src/components/MainHead.astro new file mode 100644 index 000000000..668b374b3 --- /dev/null +++ b/examples/portfolio/src/components/MainHead.astro @@ -0,0 +1,9 @@ +--- +export let title = 'Jeanine White: Personal Site'; +--- + +<meta charset="UTF-8"> +<title>{title}</title> +<link rel="stylesheet" type="text/css" href="/app.css"> +<link rel="preconnect" href="https://fonts.gstatic.com"> +<link href="https://fonts.googleapis.com/css2?family=Inter:wght@200;400;700;900&display=swap" rel="stylesheet"> diff --git a/examples/portfolio/src/components/Nav/index.jsx b/examples/portfolio/src/components/Nav/index.jsx new file mode 100644 index 000000000..944e44b71 --- /dev/null +++ b/examples/portfolio/src/components/Nav/index.jsx @@ -0,0 +1,35 @@ +import { h } from 'preact'; +import Styles from './styles.module.scss'; + +function Nav() { + return ( + <nav className={Styles.nav}> + <a className={Styles.logolink} href="/"> + <div className={Styles.monogram}>JW</div> + </a> + <a className={Styles.link} href="/projects"> + Portfolio + </a> + <a className={Styles.link} href="/about"> + About + </a> + <a className={Styles.social} href="https://twitter.com/me"> + <svg className={Styles.socialicon} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"> + <path d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z" /> + </svg> + </a> + <a className={Styles.social} href="https://github.com/me"> + <svg className={Styles.socialicon} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"> + <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z" /> + </svg> + </a> + <a className={Styles.social} href="https://dev.to/me"> + <svg className={Styles.socialicon} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 40" style="enable-background:new 0 0 50 40" xml:space="preserve"> + <path d="M15.7 15.5c-.4-.3-.7-.4-1.1-.4h-1.7v10.1h1.7c.4 0 .8-.1 1.1-.4.4-.3.6-.7.6-1.3v-6.7c0-.6-.2-1-.6-1.3z" /> + <path d="M47 0H3C1.3 0 0 1.3 0 3v34c0 1.7 1.3 3 3 3h44c1.7 0 3-1.3 3-3V3c0-1.7-1.3-3-3-3zM19.1 23.5c0 1.3-.4 2.4-1.3 3.2-.8.9-1.9 1.3-3.3 1.3h-4.4V12.3h4.5c1.3 0 2.4.4 3.2 1.3.8.8 1.3 1.9 1.3 3.2v6.7zm9.1-8.4h-5.1v3.6h3.1v2.8h-3.1v3.7h5.1V28h-5.9c-.6 0-1-.2-1.4-.6-.4-.4-.6-.8-.6-1.4V14.2c0-.6.2-1 .6-1.4.4-.4.8-.6 1.4-.6h5.9v2.9zM37.5 26c-.6 1.3-1.3 2-2.2 2-.9 0-1.7-.7-2.2-2l-3.7-13.8h3.1L35.3 23l2.8-10.8h3.1L37.5 26z" /> + </svg> + </a> + </nav> + ); +} +export default Nav; diff --git a/examples/portfolio/src/components/Nav/styles.module.scss b/examples/portfolio/src/components/Nav/styles.module.scss new file mode 100644 index 000000000..d39a65a5b --- /dev/null +++ b/examples/portfolio/src/components/Nav/styles.module.scss @@ -0,0 +1,65 @@ +.nav { + display: flex; + align-items: center; + padding-top: 1rem; + padding-right: 2rem; + padding-bottom: 1rem; + padding-left: 2rem; +} + +.logolink { + display: block; + color: var(--t-fg); + text-decoration: none; +} + +.link { + color: var(--t-subdue); + display: block; + margin-left: 1rem; + text-decoration: none; + font-size: var(--f-d1); + text-transform: uppercase; + padding-top: 0.75em; + padding-bottom: 0.75em; + + &:focus, + &:hover { + color: var(--t-active); + } +} + +.monogram { + display: flex; + align-items: center; + justify-content: center; + width: 2em; + height: 2em; + margin-right: 0.5rem; + color: var(--c-black); + font-weight: 900; + letter-spacing: -0.125rem; + border: 3px solid currentColor; + border-radius: 50%; +} + +.social { + display: block; + margin-left: auto; + + + .social { + margin-left: 0.75rem; + } +} + +.socialicon { + display: block; + width: 1.25rem; + height: 1.25rem; + fill: var(--t-subdue); + transition: fill linear 150ms; + + &:hover { + fill: var(--t-active); + } +} diff --git a/examples/portfolio/src/components/PortfolioPreview/index.jsx b/examples/portfolio/src/components/PortfolioPreview/index.jsx new file mode 100644 index 000000000..7918008c6 --- /dev/null +++ b/examples/portfolio/src/components/PortfolioPreview/index.jsx @@ -0,0 +1,28 @@ +import { h } from 'preact'; +import Styles from './styles.module.scss'; + +function PortfolioPreview({ project }) { + return ( + <div className={Styles.card}> + <div className={Styles.titleCard} style={`background-image:url(${project.img})`}> + <h1 className={Styles.title}>{project.title}</h1> + </div> + <div className="pa3"> + <p className={`${Styles.desc} mt0 mb2`}>{project.description}</p> + <div className={Styles.tags}> + Tagged: + {project.tags.map((t) => ( + <div className={Styles.tag} data-tag={t}> + {t} + </div> + ))} + </div> + <a className={Styles.link} href={project.url}> + <span className={Styles.linkInner}>View</span> + </a> + </div> + </div> + ); +} + +export default PortfolioPreview; diff --git a/examples/portfolio/src/components/PortfolioPreview/styles.module.scss b/examples/portfolio/src/components/PortfolioPreview/styles.module.scss new file mode 100644 index 000000000..ce169c2fc --- /dev/null +++ b/examples/portfolio/src/components/PortfolioPreview/styles.module.scss @@ -0,0 +1,102 @@ +.card { + position: relative; + color: var(--t-bg); + background: var(--t-fg); + border: 1px solid #f0f0f0; +} + +.title { + position: absolute; + top: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + margin: 0; + color: white; + flex-direction: column; + font-size: var(--f-u4); + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.0625em; +} + +.titleCard { + position: relative; + background-size: cover; + background-position: 50% 100%; + padding-top: 37.5%; +} + +.desc { + font-size: var(--f-u1); + line-height: 1.4; +} + +.link { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: var(--t-bg); + font-size: var(--f-u2); + font-weight: 700; + background: rgba(0, 0, 0, 0.25); + opacity: 0; + text-decoration: none; + text-transform: uppercase; + transition: opacity 150ms linear; + + &:focus, + &:hover { + opacity: 1; + + .linkInner { + transform: translateY(0); + border-color: rgba(255, 255, 255, 0.625); + } + } +} + +.linkInner { + padding: 0.375em 1em; + border: 2px solid rgba(255, 255, 255, 0); + transition: transform 300ms cubic-bezier(0, 0.4, 0.6, 1), border-color 1s linear; + transform: translateY(25%); +} + +.nav { + display: flex; + justify-content: flex-end; +} + +.tags { + font-size: var(--f-d2); + text-transform: uppercase; +} + +.tag { + display: inline-block; + color: var(--c-yellow); + text-transform: uppercase; + margin-left: 0.5em; + + &:nth-of-type(1n) { + color: var(--c-green); + } + &:nth-of-type(2n) { + color: var(--c-orange); + } + &:nth-of-type(3n) { + color: var(--c-blue); + } + &:nth-of-type(4n) { + color: var(--c-pink); + } +} |