{"version":3,"sources":["img/apps/mymemo.png","components/projects/ListItemPicker/img/keep.png","components/projects/ListItemPicker/img/next.png","components/projects/ListItemPicker/img/restart.png","img/icons/GitHub-Mark-64px.png","img/icons/linked-in-logo.png","reducers/AppReducer.ts","config/AppConfigContext.tsx","config/profile.ts","context/locale-context.ts","hooks/useTranslations.ts","screens/translations.i18n.ts","components/card/ProjectCard.tsx","components/projects/translations.i18n.ts","components/projects/MobileApps.tsx","components/buttons/ActionButton.tsx","components/projects/ListItemPicker/ListItemPicker.tsx","components/projects/webapps.tsx","screens/Projects.tsx","screens/Skills.tsx","context/AppContextProvider.tsx","screens/BlogPosts.tsx","screens/Homepage.tsx","hooks/useCookies.ts","components/cookies/Cookies.tsx","App.tsx","hooks/useLocalstorage.ts","serviceWorker.ts","config/main.ts","index.tsx"],"names":["module","exports","__webpack_require__","p","AppAction","appConfig","i18n","activeLocale","availableLocales","en","label","code","se","jp","skills","content","AppConfigContext","React","createContext","AppConfigContextProvider","_ref","children","react_default","a","createElement","Provider","value","LocaleContext","locales","useTranslation","translations","useContext","key","translation","_len","arguments","length","params","Array","_key","replace","_","index","read","concat","Projects","Skills","Backend","Frontend","Devops","Mobile","Other","Intro","sv","CardContainer","styled","div","display","flexDirection","marginBottom","ProjectCardContainer","backgroundColor","theme","colors","white","borderRadius","ProjectCardTitle","fontSize","ProjectCardImage","_ref2","image","compact","Object","defineProperty","backgroundImage","backgroundRepeat","minWidth","minHeight","backgroundSize",":hover","boxShadow","breakpoints","tabletAndLower","ProjectCard","_ref4","title","googlePlayUrl","href","target","rel","AndroidApps","WebApplications","FintechIntro","Container","maxWidth","> div:not(:first-of-type)","marginLeft","marginTop","SubTitle","h3","margin","MobileApps","t","Fragment","ProjectCard_ProjectCard","myMemo","ButtonContent","button","disabled","border","grey","fontWeight","padding","color","lighter","opacity","&:hover","gold","outline","dark","ActionButton","forwardRef","ref","isSubmit","name","rest","objectWithoutProperties","id","useMemo","uniqid","ActionButton_Container","assign","type","open","visibility","height","maxHeight","background","transition","mobileAndLower","InputBox","textarea","_ref3","resize","wrap","ResultContainer","_ref5","fullWidth","ItemsRemaining","_ref6","ItemPicked","_ref7","position","top","left","transform","width","overflow","ButtonContainer","_ref8","ButtonImage","img","_ref10","boxSizing","cursor","ListItemPicker","_ref12","isOpen","_useState","useState","_useState2","slicedToArray","list","setList","_useState3","_useState4","failedList","setFailedList","_useState5","_useState6","currItem","setCurrItem","_useState7","_useState8","isStarted","setIsStarted","useEffect","elem","document","getElementsByName","undefined","push","values","filter","x","NextItem","newList","e","shuffled","shuffleArray","array","i","j","Math","floor","random","_ref13","ListItemPicker_Container","autoFocus","placeholder","onChange","input","currentTarget","trim","match","includes","split","onClick","shuffle","GetStartItemFromList","src","restart","keep","currFailedList","KeepItem","next","textAlign","> div","alignSelf","TextContainer","List","ul","paddingLeft","listStyle","&:before","borderWidth","WebkitTransform","msTransform","ProjectTitle","ProjectTitles","WebApps","isListPickerOpen","setIsListPickerOpen","webapps_Container","ListItemPicker_ListItemPicker","webapps_SubTitle","Main","paddingTop","paddingBottom","Title","h1","letterSpacing","borderBottom","h2","textIndent","webapps_WebApps","MobileApps_MobileApps","SkillsContent","_ul","flexWrap","justifyContent","SkillCard","> ul","SkillTitle","RenderSkills","map","item","Skills_Container","Skills_Title","Skills_RenderSkills","INITIAL_APP_STATE","isDarkTheme","showProjectOverlay","activeProject","isLoading","appReducer","state","action","objectSpread","payload","AppContext","app","dispatch","AppContextProvider","_useReducer","useReducer","_useReducer2","Posts","Date","Content","alt","Left","LeftContainer","li","textDecoration","&:not(:first-of-type)","Right","overflowY","RightContainer","_ref9","Links","> a","&:first-of-type","BlogContainer","BlogList","BlogItem","fontStyle","BlogContent","fontFamily","paddingRight","Homepage","_useContext","contentType","setContentType","handleShowProject","useCallback","SetActiveProject","SetShowProjectOverlay","Homepage_Container","Homepage_TextContainer","gitHub","linkedIn","Projects_Projects","Skills_Skills","showContent","setCookie","cname","cvalue","exdays","d","setTime","getTime","expires","toUTCString","cookie","getCookie","ca","decodeURIComponent","c","charAt","substring","indexOf","bottom","zIndex","CookiesText","marginRight","Cookies","show","setShow","setCookies","Cookies_Container","Cookies_ButtonContainer","AppContainer","App","appConfigContext","_useLocalStorage","initialValue","window","localStorage","getItem","JSON","parse","error","storedValue","setStoredValue","valueToStore","Function","setItem","stringify","console","log","useLocalStorage","_useLocalStorage2","setActiveLocale","terms","setTerms","localeContext","changeLocale","locale","documentElement","lang","AppConfigContext_AppConfigContextProvider","AppContextProvider_AppContextProvider","Homepage_Homepage","Cookies_Cookies","Boolean","location","hostname","light","orange","pink","red","green","yellow","ReactDOM","render","_ref$theme","mainTheme","emotion_theming_browser_esm","src_App_0","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.925521b4.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/mymemo.f05f410c.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAkNJREFUeJztW0F2gyAUHL1JVtmaI+VkPRJuu+pR7KLPlFBQ4P8/YHV2bRKYmT+IgAIEOOeWUjjnFgY3E9QIbmXIoNmYc26Zpin5+TzPWe3stfF4PFR5i5GquEbVLNsWg0muKyNakmluRIxAiyo04RF22sM4pHDqpeopmPLrXfwKM569Cw8RGqHW2BHEr1DhrepkA4iS2+PVvhQiDUcXv6IqxTXj53m/Lc/7jWZUSX97ev6sqnynhmHYXXWFRD4+v0xXajX9bWka/T98h3KWrrEqWCahtj9fS5iCNzek1fehnQRpXyltrwSUVn+vY80kaBidSsHrx6XV1ybIaDumcQTqqp9LRJIEbWNjKRgAWfV9aBK2SlWo9W0WqKm+D60kWA6pUONbAiTV9yERwJhZfL2jxa1ubRKY0yrwcx0YtMZ/DCWCmOJ9za9rgHT8x5CbBHblfa3jxvdUsGcCW3wIcwOAOiEM8QDJAKBMEEs8QDQAyBPGFA+QDegRVANy7gaZO0sA0QCtW2FtUAyoEcQywdyAvXmetamSwnUrbHELDJQLapGEeZ6v5XByW7wWUgHWSYhui59+S2zr4CAX2oQtkhDb/L22xdd/1KbA+qKllYTU1n/0aCz3cdR/dTQG/DozTZNoRrBY0kra3Dr4uY7Hwy+XXgt8AozNjNL+qo79Tv2ITOyHRzRBrOHUj8mtOPWDkiuONhTUk3v6h6XNG1cAjV+PswOdUy9paMrj1C9NtSLTlXAmOWvh16uzFjjSy9MU9Pz6/De05OZzlAnzowAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAkxJREFUeJztW8t1hCAUvVqRs5sO0s8Ukn7SQXbYkVnkMOdJQBHeT83dzVGZ+3kiIAIKCCEsRxFCWDS4iaBFsJUhA2djIYRlmqbi8Xmeq9rZa+PxeLDy7kYpcY7UJNvuhiY5V0ZYkjE3IkfAIgUTHumfergPVTh5Sb0EUX7exUeI8fQuPEVqBFtjZxAfwcKb1UkDdFWux97+KLo0nF18RFMVn+G+/3g9l4/Xs4rbnp4/syrq1DAMvmZd+BVPf399fu9y3NI00h/UodqpqyZyqddUAtWSVsHKDc/pbwntqYJ3BXhPv4Qa8UC5Ct4XXzn9iJzGEbh++hG5KhiAe6QfkWpdPQWunH5EqnFVAVdPP4LqHT2P9krHesRThBCWwev9XzKAQzzV/O4DPN3/teP8VlCt48Z57sBV+hTuDJBOP4U7A0qQSB9wZoB2+gCjAUcWKUrXl45JpQ8wGUDJc6coKR5gMKB1kaLnfE6I9QEcoqTTBxgM2CJZY4Jl+gDANhRu7cQkh7wlrIbCXEPgFpHW6c/zzD8drq0Eq8cekEyH6QGOqXFvnyAtPrssLjElbi1vrfQBUgFbLw5a0SJEM/2oWXxZ/EglaKcPFBZEOJfJakVZpA8QAyS3n2qM6PZAt99Srdll8WmaWKsA2DbBKn3A4PV4y+vtXlS/Hgfk+oIIKlhDfNNrv1tvkcldeEYTujXceptcxBk2TOXAyvtstwJ75d5+s7R44wxQ4+fx6aDOyUs1mPK49UdTVmRcCdckJy38/9NZCZzp42kVeP58/gfzEX3cdiewhQAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAjlJREFUeJztW8mRwyAQRCpn449IxIlsPE5kExk+G4/8cKHCLCBAcyG5fy4j1N0zgLiMYQAArK0AgJWDGwl6BEsZMmFWBgDrsizZ/51zVfXs1WGtReV9GLmIY0SNsu7D4CSnyghJMuJGpAhIREGER/xSDe2QhZOWqOdAyk+7eA8yntqFx4iNQKtsBPEeKLxRnRTAoczV2Nu34pCG0cV7dGXxqO0+hz09/2ZVoVPTNOmadXWipGkOf4QO1U5dR0CoJc6CDzfOGH2PnLYtA84afY9cFmxOnDn6HimNN2P6o39/PFWMEn+/P1UBc85ty20AsFpr3y70RF+LeI9aE2KtH6NAbfS1iTemnlOs8SMDRo1+iJpMCPXOrV97msW3AgDWubQGf3Ysy/IeBYzBHftrO6RWYGVfOBrcdso2gUp4XD9mM5z3i9SBWjzVu9AMGBVfA6QJSEPUgPvjuUp/V4gZEAqXNAHNgBYRqbJHn+8FagbUECuV2XueoslMrVPhGgK5cZoj1VsmQ8YYM1Msfx1NcS4458xMdeBISydXgrV2yi6LnxXJZXGOfkBj+9+WxEobBz0vSv3PNVMsIbX4y74svpcJlEalNG59QGsW9KIkkFJ8buk/uTXGcRw1zgTqJlKV4dxb41yToZKu7/Z4XJirL+BC17bfpY/IpB4c0YTDGi59TM5j1ANTqLxHawromXv5w9LklSOAjZ/G0YGdk5ZsEOVx6UtTUmRUCeckRy38e3WWAiNdnmaB5uvzLztLayomurdeAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFNTE3OEEyRTk5QTAxMUUyOUExNUJDMTA0NkE4OTA0RCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFNTE3OEEyRjk5QTAxMUUyOUExNUJDMTA0NkE4OTA0RCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1MTc4QTJDOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1MTc4QTJEOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+FYrpWAAABrNJREFUeNrkW2ls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\"","module.exports = __webpack_public_path__ + \"static/media/linked-in-logo.bf1a2919.png\";","export enum AppAction {\r\n SetIsDarkTheme = 'SET_IS_DARK_THEME',\r\n SetShowProjectOverlay = 'SET_SHOW_PROJECT_OVERLAY',\r\n SetActiveProject = 'SET_ACTIVE_PROJECT',\r\n SetIsLoading = 'SET_IS_LOADING'\r\n}\r\n\r\ninterface IAppState {\r\n isDarkTheme: boolean;\r\n showProjectOverlay: boolean;\r\n activeProject: string;\r\n isLoading: boolean;\r\n}\r\n\r\nexport interface IAppAction {\r\n type: AppAction;\r\n payload?: string | boolean;\r\n callback?: (state?: IAppState) => {} | void;\r\n}\r\n\r\nexport const INITIAL_APP_STATE: IAppState = {\r\n isDarkTheme: false,\r\n showProjectOverlay: false,\r\n activeProject: '',\r\n isLoading: false\r\n};\r\n\r\nexport const appReducer = (state: IAppState, action: IAppAction): IAppState => {\r\n switch (action.type) {\r\n case 'SET_IS_DARK_THEME':\r\n return { ...state, isDarkTheme: action.payload as boolean };\r\n case 'SET_SHOW_PROJECT_OVERLAY':\r\n return { ...state, showProjectOverlay: action.payload as boolean };\r\n case 'SET_ACTIVE_PROJECT':\r\n return { ...state, activeProject: action.payload as string };\r\n case 'SET_IS_LOADING':\r\n return { ...state, isLoading: action.payload as boolean };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import React from 'react';\r\nimport profile from './profile';\r\n\r\ntype Locale = {\r\n label: string;\r\n code: string;\r\n};\r\n\r\ninterface I18n {\r\n activeLocale: string;\r\n availableLocales: { [key: string]: Locale };\r\n}\r\n\r\ninterface ISkills {\r\n code: string;\r\n content: string[];\r\n}\r\n\r\ninterface AppConfig {\r\n i18n: I18n;\r\n skills: ISkills[];\r\n}\r\n\r\nexport const appConfig: AppConfig = profile;\r\nexport const AppConfigContext = React.createContext(appConfig);\r\n\r\nexport const AppConfigContextProvider: React.FC = ({ children }) => {\r\n return {children};\r\n};\r\n","export default {\r\n i18n: {\r\n activeLocale: 'en',\r\n availableLocales: {\r\n en: {\r\n label: 'English',\r\n code: 'en'\r\n },\r\n se: {\r\n label: 'Svenska',\r\n code: 'sv'\r\n },\r\n jp: {\r\n label: '日本語',\r\n code: 'jp'\r\n }\r\n }\r\n },\r\n skills: [\r\n { code: 'Backend', content: ['C #', '.NET Core / Framework', 'SQL Databases', 'Visual Studio 2019', 'Xunit (Unit tests)'] },\r\n { code: 'Frontend', content: ['React JS', 'JavaScript', 'HTML / CSS', 'Typescript', 'Visual Studio Code'] },\r\n { code: 'Devops', content: ['Microsoft Azure', 'Amazon AWS (S3)', 'Sendgrid', 'Kubernetes'] },\r\n { code: 'Mobile', content: ['Android (Java)', 'Android Studio', 'Unity (C#)'] },\r\n {\r\n code: 'Other',\r\n content: ['Kanban, Agile, Slack', 'Git, IIS', 'Github, Sourcetree', 'Auth0 / Curity / Identity', 'Service Bus', 'Postman']\r\n }\r\n ]\r\n};\r\n","import React from 'react';\r\n\r\ninterface ILocale {\r\n label: string;\r\n code: string;\r\n}\r\n\r\ninterface ILocales {\r\n [key: string]: ILocale;\r\n}\r\n\r\nexport interface ILocaleContext {\r\n activeLocale: string;\r\n locales: ILocales;\r\n changeLocale?: (locale: string) => void;\r\n}\r\n\r\nexport const LocaleContext = React.createContext({\r\n activeLocale: 'en',\r\n locales: {\r\n en: {\r\n label: 'English',\r\n code: 'en'\r\n }\r\n }\r\n});\r\n","import { useContext } from 'react';\r\nimport { LocaleContext } from '../context/locale-context';\r\n\r\nexport interface ILocaleTranslation {\r\n [key: string]: {\r\n [key: string]: string;\r\n };\r\n}\r\n\r\nexport interface ITranslationFunction {\r\n (key: string, ...params: any[]): string;\r\n}\r\n\r\nexport const useTranslation = (translations: ILocaleTranslation): ITranslationFunction => {\r\n const { activeLocale } = useContext(LocaleContext);\r\n\r\n const t = (key: string, ...params: any[]) => {\r\n const translation = translations[activeLocale];\r\n\r\n const read = (translation: string, params: any[]) => {\r\n return translation.replace(/{(\\d)}/g, (_: any, index: number) => {\r\n return params[index];\r\n });\r\n };\r\n\r\n return translation && translation[key] ? (params.length > 0 ? read(translation[key], params) : translation[key]) : `@no-param: ${key}`;\r\n };\r\n\r\n return t;\r\n};\r\n","import { ILocaleTranslation } from '../hooks/useTranslations';\r\n\r\nexport const translations: ILocaleTranslation = {\r\n en: {\r\n Projects: 'PROJECTS',\r\n Skills: 'SKILLS',\r\n Backend: 'BACKEND',\r\n Frontend: 'FRONTEND',\r\n Devops: 'DEVOPS',\r\n Mobile: 'MOBILE',\r\n Other: 'OTHER',\r\n Intro:\r\n 'Hi! My name is Pontus Johansson and I am a fullstack developer currently working in C# and ReactJS in the Fintech industry. My key goals are mostly focused on being mobile friendly, having a simple to navigate UI and reusability of code and components.'\r\n },\r\n sv: {\r\n Projects: 'PROJEKT',\r\n Skills: 'SKILLS',\r\n Backend: 'BACKEND',\r\n Frontend: 'FRONTEND',\r\n Devops: 'DEVOPS',\r\n Mobile: 'MOBIL',\r\n Other: 'ANNAT',\r\n Intro:\r\n 'Hej! Mitt namn är Pontus Johansson och jag är för närvarande fullstackutvecklare och jobbar med C# och ReactJS för ett Fintech bolag. Mitt fokus ligger tugnt på att vara mobilvänlig, lättanvändlig UI och återanvändbarhet av kod och komponenter.'\r\n },\r\n jp: {\r\n Projects: 'プロジェクト',\r\n Skills: 'スキル',\r\n Backend: 'バックエンド',\r\n Frontend: 'フロントエンド',\r\n Devops: 'DEVOPS',\r\n Mobile: 'モバイル',\r\n Other: 'ほか',\r\n Intro:\r\n '初めまして!Pontus Johanssonと申します。現在フルスタックのソフトウェアエンジニアとして働いています。C# と ReactJS でプログラミングをしています。フォーカスはモバイルフレンドリーで使いやすい UI とコードの Reusability が大事だと思います。よろしくお願いします。'\r\n }\r\n};\r\n","import React from 'react';\r\nimport styled from '@emotion/styled';\r\n\r\nconst CardContainer = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n marginBottom: '2em'\r\n});\r\n\r\nconst ProjectCardContainer = styled.div(({ theme }) => ({\r\n backgroundColor: theme.colors.white,\r\n borderRadius: 10\r\n}));\r\n\r\nconst ProjectCardTitle = styled.div({\r\n fontSize: 20,\r\n marginBottom: 5\r\n});\r\n\r\nconst ProjectCardImage = styled.div(({ theme, image, compact }) => ({\r\n backgroundImage: `url(${image})`,\r\n backgroundRepeat: 'no-repeat',\r\n borderRadius: compact ? 8 : '8px 8px 0 0',\r\n minWidth: 150,\r\n minHeight: 150,\r\n backgroundSize: 150,\r\n\r\n ':hover': {\r\n borderRadius: '5%',\r\n boxShadow: `0px 0px 8px 4px ${theme.colors.white}`\r\n },\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n borderRadius: compact ? 8 : '8px 0 0 8px',\r\n backgroundSize: 120,\r\n minWidth: 120,\r\n minHeight: 120\r\n }\r\n}));\r\n\r\ninterface IProjectCardProps {\r\n title: string;\r\n image?: any;\r\n googlePlayUrl?: string;\r\n compact?: boolean;\r\n}\r\n\r\ninterface IProjectImageProps {\r\n image?: any;\r\n compact?: boolean;\r\n}\r\n\r\nexport const ProjectCard: React.FC = ({ title, image, googlePlayUrl, compact }) => {\r\n return (\r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { ILocaleTranslation } from '../../hooks/useTranslations';\r\n\r\nexport const translations: ILocaleTranslation = {\r\n en: {\r\n AndroidApps: 'Android Apps',\r\n WebApplications: 'Web applications',\r\n FintechIntro: 'Working on both frontend and backend in several projects in Fintech, the products are related to debt collection including:'\r\n },\r\n sv: {\r\n AndroidApps: 'Android Appar',\r\n WebApplications: 'Webbapplikationer',\r\n FintechIntro:\r\n 'Jobbar både med frontend och backend för ett flertal projekt under mina år inom Fintech, produkterna är relaterade till inkasso och inkluderar bland annat:'\r\n },\r\n jp: {\r\n AndroidApps: 'アンドロイドのアプリ',\r\n WebApplications: 'ウェブアプリケーション',\r\n FintechIntro:\r\n 'Fintechで色んなプロジェクトでフロントエンドとバックエンド両方やっています。下は前作ったプロジェクトと今でもまだ作っているプロジェクトにあります。'\r\n }\r\n};\r\n","import React from 'react';\r\nimport styled from '@emotion/styled';\r\nimport myMemo from '../../img/apps/mymemo.png';\r\nimport { ProjectCard } from '../card/ProjectCard';\r\nimport { useTranslation } from '../../hooks/useTranslations';\r\nimport { translations } from './translations.i18n';\r\n\r\nconst Container = styled.div(({ theme }) => ({\r\n display: 'flex',\r\n maxWidth: 700,\r\n\r\n '> div:not(:first-of-type)': {\r\n marginLeft: 30\r\n },\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n maxWidth: '100%',\r\n flexDirection: 'column',\r\n\r\n '> div:not(:first-of-type)': {\r\n marginLeft: 0,\r\n marginTop: 40\r\n }\r\n }\r\n}));\r\n\r\nconst SubTitle = styled.h3({\r\n margin: '0 0 0.5em 0'\r\n});\r\n\r\nexport const MobileApps: React.FC = () => {\r\n const t = useTranslation(translations);\r\n const myMemoUrl = 'https://play.google.com/store/apps/details?id=app.selith.lifegoals';\r\n\r\n return (\r\n <>\r\n {t('AndroidApps')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { forwardRef, useMemo } from 'react';\r\nimport uniqid from 'uniqid';\r\nimport styled from '@emotion/styled';\r\n\r\ninterface IButtonProps extends React.HTMLAttributes {\r\n disabled?: boolean;\r\n name?: string;\r\n value?: string;\r\n isSubmit?: boolean;\r\n}\r\n\r\nconst Container = styled.div({\r\n marginTop: 20,\r\n marginBottom: 20\r\n});\r\n\r\nconst ButtonContent = styled.button<{ disabled: boolean }>(({ theme, disabled }) => ({\r\n minWidth: 120,\r\n minHeight: 30,\r\n border: `1px solid ${theme.colors.grey}`,\r\n borderRadius: 10,\r\n backgroundColor: disabled ? theme.colors.grey : theme.colors.white,\r\n fontWeight: 900,\r\n fontSize: 16,\r\n padding: '5px 10px',\r\n color: theme.colors.lighter,\r\n opacity: disabled ? 0.7 : 1,\r\n boxShadow: '1px 1px 3px 0px grey',\r\n\r\n '&:hover': {\r\n boxShadow: `0px 0px 1px 1px ${theme.colors.gold}`,\r\n outline: 'none',\r\n color: theme.colors.dark\r\n }\r\n}));\r\n\r\nexport const ActionButton = forwardRef(({ isSubmit, disabled, value, name, children, ...rest }, ref) => {\r\n const id = useMemo(uniqid, []);\r\n\r\n return (\r\n \r\n \r\n {children}\r\n \r\n \r\n );\r\n});\r\n","import React, { useEffect, useState } from 'react';\r\nimport styled from '@emotion/styled';\r\nimport { ActionButton } from '../../buttons/ActionButton';\r\nimport keep from './img/keep.png';\r\nimport next from './img/next.png';\r\nimport restart from './img/restart.png';\r\n\r\nconst Container = styled.div<{ open: boolean }>(({ theme, open }) => ({\r\n display: 'flex',\r\n opacity: open ? 1 : 0,\r\n visibility: open ? 'visible' : 'hidden',\r\n flexDirection: 'row',\r\n height: open ? 500 : 0,\r\n maxHeight: 500,\r\n minWidth: '100%',\r\n background: theme.colors.dark,\r\n margin: '0 auto',\r\n border: '1px solid white',\r\n transition: 'opacity 0.25s ease-in',\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n minWidth: '100%',\r\n maxWidth: '100%',\r\n },\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n flexDirection: 'column'\r\n }\r\n}));\r\n\r\nconst InputBox = styled.textarea(({ theme }) => ({\r\n padding: 5,\r\n minWidth: '50%',\r\n resize: 'none',\r\n wrap: 'hard',\r\n backgroundColor: theme.colors.dark,\r\n color: 'white',\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n minHeight: 150\r\n }\r\n}));\r\n\r\nconst ResultContainer = styled.div<{ fullWidth: boolean }>(({ theme, fullWidth }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minWidth: fullWidth ? '100%' : '50%',\r\n minHeight: '100%',\r\n padding: '5px 10px',\r\n}));\r\n\r\nconst ItemsRemaining = styled.div(({ theme }) => ({\r\n minHeight: '10%',\r\n}));\r\n\r\nconst ItemPicked = styled.div(({ theme }) => ({\r\n minHeight: '50%',\r\n // border: '1px solid white',\r\n position: 'relative',\r\n\r\n p: {\r\n position: 'absolute',\r\n top: '0%',\r\n left: '50%',\r\n fontSize: '50px',\r\n transform: 'translate(-50%, 50%)',\r\n width: '100%',\r\n overflow: 'hidden',\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n top: '30%',\r\n fontSize: '30px'\r\n }\r\n }\r\n}));\r\n\r\nconst ButtonContainer = styled.div(({ theme }) => ({\r\n [theme.breakpoints.mobileAndLower]: {\r\n margin: '0 auto',\r\n }\r\n}));\r\n\r\nconst ButtonImage = styled.img(({ theme }) => ({\r\n width: 60,\r\n height: 60,\r\n margin: 15,\r\n boxSizing: 'border-box',\r\n\r\n ':hover': {\r\n cursor: 'pointer',\r\n },\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n width: 50,\r\n height: 50,\r\n margin: 5\r\n }\r\n}));\r\n\r\ninterface IProps {\r\n isOpen: boolean\r\n}\r\n\r\nexport const ListItemPicker: React.FC = ({ isOpen }) => {\r\n const [list, setList] = useState([]);\r\n const [failedList, setFailedList] = useState([]);\r\n const [currItem, setCurrItem] = useState('');\r\n const [isStarted, setIsStarted] = useState(false);\r\n\r\n useEffect(() => {\r\n let elem = document.getElementsByName('inputList');\r\n let values = [];\r\n if (elem !== undefined && elem !== null) {\r\n values.push(document.getElementsByName('inputList').values);\r\n setList(list);\r\n\r\n if (list.length == 0 && failedList.length > 0) {\r\n setCurrItem(failedList[0]);\r\n setList(failedList.filter(x => x.length > 0));\r\n setFailedList([]);\r\n }\r\n }\r\n }, [list, setList]);\r\n\r\n const NextItem = () => {\r\n let newList = list.filter(e => e !== currItem);\r\n let shuffled = shuffleArray(newList);\r\n setCurrItem(shuffled[0]);\r\n setList(shuffled);\r\n }\r\n\r\n const KeepItem = () => {\r\n let currFailedList = failedList;\r\n currFailedList.push(currItem);\r\n setFailedList(currFailedList);\r\n NextItem();\r\n }\r\n\r\n const NewList = () => {\r\n setIsStarted(false);\r\n setCurrItem('');\r\n setFailedList([]);\r\n setList([]);\r\n }\r\n\r\n const GetStartItemFromList = () => {\r\n if (!isStarted) {\r\n setIsStarted(true);\r\n setFailedList([]);\r\n }\r\n if (list.length <= 0) setIsStarted(false);\r\n let shuffle = shuffleArray(list);\r\n setCurrItem(shuffle[0]);\r\n }\r\n\r\n const shuffleArray = (array: Array) => {\r\n for (let i = array.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [array[i], array[j]] = [array[j], array[i]];\r\n }\r\n\r\n return array;\r\n }\r\n\r\n return (\r\n \r\n {!isStarted && {\r\n let input = e.currentTarget.value.trim();\r\n if (input.length > 0) {\r\n let match = input.includes(',')\r\n ? input.split(',')\r\n : input.match(/[^\\r\\n]+/g) as Array;\r\n setList(match === null ? [] : match);\r\n }\r\n }} />\r\n }\r\n \r\n \r\n {isStarted && Items left: {list.length > 0 ? list.length : 0}}\r\n \r\n \r\n

{!isStarted && list.length <= 0 && 'Add at least one item to the list to start'}

\r\n

{isStarted && list.length >= 0 && currItem}

\r\n {!isStarted && list && list.length > 0 && {\r\n GetStartItemFromList();\r\n }}>{'Start'}}\r\n
\r\n \r\n {isStarted && NewList()}>}\r\n {isStarted && list && list.length > 0 && KeepItem()}>}\r\n {isStarted && list && list.length > 0 && NextItem()}>}\r\n \r\n
\r\n
\r\n );\r\n};\r\n","import React, { useContext, useState } from 'react';\r\nimport styled from '@emotion/styled';\r\nimport { useTranslation } from '../../hooks/useTranslations';\r\nimport { translations } from './translations.i18n';\r\nimport { AppContext } from '../../context/AppContextProvider';\r\nimport { AppAction } from '../../reducers/AppReducer';\r\nimport { ListItemPicker } from './ListItemPicker/ListItemPicker';\r\n\r\nconst Container = styled.div(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n textAlign: 'left',\r\n marginBottom: '2em',\r\n width: '100%',\r\n\r\n '> div': {\r\n margin: '20px auto 10px auto',\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n alignSelf: 'left',\r\n margin: '20px 0px 10px 0px'\r\n }\r\n }\r\n}));\r\n\r\nconst ProjectContainer = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n margin: '15px 0',\r\n fontSize: 20,\r\n padding: 20,\r\n backgroundColor: 'rgba(255, 255, 255, 0.6)',\r\n color: 'black',\r\n fontWeight: 900,\r\n border: '5px solid rgba(255, 255, 255, 0.4)',\r\n\r\n '&:hover': {\r\n cursor: 'pointer',\r\n backgroundColor: 'rgba(255, 255, 255, 0.8)'\r\n }\r\n});\r\n\r\nconst TextContainer = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n margin: '15px 0',\r\n fontSize: 18\r\n});\r\n\r\nconst List = styled.ul(({ theme }) => ({\r\n textAlign: 'left',\r\n padding: 0,\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n paddingLeft: 0,\r\n width: '100%',\r\n margin: '20px 0 0 0',\r\n textAlign: 'left',\r\n },\r\n\r\n '>li:first-of-type': {\r\n marginTop: 0\r\n },\r\n\r\n '> li': {\r\n position: 'relative',\r\n margin: '0 auto',\r\n listStyle: 'none',\r\n textAlign: 'left',\r\n marginTop: 30,\r\n width: '100%',\r\n\r\n '&:before': {\r\n content: '\"\"',\r\n position: 'absolute',\r\n border: 'solid white',\r\n borderWidth: '0 3px 3px 0',\r\n top: 8,\r\n left: '-25px',\r\n padding: 3,\r\n transform: 'rotate(-45deg)',\r\n WebkitTransform: 'rotate(-45deg)',\r\n msTransform: 'rotate(-45deg)'\r\n },\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n width: '100%'\r\n }\r\n }\r\n}));\r\n\r\nconst ProjectTitle = styled.h3({\r\n width: 'fit-content',\r\n margin: '0 auto',\r\n padding: '10px',\r\n\r\n ':hover': {\r\n cursor: 'pointer'\r\n }\r\n});\r\n\r\nconst ProjectTitles = styled.div({\r\n width: '100%',\r\n});\r\n\r\nconst SubTitle = styled.h3({\r\n margin: '0 0 0.5em 0'\r\n});\r\n\r\nexport const WebApps: React.FC = () => {\r\n // const { dispatch } = useContext(AppContext);\r\n const t = useTranslation(translations);\r\n const [isListPickerOpen, setIsListPickerOpen] = useState(false);\r\n\r\n // const showProject = (name: string) => {\r\n // dispatch({ type: AppAction.SetActiveProject, payload: name });\r\n // };\r\n\r\n return (\r\n <>\r\n \r\n setIsListPickerOpen(!isListPickerOpen)}>Random List Item Picker\r\n \r\n {/*

{t('WebApplications')}

*/}\r\n \r\n {/* showProject('SCS')}>Simple Checkout System\r\n showProject('BS')}>Binary Search\r\n showProject('QS')}>Quick Sort*/}\r\n \r\n \r\n Fintech work\r\n

