Giter Site home page Giter Site logo

ahurynovich-cv's Introduction

AH Curriculum Vitae project

react boilerplate


My personal CV Web Application written on TypeScript.

Generally Application follows Static CSR approach deploying final build to AWS S3. Than it is hosted using AWS S3 Static Web Hosting + CloudFront + Route 53.

CircleCI codecov Known Vulnerabilities GitHub MIT License

InsightsSnapshot

OpenVSCode

  1. Technology Stack
  2. Run tasks
  3. Project structure
  4. Additional documentation
  5. UI Components Library
  6. Issues
  7. License

Technology stack

Project Bundling

Webpack Babel SASS-LoaderPostCSS-LoaderAutoprefixer

πŸ’‘ Note (TypeScript tranpiling using Babel) Transpiling TypeScript using Babel (with Webpack 'babel-loader', NOT 'ts-loader') was chosen: 1) faster compilation (no types check); 2) having single source of compilation - Babel.

On the other hand, using Babel compilation results in completely lose of type safety and TypeScript checks during this phase. That's why additional test script (tsc) were presented to check as pre-commit(push) hook + in scope of CI/CD.

Application

TypeScript React React-Router ReduxRedux-Saga SCSSCSS-Modules I18n-Next React-Helmet Mobile-Detect

Code Styling

ESLint StyleLint Prettier

Testing

Unit/Integration Testing

Jest RTL Jest-Axe

E2E Testing

Cypress Cypress-Testing-Library Cypress-Axe

Performance testing

LightHouse-CI

πŸ’‘ Note (Performance Testing usage) Performance Testing is only set up on CI/CD pipeline level. For manual performance testing you can use Chrome built-in Lighthouse DevTool.

Tests Reports

CodeCov CircleCI-Test-InsightsJest-JUnit

Other

CircleCI AWS-CLI Husky SiteMapRobots Snyk StoryBook

⬆️ back to top

Run tasks

πŸ’‘ Note: Default development Client host port: 1337

Start:

  • npm start (npm run build:and:start:dev) - Application development build task -> start with Webpack Watcher (port 1337)
  • npm run build:and:start:prod - Application production build task -> start hosting (using http-server)

Build:

  • npm run build - Application general build task (development is default)
  • npm run build:dev - Application development build task
  • npm run build:prod - Application production build task
  • npm run build:prod:pwa - Application production build task (with PWA support)

Deploy:

  • npm run deploy:s3 - Application deploy to AWS S3 task (used for Static Site Hosting)
  • npm run build:and:deploy:s3 - Application production build -> deploy to AWS S3 task (used for Static Site Hosting)

Clean up:

  • npm run build:clean - Clean build ("dist") folder

Test:

  • Unit/Integration Testing
    • npm test (npm run test) - run Application Unit/Integration Tests (Common + A11y)
    • npm run test:with:reports - run Application Unit/Integration Tests (Common + A11y). Reports (results and coverage) enabled.
    • npm run test:ci - run Application Unit/Integration Tests in CI mode (used for CI/CD pipeline level testing)
    • npm run test:ci:with:reports - run Application Unit/Integration Tests in CI mode (used for CI/CD pipeline level testing). Reports (results and coverage) enabled.
  • E2E Testing
    • npm run test:e2e (npm run test:e2e:dev) - run All (Common + A11y) E2E Tests (development build used)
    • npm run test:e2e:dev:open - open launcher of All (Common + A11y) E2E Tests (development build used)
    • npm run test:e2e:common:prod - run Common E2E Tests (production build used)
    • npm run test:e2e:a11y:prod - run A11y E2E Tests (production build used)
  • Performance Testing
    • npm run test:perf:ci - run Application Performance + Insights testing (Lighthouse CI, used for CI/CD pipeline level testing)
  • TypeScript Types checking
    • npm run test:tsc - run Application Typescript's types checking (no Libraries level checking)

Lint:

  • npm run lint:scripts - lint JS/TS files
  • npm run lint:scripts:fix - lint JS/TS files with autofix
  • npm run lint:styles - lint Styles files
  • npm run lint:styles:fix - lint Styles files with autofix
  • npm run lint - lint all (JS/TS+Styles) files
  • npm run lint:fix - lint all (JS/TS+Styles) files with autofix

Code vulnerabilities scan:

  • npm run sca:test - scan for vulnerabilities for known issues (with disrupting processes) - CI/CD integration.
  • npm run sca:test:dev - scan for vulnerabilities for known issues (with disrupting processes), include dev dependencies
  • npm run sca:monitor - scan for vulnerabilities with exposing and storing results snapshot (without disrupting processes)
  • npm run sca:auth - SCA tool (Snyk) authenticate (auth token required)

Components Library maintaining:

  • npm run storybook:start - start Components Library application (localy)
  • npm run storybook:build - build Components Library (dist folder: 'storybook-static')
  • npm run storybook:build:clean - clean Components Library build
  • npm run storybook:deploy:s3 - Components Library deploy to AWS S3 task for (used for Static Site Hosting)
  • npm run storybook:build:and:deploy:s3 - Components Library build -> deploy to AWS S3 task (used for Static Site Hosting)

⬆️ back to top

Project structure

