├── lectures ├── 11-js-dom │ ├── practice │ │ ├── main │ │ │ ├── script.js │ │ │ ├── test.html │ │ │ └── styles.css │ │ ├── events │ │ │ ├── styles.css │ │ │ ├── index.html │ │ │ └── script.js │ │ ├── load-scripts │ │ │ └── style.css │ │ ├── practice-2 │ │ │ ├── load-scripts │ │ │ │ └── style.css │ │ │ └── mouse-events │ │ │ │ └── index.html │ │ └── practice-1 │ │ │ ├── assets │ │ │ ├── icons │ │ │ │ ├── github.png │ │ │ │ ├── twitter.png │ │ │ │ ├── upIcon.png │ │ │ │ ├── youtube.png │ │ │ │ ├── colorMode.png │ │ │ │ ├── linkedIn.png │ │ │ │ ├── downloadArrow.png │ │ │ │ └── youtube.svg │ │ │ └── images │ │ │ │ ├── Project1.png │ │ │ │ ├── Project2.png │ │ │ │ ├── Project3.png │ │ │ │ ├── Project4.png │ │ │ │ ├── Project5.png │ │ │ │ ├── Project6.png │ │ │ │ └── userImg.png │ │ │ ├── script │ │ │ ├── 3-attributes.js │ │ │ ├── 8-delegation.js │ │ │ ├── 5-classes.js │ │ │ ├── 4-modifying.js │ │ │ ├── 2-node-properties.js │ │ │ └── 7-events.js │ │ │ ├── styles │ │ │ ├── delegation.css │ │ │ └── sizing.css │ │ │ ├── sizing.html │ │ │ ├── events.html │ │ │ └── delegation.html │ └── task.md ├── 10-js-advanced-3 │ └── practice │ │ ├── test │ │ ├── index.js │ │ └── expressions.js │ │ ├── modules │ │ ├── user.js │ │ ├── index.js │ │ ├── helpers.js │ │ ├── math.js │ │ └── main.js │ │ ├── event-loop.js │ │ └── async-await.js ├── 22-nextjs-1 │ ├── practice │ │ ├── src │ │ │ ├── app │ │ │ │ ├── react-csr-approach │ │ │ │ │ ├── page.module.css │ │ │ │ │ └── page.tsx │ │ │ │ ├── page.tsx │ │ │ │ ├── favicon.ico │ │ │ │ ├── api │ │ │ │ │ └── tasks │ │ │ │ │ │ └── route.ts │ │ │ │ ├── fetch-api-approach-no-cache │ │ │ │ │ └── page.tsx │ │ │ │ ├── fetch-api-approach-cache │ │ │ │ │ └── page.tsx │ │ │ │ ├── globals.css │ │ │ │ ├── layout.tsx │ │ │ │ └── tasks │ │ │ │ │ └── [id] │ │ │ │ │ └── page.tsx │ │ │ ├── interfaces │ │ │ │ └── task.ts │ │ │ └── components │ │ │ │ └── Tasks │ │ │ │ ├── styles.module.css │ │ │ │ └── index.tsx │ │ ├── public │ │ │ ├── vercel.svg │ │ │ ├── window.svg │ │ │ ├── file.svg │ │ │ └── globe.svg │ │ ├── next.config.ts │ │ ├── eslint.config.mjs │ │ ├── package.json │ │ └── tsconfig.json │ ├── assets │ │ ├── Screenshot 2025-06-01 at 18.23.08.png │ │ └── Screenshot 2025-06-01 at 18.32.19.png │ ├── server │ │ ├── package.json │ │ └── index.js │ ├── .gitignore │ └── task.md ├── .DS_Store ├── 18-react-basics │ ├── practice │ │ ├── my-app │ │ │ ├── .eslintrc.json │ │ │ ├── jsconfig.json │ │ │ ├── next.config.js │ │ │ ├── src │ │ │ │ ├── app │ │ │ │ │ ├── favicon.ico │ │ │ │ │ ├── page.js │ │ │ │ │ └── layout.js │ │ │ │ ├── components │ │ │ │ │ └── Example │ │ │ │ │ │ └── index.js │ │ │ │ └── mock │ │ │ │ │ └── people.js │ │ │ ├── package.json │ │ │ ├── .gitignore │ │ │ └── public │ │ │ │ └── vercel.svg │ │ ├── example-1 │ │ │ ├── index.js │ │ │ └── index.html │ │ └── index.html │ └── task.md ├── 16-typescript-advanced │ ├── code_examples │ │ ├── 8-nullish-coalescence.ts │ │ ├── tsconfig.json │ │ ├── package.json │ │ ├── 7-keyof.ts │ │ ├── 2-enums.ts │ │ └── 6-utility-types.ts │ └── README.md ├── 17-patterns │ ├── tsconfig.json │ └── practice │ │ ├── creational │ │ ├── 3.prototype.js │ │ ├── 4.singleton.js │ │ ├── 1.constructor.js │ │ └── 5.builder.js │ │ ├── behaviour │ │ ├── 3.iterator.js │ │ ├── 4.observer.js │ │ ├── 7.strategy.ts │ │ └── 5.mediator.js │ │ ├── structural │ │ ├── 2.decorator.js │ │ ├── 6.flyweight.js │ │ ├── 3.facade.js │ │ └── 1.adapter.js │ │ └── di │ │ ├── 1.wtihout-di.js │ │ └── 2.with-di.js ├── 15-typescript-basics │ ├── code_examples │ │ ├── tsconfig.json │ │ ├── package.json │ │ ├── package-lock.json │ │ ├── 2-array-types.ts │ │ ├── 4-object.ts │ │ └── 5-type-aliases.ts │ └── README.md ├── 24-next-js-3 │ ├── task.md │ └── README.md ├── 25-testing │ ├── practice │ │ ├── react-example │ │ │ └── my-app │ │ │ │ ├── public │ │ │ │ ├── robots.txt │ │ │ │ ├── favicon.ico │ │ │ │ ├── logo192.png │ │ │ │ ├── logo512.png │ │ │ │ └── manifest.json │ │ │ │ ├── src │ │ │ │ ├── components │ │ │ │ │ ├── Button.js │ │ │ │ │ ├── Scenario.js │ │ │ │ │ ├── FocusInput.test.js │ │ │ │ │ ├── FocusInput.js │ │ │ │ │ ├── ChangeInput.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── ChangeInput.test.js │ │ │ │ │ ├── Button.test.js │ │ │ │ │ ├── Counter.js │ │ │ │ │ └── useAPI.js │ │ │ │ ├── setupTests.js │ │ │ │ ├── App.test.js │ │ │ │ ├── index.css │ │ │ │ ├── reportWebVitals.js │ │ │ │ ├── index.js │ │ │ │ ├── App.js │ │ │ │ └── App.css │ │ │ │ ├── .gitignore │ │ │ │ └── package.json │ │ └── calculator-test-jest │ │ │ ├── coverage │ │ │ ├── lcov-report │ │ │ │ ├── favicon.png │ │ │ │ ├── sort-arrow-sprite.png │ │ │ │ └── prettify.css │ │ │ ├── lcov.info │ │ │ └── clover.xml │ │ │ ├── package.json │ │ │ ├── calculator.js │ │ │ └── calculator.test.js │ ├── task.md │ └── README.md ├── 13-environment-and-preprocessors │ ├── practice │ │ ├── styles.css.map │ │ ├── styles.css │ │ ├── styles.scss │ │ ├── package.json │ │ └── index.html │ └── README.md ├── 03-html-basics │ ├── practice │ │ └── test.html │ ├── task.md │ └── README.md ├── 04-css │ ├── practice │ │ ├── grid │ │ │ └── styles.css │ │ ├── z-index │ │ │ ├── index.html │ │ │ └── styles.css │ │ ├── flexbox │ │ │ └── styles.css │ │ └── positioning │ │ │ ├── styles.css │ │ │ └── index.html │ └── task.md ├── 07-js-basics-2 │ ├── task.md │ └── README.md ├── 06-js-basics-1 │ └── task.md ├── 05-css-advanced │ ├── task.md │ └── practice │ │ ├── css-transforms │ │ └── styles.css │ │ └── css-animations │ │ └── index.html ├── 19-react-ui │ ├── README.md │ └── task.md ├── 12-data-structures-and-algorithms │ └── README.md ├── 08-js-advanced │ └── README.md ├── 02-git │ └── README.md └── 09-js-advanced-2 │ └── README.md ├── workshops ├── ui-libraries │ ├── material-ui-nextjs-ts │ │ ├── public │ │ │ └── .gitkeep │ │ ├── next.config.mjs │ │ ├── src │ │ │ ├── app │ │ │ │ ├── favicon.ico │ │ │ │ ├── layout.tsx │ │ │ │ ├── page.tsx │ │ │ │ └── about │ │ │ │ │ └── page.tsx │ │ │ ├── components │ │ │ │ ├── Copyright.tsx │ │ │ │ └── ProTip.tsx │ │ │ └── theme.ts │ │ ├── next-env.d.ts │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ └── package.json │ ├── material-ui-nextjs-pages-router-ts │ │ ├── next.config.js │ │ ├── public │ │ │ └── favicon.ico │ │ ├── src │ │ │ ├── Copyright.tsx │ │ │ └── ProTip.tsx │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ ├── pages │ │ │ ├── test.tsx │ │ │ ├── _app.tsx │ │ │ ├── index.tsx │ │ │ ├── _document.tsx │ │ │ └── about.tsx │ │ └── package.json │ ├── with-ant-design-app │ │ ├── app │ │ │ ├── favicon.ico │ │ │ ├── themeConfig.ts │ │ │ ├── globals.css │ │ │ ├── layout.tsx │ │ │ └── AntdRegistry.tsx │ │ ├── next.config.js │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ └── package.json │ ├── with-react-bootstrap-app │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── favicon-32x32.png │ │ │ └── vercel.svg │ │ ├── pages │ │ │ └── _app.jsx │ │ ├── package.json │ │ ├── style │ │ │ └── index.css │ │ └── .gitignore │ ├── with-chakra-ui-app │ │ ├── src │ │ │ ├── components │ │ │ │ ├── Footer.tsx │ │ │ │ ├── Main.tsx │ │ │ │ ├── Container.tsx │ │ │ │ ├── Hero.tsx │ │ │ │ ├── DarkModeSwitch.tsx │ │ │ │ └── CTA.tsx │ │ │ ├── pages │ │ │ │ ├── _app.tsx │ │ │ │ └── _document.tsx │ │ │ └── theme.tsx │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ └── package.json │ └── README.md ├── state-management-react │ ├── context │ │ ├── src │ │ │ ├── interfaces │ │ │ │ ├── index.ts │ │ │ │ └── order.ts │ │ │ ├── app │ │ │ │ ├── favicon.ico │ │ │ │ ├── page.tsx │ │ │ │ └── orders │ │ │ │ │ └── page.tsx │ │ │ ├── components │ │ │ │ └── index.ts │ │ │ └── theme.tsx │ │ ├── public │ │ │ ├── vercel.svg │ │ │ ├── window.svg │ │ │ ├── file.svg │ │ │ └── globe.svg │ │ ├── .prettierrc │ │ ├── next.config.ts │ │ ├── eslint.config.mjs │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ └── package.json │ ├── rtk │ │ ├── src │ │ │ ├── interfaces │ │ │ │ ├── index.ts │ │ │ │ └── order.ts │ │ │ ├── store │ │ │ │ ├── api │ │ │ │ │ ├── index.ts │ │ │ │ │ └── orders.ts │ │ │ │ ├── index.ts │ │ │ │ └── slices │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── counter.ts │ │ │ │ │ └── selectedOrders.ts │ │ │ ├── app │ │ │ │ ├── favicon.ico │ │ │ │ ├── page.tsx │ │ │ │ ├── orders │ │ │ │ │ └── page.tsx │ │ │ │ ├── ordersByPage │ │ │ │ │ └── page.tsx │ │ │ │ └── StoreProvider.tsx │ │ │ ├── theme.tsx │ │ │ └── components │ │ │ │ └── index.ts │ │ ├── public │ │ │ ├── vercel.svg │ │ │ ├── file.svg │ │ │ ├── window.svg │ │ │ └── globe.svg │ │ ├── .prettierrc │ │ ├── next.config.ts │ │ ├── lib │ │ │ ├── hooks.ts │ │ │ └── store.ts │ │ ├── eslint.config.mjs │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ └── package.json │ ├── tanstack-query │ │ ├── src │ │ │ ├── interfaces │ │ │ │ ├── index.ts │ │ │ │ └── order.ts │ │ │ ├── app │ │ │ │ ├── favicon.ico │ │ │ │ ├── page.tsx │ │ │ │ ├── orders │ │ │ │ │ └── page.tsx │ │ │ │ ├── ordersByPage │ │ │ │ │ └── page.tsx │ │ │ │ ├── StoreProvider.tsx │ │ │ │ └── get-query-client.ts │ │ │ ├── services │ │ │ │ └── orders.ts │ │ │ ├── theme.tsx │ │ │ └── components │ │ │ │ ├── index.ts │ │ │ │ ├── OrdersByPage │ │ │ │ └── index.tsx │ │ │ │ └── OrdersContainer │ │ │ │ └── index.tsx │ │ ├── public │ │ │ ├── vercel.svg │ │ │ ├── window.svg │ │ │ ├── file.svg │ │ │ └── globe.svg │ │ ├── .prettierrc │ │ ├── next.config.ts │ │ ├── eslint.config.mjs │ │ ├── .gitignore │ │ ├── tsconfig.json │ │ └── package.json │ ├── .DS_Store │ ├── pure-redux-example │ │ ├── jsconfig.json │ │ ├── next.config.js │ │ ├── public │ │ │ ├── favicon.ico │ │ │ └── vercel.svg │ │ ├── src │ │ │ ├── common │ │ │ │ └── mui │ │ │ │ │ └── createCache.js │ │ │ ├── store │ │ │ │ ├── reducers │ │ │ │ │ ├── rootReducer.js │ │ │ │ │ ├── selectedOrders.js │ │ │ │ │ └── orders.js │ │ │ │ ├── actions │ │ │ │ │ ├── selectedOrdersAction.js │ │ │ │ │ └── ordersAction.js │ │ │ │ └── store.js │ │ │ ├── layout │ │ │ │ └── MainLayout.js │ │ │ ├── containers │ │ │ │ ├── Home.js │ │ │ │ └── Orders.js │ │ │ ├── pages │ │ │ │ ├── index.js │ │ │ │ ├── orders.js │ │ │ │ └── _app.js │ │ │ ├── styles │ │ │ │ └── theme.js │ │ │ └── components │ │ │ │ └── Orders │ │ │ │ └── components │ │ │ │ └── OrderItem.js │ │ ├── .gitignore │ │ └── package.json │ └── README.md └── .DS_Store └── .DS_Store /lectures/11-js-dom/practice/main/script.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/10-js-advanced-3/practice/test/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/events/styles.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-ts/public/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/app/react-csr-approach/page.module.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/load-scripts/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 40px; 3 | } 4 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/.DS_Store -------------------------------------------------------------------------------- /workshops/state-management-react/context/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './order'; 2 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './order'; 2 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/store/api/index.ts: -------------------------------------------------------------------------------- 1 | export * from './orders'; 2 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-2/load-scripts/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 40px; 3 | } 4 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './order'; 2 | -------------------------------------------------------------------------------- /lectures/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/.DS_Store -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /workshops/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/.DS_Store -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/store/index.ts: -------------------------------------------------------------------------------- 1 | export * from './api'; 2 | export * from './slices'; 3 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | export default function Home() { 2 | return
Home
; 3 | } 4 | -------------------------------------------------------------------------------- /lectures/16-typescript-advanced/code_examples/8-nullish-coalescence.ts: -------------------------------------------------------------------------------- 1 | console.log(0 || 1); 2 | console.log(0 ?? 1); 3 | -------------------------------------------------------------------------------- /lectures/17-patterns/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strictPropertyInitialization": false 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /lectures/15-typescript-basics/code_examples/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strictNullChecks": false 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /lectures/16-typescript-advanced/code_examples/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strictNullChecks": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /lectures/24-next-js-3/task.md: -------------------------------------------------------------------------------- 1 | # Homework: Country Explorer (Next.js App Router) 2 | 3 | ## Goal 4 | 5 | Migrate your previous HW to App Router 6 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /workshops/state-management-react/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/state-management-react/.DS_Store -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./src/*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {} 3 | 4 | module.exports = nextConfig 5 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-ts/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/22-nextjs-1/practice/src/app/favicon.ico -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./src/*"] 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lectures/10-js-advanced-3/practice/test/expressions.js: -------------------------------------------------------------------------------- 1 | function test() { 2 | console.log("Test"); 3 | } 4 | 5 | export const qwerty = 123; 6 | 7 | export default test; 8 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-pages-router-ts/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | module.exports = { 3 | reactStrictMode: true, 4 | }; 5 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/state-management-react/rtk/src/app/favicon.ico -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/store/slices/index.ts: -------------------------------------------------------------------------------- 1 | export { default as selectedOrders } from './selectedOrders'; 2 | export { default as counter } from './counter'; 3 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "endOfLine": "lf", 6 | "trailingComma": "all" 7 | } 8 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/ui-libraries/with-ant-design-app/app/favicon.ico -------------------------------------------------------------------------------- /lectures/13-environment-and-preprocessors/practice/styles.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["styles.scss"],"names":[],"mappings":"AAEI;EACE;EACA;;AAGF;EACE","file":"styles.css"} -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/18-react-basics/practice/my-app/src/app/favicon.ico -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/interfaces/task.ts: -------------------------------------------------------------------------------- 1 | export interface Task { 2 | id: number; 3 | title: string; 4 | description: string; 5 | status: string; 6 | date: string; 7 | } 8 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "endOfLine": "lf", 6 | "trailingComma": "all" 7 | } 8 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/state-management-react/context/src/app/favicon.ico -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/icons/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/icons/github.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/icons/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/icons/twitter.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/icons/upIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/icons/upIcon.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/icons/youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/icons/youtube.png -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "endOfLine": "lf", 6 | "trailingComma": "all" 7 | } 8 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/icons/colorMode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/icons/colorMode.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/icons/linkedIn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/icons/linkedIn.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/images/Project1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/images/Project1.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/images/Project2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/images/Project2.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/images/Project3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/images/Project3.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/images/Project4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/images/Project4.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/images/Project5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/images/Project5.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/images/Project6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/images/Project6.png -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/images/userImg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/images/userImg.png -------------------------------------------------------------------------------- /lectures/22-nextjs-1/assets/Screenshot 2025-06-01 at 18.23.08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/22-nextjs-1/assets/Screenshot 2025-06-01 at 18.23.08.png -------------------------------------------------------------------------------- /lectures/22-nextjs-1/assets/Screenshot 2025-06-01 at 18.32.19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/22-nextjs-1/assets/Screenshot 2025-06-01 at 18.32.19.png -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-ts/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/ui-libraries/material-ui-nextjs-ts/src/app/favicon.ico -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | }; 5 | 6 | module.exports = nextConfig; 7 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-react-bootstrap-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/ui-libraries/with-react-bootstrap-app/public/favicon.ico -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/25-testing/practice/react-example/my-app/public/favicon.ico -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/25-testing/practice/react-example/my-app/public/logo192.png -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/25-testing/practice/react-example/my-app/public/logo512.png -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | } 5 | 6 | module.exports = nextConfig 7 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/state-management-react/tanstack-query/src/app/favicon.ico -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/assets/icons/downloadArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/11-js-dom/practice/practice-1/assets/icons/downloadArrow.png -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/state-management-react/pure-redux-example/public/favicon.ico -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | }; 6 | 7 | export default nextConfig; 8 | -------------------------------------------------------------------------------- /lectures/03-html-basics/practice/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | }; 6 | 7 | export default nextConfig; 8 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-react-bootstrap-app/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/ui-libraries/with-react-bootstrap-app/public/favicon-32x32.png -------------------------------------------------------------------------------- /lectures/25-testing/task.md: -------------------------------------------------------------------------------- 1 | # Testing 2 | 3 | Add unit tests for your todo app homework(lecture #19 or #20 up to you) 4 | 5 | AC: 6 | 7 | - Add at least three unit tests in your project 8 | 9 | Good Luck! 10 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Header } from './Header'; 2 | export { default as Orders } from './Orders'; 3 | export { default as OrderItem } from './OrderItem'; 4 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | /* config options here */ 5 | }; 6 | 7 | export default nextConfig; 8 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-pages-router-ts/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/workshops/ui-libraries/material-ui-nextjs-pages-router-ts/public/favicon.ico -------------------------------------------------------------------------------- /lectures/10-js-advanced-3/practice/modules/user.js: -------------------------------------------------------------------------------- 1 | export default class User { 2 | constructor(name) { 3 | this.name = name; 4 | } 5 | 6 | greet() { 7 | return `Hello, ${this.name}!`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/interfaces/order.ts: -------------------------------------------------------------------------------- 1 | export interface Order { 2 | id: string; 3 | date: string; 4 | name: string; 5 | shipTo: string; 6 | paymentMethod: string; 7 | amount: number; 8 | } 9 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/src/interfaces/order.ts: -------------------------------------------------------------------------------- 1 | export interface Order { 2 | id: string; 3 | date: string; 4 | name: string; 5 | shipTo: string; 6 | paymentMethod: string; 7 | amount: number; 8 | } 9 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/src/components/Footer.tsx: -------------------------------------------------------------------------------- 1 | import { Flex, FlexProps } from "@chakra-ui/react"; 2 | 3 | export const Footer = (props: FlexProps) => ( 4 | 5 | ); 6 | -------------------------------------------------------------------------------- /lectures/10-js-advanced-3/practice/modules/index.js: -------------------------------------------------------------------------------- 1 | export * from './math.js'; 2 | export { default as User } from './user.js'; 3 | 4 | // Re-export the default export from math.js 5 | export { default as multiply } from './math.js'; 6 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/calculator-test-jest/coverage/lcov-report/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/25-testing/practice/calculator-test-jest/coverage/lcov-report/favicon.png -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/interfaces/order.ts: -------------------------------------------------------------------------------- 1 | export interface Order { 2 | id: string; 3 | date: string; 4 | name: string; 5 | shipTo: string; 6 | paymentMethod: string; 7 | amount: number; 8 | } 9 | -------------------------------------------------------------------------------- /lectures/15-typescript-basics/code_examples/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-basics", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "typescript": "^5.3.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/components/Button.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Button = props => { 4 | return ; 5 | }; 6 | 7 | export default Button; 8 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/common/mui/createCache.js: -------------------------------------------------------------------------------- 1 | import createCache from '@emotion/cache'; 2 | 3 | export default function createEmotionCache() { 4 | return createCache({ key: 'css', prepend: true }); 5 | } 6 | -------------------------------------------------------------------------------- /lectures/10-js-advanced-3/practice/modules/helpers.js: -------------------------------------------------------------------------------- 1 | export { add, subtract } from './math.js'; 2 | export { default as User } from './user.js'; 3 | 4 | // Re-export the default export from math.js 5 | export { default as multiply } from './math.js'; 6 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/src/components/Example/index.js: -------------------------------------------------------------------------------- 1 | import List from '../List'; 2 | 3 | const Example = () => { 4 | return ( 5 | <> 6 | 7 | 8 | ); 9 | }; 10 | 11 | export default Example; 12 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from 'next'; 2 | 3 | const nextConfig: NextConfig = { 4 | logging: { 5 | fetches: { 6 | fullUrl: true, 7 | }, 8 | }, 9 | }; 10 | 11 | export default nextConfig; 12 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/calculator-test-jest/coverage/lcov-report/sort-arrow-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvdinc/react-laba-international-4/HEAD/lectures/25-testing/practice/calculator-test-jest/coverage/lcov-report/sort-arrow-sprite.png -------------------------------------------------------------------------------- /lectures/13-environment-and-preprocessors/practice/styles.css: -------------------------------------------------------------------------------- 1 | .container .nested .text { 2 | color: red; 3 | background-color: blue; 4 | } 5 | .container .nested .phone { 6 | color: green; 7 | } 8 | 9 | /*# sourceMappingURL=styles.css.map */ 10 | -------------------------------------------------------------------------------- /lectures/13-environment-and-preprocessors/practice/styles.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | .nested { 3 | .text { 4 | color: red; 5 | background-color: blue; 6 | } 7 | 8 | .phone { 9 | color: green; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-react-bootstrap-app/pages/_app.jsx: -------------------------------------------------------------------------------- 1 | import "bootstrap/dist/css/bootstrap.min.css"; 2 | import "../style/index.css"; 3 | 4 | export default function MyApp({ Component, pageProps }) { 5 | return ; 6 | } 7 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { Orders } from '@/components'; 2 | 3 | export default function Home() { 4 | return ( 5 |
6 |
7 | 8 |
9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/app/themeConfig.ts: -------------------------------------------------------------------------------- 1 | import type { ThemeConfig } from "antd"; 2 | 3 | const theme: ThemeConfig = { 4 | token: { 5 | fontSize: 16, 6 | colorPrimary: "#52c41a", 7 | }, 8 | }; 9 | 10 | export default theme; 11 | -------------------------------------------------------------------------------- /lectures/16-typescript-advanced/code_examples/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-basics", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "ts-node": "^10.9.2", 8 | "typescript": "^5.3.3" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/services/orders.ts: -------------------------------------------------------------------------------- 1 | const getOrders = async (page: number = 0) => { 2 | const req = await fetch(`api/orders?page=${page}`); 3 | const res = await req.json(); 4 | 5 | return res; 6 | }; 7 | 8 | export { getOrders }; 9 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-ts/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /lectures/04-css/practice/grid/styles.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | .container { 6 | display: grid; 7 | grid-template-columns: repeat(3, 1fr); 8 | grid-template-rows: repeat(3, 200px); 9 | grid-auto-rows: 200px; 10 | grid-auto-flow: dense; 11 | } 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/src/app/orders/page.tsx: -------------------------------------------------------------------------------- 1 | import { Orders } from '@/components'; 2 | 3 | export default function OrdersPage() { 4 | return ( 5 |
6 |
7 | 8 |
9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/store/reducers/rootReducer.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | import orders from './orders'; 3 | import selectedOrders from './selectedOrders'; 4 | 5 | export default combineReducers({ orders, selectedOrders }); 6 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { OrdersContainer } from '@/components'; 2 | 3 | export default function Home() { 4 | return ( 5 |
6 |
7 | 8 |
9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/app/orders/page.tsx: -------------------------------------------------------------------------------- 1 | import { OrdersContainer } from '@/components'; 2 | 3 | export default function OrdersPage() { 4 | return ( 5 |
6 |
7 | 8 |
9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { OrdersContainer } from '@/components'; 2 | 3 | export default function Home() { 4 | return ( 5 |
6 |
7 | 8 |
9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/src/app/page.js: -------------------------------------------------------------------------------- 1 | import Example from '@/components/Example'; 2 | import styles from './page.module.css'; 3 | 4 | export default function Home() { 5 | return ( 6 |
7 | 8 |
9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/example-1/index.js: -------------------------------------------------------------------------------- 1 | const element = React.createElement('h1', { 2 | id: 'element-id', 3 | children: 'Heloo guys!', 4 | }); 5 | const domContainer = document.querySelector('#root_container'); 6 | const root = ReactDOM.createRoot(domContainer); 7 | root.render(element); 8 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/src/theme.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { createTheme } from '@mui/material/styles'; 3 | 4 | const theme = createTheme({ 5 | typography: { 6 | fontFamily: 'var(--font-roboto)', 7 | }, 8 | cssVariables: true, 9 | }); 10 | 11 | export default theme; 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/app/ordersByPage/page.tsx: -------------------------------------------------------------------------------- 1 | import { OrdersByPage } from '@/components'; 2 | 3 | export default function OrdersByPageComponent() { 4 | return ( 5 |
6 |
7 | 8 |
9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/theme.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { createTheme } from '@mui/material/styles'; 3 | 4 | const theme = createTheme({ 5 | typography: { 6 | fontFamily: 'var(--font-roboto)', 7 | }, 8 | cssVariables: true, 9 | }); 10 | 11 | export default theme; 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/app/orders/page.tsx: -------------------------------------------------------------------------------- 1 | import { OrdersContainer } from '@/components'; 2 | 3 | export default function OrdersPage() { 4 | return ( 5 |
6 |
7 | 8 |
9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/script/3-attributes.js: -------------------------------------------------------------------------------- 1 | const tabButtons = document.querySelector('.tabs-buttons'); 2 | 3 | const tabButtonsClickHanlder = e => { 4 | const tab = e.target.dataset.tab; 5 | console.log(tab); 6 | }; 7 | 8 | tabButtons.addEventListener('click', tabButtonsClickHanlder); 9 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/app/ordersByPage/page.tsx: -------------------------------------------------------------------------------- 1 | import { OrdersByPage } from '@/components'; 2 | 3 | export default function OrdersByPageComponent() { 4 | return ( 5 |
6 |
7 | 8 |
9 |
10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/theme.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { createTheme } from '@mui/material/styles'; 3 | 4 | const theme = createTheme({ 5 | typography: { 6 | fontFamily: 'var(--font-roboto)', 7 | }, 8 | cssVariables: true, 9 | }); 10 | 11 | export default theme; 12 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /lectures/10-js-advanced-3/practice/modules/math.js: -------------------------------------------------------------------------------- 1 | export function add(a, b) { 2 | return a + b; 3 | } 4 | 5 | export function subtract(a, b) { 6 | return a - b; 7 | } 8 | 9 | export const PI = 3.14159; 10 | 11 | // Export a default value 12 | export default function multiply(a, b) { 13 | return a * b; 14 | } 15 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/layout/MainLayout.js: -------------------------------------------------------------------------------- 1 | import Header from './components/Header'; 2 | 3 | const MainLayout = ({ children }) => { 4 | return ( 5 | <> 6 |
7 | {children} 8 |
9 | 10 | ); 11 | }; 12 | 13 | export default MainLayout; 14 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/script/8-delegation.js: -------------------------------------------------------------------------------- 1 | // const playground = document.querySelector('.playground'); 2 | 3 | // const clickHandler = (e) => { 4 | // const cellNum = e.target.dataset.cell; 5 | 6 | // console.log(cellNum); 7 | // }; 8 | 9 | // playground.addEventListener('click', clickHandler); 10 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/App.test.js: -------------------------------------------------------------------------------- 1 | import {render, screen} from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Header } from './Header'; 2 | export { default as Orders } from './Orders'; 3 | export { default as OrderItem } from './OrderItem'; 4 | export { default as OrdersContainer } from './OrdersContainer'; 5 | export { default as OrdersByPage } from './OrdersByPage'; 6 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/containers/Home.js: -------------------------------------------------------------------------------- 1 | import Orders from '@/components/Orders/Orders'; 2 | import { Container } from '@mui/system'; 3 | 4 | const Home = () => ( 5 | <> 6 | 7 |

Home Page

8 | 9 |
10 | 11 | ); 12 | 13 | export default Home; 14 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/containers/Orders.js: -------------------------------------------------------------------------------- 1 | import Orders from '@/components/Orders/Orders'; 2 | import { Container } from '@mui/system'; 3 | 4 | const OrdersContainer = () => ( 5 | 6 |

Orders Page

7 | 8 |
9 | ); 10 | 11 | export default OrdersContainer; 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Header } from './Header'; 2 | export { default as Orders } from './Orders'; 3 | export { default as OrderItem } from './OrderItem'; 4 | export { default as OrdersContainer } from './OrdersContainer'; 5 | export { default as OrdersByPage } from './OrdersByPage'; 6 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/src/components/Main.tsx: -------------------------------------------------------------------------------- 1 | import { Stack, StackProps } from "@chakra-ui/react"; 2 | 3 | export const Main = (props: StackProps) => ( 4 | 13 | ); 14 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/main/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Document 7 | 8 | 9 | 10 | HOME 11 | 12 | 13 | -------------------------------------------------------------------------------- /lectures/17-patterns/practice/creational/3.prototype.js: -------------------------------------------------------------------------------- 1 | const car = { 2 | wheels: 4, 3 | 4 | init() { 5 | console.log(`I have ${this.wheels}`); 6 | }, 7 | }; 8 | 9 | const carWithOwner = Object.create(car, { owner: { value: 'Misha' } }); 10 | 11 | console.log(car); 12 | console.log(carWithOwner.owner); 13 | console.log(carWithOwner.wheels); 14 | carWithOwner.init(); 15 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/store/actions/selectedOrdersAction.js: -------------------------------------------------------------------------------- 1 | export const ADD_ORDER = 'ADD_ORDER'; 2 | export const DELETE_ORDER = 'DELETE_ORDER'; 3 | 4 | export const addOrder = (id) => ({ 5 | type: ADD_ORDER, 6 | payload: { id }, 7 | }); 8 | 9 | export const deleteOrder = (id) => ({ 10 | type: DELETE_ORDER, 11 | payload: { id }, 12 | }); 13 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/pages/index.js: -------------------------------------------------------------------------------- 1 | import Home from '@/containers/Home'; 2 | import MainLayout from '@/layout/MainLayout'; 3 | import { Inter } from 'next/font/google'; 4 | 5 | const inter = Inter({ subsets: ['latin'] }); 6 | 7 | export default function HomePage() { 8 | return ( 9 | 10 | 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-react-bootstrap-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next dev", 5 | "build": "next build", 6 | "start": "next start" 7 | }, 8 | "dependencies": { 9 | "bootstrap": "^4.4.1", 10 | "next": "latest", 11 | "react": "^18.2.0", 12 | "react-bootstrap": "^1.0.1", 13 | "react-dom": "^18.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/pages/orders.js: -------------------------------------------------------------------------------- 1 | import Orders from '@/containers/Orders'; 2 | import MainLayout from '@/layout/MainLayout'; 3 | import { Inter } from 'next/font/google'; 4 | 5 | const inter = Inter({ subsets: ['latin'] }); 6 | 7 | export default function ProjectsPage() { 8 | return ( 9 | 10 | 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/calculator-test-jest/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "calculator-test-jest", 3 | "version": "1.0.0", 4 | "description": "testing example", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest", 8 | "test-with-coverage": "jest --coverage" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "jest": "^29.0.3" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/public/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/public/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1", 7 | "dev": "nodemon index.js" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "description": "", 12 | "dependencies": { 13 | "cors": "^2.8.5", 14 | "express": "^5.1.0", 15 | "nodemon": "^3.1.10" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/src/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { ChakraProvider } from "@chakra-ui/react"; 2 | 3 | import theme from "../theme"; 4 | import { AppProps } from "next/app"; 5 | 6 | function MyApp({ Component, pageProps }: AppProps) { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | 14 | export default MyApp; 15 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/public/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/public/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/public/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/public/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/public/window.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/public/file.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/styles/theme.js: -------------------------------------------------------------------------------- 1 | import { createTheme } from '@mui/material/styles'; 2 | import { red } from '@mui/material/colors'; 3 | // Create a theme instance. 4 | const theme = createTheme({ 5 | palette: { 6 | primary: { 7 | main: '#556cd6', 8 | }, 9 | secondary: { 10 | main: '#19857b', 11 | }, 12 | error: { 13 | main: red.A400, 14 | }, 15 | }, 16 | }); 17 | export default theme; 18 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/lib/hooks.ts: -------------------------------------------------------------------------------- 1 | import { useDispatch, useSelector, useStore } from 'react-redux'; 2 | import type { RootState, AppDispatch, AppStore } from './store'; 3 | 4 | // Use throughout your app instead of plain `useDispatch` and `useSelector` 5 | export const useAppDispatch = useDispatch.withTypes(); 6 | export const useAppSelector = useSelector.withTypes(); 7 | export const useAppStore = useStore.withTypes(); 8 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/main/styles.css: -------------------------------------------------------------------------------- 1 | .sizing-1 { 2 | box-sizing: border-box; 3 | width: 500px; 4 | height: 500px; 5 | background: red; 6 | padding: 20px; 7 | border: 20px solid purple; 8 | } 9 | 10 | .sizing-2 { 11 | border: 20px solid purple; 12 | box-sizing: border-box; 13 | background: rgba(145, 120, 120, 0.6); 14 | margin-top: 50px; 15 | width: 50px; 16 | width: 500px; 17 | height: 500px; 18 | overflow: auto; 19 | padding: 20px; 20 | } 21 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "eslint": "8.49.0", 13 | "eslint-config-next": "13.4.19", 14 | "next": "13.4.19", 15 | "react": "18.2.0", 16 | "react-dom": "18.2.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-react-bootstrap-app/style/index.css: -------------------------------------------------------------------------------- 1 | .md-container { 2 | max-width: 800px; 3 | padding-top: 2rem; 4 | } 5 | 6 | .sml-card { 7 | width: 22rem; 8 | margin: 1rem 0; 9 | } 10 | 11 | .cntr-footer { 12 | height: 80px; 13 | margin-top: 20px; 14 | display: flex; 15 | align-items: center; 16 | justify-content: center; 17 | border-top: 1px solid #ccc; 18 | } 19 | 20 | .sml-logo { 21 | height: 1em; 22 | margin-left: 10px; 23 | } 24 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/calculator-test-jest/calculator.js: -------------------------------------------------------------------------------- 1 | const add = (x, y) => { 2 | return x + y; 3 | }; 4 | 5 | const subtract = (x, y) => { 6 | return x - y; 7 | }; 8 | 9 | const multiply = (x, y) => { 10 | return x * y; 11 | }; 12 | 13 | const divide = (x, y) => { 14 | if (y === 0) { 15 | throw 'Cannot divide by 0!'; 16 | } 17 | return x / y; 18 | }; 19 | 20 | module.exports = { 21 | add, 22 | subtract, 23 | multiply, 24 | divide, 25 | }; 26 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({getCLS, getFID, getFCP, getLCP, getTTFB}) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/src/components/Container.tsx: -------------------------------------------------------------------------------- 1 | import { Flex, FlexProps } from "@chakra-ui/react"; 2 | 3 | export const Container = (props: FlexProps) => ( 4 | 17 | ); 18 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/store/reducers/selectedOrders.js: -------------------------------------------------------------------------------- 1 | import { ADD_ORDER, DELETE_ORDER } from '../actions/selectedOrdersAction'; 2 | 3 | const selectedOrders = (state = [], action) => { 4 | switch (action.type) { 5 | case ADD_ORDER: 6 | return [...state, action.payload.id]; 7 | case DELETE_ORDER: 8 | return state.filter((id) => id !== action.payload.id); 9 | default: 10 | return state; 11 | } 12 | }; 13 | 14 | export default selectedOrders; 15 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/styles/delegation.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | padding: 0; 4 | margin: 0; 5 | } 6 | 7 | .playground { 8 | max-width: 1000px; 9 | width: 100%; 10 | margin: 0 auto; 11 | border: 2px solid blue; 12 | display: flex; 13 | flex-wrap: wrap; 14 | } 15 | 16 | .cell-item { 17 | width: 33.3333%; 18 | height: 200px; 19 | border: 2px solid green; 20 | display: flex; 21 | justify-content: center; 22 | align-items: center; 23 | } 24 | -------------------------------------------------------------------------------- /lectures/17-patterns/practice/behaviour/3.iterator.js: -------------------------------------------------------------------------------- 1 | class ArrayIterator { 2 | constructor(elements) { 3 | this.index = 0; 4 | this.elements = elements; 5 | } 6 | 7 | next() { 8 | return this.elements[this.index++]; 9 | } 10 | 11 | hasNext() { 12 | return this.index < this.elements.length; 13 | } 14 | } 15 | 16 | const collection = new ArrayIterator(['Audi', 'BMW', 'Chevy', 'Ford']); 17 | while (collection.hasNext()) { 18 | console.log(collection.next()); 19 | } 20 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/src/app/layout.js: -------------------------------------------------------------------------------- 1 | import './globals.css' 2 | import { Inter } from 'next/font/google' 3 | 4 | const inter = Inter({ subsets: ['latin'] }) 5 | 6 | export const metadata = { 7 | title: 'Create Next App', 8 | description: 'Generated by create next app', 9 | } 10 | 11 | export default function RootLayout({ children }) { 12 | return ( 13 | 14 | {children} 15 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | ]; 15 | 16 | export default eslintConfig; 17 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | ]; 15 | 16 | export default eslintConfig; 17 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --foreground-rgb: 0, 0, 0; 7 | --background-start-rgb: 214, 219, 220; 8 | --background-end-rgb: 255, 255, 255; 9 | } 10 | 11 | body { 12 | color: rgb(var(--foreground-rgb)); 13 | background: linear-gradient( 14 | to bottom, 15 | transparent, 16 | rgb(var(--background-end-rgb)) 17 | ) 18 | rgb(var(--background-start-rgb)); 19 | } 20 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/components/Scenario.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Scenario = props => ( 4 |
5 |

{props.title}

6 |
{props.description}
7 |
{props.component}
8 | 11 | {props.snippet} 12 |
13 | ); 14 | 15 | export default Scenario; 16 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | ]; 15 | 16 | export default eslintConfig; 17 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/components/FocusInput.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import FocusInput from './FocusInput'; 3 | import {render, fireEvent, cleanup, screen} from '@testing-library/react'; 4 | 5 | afterEach(cleanup); 6 | 7 | test('clicking on button trigger focus on input', () => { 8 | render() 9 | fireEvent.click(screen.getByText('Click to Focus')) 10 | 11 | expect(document.activeElement).toBe(screen.getByPlaceholderText("Focus me!")) 12 | }); 13 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | ]; 15 | 16 | export default eslintConfig; 17 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/components/FocusInput.js: -------------------------------------------------------------------------------- 1 | import React, {useRef} from 'react'; 2 | 3 | const FocusInput = () => { 4 | const inputRef = useRef(null); 5 | return ( 6 |
7 | 13 | 14 |
15 | ); 16 | }; 17 | 18 | export default FocusInput; 19 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/src/components/Hero.tsx: -------------------------------------------------------------------------------- 1 | import { Flex, Heading } from "@chakra-ui/react"; 2 | 3 | export const Hero = ({ title }: { title: string }) => ( 4 | 11 | {title} 12 | 13 | ); 14 | 15 | Hero.defaultProps = { 16 | title: "with-chakra-ui-typescript", 17 | }; 18 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/calculator-test-jest/coverage/lcov.info: -------------------------------------------------------------------------------- 1 | TN: 2 | SF:calculator.js 3 | FN:1,(anonymous_0) 4 | FN:5,(anonymous_1) 5 | FN:9,(anonymous_2) 6 | FN:13,(anonymous_3) 7 | FNF:4 8 | FNH:4 9 | FNDA:2,(anonymous_0) 10 | FNDA:2,(anonymous_1) 11 | FNDA:2,(anonymous_2) 12 | FNDA:3,(anonymous_3) 13 | DA:1,1 14 | DA:2,2 15 | DA:5,1 16 | DA:6,2 17 | DA:9,1 18 | DA:10,2 19 | DA:13,1 20 | DA:14,3 21 | DA:15,1 22 | DA:17,2 23 | DA:20,1 24 | LF:11 25 | LH:11 26 | BRDA:14,0,0,1 27 | BRDA:14,0,1,2 28 | BRF:2 29 | BRH:2 30 | end_of_record 31 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/app/api/tasks/route.ts: -------------------------------------------------------------------------------- 1 | import tasks from '@/mocks/tasks.json'; 2 | 3 | const getRandomTasks = (limit = 10) => { 4 | return tasks.sort(() => Math.random() - 0.5).slice(0, limit); 5 | }; 6 | 7 | export async function GET() { 8 | // const limit = request.nextUrl.searchParams.get('limit'); 9 | // const status = request.nextUrl.searchParams.get('status'); 10 | 11 | return new Response(JSON.stringify(getRandomTasks(12)), { 12 | status: 200, 13 | headers: { 'Content-Type': 'application/json' }, 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-pages-router-ts/src/Copyright.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Typography from '@mui/material/Typography'; 3 | import MuiLink from '@mui/material/Link'; 4 | 5 | export default function Copyright() { 6 | return ( 7 | 8 | {'Copyright © '} 9 | 10 | Your Website 11 | {' '} 12 | {new Date().getFullYear()}. 13 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-ts/src/components/Copyright.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import Typography from '@mui/material/Typography'; 3 | import MuiLink from '@mui/material/Link'; 4 | 5 | export default function Copyright() { 6 | return ( 7 | 8 | {'Copyright © '} 9 | 10 | Your Website 11 | {' '} 12 | {new Date().getFullYear()}. 13 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /lectures/13-environment-and-preprocessors/practice/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "arg-laba", 3 | "version": "1.0.1", 4 | "description": "test npm init", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "sass:build": "sass styles.scss styles.css", 9 | "sass:watch": "sass styles.scss styles.css --watch" 10 | }, 11 | "keywords": [ 12 | "laba", 13 | "study" 14 | ], 15 | "author": "Mike", 16 | "license": "ISC", 17 | "dependencies": { 18 | "sass": "^1.54.3" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lectures/07-js-basics-2/task.md: -------------------------------------------------------------------------------- 1 | # JS basic 2 practice 2 | 3 | Your task is to complete all of codewars katas. 4 | 5 | ### Definition of done 6 | 7 | - All task tests are passed 8 | - Your PR includes one js file with all of your solutions 9 | 10 | Example of file structure: 11 | 12 | ``` 13 | // task 1 link 14 | solution() { 15 | ... 16 | } 17 | 18 | // task 2 link 19 | solution() { 20 | ... 21 | } 22 | 23 | ... 24 | ``` 25 | 26 | [List is here](https://docs.google.com/document/d/1-a743qOYHvs7UPTM7ltDIlx_VvJX1C3rym4swDI7zRo/edit?usp=sharing), good luck. 27 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/script/5-classes.js: -------------------------------------------------------------------------------- 1 | // const userData = document.querySelector('.user-data'); 2 | 3 | // console.log(userData.className); 4 | // console.log(userData.classList.add('test-1')); 5 | // console.log(userData.classList.remove('test-1')); 6 | // console.log(userData.classList.toggle('test-1')); 7 | // console.log(userData.classList.contains('test-1')); 8 | 9 | // userData.style.color = 'red'; 10 | // userData.style.marginTop = '20px'; 11 | // console.log(userData.style.marginTop); 12 | // console.log(getComputedStyle(userData).margin); 13 | -------------------------------------------------------------------------------- /lectures/04-css/practice/z-index/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Document 10 | 11 | 12 |
13 |
14 |
15 |
16 |
17 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/src/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import NextDocument, { Html, Head, Main, NextScript } from "next/document"; 2 | import { ColorModeScript } from "@chakra-ui/react"; 3 | 4 | export default class Document extends NextDocument { 5 | render() { 6 | return ( 7 | 8 | 9 | 10 | {/* Make Color mode to persists when you refresh the page. */} 11 | 12 |
13 | 14 | 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lectures/06-js-basics-1/task.md: -------------------------------------------------------------------------------- 1 | # JS basic practice 2 | 3 | Your task is to complete all of codewars katas. 4 | 5 | ### Definition of done 6 | 7 | - All task tests are passed 8 | - Your PR includes one js file with all of your solutions 9 | 10 | Example of file structure: 11 | 12 | ``` 13 | // task 1 link 14 | solution() { 15 | ... 16 | } 17 | 18 | // task 2 link 19 | solution() { 20 | ... 21 | } 22 | 23 | ... 24 | ``` 25 | 26 | [List is here](https://solvdportal.sharepoint.com/:w:/s/GoogleDriveSolvdLABA/EWDFXpCRMdZMuHWQSPLNEyYBjLGJl7XCFlZap_np_pwQwQ?e=G1r2Yv), good luck. 27 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | -------------------------------------------------------------------------------- /lectures/16-typescript-advanced/code_examples/7-keyof.ts: -------------------------------------------------------------------------------- 1 | interface Person { 2 | name: string; 3 | age: number; 4 | } 5 | type KeyType = keyof Person; // also works 6 | 7 | type NewObj = Record 8 | 9 | const newObj: Partial = { 10 | name: 10, 11 | age: 100, 12 | country: 19, 13 | } 14 | 15 | const printPersonProp = (person, property: keyof Person) => { 16 | console.log(`Person prop: ${person[property]}`); 17 | }; 18 | 19 | const person: Person = { 20 | name: 'Ilya', 21 | age: 23, 22 | }; 23 | 24 | printPersonProp(person, 'country'); 25 | 26 | export {}; 27 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/app/StoreProvider.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { useRef } from 'react'; 3 | import { Provider } from 'react-redux'; 4 | import { makeStore, AppStore } from '../../lib/store'; 5 | 6 | export default function StoreProvider({ children }: { children: React.ReactNode }) { 7 | const storeRef = useRef(undefined); 8 | 9 | if (!storeRef.current) { 10 | // Create the store instance the first time this renders 11 | storeRef.current = makeStore(); 12 | } 13 | 14 | return {children}; 15 | } 16 | -------------------------------------------------------------------------------- /lectures/17-patterns/practice/creational/4.singleton.js: -------------------------------------------------------------------------------- 1 | class Singleton { 2 | static instance; 3 | 4 | constructor() { 5 | if (Singleton.instance) { 6 | return Singleton.instance; 7 | } 8 | this.counter = 0; 9 | Singleton.instance = this; 10 | } 11 | 12 | increaseCounter() { 13 | this.counter += 1; 14 | } 15 | } 16 | 17 | const instance1 = new Singleton(); 18 | instance1.increaseCounter(); 19 | instance1.increaseCounter(); 20 | instance1.increaseCounter(); 21 | 22 | const instance2 = new Singleton(); 23 | 24 | console.log(instance1); 25 | console.log(instance2); 26 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-ts/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | # next-env.d.ts 37 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/styles/sizing.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | padding: 0; 4 | margin: 0; 5 | } 6 | 7 | body { 8 | box-sizing: border-box; 9 | height: 500vh; 10 | } 11 | 12 | main { 13 | min-height: 100vh; 14 | display: flex; 15 | justify-content: center; 16 | align-items: center; 17 | } 18 | 19 | .box { 20 | width: 500px; 21 | height: 500px; 22 | background: red; 23 | padding: 40px; 24 | border: 20px solid green; 25 | overflow: auto; 26 | } 27 | 28 | .box__content { 29 | height: 1400px; 30 | width: 100%; 31 | background: blue; 32 | } 33 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-react-bootstrap-app/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": false, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve" 16 | }, 17 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 18 | "exclude": ["node_modules"] 19 | } 20 | -------------------------------------------------------------------------------- /lectures/04-css/practice/flexbox/styles.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | .container { 6 | max-width: 1080px; 7 | margin: 0 auto; 8 | } 9 | 10 | .flex-container { 11 | display: flex; 12 | flex-wrap: wrap; 13 | gap: 40px; 14 | } 15 | 16 | .flex-item { 17 | width: calc(25% - 30px); 18 | background: red; 19 | } 20 | 21 | @media (max-width: 1080px) { 22 | .container { 23 | max-width: 768px; 24 | } 25 | } 26 | 27 | @media (max-width: 768px) { 28 | .flex-item { 29 | width: calc(50% - 20px); 30 | } 31 | } 32 | 33 | @media (max-width: 425px) { 34 | .flex-item { 35 | width: 100%; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lectures/13-environment-and-preprocessors/practice/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 | 11 |
12 |
13 |
Hello guys!
14 |
099 226 99 89
15 |
16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/app/react-csr-approach/page.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import { useEffect, useState } from 'react'; 4 | 5 | import Tasks from '@/components/Tasks'; 6 | import { Task } from '@/interfaces/task'; 7 | 8 | export default function ReactApproach() { 9 | const [tasks, setTasks] = useState([]); 10 | 11 | useEffect(() => { 12 | fetch('/api/tasks') 13 | .then((res) => res.json()) 14 | .then((data) => setTasks(data)); 15 | }, []); 16 | 17 | return ( 18 |
19 |
20 |

Tasks

21 | 22 |
23 |
24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/src/app/StoreProvider.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import type * as React from 'react'; 3 | import { QueryClientProvider } from '@tanstack/react-query'; 4 | import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; 5 | import { getQueryClient } from '@/app/get-query-client'; 6 | 7 | export default function Providers({ children }: { children: React.ReactNode }) { 8 | const queryClient = getQueryClient(); 9 | 10 | return ( 11 | 12 | {children} 13 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/src/components/DarkModeSwitch.tsx: -------------------------------------------------------------------------------- 1 | import { useColorMode, IconButton } from "@chakra-ui/react"; 2 | import { SunIcon, MoonIcon } from "@chakra-ui/icons"; 3 | 4 | export const DarkModeSwitch = () => { 5 | const { colorMode, toggleColorMode } = useColorMode(); 6 | const isDark = colorMode === "dark"; 7 | return ( 8 | : } 13 | aria-label="Toggle Theme" 14 | colorScheme="green" 15 | onClick={toggleColorMode} 16 | /> 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-2/mouse-events/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 9 | 10 | 11 | 12 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/components/Tasks/styles.module.css: -------------------------------------------------------------------------------- 1 | .tasksContainer { 2 | display: flex; 3 | flex-wrap: wrap; 4 | padding: 10px; 5 | background-color: #f0f0f0; 6 | gap: 15px; 7 | } 8 | 9 | .taskItem { 10 | display: flex; 11 | flex-direction: column; 12 | gap: 10px; 13 | width: calc(33.33333% - 10px); 14 | padding: 10px; 15 | border-radius: 10px; 16 | box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); 17 | } 18 | 19 | .taskItem:hover { 20 | transform: scale(1.05); 21 | transition: transform 0.3s ease-in-out; 22 | } 23 | 24 | .taskLink { 25 | display: block; 26 | text-decoration: none; 27 | color: inherit; 28 | } 29 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/store/store.js: -------------------------------------------------------------------------------- 1 | import { createStore, applyMiddleware } from 'redux'; 2 | import thunk from 'redux-thunk'; 3 | import { createWrapper } from 'next-redux-wrapper'; 4 | 5 | import rootReducer from './reducers/rootReducer'; 6 | 7 | const initialState = { 8 | orders: { 9 | result: [], 10 | isLoading: false, 11 | error: null, 12 | page: 0, 13 | }, 14 | selectedOrders: [], 15 | }; 16 | 17 | export const store = createStore( 18 | rootReducer, 19 | initialState, 20 | applyMiddleware(...[thunk]) 21 | ); 22 | 23 | export const wrapper = createWrapper(() => store, { debug: true }); 24 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true 17 | }, 18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/components/ChangeInput.js: -------------------------------------------------------------------------------- 1 | import React, {useState} from 'react'; 2 | 3 | function ChangeInput() { 4 | const [name, setName] = useState(''); 5 | return ( 6 |
7 | 8 | Welcome, {name === '' ? 'Anonymous User' : name}! 9 | 10 |
11 | setName(e.target.value)} 17 | /> 18 |
19 | ); 20 | } 21 | 22 | export default ChangeInput; 23 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/sizing.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Sizing 10 | 11 | 12 |
13 |
14 |
15 |
16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /lectures/11-js-dom/task.md: -------------------------------------------------------------------------------- 1 | # JS DOM 2 | 3 | ## Description 4 | 5 | We need to create a grid with 20 cols and 30 rows. Any cell can be selected by clicking on it 6 | 7 | ## Definition of done 8 | 9 | - Cell’s size should be 40x40px; 10 | - Selected cell should be highlighted with blue color. 11 | - By default cells are empty. But selected cell should contain a value like x/y, where x is column number, y - row number 12 | - Active row and column should be highlighted with light blue color 13 | - Click handler should be implemented using Event Delegation approach 14 | 15 | ## Advanced 16 | 17 | - clicking with holding shift button allows to select several items 18 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/my-app/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "practice", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev --turbopack", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "react": "^19.0.0", 13 | "react-dom": "^19.0.0", 14 | "next": "15.3.3" 15 | }, 16 | "devDependencies": { 17 | "typescript": "^5", 18 | "@types/node": "^20", 19 | "@types/react": "^19", 20 | "@types/react-dom": "^19", 21 | "eslint": "^9", 22 | "eslint-config-next": "15.3.3", 23 | "@eslint/eslintrc": "^3" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById('root')); 8 | root.render( 9 | 10 | 11 | , 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-pages-router-ts/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | 36 | # typescript 37 | *.tsbuildinfo 38 | next-env.d.ts 39 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/events.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Document 9 | 10 | 11 | 12 | 13 |
14 |
15 |

16 | 17 |

18 |
19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/practice-1/script/4-modifying.js: -------------------------------------------------------------------------------- 1 | // const userData = document.querySelector('.user-data'); 2 | // const cityInfo = document.createElement('p'); 3 | // cityInfo.textContent = 'London'; 4 | 5 | // userData.prepend(cityInfo); 6 | // userData.append(cityInfo); 7 | // userData.before(cityInfo); 8 | // userData.after(cityInfo); 9 | // userData.replaceWith(cityInfo); 10 | // userData.remove(); 11 | 12 | // userData.insertAdjacentElement('beforebegin', cityInfo); 13 | // userData.insertAdjacentElement('afterbegin', cityInfo); 14 | // userData.insertAdjacentElement('afterend', cityInfo); 15 | // userData.insertAdjacentElement('beforeend', cityInfo); 16 | -------------------------------------------------------------------------------- /lectures/11-js-dom/practice/events/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Document 10 | 11 | 12 | 13 | 14 |
15 |
16 |

17 | 18 |

19 |
20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lectures/15-typescript-basics/code_examples/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-basics", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ts-basics", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "typescript": "^5.3.3" 13 | } 14 | }, 15 | "node_modules/typescript": { 16 | "version": "5.3.3", 17 | "license": "Apache-2.0", 18 | "bin": { 19 | "tsc": "bin/tsc", 20 | "tsserver": "bin/tsserver" 21 | }, 22 | "engines": { 23 | "node": ">=14.17" 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/components/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import * as serviceWorker from './serviceWorker'; 6 | import ReactGA from 'react-ga'; 7 | 8 | ReactGA.initialize('UA-64315802-4'); 9 | ReactGA.pageview('/'); 10 | 11 | ReactDOM.render(, document.getElementById('root')); 12 | 13 | // If you want your app to work offline and load faster, you can change 14 | // unregister() to register() below. Note this comes with some pitfalls. 15 | // Learn more about service workers: https://bit.ly/CRA-PWA 16 | serviceWorker.unregister(); 17 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next", 5 | "build": "next build", 6 | "start": "next start" 7 | }, 8 | "dependencies": { 9 | "@ant-design/cssinjs": ">=1.21.0", 10 | "@ant-design/icons": "^5.1.4", 11 | "antd": "^5.0.0", 12 | "next": "latest", 13 | "react": "18.2.0", 14 | "react-dom": "18.2.0" 15 | }, 16 | "devDependencies": { 17 | "@types/node": "^20.4.5", 18 | "@types/react": "^18.2.17", 19 | "@types/react-dom": "^18.2.7", 20 | "typescript": "^5.1.6" 21 | }, 22 | "browser": { 23 | "fs": false, 24 | "path": false 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lectures/15-typescript-basics/code_examples/2-array-types.ts: -------------------------------------------------------------------------------- 1 | const hobbies = ['Cooking', 'Sport']; // automatically defined type "string[]" 2 | 3 | const typedHobbies: string[] = ['Cooking', 'Sports', ""]; 4 | 5 | const anotherArr: [string, number, boolean] = ["another one", 10, true] 6 | 7 | const array: [string, number, boolean] = [...anotherArr] 8 | 9 | // || 10 | 11 | 12 | // union 13 | const unionType = [2, 'test', 213, 123, 'test2', true]; // the same 14 | const unionType2: (string | number)[] = [1, 'test', 213, 123, 'test2', true]; // the same 15 | 16 | // tuple 17 | const tupleType: [string, number] = ['123', 123]; // should be exactly two values which defined in type 18 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/store/actions/ordersAction.js: -------------------------------------------------------------------------------- 1 | export const SETUP_ORDERS = 'SETUP_ORDERS'; 2 | export const SETUP_ORDERS_SUCCESS = 'SETUP_ORDERS_SUCCESS'; 3 | export const SETUP_ORDERS_FAILURE = 'SETUP_ORDERS_FAILURE'; 4 | 5 | export const getOrders = (page) => { 6 | return (dispatch) => { 7 | dispatch({ type: SETUP_ORDERS }); 8 | 9 | return fetch(`api/orders?page=${page}`) 10 | .then((res) => res.json()) 11 | .then((orders) => 12 | dispatch({ type: SETUP_ORDERS_SUCCESS, payload: { orders } }) 13 | ) 14 | .catch((e) => 15 | dispatch({ type: SETUP_ORDERS_FAILURE, payload: { error: e.message } }) 16 | ); 17 | }; 18 | }; 19 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/App.js: -------------------------------------------------------------------------------- 1 | import logo from './logo.svg'; 2 | import './App.css'; 3 | 4 | function App() { 5 | return ( 6 |
7 |
8 | logo 9 |

10 | Edit src/App.js and save to reload. 11 |

12 | 18 | Learn React 19 | 20 |
21 |
22 | ); 23 | } 24 | 25 | export default App; 26 | -------------------------------------------------------------------------------- /workshops/ui-libraries/README.md: -------------------------------------------------------------------------------- 1 | # UI Libraries 2 | 3 | - [Video](https://solvdportal-my.sharepoint.com/:v:/r/personal/laba_solvd_com/Documents/Recordings/Development-React.js-2025-01-20250620_140246-Meeting%20Recording.mp4?csf=1&web=1&e=VKcW32&nav=eyJyZWZlcnJhbEluZm8iOnsicmVmZXJyYWxBcHAiOiJTdHJlYW1XZWJBcHAiLCJyZWZlcnJhbFZpZXciOiJTaGFyZURpYWxvZy1MaW5rIiwicmVmZXJyYWxBcHBQbGF0Zm9ybSI6IldlYiIsInJlZmVycmFsTW9kZSI6InZpZXcifX0%3D) 4 | - [Presentation](https://solvdportal.sharepoint.com/:p:/s/GoogleDriveSolvdLABA/Eea4KuPEpdhJqSZpHhZSsxkBlnwTmePbCh7NV-t3SjZ6hw?e=MdDKn4) 5 | 6 | MUI docs - https://mui.com/ 7 | 8 | Ant Design dcs - https://ant.design/ 9 | 10 | Chakra UI docs - https://chakra-ui.com/ 11 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-pages-router-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "jsxImportSource": "@emotion/react", 17 | "incremental": true 18 | }, 19 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 20 | "exclude": ["node_modules"] 21 | } 22 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | 43 | .next 44 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/example-1/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 12 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /lectures/24-next-js-3/README.md: -------------------------------------------------------------------------------- 1 | # Next.js. App Router. 2 | 3 | Here's you can find materials about "Next.js. App Router." 4 | 5 | [Presentation](https://solvdportal.sharepoint.com/:p:/s/GoogleDriveSolvdLABA/EcmxvHoR6rdEvQ8JQuwnk3UBEsu66cNhlR-O07U9ZON2-Q?e=SJwUNd) 6 | 7 | [Video](https://solvdportal-my.sharepoint.com/personal/laba_solvd_com/_layouts/15/stream.aspx?id=%2Fpersonal%2Flaba%5Fsolvd%5Fcom%2FDocuments%2FRecordings%2FDevelopment%2DReact%2Ejs%2D2025%2D01%2D20250610%5F150232%2DMeeting%20Recording%2Emp4&referrer=StreamWebApp%2EWeb&referrerScenario=AddressBarCopied%2Eview%2Ebeda0e39%2D8554%2D480a%2Dbacd%2D2e860acd08b2&isDarkMode=true) 8 | 9 | Useful links 10 | 11 | - [App Router](https://nextjs.org/docs) 12 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/src/store/slices/counter.ts: -------------------------------------------------------------------------------- 1 | import { createSlice } from '@reduxjs/toolkit'; 2 | 3 | export interface CounterState { 4 | value: number; 5 | } 6 | 7 | const initialState: CounterState = { 8 | value: 0, 9 | }; 10 | 11 | export const counterSlice = createSlice({ 12 | name: 'counter', 13 | initialState, 14 | reducers: { 15 | increment: (state) => { 16 | state.value += 1; 17 | }, 18 | decrement: (state) => { 19 | state.value -= 1; 20 | }, 21 | }, 22 | }); 23 | 24 | // Action creators are generated for each case reducer function 25 | export const { increment, decrement } = counterSlice.actions; 26 | 27 | export default counterSlice.reducer; 28 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-chakra-ui-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next", 5 | "build": "next build", 6 | "start": "next start" 7 | }, 8 | "dependencies": { 9 | "@chakra-ui/icons": "^2.0.2", 10 | "@chakra-ui/react": "^2.2.1", 11 | "@chakra-ui/theme-tools": "^2.0.2", 12 | "@emotion/react": "^11.9.0", 13 | "@emotion/styled": "^11.9.0", 14 | "framer-motion": "^6.3.0", 15 | "next": "latest", 16 | "react": "^18.2.0", 17 | "react-dom": "^18.2.0" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^18.0.0", 21 | "@types/react": "^18.0.0", 22 | "@types/react-dom": "^18.0.0", 23 | "typescript": "^4.7.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/calculator-test-jest/coverage/lcov-report/prettify.css: -------------------------------------------------------------------------------- 1 | .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} 2 | -------------------------------------------------------------------------------- /lectures/16-typescript-advanced/code_examples/2-enums.ts: -------------------------------------------------------------------------------- 1 | enum Role { // automatically set numbers 2 | ADMIN = 'ADMIN', 3 | READ_ONLY = 'READ_ONLY', 4 | AUTHOR = 'AUTHOR', 5 | } 6 | 7 | enum RoleDuplicated { // we can set numbers on our own 8 | ADMIN = 10, // 0 9 | READ_ONLY = 20, // 1 10 | AUTHOR = 30, // 2 11 | } 12 | 13 | type PersonType = { 14 | name: string; 15 | age: number; 16 | hobbies: string[]; 17 | role: Role; 18 | roleCustom: RoleDuplicated; 19 | }; 20 | 21 | const personInstance: PersonType = { 22 | name: 'Ilya', 23 | age: 22, 24 | hobbies: ['Cooking', 'Sports'], 25 | role: Role.ADMIN, 26 | roleCustom: RoleDuplicated.ADMIN, 27 | }; 28 | 29 | console.log('personInstance', personInstance); 30 | 31 | export {}; 32 | -------------------------------------------------------------------------------- /lectures/10-js-advanced-3/practice/modules/main.js: -------------------------------------------------------------------------------- 1 | import { add, subtract, PI } from './math.js'; 2 | import User from './user.js'; 3 | import * as Helpers from './helpers.js'; 4 | import multiply from './math.js'; // Import default export directly 5 | import { multiply as reExportedMultiply } from './helpers.js'; // Import re-exported default export 6 | 7 | console.log(add(5, 3)); // 8 8 | console.log(subtract(5, 3)); // 2 9 | console.log(PI); // 3.14159 10 | 11 | const user = new User('John'); 12 | console.log(user.greet()); // Hello, John! 13 | 14 | console.log(Helpers.add(10, 20)); // 30 15 | console.log(new Helpers.User('Jane').greet()); // Hello, Jane! 16 | 17 | console.log(multiply(2, 3)); // 6 18 | console.log(reExportedMultiply(4, 5)); // 20 19 | -------------------------------------------------------------------------------- /lectures/04-css/practice/z-index/styles.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | } 4 | 5 | .box { 6 | width: 300px; 7 | height: 300px; 8 | background: red; 9 | } 10 | 11 | .index-outer { 12 | position: relative; 13 | } 14 | 15 | .index-inner { 16 | position: absolute; 17 | } 18 | 19 | .index-inner:nth-of-type(1) { 20 | background: yellow; 21 | top: 20px; 22 | left: 20px; 23 | } 24 | 25 | .index-inner:nth-of-type(2) { 26 | background: purple; 27 | top: 40px; 28 | left: 40px; 29 | z-index: 11; 30 | } 31 | 32 | .index-inner:nth-of-type(3) { 33 | background: pink; 34 | top: 60px; 35 | left: 60px; 36 | } 37 | 38 | .inner-outer-2 { 39 | background: blue; 40 | position: relative; 41 | z-index: 10; 42 | top: -20px; 43 | left: 10px; 44 | } 45 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./src/*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-pages-router-ts/pages/test.tsx: -------------------------------------------------------------------------------- 1 | import { useTheme } from "@emotion/react"; 2 | import { Box, Typography } from "@mui/material"; 3 | 4 | const TestPage = () => { 5 | const theme = useTheme(); 6 | 7 | return ( 8 | <> 9 | 18 | Test 19 | 20 | 28 | QWERTY 29 | 30 | 31 | ); 32 | }; 33 | 34 | export default TestPage; 35 | -------------------------------------------------------------------------------- /lectures/04-css/task.md: -------------------------------------------------------------------------------- 1 | # CSS practice 2 | 3 | Create HTML page using provided [Figma Design](). 4 | 5 | ### Definition of done 6 | 7 | - The HTML and CSS should pass W3C [HTML](https://validator.w3.org/#validate_by_uri) and [CSS](https://jigsaw.w3.org/css-validator/) validations 8 | - The page structure should be semantically correct and includes most of HTML5 elements (header, nav, section, main and footer) 9 | - Page should look good on modern browsers (Chrome, Firefox) on desktop screens. 10 | - You should use [BEM approach](https://en.bem.info/methodology/quick-start/) 11 | 12 | ### Optional (advanced) 13 | 14 | - Implement dark mode functionality 15 | 16 | Good luck! 17 | -------------------------------------------------------------------------------- /workshops/state-management-react/rtk/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./src/*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/components/Tasks/index.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import Link from 'next/link'; 4 | 5 | import { Task } from '@/interfaces/task'; 6 | 7 | import styles from './styles.module.css'; 8 | 9 | interface Props { 10 | tasks: Task[]; 11 | } 12 | 13 | const Tasks = ({ tasks }: Props) => { 14 | return ( 15 |
    16 | {tasks.map((task) => ( 17 |
  • 18 | 19 |

    {task.title}

    20 |

    {task.description}

    21 |

    {task.status}

    22 |

    {task.date}

    23 | 24 |
  • 25 | ))} 26 |
27 | ); 28 | }; 29 | 30 | export default Tasks; 31 | -------------------------------------------------------------------------------- /workshops/state-management-react/context/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./src/*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/components/ChangeInput.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ChangeInput from './ChangeInput'; 3 | import {render, fireEvent, cleanup, screen} from '@testing-library/react'; 4 | 5 | afterEach(cleanup); 6 | 7 | test('displays the correct greeting', () => { 8 | render() 9 | 10 | const input = screen.getByLabelText("user-name") 11 | const greeting = screen.getByTestId("change-input-greeting") 12 | 13 | expect(input.value).toBe(''); 14 | expect(greeting.textContent).toBe("Welcome, Anonymous User!") 15 | 16 | fireEvent.change(input, {target: { value: "Vlad" }}) 17 | expect(input.value).toBe('Vlad'); 18 | expect(greeting.textContent).toBe("Welcome, Vlad!") 19 | }); 20 | -------------------------------------------------------------------------------- /workshops/state-management-react/tanstack-query/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./src/*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /lectures/05-css-advanced/task.md: -------------------------------------------------------------------------------- 1 | # CSS Advanced practice 2 | 3 | You need adjust our CV using CSS advanced features and BEM [Figma Design](). 4 | 5 | ### Definition of done 6 | 7 | - Should be used [BEM](https://en.bem.info/methodology/quick-start/) approach for CSS classes 8 | - Layout should be responsive and have a good look on mobile/tablet screens as well 9 | - Mobile layout should be on screens width up to 600px, tablet - up to 1024px 10 | - Should be added fixed button “scroll to top” on mobile view to the bottom of the page 11 | - It would be great if you can add three types of animations to your page(transition, keyframe, js). You can add them where you imagine it. 12 | 13 | Good luck! 14 | -------------------------------------------------------------------------------- /lectures/17-patterns/practice/structural/2.decorator.js: -------------------------------------------------------------------------------- 1 | class Server { 2 | constructor(ip, port) { 3 | this.ip = ip; 4 | this.port = port; 5 | } 6 | 7 | get url() { 8 | return `https://${this.ip}:${this.port}`; 9 | } 10 | } 11 | 12 | // decorator 13 | function aws(server) { 14 | server.isAWS = true; 15 | server.awsInfo = function () { 16 | return server.url; 17 | }; 18 | return server; 19 | } 20 | 21 | // decorator 22 | function azure(server) { 23 | server.isAzure = true; 24 | server.port += 500; 25 | return server; 26 | } 27 | 28 | const s1 = aws(new Server('12.32.33.9', 8080)); 29 | console.log(s1.isAWS); 30 | console.log(s1.awsInfo()); 31 | 32 | const s2 = azure(new Server('2.1.1.10', 1000)); 33 | console.log(s2.isAzure); 34 | console.log(s2.url); 35 | -------------------------------------------------------------------------------- /lectures/25-testing/practice/react-example/my-app/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-ts/src/theme.ts: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | import { Roboto } from 'next/font/google'; 3 | import { createTheme } from '@mui/material/styles'; 4 | 5 | const roboto = Roboto({ 6 | weight: ['300', '400', '500', '700'], 7 | subsets: ['latin'], 8 | display: 'swap', 9 | }); 10 | 11 | const theme = createTheme({ 12 | palette: { 13 | mode: 'light', 14 | }, 15 | typography: { 16 | fontFamily: roboto.style.fontFamily, 17 | }, 18 | components: { 19 | MuiAlert: { 20 | styleOverrides: { 21 | root: ({ ownerState }) => ({ 22 | ...(ownerState.severity === 'info' && { 23 | backgroundColor: '#60a5fa', 24 | }), 25 | }), 26 | }, 27 | }, 28 | }, 29 | }); 30 | 31 | export default theme; 32 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/app/fetch-api-approach-no-cache/page.tsx: -------------------------------------------------------------------------------- 1 | import { Task } from '@/interfaces/task'; 2 | import Tasks from '@/components/Tasks'; 3 | 4 | /** 5 | * 6 | * fetch responses are not cached by default. 7 | * However, Next.js will prerender the route and the output will be cached for improved performance. 8 | * If you'd like to opt into dynamic rendering, use the { cache: 'no-store' } option. 9 | */ 10 | const FetchApiApproach = async () => { 11 | const tasks = await fetch('http://localhost:3001/api/tasks', { 12 | cache: 'no-store', 13 | }); 14 | const data: Task[] = await tasks.json(); 15 | 16 | return ( 17 |
18 |

Tasks Without Cache

19 | 20 |
21 | ); 22 | }; 23 | 24 | export default FetchApiApproach; 25 | -------------------------------------------------------------------------------- /lectures/03-html-basics/task.md: -------------------------------------------------------------------------------- 1 | # HTML practice 2 | 3 | Create HTML page using provided [Figma Design](). 4 | 5 | ### Definition of done 6 | 7 | - You can use only HTML (no CSS or JS or something else). 8 | - HTML should pass W3C [HTML](https://validator.w3.org/#validate_by_uri) validations. HTML should be semantic. 9 | - Add work navigation between pages. 10 | - Put your photo instead of "YOUR PHOTO HERE" on the template. Photo should not take all page. 11 | - Full name and phone inputs should be required values on the form. This means that you can't send a form without these values. 12 | - Don't be a Pixel Perfect. Don't be worry about it. 13 | - Don't need to send data anywhere. Just miss this. 14 | 15 | Good luck! 16 | -------------------------------------------------------------------------------- /lectures/18-react-basics/practice/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Traffic Lights 8 | 12 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client-next", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@emotion/react": "^11.10.6", 13 | "@emotion/server": "^11.10.0", 14 | "@emotion/styled": "^11.10.6", 15 | "@mui/icons-material": "^5.11.16", 16 | "@mui/material": "^5.11.16", 17 | "eslint": "8.37.0", 18 | "eslint-config-next": "13.3.0", 19 | "next": "13.3.0", 20 | "next-redux-wrapper": "^8.1.0", 21 | "react": "18.2.0", 22 | "react-dom": "18.2.0", 23 | "react-redux": "^8.0.5", 24 | "redux": "^4.2.1", 25 | "redux-thunk": "^2.4.2" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lectures/19-react-ui/README.md: -------------------------------------------------------------------------------- 1 | # React UI. Managing State. 2 | 3 | Here's you can find materials about "React UI. Managing State." 4 | 5 | [Presentation](https://solvdportal.sharepoint.com/:p:/s/GoogleDriveSolvdLABA/EfGctQ3vI_dHpBv1rsoGSOQBRWAel4O5w8C1BX5AU-Cz9g?e=t29WrV) 6 | 7 | [Video](https://solvdportal-my.sharepoint.com/:v:/r/personal/laba_solvd_com/Documents/Recordings/Development-React.js-2025-01-20250523_140345-Meeting%20Recording.mp4?csf=1&web=1&e=jUsIHa&nav=eyJyZWZlcnJhbEluZm8iOnsicmVmZXJyYWxBcHAiOiJTdHJlYW1XZWJBcHAiLCJyZWZlcnJhbFZpZXciOiJTaGFyZURpYWxvZy1MaW5rIiwicmVmZXJyYWxBcHBQbGF0Zm9ybSI6IldlYiIsInJlZmVycmFsTW9kZSI6InZpZXcifX0%3D) 8 | 9 | Useful links 10 | 11 | - [Describing the UI](https://react.dev/learn/adding-interactivity) 12 | - [Managing State](https://react.dev/learn/choosing-the-state-structure) 13 | -------------------------------------------------------------------------------- /workshops/state-management-react/pure-redux-example/src/store/reducers/orders.js: -------------------------------------------------------------------------------- 1 | import { 2 | SETUP_ORDERS, 3 | SETUP_ORDERS_SUCCESS, 4 | SETUP_ORDERS_FAILURE, 5 | } from '../actions/ordersAction'; 6 | 7 | const orders = (state = {}, action) => { 8 | switch (action.type) { 9 | case 'SETUP_ORDERS': 10 | return { 11 | ...state, 12 | isLoading: true, 13 | }; 14 | case 'SETUP_ORDERS_SUCCESS': 15 | return { 16 | ...state, 17 | isLoading: false, 18 | error: null, 19 | result: [...state.result, ...action.payload.orders], 20 | page: state.page + 1, 21 | }; 22 | case 'SETUP_ORDERS_FAILURE': 23 | return { 24 | ...state, 25 | isLoading: false, 26 | error: action.payload.error, 27 | }; 28 | default: 29 | return state; 30 | } 31 | }; 32 | 33 | export default orders; 34 | -------------------------------------------------------------------------------- /lectures/22-nextjs-1/practice/src/app/fetch-api-approach-cache/page.tsx: -------------------------------------------------------------------------------- 1 | import { Task } from '@/interfaces/task'; 2 | import Tasks from '@/components/Tasks'; 3 | 4 | /** 5 | * 6 | * fetch responses are not cached by default. 7 | * However, Next.js will prerender the route and the output will be cached for improved performance. 8 | * If you'd like to opt into dynamic rendering, use the { cache: 'no-store' } option. 9 | */ 10 | const FetchApiApproach = async () => { 11 | const tasks = await fetch('http://localhost:3001/api/tasks', { 12 | // next: { revalidate: 60 }, // Revalidate every 60 seconds 13 | }); 14 | const data: Task[] = await tasks.json(); 15 | 16 | return ( 17 |
18 |

Tasks With Cache

19 | 20 |
21 | ); 22 | }; 23 | 24 | export default FetchApiApproach; 25 | -------------------------------------------------------------------------------- /workshops/ui-libraries/material-ui-nextjs-ts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "plugins": [ 18 | { 19 | "name": "next" 20 | } 21 | ], 22 | "baseUrl": ".", 23 | "paths": { 24 | "@/*": ["./src/*"] 25 | } 26 | }, 27 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 28 | "exclude": ["node_modules"] 29 | } 30 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import type { Metadata } from "next"; 3 | import { Inter } from "next/font/google"; 4 | import StyledComponentsRegistry from "./AntdRegistry"; 5 | import "./globals.css"; 6 | 7 | const inter = Inter({ subsets: ["latin"] }); 8 | 9 | export const metadata: Metadata = { 10 | title: "Create Next App", 11 | description: "Generated by create next app", 12 | }; 13 | 14 | interface RootLayoutProps { 15 | children: React.ReactNode; 16 | } 17 | 18 | function RootLayout({ children }: RootLayoutProps) { 19 | return ( 20 | 21 | 22 | {children} 23 | 24 | 25 | ); 26 | } 27 | 28 | export default RootLayout; 29 | -------------------------------------------------------------------------------- /workshops/ui-libraries/with-ant-design-app/app/AntdRegistry.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import React from "react"; 4 | import { useServerInsertedHTML } from "next/navigation"; 5 | import { StyleProvider, createCache, extractStyle } from "@ant-design/cssinjs"; 6 | import type Entity from "@ant-design/cssinjs/es/Cache"; 7 | 8 | interface StyledRegistryProps { 9 | children: React.ReactNode; 10 | } 11 | 12 | const StyledComponentsRegistry = ({ children }: StyledRegistryProps) => { 13 | const cache = React.useMemo(() => createCache(), []); 14 | useServerInsertedHTML(() => ( 15 |