\n \n \n Learn More\n \n \n
\n\n {paragraphOne ||\n \"Lorem ipsum dolor sit, amet consectetur adipisicing elit. Excepturi neque, ipsa animi maiores repellendu distinctioaperiam earum dolor voluptatum consequatur blanditiis inventore debitis fuga numquam voluptate architecto itaque molestiae.\"}\n
\n\n {paragraphTwo ||\n \"Lorem ipsum dolor sit, amet consectetur adipisicing elit. Excepturi neque, ipsa animi maiores repellendu distinctioaperiam earum dolor voluptatum consequatur blanditiis inventore debitis fuga numquam voluptate architecto itaque molestiae.\"}\n
\n\n {paragraphThree || \"Lorem ipsum dolor sit, amet consectetur adipisicing elit asd asd asd asd asd asd asd asd asd.\"}\n
\n {resume && (\n \n \n Resume\n \n \n )}\n\n Additional proficiencies include: git, selenium, Typescript, Bootstrap, Bulma, Ant Design, tkinter, AutoHotkey.\n
\n\n {info ||\n 'Lorem ipsum dolor sit, amet consectetur adipisicing elit. Excepturi neque, ipsa animi maiores repellendu distinctioaperiam earum dolor voluptatum consequatur blanditiis inventore debitis fuga numquam voluptate architecto itaque molestiae.'}\n
\n{info2 || ''}
\nInterested in working together? Great!
\n \n Talk to Me\n \n{feedback.message}
}\n \n \n >\n );\n};\n\nexport default ContactForm;\n","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}","import _typeof from \"@babel/runtime/helpers/typeof\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","import _defineProperty from \"/opt/buildhome/repo/node_modules/@babel/runtime/helpers/esm/defineProperty\";\nimport _classCallCheck from \"/opt/buildhome/repo/node_modules/@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"/opt/buildhome/repo/node_modules/@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"/opt/buildhome/repo/node_modules/@babel/runtime/helpers/esm/inherits\";\nimport _possibleConstructorReturn from \"/opt/buildhome/repo/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn\";\nimport _getPrototypeOf from \"/opt/buildhome/repo/node_modules/@babel/runtime/helpers/esm/getPrototypeOf\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nimport React, { PureComponent } from 'react';\n\nvar GitHubButton = /*#__PURE__*/function (_PureComponent) {\n _inherits(GitHubButton, _PureComponent);\n\n var _super = _createSuper(GitHubButton);\n\n function GitHubButton(props) {\n var _this;\n\n _classCallCheck(this, GitHubButton);\n\n _this = _super.call(this, props);\n _this.$ = React.createRef();\n _this._ = React.createRef();\n return _this;\n }\n\n _createClass(GitHubButton, [{\n key: \"render\",\n value: function render() {\n return React.createElement('span', {\n ref: this.$\n }, React.createElement('a', _objectSpread(_objectSpread({}, this.props), {}, {\n ref: this._\n }), this.props.children));\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.paint();\n }\n }, {\n key: \"getSnapshotBeforeUpdate\",\n value: function getSnapshotBeforeUpdate() {\n this.reset();\n return null;\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate() {\n this.paint();\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.reset();\n }\n }, {\n key: \"paint\",\n value: function paint() {\n var _this2 = this;\n\n var _ = this.$.current.appendChild(document.createElement('span'));\n\n import(\n /* webpackMode: \"eager\" */\n 'github-buttons').then(function (_ref) {\n var render = _ref.render;\n render(_.appendChild(_this2._.current), function (el) {\n try {\n _.parentNode.replaceChild(el, _);\n } catch (_) {}\n });\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.$.current.replaceChild(this._.current, this.$.current.lastChild);\n }\n }]);\n\n return GitHubButton;\n}(PureComponent);\n\nexport default GitHubButton;","import \"core-js/modules/es.typed-array.sort.js\";\n// This file replaces `index.js` in bundlers like webpack or Rollup,\n// according to `browser` config in `package.json`.\nimport { urlAlphabet } from './url-alphabet/index.js';\n\nif (process.env.NODE_ENV !== 'production') {\n // All bundlers will remove this block in the production bundle.\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative' && typeof crypto === 'undefined') {\n throw new Error('React Native does not have a built-in secure random generator. ' + 'If you don’t need unpredictable IDs use `nanoid/non-secure`. ' + 'For secure IDs, import `react-native-get-random-values` ' + 'before Nano ID.');\n }\n\n if (typeof msCrypto !== 'undefined' && typeof crypto === 'undefined') {\n throw new Error('Import file with `if (!window.crypto) window.crypto = window.msCrypto`' + ' before importing Nano ID to fix IE 11 support');\n }\n\n if (typeof crypto === 'undefined') {\n throw new Error('Your browser does not have secure random generator. ' + 'If you don’t need unpredictable IDs, you can use nanoid/non-secure.');\n }\n}\n\nvar random = function random(bytes) {\n return crypto.getRandomValues(new Uint8Array(bytes));\n};\n\nvar customRandom = function customRandom(alphabet, size, getRandom) {\n // First, a bitmask is necessary to generate the ID. The bitmask makes bytes\n // values closer to the alphabet size. The bitmask calculates the closest\n // `2^31 - 1` number, which exceeds the alphabet size.\n // For example, the bitmask for the alphabet size 30 is 31 (00011111).\n // `Math.clz32` is not used, because it is not available in browsers.\n var mask = (2 << Math.log(alphabet.length - 1) / Math.LN2) - 1; // Though, the bitmask solution is not perfect since the bytes exceeding\n // the alphabet size are refused. Therefore, to reliably generate the ID,\n // the random bytes redundancy has to be satisfied.\n // Note: every hardware random generator call is performance expensive,\n // because the system call for entropy collection takes a lot of time.\n // So, to avoid additional system calls, extra bytes are requested in advance.\n // Next, a step determines how many random bytes to generate.\n // The number of random bytes gets decided upon the ID size, mask,\n // alphabet size, and magic number 1.6 (using 1.6 peaks at performance\n // according to benchmarks).\n // `-~f => Math.ceil(f)` if f is a float\n // `-~i => i + 1` if i is an integer\n\n var step = -~(1.6 * mask * size / alphabet.length);\n return function () {\n var id = '';\n\n while (true) {\n var bytes = getRandom(step); // A compact alternative for `for (var i = 0; i < step; i++)`.\n\n var j = step;\n\n while (j--) {\n // Adding `|| ''` refuses a random byte that exceeds the alphabet size.\n id += alphabet[bytes[j] & mask] || '';\n if (id.length === size) return id;\n }\n }\n };\n};\n\nvar customAlphabet = function customAlphabet(alphabet, size) {\n return customRandom(alphabet, size, random);\n};\n\nvar nanoid = function nanoid() {\n var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 21;\n var id = '';\n var bytes = crypto.getRandomValues(new Uint8Array(size)); // A compact alternative for `for (var i = 0; i < step; i++)`.\n\n while (size--) {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unneccessary because\n // the bitmask trims bytes down to the alphabet size.\n var byte = bytes[size] & 63;\n\n if (byte < 36) {\n // `0-9a-z`\n id += byte.toString(36);\n } else if (byte < 62) {\n // `A-Z`\n id += (byte - 26).toString(36).toUpperCase();\n } else if (byte < 63) {\n id += '_';\n } else {\n id += '-';\n }\n }\n\n return id;\n};\n\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random };","import { nanoid } from 'nanoid';\n\n// ABOUT DATA\nexport const aboutData = {\n img: 'profile.jpg',\n paragraphOne: 'I am a full stack web developer from Salt Lake City, Utah specializing in creating aesthetic, modern, and responsive websites.',\n paragraphTwo: 'Experienced in working with both back end (node/javascript, django/python) and front end (HTML, CSS, Javascript, react) systems -- I challenge myself to stay up to date with the latest technologies. ',\n paragraphThree: 'I am driven, self-motivated, and enjoy tinkering to find the best way of getting things done.',\n resume: '', // if no resume, the button will not show up\n};\n\n// PROJECTS DATA\nexport const projectsData = [\n {\n id: nanoid(),\n img: 'asmrvideodb.png',\n title: 'ASMRVIDEODB',\n info: \"A website displaying ASMR videos collected using Google's Youtube API and stored in a custom database along with video specific user generated data. This site allows users to better find and track videos that match their interests.\",\n info2: 'Built With: HTML5, react.js, django rest framework, SASS, ant design.',\n url: 'https://www.asmrvideodb.com',\n repo: '', // if no repo, the button will not show up\n },\n {\n id: nanoid(),\n img: 'achievefamilytherapyneurofeedback.png',\n title: 'Achieve Family Therapy Neurofeedback',\n info: \"A single page website for Achieve Family Therapy's neurofeedback program.\",\n info2: 'Built With: HTML5, SASS, Javascript, jQuery',\n url: 'https://www.neurofeedback.achievefamilytherapy.com/',\n repo: 'https://github.com/TSolo315/Achieve-Family-Therapy-Neurofeedback', // if no repo, the button will not show up\n },\n {\n id: nanoid(),\n img: 'mturkguide.png',\n title: 'Mturk Guide',\n info: \"An informational website instructing visitors on how to better make money from home on Amazon's Mechanical Turk.\",\n info2: 'Built With: HTML5, Javascript, SASS, Bulma.',\n url: 'https://www.mturkguide.com',\n repo: 'https://github.com/TSolo315/Mturk-Guide', // if no repo, the button will not show up\n },\n];\n\n// FOOTER DATA\nexport const footerData = {\n networks: [\n {\n id: nanoid(),\n name: 'codepen',\n url: 'https://codepen.io/tsolo315',\n },\n {\n id: nanoid(),\n name: 'linkedin',\n url: 'https://www.linkedin.com/in/tyler-solosko-5419761b2/',\n },\n {\n id: nanoid(),\n name: 'github',\n url: 'https://github.com/TSolo315',\n },\n ],\n};\n\n// Github start/fork buttons\nexport const githubButtons = {\n isEnabled: false, // set to false to disable the GitHub stars/fork buttons\n};\n","import React, { useContext } from 'react';\nimport { Container } from 'react-bootstrap';\nimport { Link } from 'react-scroll';\nimport PortfolioContext from '../../context/context';\nimport GithubButtons from '../GithubButtons/GithubButtons';\n\nimport { githubButtons } from '../../mock/data';\n\nconst Footer = () => {\n const { footer } = useContext(PortfolioContext);\n const { networks } = footer;\n const { isEnabled } = githubButtons;\n\n return (\n \n );\n};\n\nexport default Footer;\n","import React, { useState, useEffect } from 'react';\nimport Modal from 'react-modal';\nimport Hero from './Hero/Hero';\nimport About from './About/About';\nimport Projects from './Projects/Projects';\nimport Contact from './Contact/Contact';\nimport ContactForm from './Contact/ContactForm';\nimport Footer from './Footer/Footer';\n\nimport { PortfolioProvider } from '../context/context';\n\nimport { aboutData, projectsData, footerData } from '../mock/data';\n\nModal.setAppElement('#___gatsby');\n\nfunction App() {\n const [about, setAbout] = useState({});\n const [projects, setProjects] = useState([]);\n const [footer, setFooter] = useState({});\n const [modalIsOpen, setIsOpen] = useState(false);\n\n useEffect(() => {\n setAbout({ ...aboutData });\n setProjects([...projectsData]);\n setFooter({ ...footerData });\n }, []);\n\n function closeModal() {\n setIsOpen(false);\n }\n\n const customStyles = {\n overlay: {\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n },\n content: {\n top: '50%',\n left: '50%',\n right: 'auto',\n bottom: 'auto',\n marginRight: '-50%',\n transform: 'translate(-50%, -50%)',\n backgroundColor: '#0B172A',\n padding: '44px',\n width: '350px',\n },\n };\n\n return (\n