./
β”‚
β”œβ”€β”€β”€.circleci   // application CI/CD configuration (using CircleCI)
β”‚
β”œβ”€β”€β”€.github   // GitHub templates for Projects
β”‚
β”œβ”€β”€β”€.husky   // Git Hooks configuration
β”‚
β”œβ”€β”€β”€.vscode   // VSCode Workspace configuration (additionally for .editorconfig)
β”‚
β”œβ”€β”€β”€config   // configurations folder
β”‚   β”‚
β”‚   β”œβ”€β”€β”€application
β”‚   β”‚
β”‚   β”œβ”€β”€β”€environment
β”‚   β”‚
β”‚   β”œβ”€β”€β”€test
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€jest   // Unit/Integration Tests configuration folder
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€mocks   // Jest setup mocks (e.g. no-JS pattern files mock)
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€test-utils   // Testing utils enhancement (e.g. RTL custom "render" util)
β”‚   β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€β”€custom
β”‚   β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”‚   β”‚   test-utils.js
β”‚   β”‚   β”‚   β”‚   β”‚   index.js
β”‚   β”‚   β”‚   β”‚   └───
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”‚   jest.setupAfterEnv.js   // Jest pre-setup execution (after installed to environment)
β”‚   β”‚   β”‚   β”‚   jest.setup.js   // Jest pre-setup execution (before installed to environment)
β”‚   β”‚   β”‚   └───
β”‚   β”‚   β”œβ”€β”€β”€cypress   // E2E Tests configuration folder
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€downloads
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€e2e
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€fixtures
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€support
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”‚   cypress.config.a11y.json   // E2E A11y Tests override configuration
β”‚   β”‚   β”‚   β”‚   cypress.config.e2e.json   // E2E General Tests override configuration
β”‚   β”‚   β”‚   └───
β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   cypress.config.js   // E2E Tests (Cypress) main config file
β”‚   β”‚   β”‚   jest.config.js   // Unit/Integration Tests (Jest) main config file
β”‚   β”‚   β”‚   lighthouse.config.js   // Performance Tests main config file (used for CI/CD pipeline)
β”‚   β”‚   └───
β”‚   β”‚
β”‚   β”œβ”€β”€β”€lint
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€eslint
β”‚   β”‚   β”‚
β”‚   β”‚   └───stylelint
β”‚   β”‚
β”‚   β”œβ”€β”€β”€prettier
β”‚   β”‚
β”‚   β”œβ”€β”€β”€webpack
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€app   // Webpack Application configuration
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€helpers
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€loaders   // Webpack loaders (babel-loader, sass-loader, etc.)
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€plugins   // Webpack plugins (Favicon plugin, HTML plugin, etc.)
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   └───resolve   // Webpack resolves (aliases, etc.)
β”‚   β”‚   β”‚
β”‚   β”‚   └───storybook   // Webpack Components Library (StoryBook) configuration
β”‚   β”‚
β”‚   β”œβ”€β”€β”€storybook   // UI Components Library configuration
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€docs
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€helpers
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   β”œβ”€β”€β”€argTypes   // StoryBook global argTypes and args (e.g. device type)
β”‚   β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   └───decorators   // StoryBook global decorators (e.g. Providers wrapper)
β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   constants.js   // StoryBook sharable constants
β”‚   β”‚   β”‚   main.js   // StoryBook main config file
β”‚   β”‚   β”‚   preview.js   // StoryBook global stories setup (decorators, parameters, args, etc.)
β”‚   β”‚   β”‚   webpack.config.storybook.es5.js   // StoryBook Webpack config loader (use Babel transpiler to provide ES6 Webpack config usage)
β”‚   β”‚   └───
β”‚   β”‚
β”‚   β”œβ”€β”€β”€robots
β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   robots.txt   // Robots configuration to enhance Web crawlers search
β”‚   β”‚   β”‚   sitemap.xml   // SiteMap configuration
β”‚   β”‚   └───
β”‚   β”‚
β”‚   β”‚   README.md   // Config folder info
β”‚   └───
β”‚
β”œβ”€β”€β”€src
β”‚   β”‚
β”‚   β”œβ”€β”€β”€api
β”‚   β”‚
β”‚   β”œβ”€β”€β”€services    // device detection, i18n, etc.
β”‚   β”‚
β”‚   β”œβ”€β”€β”€utils   // reusable utils
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€functions
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€objects
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€strings
β”‚   β”‚   β”‚
β”‚   β”‚   └───user
β”‚   β”‚
β”‚   β”œβ”€β”€β”€assets
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€fonts
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€images
β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   preload.config.js
β”‚   β”‚   └───
β”‚   β”‚
β”‚   β”œβ”€β”€β”€components   // React components folder
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€base   // base components (Button, Icon, etc.)
|   |   |
|   |   β”œβ”€β”€β”€common   //common components (Header, Footer, etc.)
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€pages   // general pages components (MainPage, etc.)
β”‚   β”‚   β”‚
β”‚   β”‚   └───routes   // application routes setup
β”‚   β”‚
β”‚   β”œβ”€β”€β”€reusables
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€custom-hooks
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€hocs
β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   services.context.tsx   // Services context for components injection using specific Custom Hook/HOC
|   |   |   skip-to-content.context.tsx   // Skip To Content (A11y enhancement) context for components injection using specific Custom Hook/HOC
β”‚   β”‚   └───
β”‚   β”‚
β”‚   β”œβ”€β”€β”€store   // Redux's Store
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€middlewares
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€slices
β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   store.ts   // main Store setup file
β”‚   β”‚   β”‚   store.reducer.ts   // main reducer setup file
β”‚   β”‚   β”‚   store.saga.ts   // root saga setup file (main init + watch sagas)
β”‚   β”‚   β”‚   store.types.ts   // general Store types
β”‚   β”‚   └───
β”‚   β”‚
β”‚   β”œβ”€β”€β”€styles   // main styles folder
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€base   // base styles (mixins, functions, variables, etc.)
β”‚   β”‚   β”‚
β”‚   β”‚   β”‚   main.scss   // main styles file
β”‚   β”‚   β”‚   font-declarations.scss  // fonts declarations main file
β”‚   β”‚   β”‚   reset-normalize.scss   // reset & normalize basic styles
β”‚   β”‚   β”‚   scrollbar.scss   // scrollbar styles
β”‚   β”‚   └───
β”‚   β”‚
β”‚   β”‚   Application.component.tsx   // main application Component
β”‚   β”‚   Application.module.scss   // entry styles file
β”‚   β”‚   application.tsx   // main Create App file
β”‚   β”‚   application.types.ts   // application types models file
β”‚   β”‚   declarations.d.ts   // non-TS files declarations and globals
β”‚   β”‚   index.ts   // main entry file
|   |   index.html   // source HTML file
β”‚   β”‚   README.md   // Source folder info
β”‚   └───
β”‚
β”œβ”€β”€β”€dist
β”‚   β”‚
β”‚   β”œβ”€β”€β”€assets
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€favicons   // favicons collection folder (generated by Webpack Favicon plugin)
β”‚   β”‚   β”‚
β”‚   β”‚   β”œβ”€β”€β”€fonts
β”‚   β”‚   β”‚
β”‚   β”‚   └───images
β”‚   β”‚
β”‚   β”œβ”€β”€β”€css
β”‚   β”‚
β”‚   β”œβ”€β”€β”€js
β”‚   β”‚
β”‚   β”‚   robots.txt
β”‚   β”‚   sitemap.xml
β”‚   β”‚   index.html   // result HTML file
β”‚   └───
β”œβ”€β”€β”€
β”‚
β”‚   .editorconfig   // editor basic setup for IDE
β”‚   babel.config.js   // Babel configuration
β”‚   commitlint.config.ts   // Commit linting configuration
β”‚   jsconfig.json   // JS configuration file for indicating directory root, aliases setup, etc.
β”‚   tsconfig.json   // TS configuration file for indicating basic setup, including directory root, aliases setup, etc.
β”‚   package.json
β”‚   package-lock.json
β”‚   .gitignore
β”‚   LICENSE
β”‚   README.md
└───