{t('FintechIntro')}

\r\n \r\n
  • \r\n Searching, filtering and handling larger data sets. User adding, deleting, editing and impersonation. Authorization and email handling.\r\n Creating complex user-permission groups in a one-to-many relationship between users and customers.\r\n
  • \r\n
  • \r\n Client portal that allow for manangement of essential work and in-site messaging and communications. Ability to cover for a colleague in\r\n case of absence.\r\n
  • \r\n
  • \r\n User portal for private persons, authorization through bankID on desktop or mobile as login method. Ability to manage and handle debts\r\n and create payment plans to pay off debts which includes mobile forms of payments as well using Swish. Includes ways of communication through\r\n in-site messaging systems.\r\n
  • \r\n
  • \r\n Also manage backend systems to communicate with databases and above websites to GET, POST and PUT data required for everything to work\r\n smoothly.\r\n
  • \r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport styled from '@emotion/styled';\r\nimport { useTranslation } from '../hooks/useTranslations';\r\nimport { translations } from './translations.i18n';\r\nimport { MobileApps } from '../components/projects/MobileApps';\r\nimport { WebApps } from '../components/projects/webapps';\r\n\r\nconst Main = styled.div<{}>(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n textAlign: 'left',\r\n paddingTop: 0,\r\n width: '100%',\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n paddingTop: 0,\r\n paddingBottom: 50\r\n }\r\n}));\r\n\r\nexport const SectionTitle = styled.h1(({ theme }) => ({\r\n textAlign: 'left',\r\n letterSpacing: 5,\r\n borderBottom: '1px solid grey',\r\n paddingLeft: 10,\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n textAlign: 'center'\r\n }\r\n}));\r\n\r\nconst Title = styled.h2({\r\n borderBottom: '1px solid black',\r\n textIndent: '0.2em',\r\n margin: '0.5em 0 0 0'\r\n});\r\n\r\nexport const Projects: React.FC = () => {\r\n const t = useTranslation(translations);\r\n\r\n return (\r\n
    \r\n {t('Projects')}\r\n \r\n \r\n
    \r\n );\r\n};\r\n","import React, { useContext } from 'react';\r\nimport styled from '@emotion/styled';\r\nimport { useTranslation } from '../hooks/useTranslations';\r\nimport { translations } from './translations.i18n';\r\nimport { AppConfigContext } from '../config/AppConfigContext';\r\nimport { SectionTitle } from './Projects';\r\n\r\nconst Container = styled.div(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: '100%',\r\n margin: '0 auto',\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n maxWidth: '100%'\r\n }\r\n}));\r\n\r\nconst SkillsContent = styled.div(({ theme }) => ({\r\n ul: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n width: '100%',\r\n paddingLeft: 0,\r\n textAlign: 'center',\r\n marginBottom: '1em',\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n width: '100%',\r\n flexDirection: 'column'\r\n },\r\n\r\n '> div': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n width: 'auto',\r\n padding: '0 1em',\r\n minWidth: '200px',\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n width: '100%'\r\n }\r\n },\r\n\r\n li: {\r\n textAlign: 'center',\r\n marginBottom: 10,\r\n listStyle: 'none',\r\n fontSize: '1em'\r\n }\r\n },\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n justifyContent: 'center',\r\n display: 'grid'\r\n }\r\n}));\r\n\r\nconst SkillCard = styled.div({\r\n display: 'flex',\r\n width: '100%',\r\n\r\n '> ul': {\r\n flexDirection: 'column'\r\n }\r\n});\r\n\r\nconst Title = styled.h2({\r\n borderBottom: '1px solid black',\r\n textIndent: '0.2em',\r\n margin: '0.5em 0 0 0'\r\n});\r\n\r\nconst SkillTitle = styled.h3({\r\n margin: '0 0 0.5em 0'\r\n});\r\n\r\ninterface ISkills {\r\n code: string;\r\n content: string[];\r\n}\r\n\r\nconst RenderSkills = ({ code, content }: ISkills) => {\r\n return (\r\n
    \r\n {code}\r\n \r\n
      \r\n {content.map((item: string) => {\r\n return
    • {item}
    • ;\r\n })}\r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport const Skills: React.FC = () => {\r\n const t = useTranslation(translations);\r\n const { skills } = useContext(AppConfigContext);\r\n\r\n return (\r\n \r\n {t('Skills')}\r\n \r\n
      \r\n {skills.map((item: ISkills) => (\r\n \r\n ))}\r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n","import React, { useReducer } from 'react';\r\nimport { IAppAction, INITIAL_APP_STATE, appReducer } from '../reducers/AppReducer';\r\n\r\nexport interface IAppContext {\r\n app: {};\r\n dispatch: React.Dispatch;\r\n}\r\n\r\nexport const AppContext = React.createContext({\r\n app: INITIAL_APP_STATE,\r\n dispatch: (() => '') as React.Dispatch\r\n});\r\n\r\nexport const AppContextProvider: React.FC = ({ children }) => {\r\n const [app, dispatch] = useReducer(appReducer, INITIAL_APP_STATE);\r\n\r\n return {children};\r\n};\r\n","import React from 'react';\r\n\r\nexport const Posts = [\r\n {\r\n Title: 'Secure keys and secrets in legacy projects',\r\n Date: '2022-04-23',\r\n Content:\r\n <>\r\n

    These days as we rely more on technology every day it is important to keep your apps secure from the outside. With that in mind it is important that developers also are aware and up to date on security measures.

    \r\n

    One way to secure keys using Azure is with Key Vaults. Using Key Vaults we can store our keys and secrets in Azure instead of in our code and control who can access these.

    \r\n

    But using these tools with legacy projects that have not been updated is not always easy, one example where this becomes a problem is with old .NET projects.

    \r\n

    If it is not currently possible to upgrade the project to the latest framework we are still able to get the Key Vault funcationality in .NET Framework 4.7.2 projects.

    \r\n

    This solution is only for projects that can not be upgraded past .NET Framework 4.8 as there are better solutions for newer frameworks.

    \r\n
    \r\n

    Following these steps we can take advantage of Azure Key Vault on older .NET Framework projects:

    \r\n
    \r\n

    1) Upgrade your project target framework to .NET Framework 4.7.2 or bigger.

    \r\n \"TargetFramework\"\r\n

    2) Install Microsoft.Configuration.ConfigurationBuilders.Azure Nuget package.

    \r\n \"ConfigurationBuildersAzure\"\r\n

    3) In your App.config add your KeyVault Name to the configBuilders.

    \r\n \"AppConfigAzureKeyVaultName\"\r\n

    4) In your config file add configBuilders='AzureKeyVault' to your AppSettings and/or ConnectionString container tag and replace the value with a dummy value.

    \r\n \"AppConfigAzureKeyVault\"\r\n

    5) After that all you need to do is set up a KeyVault in Azure and add your secrets, make sure all your key vault secret names match your config names and configure the KeyVault with appropriate Access settings so that your app and/or user can authenticate to the KeyVault and read the secrets.

    \r\n \r\n }\r\n];","import React, { useEffect, useContext, useCallback, useState } from 'react';\r\nimport styled from '@emotion/styled';\r\nimport { Projects } from './Projects';\r\nimport { Skills } from './Skills';\r\nimport { WebAppOverlay } from '../components/overlays/WebAppOverlay';\r\nimport { AppContext } from '../context/AppContextProvider';\r\nimport { AppAction } from '../reducers/AppReducer';\r\nimport gitHub from '../img/icons/GitHub-Mark-64px.png';\r\nimport linkedIn from '../img/icons/linked-in-logo.png';\r\nimport { useTranslation } from '../hooks/useTranslations';\r\nimport { translations } from './translations.i18n';\r\nimport { Header } from '../components/header/header';\r\nimport { Footer } from '../components/footer/Footer';\r\nimport { Posts } from './BlogPosts';\r\n\r\nconst Container = styled.div(({ theme }) => ({\r\n display: 'flex',\r\n margin: 'auto',\r\n flexDirection: 'row',\r\n maxWidth: '100%',\r\n height: '100%',\r\n maxHeight: '100%',\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n flexDirection: 'column',\r\n }\r\n}));\r\n\r\nconst Left = styled.div(({ theme }) => ({\r\n display: 'flex',\r\n backgroundColor: '#181818',\r\n width: '35%',\r\n height: '100vh',\r\n color: '#fff',\r\n padding: '0.5em 1em 0.5em 0.5em',\r\n justifyContent: 'end',\r\n overflow: 'hidden',\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n maxHeight: '100px',\r\n width: '100%',\r\n }\r\n}));\r\n\r\nconst LeftContainer = styled.div(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minWidth: '30%',\r\n margin: '200px 0.5em 0 0.5em',\r\n width: '100%',\r\n textAlign: 'right',\r\n\r\n 'ul': {\r\n listStyle: 'none',\r\n padding: 0,\r\n marginTop: 0,\r\n\r\n 'li': {\r\n marginTop: '1em',\r\n\r\n '&:hover': {\r\n cursor: 'pointer',\r\n textDecoration: 'underline',\r\n fontWeight: 'bold'\r\n }\r\n }\r\n },\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n marginTop: '100px'\r\n },\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n marginTop: '50px',\r\n margin: '0 0.5em 0 0.5em',\r\n flexDirection: 'row',\r\n\r\n 'ul': {\r\n display: 'flex',\r\n margin: 'auto',\r\n\r\n 'li': {\r\n margin: 'auto',\r\n\r\n '&:not(:first-of-type)': {\r\n paddingLeft: '1em'\r\n }\r\n }\r\n }\r\n },\r\n}));\r\n\r\nconst Right = styled.div(({ theme }) => ({\r\n display: 'flex',\r\n width: '65%',\r\n height: '100vh',\r\n color: '#181818',\r\n padding: '0.5em 0.5em 0.5em 1em',\r\n justifyContent: 'start',\r\n overflowY: 'auto',\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n width: '100%',\r\n overflowY: 'initial'\r\n },\r\n}));\r\n\r\nconst RightContainer = styled.div(({ theme }) => ({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minWidth: '30%',\r\n textAlign: 'left',\r\n padding: '0 0.5em 0 0',\r\n marginTop: '200px',\r\n width: '100%',\r\n\r\n 'p': {\r\n margin: 0\r\n },\r\n\r\n [theme.breakpoints.tabletAndLower]: {\r\n marginTop: '100px'\r\n },\r\n\r\n [theme.breakpoints.mobileAndLower]: {\r\n marginTop: '0',\r\n\r\n h1: {\r\n position: 'absolute',\r\n color: '#fff',\r\n top: '3em',\r\n left: '2.8em',\r\n fontSize: '1em'\r\n }\r\n },\r\n}));\r\n\r\nconst TextContainer = styled.div({\r\n margin: '1em 0 0 0',\r\n padding: 0,\r\n\r\n 'h2': {\r\n borderBottom: '1px solid black'\r\n },\r\n\r\n 'h3': {\r\n marginBottom: '0.5em'\r\n }\r\n});\r\n\r\nconst Content = styled.div({\r\n\r\n});\r\n\r\nconst Links = styled.div({\r\n width: 'fit-content',\r\n paddingTop: '1em',\r\n paddingBottom: '1em',\r\n\r\n '> a': {\r\n padding: '1em',\r\n\r\n '&:first-of-type': {\r\n paddingLeft: 0\r\n },\r\n\r\n img: {\r\n borderRadius: '50%',\r\n }\r\n }\r\n});\r\n\r\nconst BlogContainer = styled.div({\r\n display: 'flex',\r\n maxWidth: '100%',\r\n});\r\n\r\nconst BlogList = styled.div({\r\n display: 'flex',\r\n flexDirection: 'column',\r\n maxWidth: '100%'\r\n});\r\n\r\nconst BlogItem = styled.div({\r\n paddingBottom: '1.5em',\r\n borderBottom: '1px solid black',\r\n marginBottom: '1.5em',\r\n\r\n h1: {\r\n position: 'relative',\r\n color: 'black',\r\n fontSize: '1.2em',\r\n top: 0,\r\n left: 0,\r\n marginBottom: 0,\r\n },\r\n h2: {\r\n fontSize: '0.8em',\r\n marginTop: 0,\r\n fontWeight: 'normal',\r\n fontStyle: 'italic',\r\n borderBottom: 'none'\r\n },\r\n});\r\n\r\nconst BlogContent = styled.div({\r\n p: {\r\n i: {\r\n fontSize: '0.8em'\r\n }\r\n },\r\n code: {\r\n fontFamily: 'monospace',\r\n fontSize: '1em',\r\n backgroundColor: '#f1f1f1',\r\n paddingLeft: '0.3em',\r\n paddingRight: '0.3em',\r\n },\r\n img: {\r\n margin: '0.3em 0.5em 0.3em 0.5em',\r\n maxWidth: '100%',\r\n height: 'auto'\r\n }\r\n});\r\n\r\nexport const Homepage: React.FC = () => {\r\n const t = useTranslation(translations);\r\n const { app, dispatch } = useContext(AppContext);\r\n const [contentType, setContentType] = useState(0);\r\n\r\n const handleShowProject = useCallback(() => {\r\n if (app.showProjectOverlay && app.activeProject !== '') {\r\n dispatch({ type: AppAction.SetActiveProject, payload: '' });\r\n }\r\n\r\n dispatch({ type: AppAction.SetShowProjectOverlay, payload: !app.showProjectOverlay });\r\n }, [app.activeProject, app.showProjectOverlay, dispatch]);\r\n\r\n useEffect(() => {\r\n if (app.activeProject !== '' && !app.showProjectOverlay) {\r\n handleShowProject();\r\n }\r\n }, [handleShowProject, app.activeProject, app.showProjectOverlay]);\r\n\r\n const GetPosts = () => {\r\n return Posts.map(x =>\r\n \r\n

    {x.Title}

    \r\n

    {x.Date}

    \r\n {x.Content}\r\n
    \r\n )\r\n }\r\n\r\n const showContent = () => {\r\n switch (contentType) {\r\n case 0: {\r\n return <>\r\n \r\n

    I am a full-stack developer currently working in C# and ReactJS in the Fintech industry.

    \r\n

    My key goals are mostly focused on being mobile friendly, having a simple to navigate UI and reusability of code and components.

    \r\n
    \r\n \r\n

    Socials

    \r\n

    Feel free to contact me on either LinkedIn or Email: pontusdev@gmail.com

    \r\n
    \r\n \r\n \r\n \"PontusDev\r\n \r\n \r\n \"Pontus\r\n \r\n \r\n \r\n

    Thoughts & Things

    \r\n \r\n \r\n {GetPosts()}\r\n \r\n \r\n
    \r\n \r\n }\r\n case 1: {\r\n return \r\n }\r\n case 2: {\r\n return \r\n }\r\n case 3: {\r\n return \r\n

    I am a full-stack developer currently working in C# and ReactJS in the Fintech industry.

    \r\n

    My key goals are mostly focused on being mobile friendly, having a simple to navigate UI and reusability of code and components.

    \r\n
    \r\n }\r\n default: {\r\n return
    \r\n }\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {/*
    \r\n
    \r\n
    */}\r\n
    \r\n \r\n \r\n \r\n

    Pontus

    \r\n
      \r\n
    • setContentType(0)}>HOME
    • \r\n
    • setContentType(1)}>PROJECTS
    • \r\n
    • setContentType(2)}>SKILLS
    • \r\n {/*
    • setContentType(3)}>ABOUT
    • */}\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n

    Johansson

    \r\n \r\n {showContent()}\r\n \r\n
    \r\n
    \r\n {/* {app.showProjectOverlay && }\r\n \r\n */}\r\n
    \r\n
    \r\n {/*