├── .editorconfig ├── .env.example ├── .eslintrc.js ├── .github └── dependabot.yml ├── .gitignore ├── .netlify └── state.json ├── .prettierrc ├── README.md ├── app.html ├── assets ├── css │ ├── styles.css │ └── tailwind.css └── icons │ ├── dark.svg │ ├── light.svg │ └── system.svg ├── components ├── Categories │ └── CategoryList.vue ├── Contact │ └── ContactForm.vue ├── DarkModeSwitcher.vue ├── General │ ├── Dropdown.vue │ ├── Footer.vue │ ├── PageHeader.vue │ └── navbar │ │ ├── DesktopNavLinks.vue │ │ ├── MobileNavLinks.vue │ │ └── Navbar.vue ├── Letters │ └── LetterList.vue ├── Links │ ├── DesktopNavLink.vue │ └── FooterLink.vue ├── Posts │ └── PostList.vue ├── Projects │ ├── ProjectLinks.vue │ ├── ProjectList.vue │ └── ProjectTechnologies.vue ├── Technologies │ └── TechnologyList.vue ├── Thoughts │ └── ThoughtList.vue └── utils │ └── Date.vue ├── jsconfig.json ├── layouts └── default.vue ├── modules └── sitemapRouteGenerator.js ├── netlify.toml ├── nuxt.config.js ├── package.json ├── pages ├── README.md ├── categories │ ├── _slug.vue │ └── index.vue ├── contact │ └── index.vue ├── index.vue ├── letters │ ├── _slug.vue │ └── index.vue ├── posts │ ├── _slug.vue │ └── index.vue ├── privacy-policy.vue ├── projects │ ├── _slug.vue │ └── index.vue ├── resume │ └── index.vue ├── technologies │ ├── _slug.vue │ └── index.vue └── thoughts │ └── index.vue ├── plugins ├── README.md └── preview.client.js ├── static ├── Christopher-Wray-Resume.pdf ├── ads.txt ├── chris-wray-family.jpg ├── favicon.svg ├── icon.png ├── web-programming-gray.svg └── web-programming.svg ├── store └── README.md ├── tailwind.config.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | API_ROUTE='http://localhost:1337' 2 | ANALYTICS_ID='' -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/prettier'], 7 | parserOptions: { 8 | parser: 'babel-eslint' 9 | }, 10 | rules: { 11 | quotes: ['single', 'double'], 12 | 'no-multi-spaces': ['error'], 13 | 'no-unused-vars': 'off', 14 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 15 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: '/' 5 | schedule: 6 | interval: monthly 7 | time: '00:00' 8 | open-pull-requests-limit: 99 9 | reviewers: 10 | - cwray-tech 11 | assignees: 12 | - cwray-tech 13 | labels: 14 | - dependencies 15 | commit-message: 16 | prefix: fix 17 | prefix-development: chore 18 | include: scope 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | /logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | package-lock.json 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (https://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # TypeScript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional REPL history 51 | .node_repl_history 52 | 53 | # Output of 'npm pack' 54 | *.tgz 55 | 56 | # Yarn Integrity file 57 | .yarn-integrity 58 | 59 | # dotenv environment variables file 60 | .env 61 | 62 | # parcel-bundler cache (https://parceljs.org/) 63 | .cache 64 | 65 | # next.js build output 66 | .next 67 | 68 | # nuxt.js build output 69 | .nuxt 70 | 71 | # Nuxt generate 72 | dist 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless 79 | 80 | # IDE / Editor 81 | .idea 82 | 83 | # Service worker 84 | sw.* 85 | 86 | # macOS 87 | .DS_Store 88 | 89 | # Vim swap files 90 | *.swp 91 | .vscode 92 | sw.* 93 | -------------------------------------------------------------------------------- /.netlify/state.json: -------------------------------------------------------------------------------- 1 | { 2 | "siteId": "2f35842b-9fc6-49b9-a49e-9d785d0525f3" 3 | } -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "tabWidth": 2, 4 | "singleQuote": true, 5 | "arrowParens": "avoid", 6 | "semi": false, 7 | "trailingComma": "none", 8 | "bracketSpacing": true 9 | } 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # My Personal Portfolio Frontend On NuxtJS 2 | 3 | This is the frontend code to [my personal portfolio](https://chriswray.dev). 4 | 5 |  6 | 7 | ## Build Setup 8 | 9 | ```bash 10 | # install dependencies 11 | $ yarn install 12 | 13 | # serve with hot reload at localhost:3000 14 | $ yarn dev 15 | 16 | # build for production and launch server 17 | $ yarn build 18 | $ yarn start 19 | 20 | # generate static project 21 | $ yarn generate 22 | ``` 23 | 24 | For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org). 25 | -------------------------------------------------------------------------------- /app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | {{ HEAD }} 6 | 7 | 8 | 15 | 16 | 17 | 18 | {{ APP }} 19 | 20 | 21 | -------------------------------------------------------------------------------- /assets/css/styles.css: -------------------------------------------------------------------------------- 1 | /*General Scrollbar Styling */ 2 | ::-webkit-scrollbar { 3 | width: 15px; 4 | height: 10px; 5 | } 6 | 7 | ::-webkit-scrollbar-track { 8 | background-color: #f9fafb; 9 | -webkit-border-radius: 20px; 10 | border-radius: 20px; 11 | } 12 | 13 | ::-webkit-scrollbar-thumb { 14 | -webkit-border-radius: 20px; 15 | border-radius: 20px; 16 | background: #5850ec; 17 | } 18 | -------------------------------------------------------------------------------- /assets/css/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /assets/icons/dark.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /assets/icons/light.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /assets/icons/system.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /components/Categories/CategoryList.vue: -------------------------------------------------------------------------------- 1 | 2 |11 | {{ category.description }} 12 |
13 |9 | Trying to do my part in making the world a better place. 10 |
11 |12 | This site is hosted for free, so I am thanking the services I am using by adding a link 13 | to their websites here in the footer. 14 |
15 |277 | © 2020 Chris Wray. All rights reserved. 278 |
279 |14 | {{ subheading }} 15 |
16 |14 | {{ subheading }} 15 |
16 |26 | {{ post.preview }} 27 |
28 |90 | {{ project.introduction }} 91 |
92 |11 | {{ technology.description }} 12 |
13 |3 | 4 |
5 | 6 | 11 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "~/*": ["./*"], 6 | "@/*": ["./*"], 7 | "~~/*": ["./*"], 8 | "@@/*": ["./*"] 9 | } 10 | }, 11 | "exclude": ["node_modules", ".nuxt", "dist"] 12 | } 13 | -------------------------------------------------------------------------------- /layouts/default.vue: -------------------------------------------------------------------------------- 1 | 2 |18 | {{ contactPage.contact_text }} 19 |
20 |18 | {{ home.title }} 19 |
20 |60 | {{ home.introduction_heading }} 61 |
62 |68 | {{ home.introduction }} 69 |
70 |Last updated: January 15, 2022
15 |16 | This Privacy Policy describes Our policies and procedures on the collection, use and 17 | disclosure of Your information when You use the Service and tells You about Your privacy 18 | rights and how the law protects You. 19 |
20 |21 | We use Your Personal data to provide and improve the Service. By using the Service, You 22 | agree to the collection and use of information in accordance with this Privacy Policy. 23 |
24 |27 | The words of which the initial letter is capitalized have meanings defined under the 28 | following conditions. 29 |
30 |31 | The following definitions shall have the same meaning regardless of whether they appear 32 | in singular or in plural. 33 |
34 |For the purposes of this Privacy Policy:
36 |123 | While using Our Service, We may ask You to provide Us with certain personally 124 | identifiable information that can be used to contact or identify You. Personally 125 | identifiable information may include, but is not limited to: 126 |
127 |Usage Data is collected automatically when using the Service.
135 |136 | Usage Data may include information such as Your Device's Internet Protocol address (e.g. 137 | IP address), browser type, browser version, the pages of our Service that You visit, the 138 | time and date of Your visit, the time spent on those pages, unique device identifiers 139 | and other diagnostic data. 140 |
141 |142 | When You access the Service by or through a mobile device, We may collect certain 143 | information automatically, including, but not limited to, the type of mobile device You 144 | use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile 145 | operating system, the type of mobile Internet browser You use, unique device identifiers 146 | and other diagnostic data. 147 |
148 |149 | We may also collect information that Your browser sends whenever You visit our Service 150 | or when You access the Service by or through a mobile device. 151 |
152 |154 | We use Cookies and similar tracking technologies to track the activity on Our Service 155 | and store certain information. Tracking technologies used are beacons, tags, and scripts 156 | to collect and track information and to improve and analyze Our Service. 157 |
158 |159 | You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is 160 | being sent. However, if You do not accept Cookies, You may not be able to use some parts 161 | of our Service. 162 |
163 |164 | Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on your 165 | personal computer or mobile device when You go offline, while Session Cookies are 166 | deleted as soon as You close your web browser. 167 |
168 |We use both session and persistent Cookies for the purposes set out below:
169 |The Company may use Personal Data for the following purposes:
211 |We may share your personal information in the following situations:
244 |280 | The Company will retain Your Personal Data only for as long as is necessary for the 281 | purposes set out in this Privacy Policy. We will retain and use Your Personal Data to 282 | the extent necessary to comply with our legal obligations (for example, if we are 283 | required to retain your data to comply with applicable laws), resolve disputes, and 284 | enforce our legal agreements and policies. 285 |
286 |287 | The Company will also retain Usage Data for internal analysis purposes. Usage Data is 288 | generally retained for a shorter period of time, except when this data is used to 289 | strengthen the security or to improve the functionality of Our Service, or We are 290 | legally obligated to retain this data for longer time periods. 291 |
292 |294 | Your information, including Personal Data, is processed at the Company's operating 295 | offices and in any other places where the parties involved in the processing are 296 | located. It means that this information may be transferred to — and maintained on — 297 | computers located outside of Your state, province, country or other governmental 298 | jurisdiction where the data protection laws may differ than those from Your 299 | jurisdiction. 300 |
301 |302 | Your consent to this Privacy Policy followed by Your submission of such information 303 | represents Your agreement to that transfer. 304 |
305 |306 | The Company will take all steps reasonably necessary to ensure that Your data is treated 307 | securely and in accordance with this Privacy Policy and no transfer of Your Personal 308 | Data will take place to an organization or a country unless there are adequate controls 309 | in place including the security of Your data and other personal information. 310 |
311 |314 | If the Company is involved in a merger, acquisition or asset sale, Your Personal Data 315 | may be transferred. We will provide notice before Your Personal Data is transferred and 316 | becomes subject to a different Privacy Policy. 317 |
318 |320 | Under certain circumstances, the Company may be required to disclose Your Personal Data 321 | if required to do so by law or in response to valid requests by public authorities (e.g. 322 | a court or a government agency). 323 |
324 |326 | The Company may disclose Your Personal Data in the good faith belief that such action is 327 | necessary to: 328 |
329 |338 | The security of Your Personal Data is important to Us, but remember that no method of 339 | transmission over the Internet, or method of electronic storage is 100% secure. While We 340 | strive to use commercially acceptable means to protect Your Personal Data, We cannot 341 | guarantee its absolute security. 342 |
343 |345 | Service Providers have access to Your Personal Data only to perform their tasks on Our 346 | behalf and are obligated not to disclose or use it for any other purpose. 347 |
348 |350 | We may use third-party Service providers to monitor and analyze the use of our Service. 351 |
352 |374 | We may use Your Personal Data to contact You with newsletters, marketing or promotional 375 | materials and other information that may be of interest to You. You may opt-out of 376 | receiving any, or all, of these communications from Us by following the unsubscribe link 377 | or instructions provided in any email We send or by contacting Us. 378 |
379 |We may use Email Marketing Service Providers to manage and send emails to You.
380 |394 | We may use third-party Service Providers to provide better improvement of our Service. 395 |
396 |416 | Under this Privacy Policy, and by law if You are a resident of California, You have the 417 | following rights: 418 |
419 |470 | In order to exercise any of Your rights under the CCPA, and if you are a California 471 | resident, You can email us or submit our contact form for requests. 472 |
473 |474 | The Company will disclose and deliver the required information free of charge within 45 475 | days of receiving Your verifiable request. The time period to provide the required 476 | information may be extended once by an additional 45 days when reasonable necessary and 477 | with prior notice. 478 |
479 |481 | We do not sell personal information. However, the Service Providers we partner with (for 482 | example, our advertising partners) may use technology on the Service that "sells" 483 | personal information as defined by the CCPA law. 484 |
485 |486 | If you wish to opt out of the use of your personal information for interest-based 487 | advertising purposes and these potential sales as defined under CCPA law, you may do so 488 | by following the instructions below. 489 |
490 |491 | Please note that any opt out is specific to the browser You use. You may need to opt out 492 | on every browser that you use. 493 |
494 |496 | You can opt out of receiving ads that are personalized as served by our Service 497 | Providers by following our instructions presented on the Service: 498 |
499 |506 | The opt out will place a cookie on Your computer that is unique to the browser You use 507 | to opt out. If you change browsers or delete the cookies saved by your browser, you will 508 | need to opt out again. 509 |
510 |512 | Your mobile device may give you the ability to opt out of the use of information about 513 | the apps you use in order to serve you ads that are targeted to your interests: 514 |
515 |522 | You can also stop the collection of location information from Your mobile device by 523 | changing the preferences on your mobile device. 524 |
525 |Our Service does not respond to Do Not Track signals.
529 |530 | However, some third party websites do keep track of Your browsing activities. If You are 531 | visiting such websites, You can set Your preferences in Your web browser to inform 532 | websites that You do not want to be tracked. You can enable or disable DNT by visiting 533 | the preferences or settings page of Your web browser. 534 |
535 |537 | Our Service does not address anyone under the age of 13. We do not knowingly collect 538 | personally identifiable information from anyone under the age of 13. If You are a parent 539 | or guardian and You are aware that Your child has provided Us with Personal Data, please 540 | contact Us. If We become aware that We have collected Personal Data from anyone under 541 | the age of 13 without verification of parental consent, We take steps to remove that 542 | information from Our servers. 543 |
544 |545 | We also may limit how We collect, use, and store some of the information of Users 546 | between 13 and 18 years old. In some cases, this means We will be unable to provide 547 | certain functionality of the Service to these users. 548 |
549 |550 | If We need to rely on consent as a legal basis for processing Your information and Your 551 | country requires consent from a parent, We may require Your parent's consent before We 552 | collect and use that information. 553 |
554 |556 | Our Service may contain links to other websites that are not operated by Us. If You 557 | click on a third party link, You will be directed to that third party's site. We 558 | strongly advise You to review the Privacy Policy of every site You visit. 559 |
560 |561 | We have no control over and assume no responsibility for the content, privacy policies 562 | or practices of any third party sites or services. 563 |
564 |566 | We may update our Privacy Policy from time to time. We will notify You of any changes by 567 | posting the new Privacy Policy on this page. 568 |
569 |570 | We will let You know via email and/or a prominent notice on Our Service, prior to the 571 | change becoming effective and update the "Last updated" date at the top of this Privacy 572 | Policy. 573 |
574 |575 | You are advised to review this Privacy Policy periodically for any changes. Changes to 576 | this Privacy Policy are effective when they are posted on this page. 577 |
578 |If you have any questions about this Privacy Policy, You can contact us:
580 |
584 |