From 550caa9c13f923f3ea328489c725a37d180ff641 Mon Sep 17 00:00:00 2001 From: Sadanand Pai Date: Sun, 14 Jul 2024 16:35:48 +0530 Subject: [PATCH] UI app addition --- .env.local | 9 +- apps/css/.gitignore | 24 + apps/css/package.json | 19 + .../src/challenges/shapes}/index.html | 6 +- .../src/challenges/shapes}/style.css | 0 apps/css/src/helpers/dom.js | 55 ++ apps/css/src/helpers/header.js | 34 + apps/css/src/helpers/navbar.ts | 46 ++ apps/css/src/vite-env.d.ts | 1 + apps/css/tsconfig.json | 8 + apps/css/vite.config.ts | 21 + .../src/components/modules/home/hero/hero.tsx | 44 +- .../modules/leaderboard/leaderboard-body.tsx | 3 +- .../leaderboard/leaderboard.module.scss | 2 +- apps/host/src/helpers/leaderboard.ts | 2 + apps/host/src/pages/challenges.tsx | 32 +- apps/javascript/vite.config.ts | 2 +- apps/react/vite.config.ts | 2 +- apps/vue/vite.config.ts | 2 +- package-lock.json | 758 +++++++++++++++++- shared/assets/tech/css.png | Bin 0 -> 32176 bytes shared/assets/tech/index.ts | 3 +- shared/data/content/css-challenges.ts | 17 + shared/data/content/index.ts | 1 + shared/data/content/js-challenges.ts | 10 - shared/data/content/react-challenges.ts | 28 +- 26 files changed, 1061 insertions(+), 68 deletions(-) create mode 100644 apps/css/.gitignore create mode 100644 apps/css/package.json rename apps/{javascript/src/challenges/css-shapes => css/src/challenges/shapes}/index.html (82%) rename apps/{javascript/src/challenges/css-shapes => css/src/challenges/shapes}/style.css (100%) create mode 100644 apps/css/src/helpers/dom.js create mode 100644 apps/css/src/helpers/header.js create mode 100644 apps/css/src/helpers/navbar.ts create mode 100644 apps/css/src/vite-env.d.ts create mode 100644 apps/css/tsconfig.json create mode 100644 apps/css/vite.config.ts create mode 100644 shared/assets/tech/css.png create mode 100644 shared/data/content/css-challenges.ts diff --git a/.env.local b/.env.local index 78670b279..62cc7bd1a 100644 --- a/.env.local +++ b/.env.local @@ -1,6 +1,7 @@ VITE_PATH=frontend-mini-challenges VITE_HOST_URL=http://localhost:6010/ -VITE_JS_APP_URL=http://localhost:6011/ -VITE_REACT_APP_URL=http://localhost:6012/ -VITE_VUE_APP_URL=http://localhost:6013/ -VITE_NG_APP_URL=http://localhost:6014/ \ No newline at end of file +VITE_CSS_APP_URL=http://localhost:6011/ +VITE_JS_APP_URL=http://localhost:6012/ +VITE_REACT_APP_URL=http://localhost:6013/ +VITE_VUE_APP_URL=http://localhost:6014/ +VITE_NG_APP_URL=http://localhost:6015/ \ No newline at end of file diff --git a/apps/css/.gitignore b/apps/css/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/apps/css/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/apps/css/package.json b/apps/css/package.json new file mode 100644 index 000000000..0b45ae89b --- /dev/null +++ b/apps/css/package.json @@ -0,0 +1,19 @@ +{ + "name": "@fmc/css", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "build-baseless": "tsc && vite build --base=/css/", + "preview": "vite preview" + }, + "devDependencies": { + "typescript": "^5.2.2", + "vite": "^5.3.1" + }, + "dependencies": { + "@fmc/data": "*" + } +} diff --git a/apps/javascript/src/challenges/css-shapes/index.html b/apps/css/src/challenges/shapes/index.html similarity index 82% rename from apps/javascript/src/challenges/css-shapes/index.html rename to apps/css/src/challenges/shapes/index.html index 2d05189bf..293cf83f9 100644 --- a/apps/javascript/src/challenges/css-shapes/index.html +++ b/apps/css/src/challenges/shapes/index.html @@ -1,10 +1,6 @@ - + - - - - diff --git a/apps/javascript/src/challenges/css-shapes/style.css b/apps/css/src/challenges/shapes/style.css similarity index 100% rename from apps/javascript/src/challenges/css-shapes/style.css rename to apps/css/src/challenges/shapes/style.css diff --git a/apps/css/src/helpers/dom.js b/apps/css/src/helpers/dom.js new file mode 100644 index 000000000..ed6190d86 --- /dev/null +++ b/apps/css/src/helpers/dom.js @@ -0,0 +1,55 @@ +export const create1DFragment = (m, { type = 'div', ...properties }) => { + const fragment = document.createDocumentFragment(); + + for (let i = 0; i < m; i++) { + const element = createElement(type, { ...properties, dataset: { x: i } }); + fragment.appendChild(element); + } + + return fragment; +}; + +export const create2DFragment = (m, n, { type = 'div', ...properties }) => { + const fragment = document.createDocumentFragment(); + + for (let i = 0; i < m; i++) { + const row = createElement('div'); + for (let j = 0; j < n; j++) { + const element = createElement(type, { ...properties, dataset: { x: i, y: j } }); + row.appendChild(element); + idx++; + } + fragment.appendChild(row); + } + + return fragment; +}; + +export const createGridFragment = (m, n, { type = 'div', ...properties }) => { + const fragment = document.createDocumentFragment(); + let idx = 0; + for (let i = 0; i < m; i++) { + for (let j = 0; j < n; j++) { + const element = createElement(type, { ...properties, dataset: { x: i, y: j, idx } }); + fragment.appendChild(element); + idx++; + } + } + + return fragment; +}; + +export const createElement = (type = 'div', properties) => { + const element = document.createElement(type); + Object.entries(properties).forEach(([key, value]) => { + if (typeof value === 'object') { + Object.entries(value).forEach(([subKey, subValue]) => { + element[key][subKey] = subValue; + }); + return; + } + + element[key] = value; + }); + return element; +}; diff --git a/apps/css/src/helpers/header.js b/apps/css/src/helpers/header.js new file mode 100644 index 000000000..b58afd5a2 --- /dev/null +++ b/apps/css/src/helpers/header.js @@ -0,0 +1,34 @@ +import '@fmc/shared-styles/theme'; +import '@fmc/shared-styles/base'; +import '@fmc/shared-styles/components'; +import '@fmc/shared-styles/utilities'; +import './navbar.ts'; +import { cssChallenges } from '@fmc/data/content'; + +const metaUTF = document.createElement('meta'); +metaUTF.setAttribute('charset', 'UTF-8'); + +const metaName = document.createElement('meta'); +metaName.setAttribute('name', 'viewport'); +metaName.setAttribute('content', 'width=device-width, initial-scale=1.0'); + +const metaHTTP = document.createElement('meta'); +metaHTTP.setAttribute('http-equiv', 'X-UA-Compatible'); +metaHTTP.setAttribute('content', 'IE=edge'); + +const favIcon = document.createElement('link'); +favIcon.setAttribute('rel', 'icon'); +favIcon.setAttribute('type', 'image/svg+xml'); +favIcon.setAttribute( + 'href', + 'https://github.com/sadanandpai/frontend-mini-challenges/raw/main/shared/assets/core/logo.png' +); + +// Add all tags to the head +const headTags = [metaUTF, metaName, metaHTTP, favIcon]; +headTags.forEach((tag) => document.head.prepend(tag)); + +// Add title +const challengeLink = window.location.pathname.split('/challenges/')[1].slice(0, -1); +const challenge = cssChallenges.get(challengeLink); +document.title = challenge.title; diff --git a/apps/css/src/helpers/navbar.ts b/apps/css/src/helpers/navbar.ts new file mode 100644 index 000000000..bd43a7a40 --- /dev/null +++ b/apps/css/src/helpers/navbar.ts @@ -0,0 +1,46 @@ +import { cssChallenges } from '@fmc/data/content'; +import { logo } from '@fmc/assets/images'; +import '@fmc/shared-styles/navbar'; + +const { VITE_PATH, VITE_HOST_URL, DEV } = import.meta.env; +const backURL = DEV ? `${VITE_HOST_URL}${VITE_PATH}/#/css/` : `/${VITE_PATH}/#/css/`; +const homeURL = DEV ? `${VITE_HOST_URL}${VITE_PATH}/` : `/${VITE_PATH}/`; + +const challengeLink = window.location.pathname.split('/challenges/')[1].slice(0, -1); +const challenge = cssChallenges.get(challengeLink)!; + +const navbar = document.createElement('nav'); +navbar.classList.add('challenge-navbar'); +navbar.innerHTML = ` +
+ + < + + +
+ +