⬆️ back to top

Additional documentation

Folders README

Name Description
Config README general configuration setup
Source README major source of truth for Source folder

Project Docs

Name Description
Branching Strategy & CI/CD Project's branching strategy info and CI/CD approach description
TypeScript Project's TypeScript usage details and general Code Convention
PWA Project's PWA support information (tech stack, build process, etc.)
Testing Project's testing approaches (Unit+Integration, E2E) + according CI/CD quality gates description
Typography Project's typography configuration and conventions

UI Components Library

Project's UI components library, created with StoryBook, could be found here

Issues

Find a bug or enhancement and want provide help? Please submit an issue.

License

MIT Aliaksei's Curriculum Vitae project

⬆️ back to top

ahurynovich-cv's People

Contributors

shagon1k avatar

Stargazers

Dzmitry Samsonau avatar  avatar

Watchers

James Cloos avatar  avatar

ahurynovich-cv's Issues

[AH-11] Come up with application view structure and design

Description

ALL WAS SETTLE UP IN DESIGNS COPNCEPTS

Design concepts: #38

Obviously site should have it's own unique design.

Notes

Stylistic:

  • Cyberpunk?
  • Steampunk (Chosen)

Structure:

  • Header (Logo + Title + General info). On the left side from centralized Logo "Search for work" light could be pasted (Red <-> Green light to detect). On the right side - potential language switcher (EN <-> RU)
  • Career flow (see details in #25)
  • Past Projects section (see details in #25)
  • Hobbies & Personal section (with link to detailed info route)
  • Footer (Socials section - Name: Get in touch + Email + Copyright)
const Footer = () => (
  <footer>
    <a href={LINK_FROM_CONFIG} target="_top">
      <Icon name="envelope" />
    </a>
    <a href={LINK_FROM_CONFIG} target="_blank" rel="noopener noreferrer">
      <Icon name="linkedin" />
    </a>
    ...
  </footer>
);

Some good examples to inspire:

Other:

  • Hobbies and personal information could be briefly mentioned on main page and detailed one could be moved in to separate route

[AH-26] Add manifest JSON in order to have PWA support

Description

The web app manifest is a JSON file that tells the browser about your Progressive Web App and how it should behave when installed on the user's desktop or mobile device. A typical manifest file includes the app name, the icons the app should use, and the URL that should be opened when the app is launched.

More info:
https://web.dev/add-manifest/

Notes

Link(s): https://web.dev/add-manifest/

Example(s):
index.html

<!--
      manifest.json provides metadata used when your web app is installed on a
      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    -->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />

manifest.json

{
  "short_name": "AHurynovich CV",
  "name": "My awesome CV",
  "icons": [
    {
      "src": "src/to/favicon.ico",
      "sizes": "64x64 32x32 24x24 16x16",
      "type": "image/x-icon"
    },
     ...
    {
      "src": src/to/"logo_maskable.png",
      "sizes": "196x196",
      "type": "image/png",
      "purpose": "maskable"
    }
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"
}

[AH-14] Buy domain name and register personal website

Description

WARN: FIRST - Route53 (buy domain name). SECOND - CloudFront (distribution settings - domain name)

https://cloudofthings.net/lightsail-vs-ec2-vs-s3-web-hosting/

Once all work will be close to done, host your site.
Preferable domain name: ahurynovich.com

https://www.youtube.com/watch?v=kvlSep7m7Uk
https://www.youtube.com/watch?v=mls8tiiI3uc

https://www.youtube.com/watch?v=5IfDzpkLlYY
https://docs.aws.amazon.com/AmazonS3/latest/userguide/website-hosting-cloudfront-walkthrough.html
https://medium.datadriveninvestor.com/configurate-route-53-and-adding-ssl-certificate-145d8a317d91

Notes

AWS Guide for domain reqistring:
https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html#domain-register-procedure

⚠️⚠️⚠️ Think about files compression availability (gzip, Brottli)

  • REMOVE CURRENT PUBLIC ACCESS AND HOSTING FROM S3 BUCKET.

WARNING
Right now in order to fully serve SPA routing, all 404 error pages are redirected to index.html.
image
This leads to not fully correct workflow:

  1. 404 error still returned to user in Network (even though redirection done)
  2. All non-existing pages (e.g. /ololo) also redirects to index.html and do not handled by it (could be fixed with adding 404 page to React Router);
    After completed hosting, this issue should be fixed (potentially through CloudFront). Some details could be found here: https://stackoverflow.com/questions/16267339/s3-static-website-hosting-route-all-paths-to-index-html

Sources of domain name buying:

Additionally

[AH-45] Add CV PDF file download ability

Description

This one to add ability to download CV in more convinient sharable view as PDF file.
image

Notes

  • Potentially web app could have "print" view to handle this way. It depends on how web app will look like and pitfalls could be faced based on it's features implemented.
    image

image
Example: https://www.dejan.works/about/
Note: A11y note: use "download" attribute
image

[AH-5] Add WebPack Provide plugin

Description

In order to not import basic packages like React, WebPack Provide plugin could be used.

Notes

Link:
https://webpack.js.org/plugins/provide-plugin/

Example of usage:

new webpack.ProvidePlugin({
  moment: 'moment',
  React: 'react',
  ReactDOM: 'react-dom',
  PropTypes: 'prop-types',
  localize: [path.resolve(__dirname, '../../src/core/js/app/utils/localizationUtils.js'), 'localize'],
}),

[AH-30] Extend code sourcemaps

Description

Extend code sourcemaps to have ability debug production build.

Notes

(TBD)

Link(s): (...)

Example(s): (...)

Other: (...)

[AH-16] Add README to sub-folders

Description

README files should be added to some subfolders like /server, /client, /etc.
Generally it should be common practice to whole project

Notes

No

[AH-28] Enhance application to follow A11y criterias

Description

!! Work as AHurynovich-Accessibility or simply [AH-A]

Important to start with not "how" and "what" but with "why" and "for whom": check different disabilities types, how users struggle with them, which tools do they use, etc.

https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion

!! Remember!
The important thing to understand about the TAB key, is that it is used to move from one operable item to the next. Any non-operable content in between will be ignored. So if a paragraph has some links inside a sentence, pressing TAB will just read out the links, not the rest of the sentence. The TAB key also stops at buttons and form inputs.
When the user wants to read the whole paragraph, they will proceed using the arrow keys ("browse" mode of Screen Readers, not "focus" mode). When dealing with a form or application-like UI, they can use the TAB key.
Page elements that are not interactive to mouse or touch users should not be made keyboard focusable (such as by using tabindex).
More details
More details 2

! Do not use tabindex values of 1 or greater to change the default keyboard navigation order. Think about logical TAB order (top-to-bottom, left-to-right) from the beginning, then left the Browser do all the job. Tab indexation change should be done only for exceptional cases.

W3C course with certification

https://www.w3.org/WAI/fundamentals/foundations-course/
https://courses.edx.org/certificates/ff5e044720d34b75922eecaf01440906

Guidelines

image

Perceivable - ability to find content:

  • Text alternatives (all non-text content has it's alternatives, not only images but charts, diagrams, buttons, etc.) Note: Should be described not only based on content inside, but also content which it covers should be kept in mind + image functionality e.g. "My page homepage logo". Some images can have "alt" skipped in case adding it will only increase complexity (e.g. divider image) Remember: skipping alt !== having null one. Alt not null: informative, actionable images, alt null: decorative images.
  • Media alternatives (videos\audios has captions, subtitles, text transcripts, audio descriptors, sign language)
  • Adaptable (acceptable for different devices and it's orientations without lost information and structure (context) + well-read by Screen Readers (good Semantic, e.g. do not skip headings) )
  • Distinguishable (content (text, images) can be separated from it's background - use https://contrast-ratio.com/ OR https://webaim.org/resources/contrastchecker/ OR https://color.adobe.com/create/color-accessibility . Recommended ration is 3-4.5 (based on large/small content))

Operable - ability to use application:

  • Keyboard accessible (all parts of app accessible with only a keyboard. Remember: buttons for actions, links for moving to some content. AVOID keyboard traps. Focus locker or similar package could be used for modals\popups\navigation case.) TAB RULE: tab all, tab away, tab order, visual focus, all functionality by focus;
  • Enough time (all content should have enough time to be watched)
  • Avoid seizures and physical reactions (do not design content in a way that is known to cause seizures or physical reactions) So avoid flash more than 3 times in a second, animation covering large area of the screen, bright ones.
  • Navigable (easy to navigate and understand - more about semantic) Note: unique <title> for each page is good practice (dash "|" can be used for complex titles, precise title first: "Contact Us | My Company") -> React Helmet
  • Input Modalities (all parts of app accessible with mouse\touch)

Understandable - ability to understand each part of app (semantic):

  • Readable (content is readable and easy to understand. Abbreviations could use tag )
  • Predictable (app is predictable in how it operate. E.g. base structure is kept over the page and app navigation)
  • Input assistance (easy to correct and avoid mistakes - validation and tips)

Robust - be compatible:

  • Compatible (working for current and future accesstive technology):
    Write valid, semantic HTML (e.g. H1-H5 matters, HTML tags matters, etc.)
    Use ARIA labels to extend HTML (more applicable for interactive components)
    Use a11y testing tools

More information here

Notes

Tips:

  • Once A11y plan created, it is worth to add a11y statement and place it somewhere on your web site (e.g. in Footer) in order to notify users that you follow it. Statement generator link: https://www.w3.org/WAI/planning/statements/generator/#create (additional info link)
  • Add a11y to CI\CD pipeline
  • Aria labels to check and add (aria-controls, aria-expanded, aria-role etc.)
Details
  • Identify inputs and help browser autocomplete
Details
  • Zooming (at least 200-300%) should be taken in to a count. Note: having 2 scrolling (vertical + horizontal) are not welcomed as in such way page become not so accessible and harder to read and understand
  • Lower zoom (e.g. 50%) also matters for the people with tunnel vision
  • Orientation should be taken in to a count
  • Think about ability to remove animation (@no-animation mixin could be created)
Details
  • New AAA standard is to buttons be at least 44x44
  • For ON/OFF switchers or something like examples text notations should be used
Details
  • Use "sr-only" elements for explanations. Such elements should also keep semantic (Headers, spans, navs, etc.)
Details (Simple unseen elements could not be used as browser identifies them as "not needed" and possibly just skip)
  • Use "aria-hidden=true" ARIA label in order to Screen Reader to skip content (in case no need to pass)
  • Accessible SVG
Details
  • Video embeds should not load on page load, only on demand need. Iframe with "srcdoc" attribute settled up could be used to handle this. DO NOT FORGET ABOUT TRANSCRIPTS FOR A11Y
Details
  • FireFox browser has much better A11y built-in tools, Web Developer Chrome could be used as alternative
  • Wave extension is really good one
  • Additionally Chrome Lighthouse could be used to test A11y
  • Screen Reader extension
  • Sometimes it is worth to add "Skip smth" hidden link (e.g. "Skip navigation")
Details
  • Managing programmatically onBlur event it is worth to use setTimeout as wrapper to callback. It is valuable as we need to first check if another child of the element has received focus as the blur event fires prior to the new focus event
  • Also worth to add some a11y linters like jsx-eslint/jsx-a11y, stylelint-a11y
  • Don't forget to use "role" attribute in addition to ARIA labels
Details
Details
  • Check google.com tabulation for inspiration about skip link and "how to" for people with disabilities

  • Tooltips should not contain really important information as it is not always accessible (e.g. for users using Screen Magnification)

  • Use a11y anchors to skip over the site for more welcomed interface:
    image

  • Android TalkBack feature can be also used to check site A11y

  • When opening Popup the focus should automatically go to "X" button (close) to provide USER easy possibility to close in case unintentional opening (the only exception happens if there are some focusable items before "X" button, then focus should be set to them in order not to skip when TAB navigate);

  • Button for the action, Link for the navigation;

  • NO necessity to specify both "ariaLabel" and "title": in such case both will be read by Screen Reader;

  • avoid outline: 0`outline: none`. In addition to the default outline, you can use CSS to make the focus indicator more visually apparent and keyboard-friendly by ensuring the focus indicator is highly visible with sufficient contrast, and by adding a background color or other visual focus style to links and other interactive controls. The outline can be styled to match your site design but should be readily detected when navigating with the Tab key.

A11y settings popup

  • A11y settings popup could be created as an option. It could be used e.g. for changing text font to more accessible one, remove animations, activate more color-friendly theme, change font size, change basic margins, text line-height and line-spacing, reduced number of images and content etc.
  • CSS-specific variables (e.g. preferable font size) could be stored by A11y settings service in CSS variables to automatically work only on CSS basis (https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties)
  • Opening popup will display a list of different disabilities people might have (cognitive, low visual, absence of visual, etc.) and application will apply changes based on chosen

A11y CI/CD automation

There are a number of tools. Worth to check and add to pipeline. Example: axe-core
Cypress also could be used to test A11y in a couple with Axe. https://www.npmjs.com/package/cypress-axe

[AH-32] Notification-info-dialog popup

Description

Create notification-info-dialog popup at the bottom right. It could be used as info dialog (e.g. "This site attempts to use all a11y features. For example, you can use keyboard or try to use 50%-300% zoom."), notification or simply imitate conversation with user (e.g. "Oh, you're interested in my hobbies? It's so sweet!").
It could be shown based on some events: page load, element hover, route changing, etc.)
Redux Store OR HOC + React Context could be used as messages mediator in order to set some notification value there based on which popup will be shown.

Notes

Brief designs:
image

Cases of usage:
Notifications:

  • Site is A11y enhanced (on page load)

Info:

  • "Is work searched" indicator (on hover)

Dialog:

  • "Oh, interested in my hobbies" message (on /hobbies route change)

Keep in mind:

  • A11y for popup itself should also be taken in to a count
Notifications on the left-bottom as live talk with User. Like "Oh, you want to know something about my hobbies? Thank you!

[AH-9] Add internationalization support

Description

As two languages need to be supported (en\ru), some internationalization tool should be added.
Application view should be enhanced with language switcher.

Notes

localize could be added as special app service OR as HOC OR as HOC+service OR as global function (should be considered and check modern solutions)
Default language could be set on the way like:

const DEFAULT_LANGUAGE = 'en' // could be stored on config level fetched from AWS S3
let userLang = navigator.language || navigator.userLanguage || DEFAULT_LANGUAGE;

Other

  • Think over "lang" attribute (<html lang="en">)
  • Language switcher should be at the top right of Header
  • Configuration-based info (titles, descriptions, etc.) are also assumed to be multi-translated, so it should be adapted either
  • Think about ESLint plugin writing to control all "text values" translated
Text i18n esling plugin example
  • TBD

[AH-10] Add Google Analytics to application

Description

In order to have ability to check application statistics Analytics management should be added.

Notes

Preferable option - GTM (Google Tag Management) (https://tagmanager.google.com/)

Example (part of index.html):

  <script async src="https://www.googletagmanager.com/gtag/js?id=GET_ID"></script>
  <script>
    window.dataLayer = window.dataLayer || [];
    function gtag() { dataLayer.push(arguments); }
    ...
  </script>

Links:

[DESIGN] Application design concept

Inspirations

https://frontend-science.com/advanced/pet-project-links.html

Details:

Nice ideas / TODO (Moved to #45)

Notifications on the left-bottom as live talk with User. Like "Oh, you want to know something about my hobbies? Thank you!

Recommended default font-size is 18-20px

Steampunk image

General

Color theme:
image

DONT FORGET use styles fonts only for decorations (e.g. titles)

Fonts:
Performance tips: https://github.com/zachleat/web-font-loading-recipes

Main page

Header:
image

Under-Header photo: Photo link
image
image
Description block:
image

Insiration example

Some BG Steampunk image here

Five reasons to work with me
image

Skills block:
image
(Flags could be used)

Career flow:
image
Note: Do NOT forget about Middle/Senior achievement

Past projects:
image

Some BG image before Footer:
image

Footer:
image
image
Note: Use train windows as Social icons =[(tg)(fb)]--[(t)(ig)]--[(li)(gh)]--[(email)]>
Nice form view to inspire:
image

Skills page

Skills page

Note: You can use ASMT and Feedbacks here.

Passions page

Other

Inspires:

First https://i.pinimg.com/564x/6c/3e/b1/6c3eb116212d76ce4d3d8141e57e306e.jpg

[AH-1] Add LICENSE file

Description

In order to enhance project with license agreement, LICENSE file should be added.

Notes

Info:
https://en.wikipedia.org/wiki/MIT_License

Example(s):

MIT License

Copyright (c) 2021 Aliaksei Hurynovich <[email protected]>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

package.json:

...
"license": "MIT"
...

How to add:
https://stackoverflow.com/questions/31639059/how-to-add-license-to-an-existing-github-project

[AH-15] Add application config file

Description

In order to collect some application general information, application.config.js file should be added.

Notes

Folder to collect: config/application
Example of stored:

export const ROOT_ID = 'root';

[AH-23] Performance enhancement

Description

This is to save a place and not to forget about performance.

Notes

Other:

  • lazy load (think about SSR as application also can be used as template)
  • (alternative to previous point for images) attribute loading="lazy"
  • think about fonts load only if needed (fonts perf optimization)
  • set up gzip compressing for files on AWS side (if applicable)
  • check "rel" attribute
  • TBD

[AH-40] Revise AWS static hosting

Description

AWS S3 Static Hosting seems to be outdated solution.
Think about altrernatives, e.g. AWS Amplify Hosting - https://aws.amazon.com/amplify/hosting/ https://aws.amazon.com/getting-started/hands-on/build-react-app-amplify-graphql/module-one/
https://catalog.us-east-1.prod.workshops.aws/workshops/841ce16b-9d86-48ac-a3f6-6a1b29f95d2b/en-US/step-3/add-hosting
https://levelup.gitconnected.com/aws-react-js-full-stack-development-tutorial-build-a-serverless-tournament-bracket-platform-b6dfbd878d46

Additionaly:
Serverless-finch usage is seems to be potential not best approach (no support anymore).
Moreover Serverless package update potentialy required.

Notes

  • In new version of Serverless parameters should be passed according to new approach:
    image

[AH-20] Add code security check

Description

To be sure your code is safe it is worth to add some security check as well as add it to CI pipeline stage.
SNYK?

Notes

TBD

[AH-42] Enhance Testing workflow

Description

There are some additional enahcnements which could be added to improve testing:

const button = screen.getByRole('button', {name: /disabled button/i})
// ❌
expect(button.disabled).toBe(true)
// error message:
//  expect(received).toBe(expected) // Object.is equality
//
//  Expected: true
//  Received: false

// βœ…
expect(button).toBeDisabled()
// error message:
//   Received element is not disabled:
//     <button />
  • Think about and add if needed test coverage check for application. It could be also added as a part of CI/CD pipeline.
  • Update documentation (Test convention) if needed NOTE: UNIT + INTEGRATION (icnluding a11y) - RTL, E2E - Cypress.

[AH-4] Add breakpoint and Mobile/Desktop view support

Note: think about stylelint adding

Description

As application should have ability to change it's view on device basis, Mobile detect AND styles breakpoints media-queries should be added.
Existing libraries could be used for Mobile detection. In order to have support for SSR such libraries use specific request headers (User Agent).

Notes

Link (Breakpoints handling): https://github.com/Necromancerx/media-queries-scss-mixins , http://github.com/rafalbromirski/sass-mediaqueries , dkn

Redux-Saga start saga can be used to collect mobile\desktop information on Redux store.

[AH-39] Enhance site SEO with Google Verification and better Crawling

Description

After re-deploy:

sitemap and robots txt

https://blog.openreplay.com/important-seo-related-tags-in-html-and-how-to-optimize-them/
After application will be completed and hosted on some of domain, there are 2 major things to consider:

  1. Google Verification, which enables access to more detailed sensitive data of Google Search: link
  2. Update robots.txt for better crawling + add SiteMap.
    In addition, sitemap.xml could be submited to Google Webmaster Tools so more links from other sites pointing to yours => better indexing.

Notes

Link(s):

Example(s):

<meta name="google-site-verification" content="YOUR_KEY" />
<meta name="description"
    content="This is my website.">
  <meta name="robots" content="index, follow" />

https://search.google.com/search-console/about

[AH-13] Add Icon component and choose icons to use

Description

When application brief design and stylistic will be finalized, icons collection and special component should be prepared.

Notes

Icons collection which could be used: https://icons8.ru/icons/set/free-icons

Other:

  • SVG with PNG alternative files could be used
  • Each file could be stored in static and imported as React component (see example below)

Example:

import GH from './icons/github.svg';
import LinkedIn from './icons/linkedin.svg';
import SomePng from './icons/some-png.png';

const ICON_MAP= {
  gh: GithubIcon,
  linkedin: LinkedinIcon,
};

const Icon = ({ name, size }) => {
  const icon= ICON_MAP[name];
  const width = ICON_WIDTH[size];  // could be get based on mobile/desktop view
  const height = ICON_HEIGHT[size];  // could be get based on mobile/desktop view

  return icon ? <img width={width} height={height} src={icon} alt={name} /> : null;
};

[AH-7] Create Main Config file on AWS S3

Description

AH CV.pdf

Name: content-config
! add "/assets" folder to contain all possible asset files (e.g. project logos)
In order to collect all necessary configuration Main Config file should be created.
The options are:
- AWS S3 + Lambda + API Gateway

  • Just S3 (public bucket => check privacy importance)
    Screenshot_20230622_215215_com.android.chrome.png
More details { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSpecificDomain", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*", "Condition": { "StringLike": { "aws:Referer": [ "https://www.your-domain.com/*", "https://subdomain.your-domain.com/*" ] } } }, { "Sid": "DenyAllOtherAccess", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }

For simple data like "About me" text and "My skills" list, you can use Amazon S3 to store and manage the content for your web application. Here's how you can do it:

Create an S3 bucket: Log in to the AWS Management Console and create an S3 bucket to store your content. Make sure to configure the bucket to allow public access, so that your web application can access the content.

Upload content: Upload your "About me" text and "My skills" list as files to your S3 bucket. You can use the AWS Management Console, AWS CLI, or an SDK to upload the files.

Retrieve content: In your web application code, you can use an HTTP GET request to retrieve the content from your S3 bucket. You can also use the AWS SDK to programmatically retrieve the content.

Display content: Once you have retrieved the content, you can display it on your web application using HTML, CSS, and JavaScript.

By using Amazon S3 to store and manage your simple content, you can take advantage of the scalability, durability, and security features of the service. Plus, it's an easy and cost-effective way to store and serve static content for your web application.

If your content needs to be localized into multiple languages, you can structure your configuration file to include the content in each language. Here's an example of how you can structure your configuration file:

{
  "about_me": {
    "en": "Hi, my name is John and I'm a web developer.",
    "ru": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, мСня Π·ΠΎΠ²ΡƒΡ‚ Π”ΠΆΠΎΠ½ ΠΈ я Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ."
  },
  "my_skills": {
    "en": ["HTML", "CSS", "JavaScript", "Python"],
    "ru": ["HTML", "CSS", "JavaScript", "Python"]
  }
}

- AWS DynamoDB + Lambda + API Gateway (check price)

Notes

Redux-Saga starting saga could be used to fetch config and collect it in Redux store.

List of information to store:

  • About me: bla-bla with knowing BE with focus on FE
  • Site main title
  • Personal message (Header + Message: Hello, I am bla-bla-lba)
  • Social links (Professional: GitHub/LinkedIn/etc. , Other: YouTube/TikTok/Instagram/etc.)
  • Tech skills (React, Redux, AWS, etc.) and it's leveling (1-5) each should have it's ID to match to specific Icon (default icon if not matched)
  • Other skills (Mentoring, Interviewing, etc.) each should have it's ID to match to specific Icon (default icon if not matched)
  • Career flow (Education -> RS school -> JS Lab -> Epam) STRUCTURE: BG Image + Title + Description
  • Past projects info STRUCTURE: BG Image + Title + DescriptionCareer flow & Past projects structure example
  • Feedbacks: You can use ASMT and Feedbacks. + ask Anton for feedback after RS end
  • Career Flow: Do NOT forget about Middle/Senior achievement
  • Don't forget to use certificates in skills: https://app.rs.school/certificate/eqtmvr7h , https://courses.edx.org/certificates/ff5e044720d34b75922eecaf01440906

WARN: "TO_API_" prefix used right now to mark potential cases when data should be moved to fetched config

BFF layer could be used as alternative (should be learned to figure out how to run server part on AWS) - COULD BE MOVED INTO SEPARATE ISSUE IN FUTURE

[AH-17] Add COMMON type folder

Description

In order to manage some general purposes (both for client/server) /common folder should be added

Notes

Preferable structure:

/src
__/common
____/services
____/services/i18n
____/utils
____/utils/logger

[AH-33] Add new "Articles" page with number of personal developer articles

Description

Articles page can include articles of personal authorship.
Firstly only development-based articles was assumed, but it also could be some general (e.g. hobby\travel specific ones).
As for now only few of articles are planned to be posted, no filter functionality needed
Articles page could consist of 2 basic topics: Software Development and Other. Second could include for example travel articles (e.g. London 2019 trip feedback)

Important:

  • Multi-language and translation should be taken in to a count
  • A11y rules should be followed: articles could contain a lot of slangs and abbreviations (use tag), also sentences should be short enough and understandable.
  • CMS should be used as resource manager, API gateway service could be written in order to get resources (use AWS if applicable). Resource itself should be HTML markup to place (as images and e.g. abbreviations could be included). As multi-language should be supported, resources should be kept in both RU and EN languages.
  • As new articles could be written in future, it is valuable to think about admin level management of application "Articles" page: additional login page could be implemented, which should be unreachable from the application view level (e.g. only by route). In case log in credentials available - additional manage handlers could be seen and used.

Notes

View designs TBD

Example:
Software Development:

  • Accessibility basics: based on experience and materials learned and passed: #49
  • TBD

Other:

  • London 2019 : already written material can be used as basis and enhanced with some photos - do not forget about mails from Walking Tours. As this material will definitely include a number of abbreviations and slang words, A11y should be taken in to a count (e.g. tag)
  • TBD

[AH-21] Improve code linting

Description

In order to improve code linting some features could be added.
The most obvious one - stylelint

Notes

Other:

  • think about some esling plugins (custom or existing one), at least check
  • probably as project start grow it is worth to check only staged changes ( lint-staged )

[AH-8] Add folder to collect static files

Description

Add /static folder to project root in order to add some static content there.

Notes

Example: favicon.ico
image
(AH should be used instead BY. Favicon should be checked how to be injected. Remember about style Steampunk theme #38 )

Favicon usage example:

  <link rel="apple-touch-icon" sizes="60x60" href="route/to/apple-icon-60x60.png">
  <link rel="apple-touch-icon" sizes="72x72" href="route/to/apple-icon-72x72.png">
  <link rel="apple-touch-icon" sizes="120x120" href="route/to/apple-icon-120x120.png">
  <link rel="apple-touch-icon" sizes="180x180" href="route/to/apple-icon-180x180.png">
  <link rel="icon" type="image/png" sizes="192x192" href="route/to/android-icon-192x192.png">
  <link rel="icon" type="image/png" sizes="32x32" href="route/to/favicon-32x32.png">
  <link rel="icon" type="image/png" sizes="96x96" href="route/to/favicon-96x96.png">
  <link rel="icon" type="image/png" sizes="16x16" href="route/to/favicon-16x16.png">
  <link rel='shortcut icon' type='image/x-icon' href='route/to/favicon.ico' />

To think over: https://www.npmjs.com/package/favicons-webpack-plugin

[AH-2] Add .browserslistrc file

Description

(probably not needed as "browsers" field in package.json used)
In order to provide some tools like Babel with information about supported browsers and it's versions, special file should be added

Notes

Example(s):

Chrome 70
Safari 12
Firefox 65
iOS 10

[AH-36] Add VideoPlayer component

Description

In order to have ability to render videos from specific resource (e.g. Youtube) - special VideoPlayer component should be created. For example, it could take "videoType" property to select specific player which should be used, "data" to be used for video playing, optional "width"/"height" props or "fitContent" to fit outer container. In order to have unified control across different video types Video Facade (service) could be created, which will use specific adapter (NOTE: THINK ABOUT NAMING as it is most likely not Adapter).
Thus, solution will be extendible and follow SOLID principles.

Notes

image

https://www.tutorialspoint.com/design_pattern/facade_pattern.htm
https://beta-reactjs-org-git-effects-fbopensource.vercel.app/learn/synchronizing-with-effects

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.