├── .vscode └── settings.json ├── src ├── img │ └── photo_2024-05-03_20-00-13.jpg ├── css │ ├── media-queries.css │ ├── animations.css │ ├── setup.css │ └── styles.css ├── js │ └── script.js └── libs │ └── normalize.css ├── .gitignore └── index.html /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "liveServer.settings.port": 5501 3 | } -------------------------------------------------------------------------------- /src/img/photo_2024-05-03_20-00-13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KhujamovCodes/Portifolio/HEAD/src/img/photo_2024-05-03_20-00-13.jpg -------------------------------------------------------------------------------- /src/css/media-queries.css: -------------------------------------------------------------------------------- 1 | /*///////////////////////////////// 2 | // Media Queries 3 | /////////////////////////////////*/ 4 | 5 | @media only screen and (max-width: 700px) { 6 | .grid-list { 7 | grid-template-columns: repeat(3, minmax(100px, 1fr)); 8 | } 9 | } 10 | 11 | @media only screen and (max-width: 600px) { 12 | header { 13 | min-height: 800px; 14 | overflow: hidden; 15 | position: relative; 16 | } 17 | 18 | .main-photo { 19 | top: 0; 20 | left: 0; 21 | } 22 | 23 | .heading { 24 | top: 50%; 25 | width: 20em; 26 | } 27 | 28 | .intro { 29 | font-size: 6em; 30 | } 31 | 32 | .lead { 33 | font-size: 1.5em; 34 | width: 100%; 35 | } 36 | 37 | .grid-list { 38 | grid-template-columns: repeat(2, minmax(100px, 1fr)); 39 | } 40 | } 41 | 42 | @media only screen and (max-width: 550px) { 43 | .contact-form { 44 | grid-template-columns: 1fr; 45 | } 46 | } 47 | 48 | @media only screen and (max-width: 450px) { 49 | h2 { 50 | font-size: 3.7em; 51 | } 52 | 53 | .contact-form { 54 | grid-template-columns: 1fr; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/js/script.js: -------------------------------------------------------------------------------- 1 | // Scroll function from Donovan Hutchinson's Level Up Your CSS Animation Skills Udemy course 2 | // Detect request animation frame 3 | const scroll = 4 | window.requestAnimationFrame || 5 | // IE Fallback 6 | function (callback) { 7 | window.setTimeout(callback, 1000 / 60); 8 | }; 9 | const elementsToShow = document.querySelectorAll(".show-on-scroll"); 10 | 11 | function loop() { 12 | elementsToShow.forEach(function (element) { 13 | if (isElementInViewport(element)) { 14 | element.classList.add("is-visible"); 15 | } else { 16 | element.classList.remove("is-visible"); 17 | } 18 | }); 19 | 20 | scroll(loop); 21 | } 22 | 23 | // Call the loop for the first time 24 | loop(); 25 | 26 | // Helper function from: http://stackoverflow.com/a/7557433/274826 27 | function isElementInViewport(el) { 28 | // special bonus for those using jQuery 29 | if (typeof jQuery === "function" && el instanceof jQuery) { 30 | el = el[0]; 31 | } 32 | const rect = el.getBoundingClientRect(); 33 | return ( 34 | (rect.top <= 0 && rect.bottom >= 0) || 35 | (rect.bottom >= 36 | (window.innerHeight || document.documentElement.clientHeight) && 37 | rect.top <= 38 | (window.innerHeight || 39 | document.documentElement.clientHeight)) || 40 | (rect.top >= 0 && 41 | rect.bottom <= 42 | (window.innerHeight || document.documentElement.clientHeight)) 43 | ); 44 | } 45 | 46 | // Smooth scroll function 47 | const headerBtn = document.getElementById("header-btn"); 48 | const socialContact = document.getElementById("social-contact"); 49 | const contactForm = document.getElementById("contact"); 50 | 51 | function scrollToForm() { 52 | contactForm.scrollIntoView({ behavior: "smooth" }); // Top 53 | } 54 | 55 | headerBtn.addEventListener("click", scrollToForm); 56 | socialContact.addEventListener("click", scrollToForm); 57 | 58 | // No bots! 59 | const contactFormNoBots = document.getElementById("contact-form-no-bots"); 60 | contactFormNoBots.parentNode.removeChild(contactFormNoBots); 61 | -------------------------------------------------------------------------------- /src/css/animations.css: -------------------------------------------------------------------------------- 1 | /*///////////////////////////////// 2 | // Animation Styles 3 | /////////////////////////////////*/ 4 | 5 | /* Header */ 6 | header { 7 | opacity: 0; 8 | -webkit-transition: opacity 0.5s 0.25s ease-out; 9 | transition: opacity 0.5s 0.25s ease-out; 10 | } 11 | 12 | header.is-visible { 13 | opacity: 1; 14 | } 15 | 16 | .main-photo { 17 | -webkit-transform: scale(0.8); 18 | transform: scale(0.8); 19 | } 20 | 21 | .heading { 22 | -webkit-transform: translate(-50%, calc(-50% + 5em)); 23 | transform: translate(-50%, calc(-50% + 5em)); 24 | } 25 | 26 | .is-visible .main-photo { 27 | -webkit-transform: none; 28 | transform: none; 29 | } 30 | 31 | .is-visible .heading { 32 | -webkit-transform: translate(-50%, -50%); 33 | transform: translate(-50%, -50%); 34 | } 35 | 36 | .main-photo, 37 | .heading { 38 | -webkit-transition: -webkit-transform 4s 0.25s cubic-bezier(0, 1, 0.3, 1); 39 | transition: -webkit-transform 4s 0.25s cubic-bezier(0, 1, 0.3, 1); 40 | transition: transform 4s 0.25s cubic-bezier(0, 1, 0.3, 1); 41 | transition: transform 4s 0.25s cubic-bezier(0, 1, 0.3, 1), 42 | -webkit-transform 4s 0.25s cubic-bezier(0, 1, 0.3, 1); 43 | will-change: transform; 44 | } 45 | 46 | /* Icons Grid List / Portfolio */ 47 | 48 | .grid-list, 49 | .portfolio-img { 50 | opacity: 0; 51 | -webkit-transition: opacity 0.3s 0.25s ease-out, 52 | -webkit-transform 1.5s 0.25s cubic-bezier(0, 1, 0.3, 1); 53 | transition: opacity 0.3s 0.25s ease-out, 54 | -webkit-transform 1.5s 0.25s cubic-bezier(0, 1, 0.3, 1); 55 | transition: transform 1.5s 0.25s cubic-bezier(0, 1, 0.3, 1), 56 | opacity 0.3s 0.25s ease-out; 57 | transition: transform 1.5s 0.25s cubic-bezier(0, 1, 0.3, 1), 58 | opacity 0.3s 0.25s ease-out, 59 | -webkit-transform 1.5s 0.25s cubic-bezier(0, 1, 0.3, 1); 60 | will-change: transform, opacity; 61 | } 62 | 63 | .grid-list.slide-left { 64 | -webkit-transform: translateX(-4em); 65 | transform: translateX(-4em); 66 | } 67 | 68 | .grid-list.slide-right { 69 | -webkit-transform: translateX(4em); 70 | transform: translateX(4em); 71 | } 72 | 73 | .grid-list.is-visible { 74 | opacity: 1; 75 | -webkit-transform: translateX(0); 76 | transform: translateX(0); 77 | } 78 | 79 | .portfolio-img.is-visible { 80 | opacity: 1; 81 | -webkit-transform: translateY(0); 82 | transform: translateY(0); 83 | } 84 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/node,macos 3 | # Edit at https://www.gitignore.io/?templates=node,macos 4 | 5 | ### macOS ### 6 | # General 7 | .DS_Store 8 | .AppleDouble 9 | .LSOverride 10 | 11 | # Icon must end with two \r 12 | Icon 13 | 14 | # Thumbnails 15 | ._* 16 | 17 | # Files that might appear in the root of a volume 18 | .DocumentRevisions-V100 19 | .fseventsd 20 | .Spotlight-V100 21 | .TemporaryItems 22 | .Trashes 23 | .VolumeIcon.icns 24 | .com.apple.timemachine.donotpresent 25 | 26 | # Directories potentially created on remote AFP share 27 | .AppleDB 28 | .AppleDesktop 29 | Network Trash Folder 30 | Temporary Items 31 | .apdisk 32 | 33 | ### Node ### 34 | # Logs 35 | logs 36 | *.log 37 | npm-debug.log* 38 | yarn-debug.log* 39 | yarn-error.log* 40 | lerna-debug.log* 41 | 42 | # Diagnostic reports (https://nodejs.org/api/report.html) 43 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 44 | 45 | # Runtime data 46 | pids 47 | *.pid 48 | *.seed 49 | *.pid.lock 50 | 51 | # Directory for instrumented libs generated by jscoverage/JSCover 52 | lib-cov 53 | 54 | # Coverage directory used by tools like istanbul 55 | coverage 56 | *.lcov 57 | 58 | # nyc test coverage 59 | .nyc_output 60 | 61 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 62 | .grunt 63 | 64 | # Bower dependency directory (https://bower.io/) 65 | bower_components 66 | 67 | # node-waf configuration 68 | .lock-wscript 69 | 70 | # Compiled binary addons (https://nodejs.org/api/addons.html) 71 | build/Release 72 | 73 | # Dependency directories 74 | node_modules/ 75 | jspm_packages/ 76 | 77 | # TypeScript v1 declaration files 78 | typings/ 79 | 80 | # TypeScript cache 81 | *.tsbuildinfo 82 | 83 | # Optional npm cache directory 84 | .npm 85 | 86 | # Optional eslint cache 87 | .eslintcache 88 | 89 | # Optional REPL history 90 | .node_repl_history 91 | 92 | # Output of 'npm pack' 93 | *.tgz 94 | 95 | # Yarn Integrity file 96 | .yarn-integrity 97 | 98 | # dotenv environment variables file 99 | .env 100 | .env.test 101 | 102 | # parcel-bundler cache (https://parceljs.org/) 103 | .cache 104 | 105 | # next.js build output 106 | .next 107 | 108 | # nuxt.js build output 109 | .nuxt 110 | 111 | # vuepress build output 112 | .vuepress/dist 113 | 114 | # Serverless directories 115 | .serverless/ 116 | 117 | # FuseBox cache 118 | .fusebox/ 119 | 120 | # DynamoDB Local files 121 | .dynamodb/ 122 | 123 | # End of https://www.gitignore.io/api/node,macos 124 | -------------------------------------------------------------------------------- /src/css/setup.css: -------------------------------------------------------------------------------- 1 | /* Colors */ 2 | :root { 3 | --black: #000000; 4 | --dark-red: rgba(255, 0, 0, 0.5); 5 | --grey: #666; 6 | --lighter-black: #FEAB02; 7 | --red: rgba(255, 0, 0, 0.75); 8 | --white: #131313; 9 | } 10 | 11 | /* Basic Setup */ 12 | 13 | html { 14 | box-sizing: border-box; 15 | min-width: 400px; 16 | } 17 | 18 | *, 19 | *:before, 20 | *:after { 21 | box-sizing: inherit; 22 | } 23 | 24 | ::selection, 25 | ::-moz-selection { 26 | background: var(--red); 27 | color: var(--lighter-black); 28 | } 29 | 30 | /* Text styles */ 31 | @font-face { 32 | font-family: "Open Sans"; 33 | font-style: normal; 34 | font-weight: 400; 35 | src: local("Open Sans"), local("OpenSans"), 36 | url(https://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3bO3LdcAZYWl9Si6vvxL-qU.woff) 37 | format("woff"); 38 | } 39 | 40 | @font-face { 41 | font-family: "Open Sans"; 42 | font-style: normal; 43 | font-weight: 700; 44 | src: local("Open Sans Bold"), local("OpenSans-Bold"), 45 | url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzKRDOzjiPcYnFooOUGCOsRk.woff) 46 | format("woff"); 47 | } 48 | 49 | html { 50 | background: var(--white); 51 | color: var(--black); 52 | font-size: 10px; 53 | font-family: "Avenir Next", Open Sans, sans-serif; 54 | line-height: 1.15; 55 | -ms-text-size-adjust: 100%; 56 | -webkit-text-size-adjust: 100%; 57 | } 58 | 59 | body { 60 | font-size: 1.8rem; 61 | } 62 | 63 | h1 { 64 | font-size: 4.8rem; 65 | } 66 | 67 | h2 { 68 | font-size: 4.7em; 69 | } 70 | 71 | h3 { 72 | font-size: 2.5em; 73 | text-align: center; 74 | } 75 | 76 | h1, 77 | h2, 78 | h3, 79 | h4, 80 | h5, 81 | h6 { 82 | color: var(--lighter-black); 83 | } 84 | 85 | p, 86 | li { 87 | font-size: 2rem; 88 | line-height: 1.5; 89 | } 90 | 91 | ul { 92 | list-style: none; 93 | padding: 0; 94 | } 95 | 96 | a { 97 | box-shadow: inset 0 -0.5em var(--dark-red); 98 | color: var(--black); 99 | font-weight: bold; 100 | text-decoration: none; 101 | transition: all 0.4s cubic-bezier(0, 1, 0.3, 1); 102 | } 103 | 104 | a:hover { 105 | box-shadow: inset 0 -1.5em var(--red); 106 | color: var(--white); 107 | } 108 | 109 | .white-text { 110 | color: var(--white) !important; 111 | } 112 | 113 | .red-text { 114 | color: var(--red); 115 | } 116 | 117 | .text-center { 118 | text-align: center !important; 119 | } 120 | -------------------------------------------------------------------------------- /src/css/styles.css: -------------------------------------------------------------------------------- 1 | /* General Styles */ 2 | .grid-list { 3 | display: grid; 4 | grid-row-gap: 40px; 5 | grid-template-columns: repeat(4, minmax(100px, 1fr)); 6 | text-align: center; 7 | } 8 | 9 | .grid-list > li > a:hover { 10 | color: var(--red); 11 | } 12 | 13 | section { 14 | align-content: center; 15 | display: grid; 16 | justify-content: center; 17 | min-height: 100vh; 18 | padding: 40px 30px 100px 30px; 19 | } 20 | 21 | section > div { 22 | max-width: 1000px; 23 | overflow: hidden; 24 | } 25 | 26 | .svg-image { 27 | fill: var(--white); 28 | height: 80px; 29 | padding: 5px; 30 | width: 80px; 31 | } 32 | 33 | /* Header Styles */ 34 | header { 35 | height: 100vh; 36 | min-height: 1200px; 37 | overflow: hidden; 38 | position: relative; 39 | } 40 | 41 | header:after { 42 | content: ""; 43 | position: absolute; 44 | top: 0; 45 | right: 0; 46 | bottom: 0; 47 | left: 0; 48 | } 49 | 50 | .heading { 51 | color: var(--lighter-black); 52 | line-height: 1; 53 | margin: 0; 54 | position: absolute; 55 | left: 50%; 56 | top: 50%; 57 | text-shadow: -1px -1px 0 var(--white), 1px -1px 0 var(--white), 58 | -1px 1px 0 var(--white), 1px 1px 0 var(--white); 59 | -webkit-transform: translate(-50%, -50%); 60 | transform: translate(-50%, -50%); 61 | width: 30em; 62 | z-index: 10; 63 | } 64 | 65 | .intro { 66 | font-size: 8em; 67 | margin-bottom: 0; 68 | } 69 | 70 | .lead { 71 | color: var(--grey); 72 | font-size: 2em; 73 | margin-bottom: 60px; 74 | } 75 | 76 | .header-btn { 77 | background: var(--lighter-black); 78 | border: 2px solid var(--lighter-black); 79 | border-radius: 4px; 80 | box-shadow: none; 81 | color: var(--white); 82 | cursor: pointer; 83 | font-size: 90%; 84 | font-weight: normal; 85 | padding: 20px; 86 | text-shadow: none; 87 | transition: background 0.3s ease-in-out, color 0.3s ease-in-out; 88 | } 89 | 90 | .header-btn:hover { 91 | background: var(--white); 92 | box-shadow: none; 93 | color: var(--lighter-black); 94 | } 95 | 96 | .main-photo { 97 | background: url(../img/photo_2024-05-03_20-00-13.jpg); 98 | background-position: center; 99 | background-size: cover; 100 | border: 7px solid var(--lighter-black); 101 | border-radius: 50%; 102 | height: 20em; 103 | position: absolute; 104 | top: calc(45% - 25.5em); 105 | left: calc(50% - 25em); 106 | width: 20em; 107 | } 108 | 109 | .main-photo:before { 110 | border: 7px solid var(--white); 111 | border-radius: 50%; 112 | content: " "; 113 | position: absolute; 114 | top: 1px; 115 | right: 1px; 116 | bottom: 1px; 117 | left: 1px; 118 | z-index: -1; 119 | } 120 | 121 | /* Portfolio Styles */ 122 | 123 | .portfolio-img svg { 124 | fill: var(--lighter-black); 125 | width: 100%; 126 | } 127 | 128 | .portfolio-img { 129 | -webkit-transform: translateY(5em); 130 | transform: translateY(5em); 131 | } 132 | 133 | .section-lead { 134 | margin-bottom: 60px; 135 | } 136 | 137 | /* Social Styles */ 138 | #social-contact { 139 | cursor: pointer; 140 | } 141 | 142 | /* Contact Form Styles */ 143 | 144 | fieldset { 145 | border: none; 146 | padding: 0; 147 | } 148 | 149 | textarea { 150 | resize: none; 151 | } 152 | 153 | input, 154 | textarea, 155 | button { 156 | background: var(--white); 157 | border: 5px solid var(--lighter-black); 158 | border-radius: 4px; 159 | padding: 1em; 160 | width: 100%; 161 | } 162 | 163 | input:active, 164 | textarea:active { 165 | outline: var(--red); 166 | } 167 | 168 | form label { 169 | display: block; 170 | font-weight: bold; 171 | } 172 | 173 | .contact-form { 174 | display: grid; 175 | grid-gap: 20px; 176 | grid-template-columns: 1fr 1fr; 177 | } 178 | 179 | #contact-form-no-bots, 180 | #contact-form-message, 181 | #contact-form-submit { 182 | grid-column: 1 / -1; 183 | } 184 | 185 | #contact-form-submit { 186 | background-color: var(--lighter-black); 187 | color: var(--white); 188 | cursor: pointer; 189 | font-weight: bold; 190 | transition: background 0.3s ease-in-out, color 0.3s ease-in-out; 191 | } 192 | 193 | #contact-form-submit:hover { 194 | background-color: var(--white); 195 | color: var(--lighter-black); 196 | } 197 | 198 | #contact-form-submit:active { 199 | background-color: var(--red); 200 | color: var(--lighter-black); 201 | } 202 | 203 | /* Footer Styles */ 204 | footer { 205 | background: var(--black); 206 | color: var(--white); 207 | padding: 20px 0; 208 | text-align: center; 209 | } 210 | 211 | /* General Styles */ 212 | .dark-bg { 213 | background: var(--lighter-black); 214 | color: var(--white); 215 | } 216 | 217 | .dark-bg a { 218 | color: var(--white); 219 | transition: all 0.4s cubic-bezier(0, 1, 0.3, 1); 220 | } 221 | 222 | .dark-bg a:hover { 223 | color: var(--black); 224 | } 225 | -------------------------------------------------------------------------------- /src/libs/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | } 26 | 27 | /** 28 | * Render the `main` element consistently in IE. 29 | */ 30 | 31 | main { 32 | display: block; 33 | } 34 | 35 | /** 36 | * Correct the font size and margin on `h1` elements within `section` and 37 | * `article` contexts in Chrome, Firefox, and Safari. 38 | */ 39 | 40 | h1 { 41 | font-size: 2em; 42 | margin: 0.67em 0; 43 | } 44 | 45 | /* Grouping content 46 | ========================================================================== */ 47 | 48 | /** 49 | * 1. Add the correct box sizing in Firefox. 50 | * 2. Show the overflow in Edge and IE. 51 | */ 52 | 53 | hr { 54 | box-sizing: content-box; /* 1 */ 55 | height: 0; /* 1 */ 56 | overflow: visible; /* 2 */ 57 | } 58 | 59 | /** 60 | * 1. Correct the inheritance and scaling of font size in all browsers. 61 | * 2. Correct the odd `em` font sizing in all browsers. 62 | */ 63 | 64 | pre { 65 | font-family: monospace, monospace; /* 1 */ 66 | font-size: 1em; /* 2 */ 67 | } 68 | 69 | /* Text-level semantics 70 | ========================================================================== */ 71 | 72 | /** 73 | * Remove the gray background on active links in IE 10. 74 | */ 75 | 76 | a { 77 | background-color: transparent; 78 | } 79 | 80 | /** 81 | * 1. Remove the bottom border in Chrome 57- 82 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 83 | */ 84 | 85 | abbr[title] { 86 | border-bottom: none; /* 1 */ 87 | text-decoration: underline; /* 2 */ 88 | text-decoration: underline dotted; /* 2 */ 89 | } 90 | 91 | /** 92 | * Add the correct font weight in Chrome, Edge, and Safari. 93 | */ 94 | 95 | b, 96 | strong { 97 | font-weight: bolder; 98 | } 99 | 100 | /** 101 | * 1. Correct the inheritance and scaling of font size in all browsers. 102 | * 2. Correct the odd `em` font sizing in all browsers. 103 | */ 104 | 105 | code, 106 | kbd, 107 | samp { 108 | font-family: monospace, monospace; /* 1 */ 109 | font-size: 1em; /* 2 */ 110 | } 111 | 112 | /** 113 | * Add the correct font size in all browsers. 114 | */ 115 | 116 | small { 117 | font-size: 80%; 118 | } 119 | 120 | /** 121 | * Prevent `sub` and `sup` elements from affecting the line height in 122 | * all browsers. 123 | */ 124 | 125 | sub, 126 | sup { 127 | font-size: 75%; 128 | line-height: 0; 129 | position: relative; 130 | vertical-align: baseline; 131 | } 132 | 133 | sub { 134 | bottom: -0.25em; 135 | } 136 | 137 | sup { 138 | top: -0.5em; 139 | } 140 | 141 | /* Embedded content 142 | ========================================================================== */ 143 | 144 | /** 145 | * Remove the border on images inside links in IE 10. 146 | */ 147 | 148 | img { 149 | border-style: none; 150 | } 151 | 152 | /* Forms 153 | ========================================================================== */ 154 | 155 | /** 156 | * 1. Change the font styles in all browsers. 157 | * 2. Remove the margin in Firefox and Safari. 158 | */ 159 | 160 | button, 161 | input, 162 | optgroup, 163 | select, 164 | textarea { 165 | font-family: inherit; /* 1 */ 166 | font-size: 100%; /* 1 */ 167 | line-height: 1.15; /* 1 */ 168 | margin: 0; /* 2 */ 169 | } 170 | 171 | /** 172 | * Show the overflow in IE. 173 | * 1. Show the overflow in Edge. 174 | */ 175 | 176 | button, 177 | input { 178 | /* 1 */ 179 | overflow: visible; 180 | } 181 | 182 | /** 183 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 184 | * 1. Remove the inheritance of text transform in Firefox. 185 | */ 186 | 187 | button, 188 | select { 189 | /* 1 */ 190 | text-transform: none; 191 | } 192 | 193 | /** 194 | * Correct the inability to style clickable types in iOS and Safari. 195 | */ 196 | 197 | button, 198 | [type="button"], 199 | [type="reset"], 200 | [type="submit"] { 201 | -webkit-appearance: button; 202 | } 203 | 204 | /** 205 | * Remove the inner border and padding in Firefox. 206 | */ 207 | 208 | button::-moz-focus-inner, 209 | [type="button"]::-moz-focus-inner, 210 | [type="reset"]::-moz-focus-inner, 211 | [type="submit"]::-moz-focus-inner { 212 | border-style: none; 213 | padding: 0; 214 | } 215 | 216 | /** 217 | * Restore the focus styles unset by the previous rule. 218 | */ 219 | 220 | button:-moz-focusring, 221 | [type="button"]:-moz-focusring, 222 | [type="reset"]:-moz-focusring, 223 | [type="submit"]:-moz-focusring { 224 | outline: 1px dotted ButtonText; 225 | } 226 | 227 | /** 228 | * Correct the padding in Firefox. 229 | */ 230 | 231 | fieldset { 232 | padding: 0.35em 0.75em 0.625em; 233 | } 234 | 235 | /** 236 | * 1. Correct the text wrapping in Edge and IE. 237 | * 2. Correct the color inheritance from `fieldset` elements in IE. 238 | * 3. Remove the padding so developers are not caught out when they zero out 239 | * `fieldset` elements in all browsers. 240 | */ 241 | 242 | legend { 243 | box-sizing: border-box; /* 1 */ 244 | color: inherit; /* 2 */ 245 | display: table; /* 1 */ 246 | max-width: 100%; /* 1 */ 247 | padding: 0; /* 3 */ 248 | white-space: normal; /* 1 */ 249 | } 250 | 251 | /** 252 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 253 | */ 254 | 255 | progress { 256 | vertical-align: baseline; 257 | } 258 | 259 | /** 260 | * Remove the default vertical scrollbar in IE 10+. 261 | */ 262 | 263 | textarea { 264 | overflow: auto; 265 | } 266 | 267 | /** 268 | * 1. Add the correct box sizing in IE 10. 269 | * 2. Remove the padding in IE 10. 270 | */ 271 | 272 | [type="checkbox"], 273 | [type="radio"] { 274 | box-sizing: border-box; /* 1 */ 275 | padding: 0; /* 2 */ 276 | } 277 | 278 | /** 279 | * Correct the cursor style of increment and decrement buttons in Chrome. 280 | */ 281 | 282 | [type="number"]::-webkit-inner-spin-button, 283 | [type="number"]::-webkit-outer-spin-button { 284 | height: auto; 285 | } 286 | 287 | /** 288 | * 1. Correct the odd appearance in Chrome and Safari. 289 | * 2. Correct the outline style in Safari. 290 | */ 291 | 292 | [type="search"] { 293 | -webkit-appearance: textfield; /* 1 */ 294 | outline-offset: -2px; /* 2 */ 295 | } 296 | 297 | /** 298 | * Remove the inner padding in Chrome and Safari on macOS. 299 | */ 300 | 301 | [type="search"]::-webkit-search-decoration { 302 | -webkit-appearance: none; 303 | } 304 | 305 | /** 306 | * 1. Correct the inability to style clickable types in iOS and Safari. 307 | * 2. Change font properties to `inherit` in Safari. 308 | */ 309 | 310 | ::-webkit-file-upload-button { 311 | -webkit-appearance: button; /* 1 */ 312 | font: inherit; /* 2 */ 313 | } 314 | 315 | /* Interactive 316 | ========================================================================== */ 317 | 318 | /* 319 | * Add the correct display in Edge, IE 10+, and Firefox. 320 | */ 321 | 322 | details { 323 | display: block; 324 | } 325 | 326 | /* 327 | * Add the correct display in all browsers. 328 | */ 329 | 330 | summary { 331 | display: list-item; 332 | } 333 | 334 | /* Misc 335 | ========================================================================== */ 336 | 337 | /** 338 | * Add the correct display in IE 10+. 339 | */ 340 | 341 | template { 342 | display: none; 343 | } 344 | 345 | /** 346 | * Add the correct display in IE 10. 347 | */ 348 | 349 | [hidden] { 350 | display: none; 351 | } 352 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Khujamov Codes 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 |
21 |

Hi, my name is ixva

22 |

23 | I'm a web developer and teacher. I love JavaScript, Node.js, 24 | jQuery, and Python. 25 |

26 |

Contact Me

27 |
28 |
29 | 30 | 31 |
32 |
33 |

About

34 |

35 | I'm a freelancer living in Portugal who is 36 | originally from the UK. I teach business 37 | English remotely and I create websites. 38 |

39 | 40 |

41 | I went to university in London where I earned a BA in 42 | English Literature and an MA in Victorian Studies. In 2013, 43 | I relocated to Lisbon in order to train for a CELTA at 44 | International House, Lisbon. 45 |

46 | 47 |

48 | While I love teaching English, I missed the fun that I had 49 | creating Visual Basic programs and database queries while 50 | working as a Management Information and Data Analytics 51 | Administrator for Kingston University. 52 |

53 | 54 |

55 | In 2016, I decided to learn web development and I enrolled 56 | in freeCodeCamp's Full Stack Web Development Certification. 57 | Since then I have completed Colt Steele's 58 | The Ultimate MySQL Bootcamp: Go from SQL Beginner to 60 | Expert, The Modern Python 3 Bootcamp, and 62 | The Web Developer Bootcamp, as well as Wes Bos's 63 | JavaScript30, What The Flexbox?!, and 64 | CSS Grid. 65 |

66 | 67 |

68 | I use Python, JavaScript, 69 | jQuery, Node.js, 70 | HTML5, and CSS3 to 71 | automate day-to-day business tasks like sending emails and 72 | keeping track of hours worked. 73 |

74 | 75 |

76 | I'm open to job opportunities, and my CV is available on 77 | request. 78 |

79 |
80 | 81 |
82 |

Skills

83 | 84 | 199 |
200 | 201 |
202 |

Programs

203 | 204 | 314 |
315 |
316 | 317 | 318 |
319 |
320 |

Portfolio

321 |

322 | Bu bo'lim tez orada chiqadi. Hozirgacha men ishlagan ba'zi loyihalarni ko'rish uchun siz mening hisoblarimni tekshirishingiz mumkin. 323 | GitHub 324 | va 325 | Telegram 326 | hisoblarimni tekshirishingiz mumkin. 327 |

328 |
329 |
330 | 340 | 343 | 344 |
345 |
346 | 347 | 348 |
349 |
350 |

Sahifa

351 |

352 | Agar siz men bilan bevosita bog'lanishni istasangiz, quyidagi 353 | aloqa formasidan foydalanishingiz 354 | mumkin. Agar siz ijtimoiy tarmoqlarni afzal ko'rsangiz, meni ushbu belgi havolalari orqali topishingiz mumkin. 355 |

356 |
357 |
358 | 493 |
494 |
495 | 496 | 497 |
498 |
499 |

Aloqa

500 |

501 | Menga xabar yuboring! Sizning elektron pochta manzilingiz ulashilmaydi. Majburiy maydonlar a bilan belgilangan 502 | *. 503 |

504 |
505 | 506 |
507 |
508 | 509 | 510 |
511 | 512 |
513 | 514 | 515 |
516 | 517 |
518 | 519 | 520 |
521 | 522 |
523 | 524 | 525 |
526 | 527 | 528 |
529 |
530 |
531 | 532 | 535 |
536 | 537 | 538 | 539 |
540 | 541 | 542 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | --------------------------------------------------------------------------------