${challenge.title}

+ +
+ ${ + challenge?.youtube + ? ` + + youtube solution + + ` + : '' + } + + github repo + +
+`; + +document.body.prepend(navbar); diff --git a/apps/css/src/vite-env.d.ts b/apps/css/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/apps/css/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/css/tsconfig.json b/apps/css/tsconfig.json new file mode 100644 index 000000000..566b507a4 --- /dev/null +++ b/apps/css/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "allowJs": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"] + }, + "include": ["src"] +} diff --git a/apps/css/vite.config.ts b/apps/css/vite.config.ts new file mode 100644 index 000000000..8d6036697 --- /dev/null +++ b/apps/css/vite.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vite'; +import { cssChallenges } from '../../shared/data/content/index'; + +const challengesPath = [...cssChallenges.values()].map( + (challenge) => `./src/challenges/${challenge.link}/index.html` +); + +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + rollupOptions: { + input: ['./src/helpers/navbar.ts', ...challengesPath], + }, + }, + server: { + port: 6011, + strictPort: true, + }, + base: '/frontend-mini-challenges/css/', + logLevel: 'silent', +}); diff --git a/apps/host/src/components/modules/home/hero/hero.tsx b/apps/host/src/components/modules/home/hero/hero.tsx index 18daf7539..7b0a02e85 100644 --- a/apps/host/src/components/modules/home/hero/hero.tsx +++ b/apps/host/src/components/modules/home/hero/hero.tsx @@ -1,25 +1,31 @@ -import { coverTransparent, jsImg, reactImg, vueImg, angularImg } from '@fmc/assets/images'; +import { coverTransparent, cssImg, jsImg, reactImg, vueImg, angularImg } from '@fmc/assets/images'; import styles from './hero.module.scss'; import { HashLink } from 'react-router-hash-link'; + +const allImg = [ + { + title: 'css', + imgSrc: cssImg, + }, + { + title: 'JS', + imgSrc: jsImg, + }, + { + title: 'react', + imgSrc: reactImg, + }, + { + title: 'vue', + imgSrc: vueImg, + }, + { + title: 'angular', + imgSrc: angularImg, + }, +]; + function Hero() { - const allImg = [ - { - title: 'JS', - imgSrc: jsImg, - }, - { - title: 'react', - imgSrc: reactImg, - }, - { - title: 'vue', - imgSrc: vueImg, - }, - { - title: 'angular', - imgSrc: angularImg, - }, - ]; return (
diff --git a/apps/host/src/components/modules/leaderboard/leaderboard-body.tsx b/apps/host/src/components/modules/leaderboard/leaderboard-body.tsx index ee7aec709..6f32f556e 100644 --- a/apps/host/src/components/modules/leaderboard/leaderboard-body.tsx +++ b/apps/host/src/components/modules/leaderboard/leaderboard-body.tsx @@ -1,12 +1,13 @@ import { generateLeaderboardData } from '@/helpers/leaderboard'; +import { jsImg, reactImg, vueImg, angularImg, cssImg } from '@fmc/assets/images'; import classes from './leaderboard.module.scss'; -import { jsImg, reactImg, vueImg, angularImg } from '@fmc/assets/images'; function cn(...classnames: string[]) { return classnames.join(' '); } const techStackImgs = new Map([ + ['css', cssImg], ['js', jsImg], ['react', reactImg], ['vue', vueImg], diff --git a/apps/host/src/components/modules/leaderboard/leaderboard.module.scss b/apps/host/src/components/modules/leaderboard/leaderboard.module.scss index cdf2ca3a4..73365e346 100644 --- a/apps/host/src/components/modules/leaderboard/leaderboard.module.scss +++ b/apps/host/src/components/modules/leaderboard/leaderboard.module.scss @@ -75,7 +75,7 @@ table.leaderboardTable { .contributionTableCell { display: grid; - grid-template-columns: repeat(5, 1fr); + grid-template-columns: repeat(6, 1fr); .techStackDiv { font-size: 14px; diff --git a/apps/host/src/helpers/leaderboard.ts b/apps/host/src/helpers/leaderboard.ts index 9853cd179..90f135e81 100644 --- a/apps/host/src/helpers/leaderboard.ts +++ b/apps/host/src/helpers/leaderboard.ts @@ -1,6 +1,7 @@ import { contributors, angularChallenges, + cssChallenges, jsChallenges, reactChallenges, vueChallenges, @@ -45,6 +46,7 @@ export function updateContributions( export const generateLeaderboardData = (): Map => { const developerContributions: Map = new Map(); const techChallengesMap = new Map([ + ['css', cssChallenges], ['js', jsChallenges], ['react', reactChallenges], ['vue', vueChallenges], diff --git a/apps/host/src/pages/challenges.tsx b/apps/host/src/pages/challenges.tsx index 483f93f2c..b5ad48560 100644 --- a/apps/host/src/pages/challenges.tsx +++ b/apps/host/src/pages/challenges.tsx @@ -3,17 +3,41 @@ import { useNavigate, useParams } from 'react-router-dom'; import Navbar from '@/components/common/navbar/navbar'; import ScrollBtn from '@/components/common/scroll-to-top/scroll-btn'; import ChallengeGrid from '@/components/modules/challenges/challenge-grid/challenge-grid'; -import { angularImg, jsImg, reactImg, vueImg } from '@fmc/assets/images'; -import { angularChallenges, jsChallenges, reactChallenges, vueChallenges } from '@fmc/data/content'; +import { angularImg, jsImg, reactImg, cssImg, vueImg } from '@fmc/assets/images'; +import { + angularChallenges, + jsChallenges, + reactChallenges, + cssChallenges, + vueChallenges, +} from '@fmc/data/content'; -const { VITE_PATH, VITE_JS_APP_URL, VITE_REACT_APP_URL, VITE_VUE_APP_URL, VITE_NG_APP_URL, DEV } = - import.meta.env; +const { + VITE_PATH, + VITE_CSS_APP_URL, + VITE_JS_APP_URL, + VITE_REACT_APP_URL, + VITE_VUE_APP_URL, + VITE_NG_APP_URL, + DEV, +} = import.meta.env; + +const cssLinkPrefix = DEV ? `${VITE_CSS_APP_URL}${VITE_PATH}` : `/${VITE_PATH}`; const jsLinkPrefix = DEV ? `${VITE_JS_APP_URL}${VITE_PATH}` : `/${VITE_PATH}`; const reactLinkPrefix = DEV ? `${VITE_REACT_APP_URL}${VITE_PATH}` : `/${VITE_PATH}`; const vueLinkPrefix = DEV ? `${VITE_VUE_APP_URL}${VITE_PATH}` : `/${VITE_PATH}`; const angularPrefix = DEV ? `${VITE_NG_APP_URL}${VITE_PATH}` : `/${VITE_PATH}`; const techMap = new Map([ + [ + 'css', + { + title: 'CSS', + challenges: cssChallenges, + link: cssLinkPrefix + '/css/src/challenges/', + imgSrc: cssImg, + }, + ], [ 'javascript', { diff --git a/apps/javascript/vite.config.ts b/apps/javascript/vite.config.ts index 77f7f1c33..067ee39f0 100644 --- a/apps/javascript/vite.config.ts +++ b/apps/javascript/vite.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ }, }, server: { - port: 6011, + port: 6012, strictPort: true, }, base: '/frontend-mini-challenges/javascript/', diff --git a/apps/react/vite.config.ts b/apps/react/vite.config.ts index 649c6eeba..e2182dbd2 100644 --- a/apps/react/vite.config.ts +++ b/apps/react/vite.config.ts @@ -11,7 +11,7 @@ export default defineConfig({ }, }, server: { - port: 6012, + port: 6013, strictPort: true, }, base: '/frontend-mini-challenges/react/', diff --git a/apps/vue/vite.config.ts b/apps/vue/vite.config.ts index da777f44c..8dc62d25f 100644 --- a/apps/vue/vite.config.ts +++ b/apps/vue/vite.config.ts @@ -11,7 +11,7 @@ export default defineConfig({ }, }, server: { - port: 6013, + port: 6015, strictPort: true, }, base: '/frontend-mini-challenges/vue/', diff --git a/package-lock.json b/package-lock.json index 2d868c4db..7865460b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1176,6 +1176,693 @@ } } }, + "apps/ui": { + "version": "1.0.0", + "dependencies": { + "@fmc/data": "*" + }, + "devDependencies": { + "typescript": "^5.2.2", + "vite": "^5.3.1" + } + }, + "apps/ui/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "apps/ui/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "apps/ui/node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "apps/ui/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "apps/ui/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "apps/ui/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "apps/ui/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "apps/ui/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "apps/ui/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "apps/ui/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "apps/ui/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "apps/ui/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "apps/ui/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "apps/ui/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "apps/ui/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "apps/ui/node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "apps/ui/node_modules/rollup": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", + "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.1", + "@rollup/rollup-android-arm64": "4.18.1", + "@rollup/rollup-darwin-arm64": "4.18.1", + "@rollup/rollup-darwin-x64": "4.18.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", + "@rollup/rollup-linux-arm-musleabihf": "4.18.1", + "@rollup/rollup-linux-arm64-gnu": "4.18.1", + "@rollup/rollup-linux-arm64-musl": "4.18.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", + "@rollup/rollup-linux-riscv64-gnu": "4.18.1", + "@rollup/rollup-linux-s390x-gnu": "4.18.1", + "@rollup/rollup-linux-x64-gnu": "4.18.1", + "@rollup/rollup-linux-x64-musl": "4.18.1", + "@rollup/rollup-win32-arm64-msvc": "4.18.1", + "@rollup/rollup-win32-ia32-msvc": "4.18.1", + "@rollup/rollup-win32-x64-msvc": "4.18.1", + "fsevents": "~2.3.2" + } + }, + "apps/ui/node_modules/vite": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", + "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "apps/vue": { "name": "@fmc/vue", "version": "1.0.0", @@ -4150,6 +4837,22 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.19.5", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", @@ -4708,6 +5411,10 @@ "resolved": "shared/styles", "link": true }, + "node_modules/@fmc/ui": { + "resolved": "apps/ui", + "link": true + }, "node_modules/@fmc/vue": { "resolved": "apps/vue", "link": true @@ -6780,6 +7487,19 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.1.tgz", @@ -6806,6 +7526,19 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.1.tgz", @@ -6819,6 +7552,19 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.1.tgz", @@ -18466,9 +19212,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "3.0.1", @@ -21427,9 +22173,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } diff --git a/shared/assets/tech/css.png b/shared/assets/tech/css.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a1f89eb264133113730e203c79e0ed414d495a GIT binary patch literal 32176 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 literal 0 HcmV?d00001 diff --git a/shared/assets/tech/index.ts b/shared/assets/tech/index.ts index b1abd617a..896b1d72b 100644 --- a/shared/assets/tech/index.ts +++ b/shared/assets/tech/index.ts @@ -1,6 +1,7 @@ +import cssImg from './css.png'; import angularImg from './angular.png'; import jsImg from './js.png'; import reactImg from './react.png'; import vueImg from './vue.png'; -export { angularImg, jsImg, reactImg, vueImg }; +export { angularImg, jsImg, reactImg, cssImg, vueImg }; diff --git a/shared/data/content/css-challenges.ts b/shared/data/content/css-challenges.ts new file mode 100644 index 000000000..23458c3a9 --- /dev/null +++ b/shared/data/content/css-challenges.ts @@ -0,0 +1,17 @@ +import { EDifficulty, type IChallenge } from '../types/challenge'; +import { sortChallengesByDifficulty } from '../utils/challenges.helper'; + +const challenges: Map = new Map([ + [ + 'shapes', + { + title: 'Shapes', + link: 'shapes/', + difficulty: EDifficulty.Easy, + developer: 'sadanandpai', + tags: [], + }, + ], +]); + +export const cssChallenges = sortChallengesByDifficulty(challenges); diff --git a/shared/data/content/index.ts b/shared/data/content/index.ts index 75db2b135..ab3ed4519 100644 --- a/shared/data/content/index.ts +++ b/shared/data/content/index.ts @@ -1,4 +1,5 @@ export { contributors } from './contributors'; +export { cssChallenges } from './css-challenges'; export { jsChallenges } from './js-challenges'; export { reactChallenges } from './react-challenges'; export { vueChallenges } from './vue-challenges'; diff --git a/shared/data/content/js-challenges.ts b/shared/data/content/js-challenges.ts index 5c47c8a4a..5505d0759 100644 --- a/shared/data/content/js-challenges.ts +++ b/shared/data/content/js-challenges.ts @@ -314,16 +314,6 @@ const challenges: Map = new Map([ tags: [], }, ], - [ - 'css-shapes', - { - title: 'CSS Shapes', - link: 'css-shapes/', - difficulty: EDifficulty.Medium, - developer: 'sadanandpai', - tags: [], - }, - ], [ 'column-table', { diff --git a/shared/data/content/react-challenges.ts b/shared/data/content/react-challenges.ts index 95e67ea08..6fe36dc89 100644 --- a/shared/data/content/react-challenges.ts +++ b/shared/data/content/react-challenges.ts @@ -424,6 +424,18 @@ const challenges = new Map([ tags: [], }, ], + [ + 'nested-comments', + { + title: 'Nested Comments', + link: 'nested-comments', + difficulty: EDifficulty.Hard, + developer: 'Akshay-Omkar', + // contributors: ['arpansaha13'], + tags: [], + isNew: true, + }, + ], [ 'password-generator', { @@ -469,7 +481,7 @@ const challenges = new Map([ { title: 'Word Connect', link: 'word-connect', - difficulty: EDifficulty.Medium, + difficulty: EDifficulty.Hard, developer: 'sadanandpai', tags: [], isNew: true, @@ -480,7 +492,7 @@ const challenges = new Map([ { title: 'OTP', link: 'otp', - difficulty: EDifficulty.Medium, + difficulty: EDifficulty.Hard, developer: 'rishabhm05', tags: [], }, @@ -547,18 +559,6 @@ const challenges = new Map([ isNew: true, }, ], - [ - 'nested-comments', - { - title: 'Nested Comments', - link: 'nested-comments', - difficulty: EDifficulty.Medium, - developer: 'Akshay-Omkar', - // contributors: ['arpansaha13'], - tags: [], - isNew: true, - }, - ], [ '15puzzle', {