diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 000000000..a607b13b0 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,7 @@ +{ + "extends": "stylelint-config-standard", + "rules": { + "indentation": 2, + "color-no-invalid-hex": true + } +} \ No newline at end of file diff --git a/docusaurus.config.ts b/docusaurus.config.ts index fabc5e3b5..4a370cf8f 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -77,7 +77,7 @@ const config: Config = { title: "", logo: { alt: "QuantStack Logo", - src: "img/quantstack/logo-website.svg", + src: "img/quantstack/logo-website-smaller.svg", }, items: [ @@ -110,10 +110,17 @@ const config: Config = { className: "custom_navbar_item", label: "Blog", position: "left", + }, + { + to: "/fundable/", + className: "custom_navbar_item", + label: "Fundable projects", + position: "right", + className:"fundable_projects" }, { to: "/contact/", - label: "CONTACT US", + label: "Contact us", position: "right", className: "contact", }, diff --git a/package-lock.json b/package-lock.json index a82a933c1..f9493a7d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,7 @@ "@types/node": "^20.12.12", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", + "stylelint": "^16.21.1", "typescript": "^5.8.3" }, "engines": { @@ -3904,6 +3905,17 @@ "node": ">=18.0" } }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", @@ -4718,6 +4730,41 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, + "node_modules/@keyv/serialize/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -6538,6 +6585,16 @@ "node": ">=0.8" } }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/astring": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", @@ -6993,6 +7050,17 @@ "node": ">= 0.8" } }, + "node_modules/cacheable": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.1.tgz", + "integrity": "sha512-Fa2BZY0CS9F0PFc/6aVA6tgpOdw+hmv9dkZOlHXII5v5Hw+meJBIWDcPrG9q/dXxGcNbym5t77fzmawrBQfTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.10.0", + "keyv": "^5.3.4" + } + }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -7032,6 +7100,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.4.tgz", + "integrity": "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.0.3" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -7961,6 +8039,16 @@ "postcss": "^8.0.9" } }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, "node_modules/css-has-pseudo": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", @@ -8836,6 +8924,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -9379,6 +9477,16 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -9449,6 +9557,16 @@ "node": ">=0.8.0" } }, + "node_modules/file-entry-cache": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz", + "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.10" + } + }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -9597,6 +9715,25 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.11.tgz", + "integrity": "sha512-zfOAns94mp7bHG/vCn9Ru2eDCmIxVQ5dELUHKjHfDEOJmHNzE+uGa6208kfkgmtym4a0FFjEuFksCXFacbVhSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^1.10.1", + "flatted": "^3.3.3", + "hookified": "^1.10.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -9967,6 +10104,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9996,6 +10181,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -10426,6 +10618,13 @@ "react-is": "^16.7.0" } }, + "node_modules/hookified": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.10.0.tgz", + "integrity": "sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==", + "dev": true, + "license": "MIT" + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -11610,6 +11809,13 @@ "node": ">=6" } }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, "node_modules/latest-version": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", @@ -11740,6 +11946,13 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -11853,6 +12066,17 @@ "node": ">= 0.4" } }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/mdast-util-directive": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", @@ -12282,6 +12506,19 @@ "node": ">= 4.0.0" } }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -16475,6 +16712,40 @@ "postcss": "^8.0.3" } }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, "node_modules/postcss-selector-not": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", @@ -18589,6 +18860,24 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/slick-carousel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", @@ -18976,6 +19265,240 @@ "postcss": "^8.4.31" } }, + "node_modules/stylelint": { + "version": "16.21.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.1.tgz", + "integrity": "sha512-WCXdXnYK2tpCbebgMF0Bme3YZH/Rh/UXerj75twYo4uLULlcrLwFVdZTvTEF8idFnAcW21YUDJFyKOfaf6xJRw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.4.1", + "fast-glob": "^3.3.3", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^10.1.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^7.0.5", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.37.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.6", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.2.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stylelint/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -18993,6 +19516,23 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -19011,6 +19551,12 @@ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "license": "MIT" }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, "node_modules/svgo": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", @@ -19045,6 +19591,69 @@ "node": ">= 10" } }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tapable": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", diff --git a/package.json b/package.json index 3a76ddafa..03a102e4e 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "@types/node": "^20.12.12", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", + "stylelint": "^16.21.1", "typescript": "^5.8.3" }, "browserslist": { diff --git a/src/components/about/LargePortraitCardPage.tsx b/src/components/about/LargePortraitCardPage.tsx index 234340813..5845edc62 100644 --- a/src/components/about/LargePortraitCardPage.tsx +++ b/src/components/about/LargePortraitCardPage.tsx @@ -54,9 +54,9 @@ export default function LargePortraitCardPage() { if (!person) return null; return ( -
+
e.stopPropagation()} >
+
+
    +
  • + Fundable projects +
  • +
  • + Contact us +
  • +
+
diff --git a/src/components/fundable/GetAQuoteForm.tsx b/src/components/fundable/GetAQuoteForm.tsx new file mode 100644 index 000000000..af0ff675b --- /dev/null +++ b/src/components/fundable/GetAQuoteForm.tsx @@ -0,0 +1,88 @@ +import styles from "./styles.module.css"; + +export default function GetAQuoteForm() { + return ( +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/fundable/GetAQuotePage.tsx b/src/components/fundable/GetAQuotePage.tsx new file mode 100644 index 000000000..405cff4c5 --- /dev/null +++ b/src/components/fundable/GetAQuotePage.tsx @@ -0,0 +1,72 @@ + +import styles from "./styles.module.css"; +import GetAQuoteForm from "./GetAQuoteForm" +import { LargeProjectCardContent } from "./LargeProjectCard"; +import { useHistory, useLocation } from "@docusaurus/router"; +import Layout from "@theme/Layout"; +import { Route } from 'react-router-dom'; +import { getCategoryFromProjectPageName } from "."; +import FundableProjects from "."; + +function GetAQuoteComponent({ project }) { + return ( +
+
+
+ +
+
+

Get a quote

+
+
+
+

Get a quote

+
+
+
+
+ ) +} +export default function GetAQuotePage() { + const location = useLocation(); + const history = useHistory(); + + const handleClose = () => { + history.push('/fundable'); + + } + return ( + + + { + const { pageName } = match.params; /* extract the dynamic part from the url i.e. the pageName*/ + const projectsByCategory = getCategoryFromProjectPageName(pageName); + const project = projectsByCategory.find((project) => project.pageName === pageName); + if (!project) return null; + + return ( +
+
e.stopPropagation()} + > +
+
+ ); + }} + /> +
+ ) +} \ No newline at end of file diff --git a/src/components/fundable/IconContainer.tsx b/src/components/fundable/IconContainer.tsx new file mode 100644 index 000000000..80714af8e --- /dev/null +++ b/src/components/fundable/IconContainer.tsx @@ -0,0 +1,26 @@ +import styles from "./styles.module.css"; +import Link from "@docusaurus/Link"; +import GHPicture from "@site/static/img/socialmedias/GH.svg"; +import LinkedInPicture from "@site/static/img/socialmedias/LinkedIn.svg"; +import BlueskyPicture from "@site/static/img/socialmedias/Bluesky.svg"; +import MastodonPicture from "@site/static/img/socialmedias/Mastodon.svg"; + +export default function IconContainer({ project }) { + const icons = project.icons + return ( + + +
+ {icons.map((Icon, index) => ( +
+ +
+ ))} +
+ ); + + +} diff --git a/src/components/fundable/LargeProjectCard.tsx b/src/components/fundable/LargeProjectCard.tsx new file mode 100644 index 000000000..2b95bed29 --- /dev/null +++ b/src/components/fundable/LargeProjectCard.tsx @@ -0,0 +1,51 @@ +import styles from "./styles.module.css"; +import React from "react"; +import IconContainer from "./IconContainer"; +import LinkToGetAQuote from "./LinkToGetAQuote"; +import { useHistory, useLocation } from "@docusaurus/router"; + +export function LargeProjectCardContent({ project }) { + const history = useHistory(); + const location = useLocation(); + + function openDialog() { + const pageName = project.pageName; + + history.push({ + pathname: `/fundable/${pageName}/GetAQuote`, + state: { from: location.pathname, scrollY: window.scrollY }, + }); + } + return ( +
+
+
+
{project.title}
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ ) +} +export default function LargeProjectCard({ project }) { + return ( +
+ +
+
+
+
+
+
+ ); +} diff --git a/src/components/fundable/LargeProjectCardPage.tsx b/src/components/fundable/LargeProjectCardPage.tsx new file mode 100644 index 000000000..e634bd156 --- /dev/null +++ b/src/components/fundable/LargeProjectCardPage.tsx @@ -0,0 +1,79 @@ +import { useHistory, useLocation } from "@docusaurus/router"; +import { useEffect } from "react"; +import styles from "./styles.module.css"; +import LargeProjectCard from "./LargeProjectCard"; +import { getCategoryFromProjectPageName } from "."; +import FundableProjects from "."; +import Layout from "@theme/Layout"; +import { Route } from 'react-router-dom'; + + +export default function LargeProjectCardPage() { + const location = useLocation(); + const history = useHistory(); + + useEffect(() => { + if (location.state?.fromFundable) { + window.scrollTo({ top: location.state.scrollY ?? 0, behavior: 'auto' }); + } + }, []); + + const handleOverlayClick = () => { + const scrollY = location.state?.scrollY; + setTimeout(() => { + if (scrollY !== undefined) { + window.scrollTo({ top: scrollY, behavior: 'auto' }); + } + }, 0); + history.replace('/fundable'); + }; + + const handleClose = () => { + const scrollY = location.state?.scrollY; + if (location.state?.fromFundable) { + history.replace('/fundable'); + + setTimeout(() => { + if (scrollY !== undefined) { + window.scrollTo({ top: scrollY, behavior: 'auto' }); + } + }, 0); + } else { + history.goBack(); + } + } + return ( + + + { + const { pageName } = match.params; /* extract the dynamic part from the url i.e. the pageName*/ + const projectsByCategory = getCategoryFromProjectPageName(pageName); + const project = projectsByCategory.find((project) => project.pageName === pageName); + if (!project) return null; + + return ( +
+
e.stopPropagation()} + > +
+
+ ); + }} + /> +
+ ) +} \ No newline at end of file diff --git a/src/components/fundable/LinkToGetAQuote.tsx b/src/components/fundable/LinkToGetAQuote.tsx new file mode 100644 index 000000000..db1e14a07 --- /dev/null +++ b/src/components/fundable/LinkToGetAQuote.tsx @@ -0,0 +1,16 @@ +import styles from "./styles.module.css"; +import Link from "@docusaurus/Link"; + +export default function LinkToGetAQuote({label, pageName}) { + const pathname = "/fundable/"+ pageName+ "/GetAQuote" + return ( +
+ + {label} + +
+ ); +} diff --git a/src/components/fundable/LinkToMoreInformation.tsx b/src/components/fundable/LinkToMoreInformation.tsx new file mode 100644 index 000000000..89e17c158 --- /dev/null +++ b/src/components/fundable/LinkToMoreInformation.tsx @@ -0,0 +1,16 @@ +import styles from "./styles.module.css"; +import Link from "@docusaurus/Link"; + +export default function LinkToMoreInformation({label, pageName}) { + const pathname = "/fundable/"+ pageName + return ( +
+ + {label} + +
+ ); +} diff --git a/src/components/fundable/MenuSideBar.tsx b/src/components/fundable/MenuSideBar.tsx new file mode 100644 index 000000000..534c43aa7 --- /dev/null +++ b/src/components/fundable/MenuSideBar.tsx @@ -0,0 +1,48 @@ +// src/components/ScrollSidebar.js +import React, { useEffect, useState } from 'react'; +import styles from "./styles.module.css"; + +const sections = [ + { id: 'jupyter-ecosystem', label: 'Jupyter Ecosystem' }, + { id: 'package-management', label: 'Package Management' }, +]; + +export default function MenuSideBar() { + const [activeSectionId, setActiveSectionId] = useState('jupyter-ecosystem'); + + useEffect(() => { + const handleScroll = () => { + const scrollPosition = window.scrollY + 300; + for (const section of sections) { + const element = document.getElementById(section.id); + if (element && element.offsetTop <= scrollPosition) { + setActiveSectionId(section.id); + } + } + }; + window.addEventListener('scroll', handleScroll); + handleScroll(); + return () => window.removeEventListener('scroll', handleScroll); + }, []); + + return ( +
+ +
+ ); +} diff --git a/src/components/fundable/ProgressBar.tsx b/src/components/fundable/ProgressBar.tsx new file mode 100644 index 000000000..7e961b322 --- /dev/null +++ b/src/components/fundable/ProgressBar.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +export default function ProgressBar({ value = 0, color = '#4caf50' }) { + return ( +
+
+ +
+
+
+ ); +} diff --git a/src/components/fundable/ProjectCategory.tsx b/src/components/fundable/ProjectCategory.tsx new file mode 100644 index 000000000..aca991758 --- /dev/null +++ b/src/components/fundable/ProjectCategory.tsx @@ -0,0 +1,22 @@ +import styles from "./styles.module.css"; +import { SmallProjectCard } from "./SmallProjectCard"; + + +export default function ProjectCategory({ projectCategoryName, projectCategory }) { + return ( +
+

{projectCategoryName }

+
+
    + {projectCategory.map((project) => ( +
  • +
    + +
    +
  • + ))} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/fundable/SmallProjectCard.tsx b/src/components/fundable/SmallProjectCard.tsx new file mode 100644 index 000000000..dba7e93d9 --- /dev/null +++ b/src/components/fundable/SmallProjectCard.tsx @@ -0,0 +1,103 @@ +import styles from "./styles.module.css"; +import { useHistory } from "@docusaurus/router"; +import BlueCaretIcon from "@site/static/img/icons/BlueCaret.svg"; +import LinkToMoreInformation from "./LinkToMoreInformation"; +import ProgressBar from "./ProgressBar"; +import FundersIcon from "@site/static/img/icons/Funders.svg"; +import DollarIcon from "@site/static/img/icons/Dollar.svg"; + +export function SmallProjectCard({ project }) { + const history = useHistory(); + + function openDialog() { + const pageName = project.pageName; + + history.push({ + pathname: `/fundable/${pageName}`, + state: { fromFundable: true, scrollY: window.scrollY }, + }); + } + + return ( +
+
+
+
+
+
+ {project.title} +
+
+
+ +
+
+
+ {project.shortDescription.length < 250 + ? project.shortDescription + : project.shortDescription.substring(0, 250) + "..."} +
+
+
+
+
+ +
+
+ Open-source under relevant licenses +
+
+
+
+ +
+
+ The funding organization will be credited in communication about the project +
+
+ +
Note: Costs and features can be further adapted following discussion with the funding organization
+
+
+
+
+ {project.price} +
+
+
+ Indicative price +
+
+ Funded at {project.currentFundingPercentage} % +
+
+ +
+
+
+
{project.maxNbOfFunders === 1 + ? 'Not shareable between funders' + : `Shareable between ${project.maxNbOfFunders} funders` + } +
+
+
+
+
+ {project.currentNbOfFunders === 0 + ? 'This project does not have any backers yet' + : `Backed by ${project.currentNbOfFunders} + ${project.currentNbOfFunders === 1 ? 'funder' : 'funders'} + `} +
+
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/src/components/fundable/descriptions/EmscriptenForgePackageRequests.md b/src/components/fundable/descriptions/EmscriptenForgePackageRequests.md new file mode 100644 index 000000000..ea94e7b78 --- /dev/null +++ b/src/components/fundable/descriptions/EmscriptenForgePackageRequests.md @@ -0,0 +1,18 @@ +#### Overview +Emscripten-forge is a conda package distribution specifically designed for WebAssembly. When combined with JupyterLite and the jupyterlite-xeus extension, it enables easy deployment of JupyterLite with a preconfigured conda environment that includes essential packages like NumPy, Pandas, Matplotlib, and more. + +While the number of available emscripten-forge packages is growing quickly, many packages are still missing from the ecosystem. + +We will be working on adding new packages upon request. + +#### Option A +This is option A. + +#### Option B +This is option B. + +#### Custom option +This is custom option. + + +##### Are you interested in this project? Either entirely or partially, contact us for more information on how to help us fund it \ No newline at end of file diff --git a/src/components/fundable/descriptions/JupyterGISRasterProcessing.md b/src/components/fundable/descriptions/JupyterGISRasterProcessing.md new file mode 100644 index 000000000..e74895a50 --- /dev/null +++ b/src/components/fundable/descriptions/JupyterGISRasterProcessing.md @@ -0,0 +1,21 @@ +#### Overview +Similar to QGIS, JupyterGIS currently offers a set of vector processing and conversion tools such as buffer creation, centroid calculation, and convex hull generation. These capabilities are powered by a GDAL WebAssembly (WASM) build running in the browser. + +We will work on extending support to raster processing tools using the same underlying technology. Planned features (non-exhaustive and subject to request needs) include: + +- Clipping by extent +- Clipping by mask layer +- Generating contours +- Polygonizing raster data + +#### Option A +This is option A. + +#### Option B +This is option B. + +#### Custom option +This is custom option. + + +##### Are you interested in this project? Either entirely or partially, contact us for more information on how to help us fund it \ No newline at end of file diff --git a/src/components/fundable/descriptions/JupyterGISToolsForPythonAPI.md b/src/components/fundable/descriptions/JupyterGISToolsForPythonAPI.md new file mode 100644 index 000000000..a3c945983 --- /dev/null +++ b/src/components/fundable/descriptions/JupyterGISToolsForPythonAPI.md @@ -0,0 +1,16 @@ +#### Overview +JupyterGIS currently supports several vector processing and conversion tools such as buffer creation, centroid computation, and convex hull generation, similar to what QGIS offers. These features are powered by a GDAL WebAssembly (WASM) build and are currently available only through the JupyterGIS user interface. + +We plan to extend these capabilities to the JupyterGIS Python API, enabling users to access the same processing tools programmatically, just as they would via the UI. This functionality will be implemented using the GDAL Python bindings. + +#### Option A +This is option A. + +#### Option B +This is option B. + +#### Custom option +This is custom option. + + +##### Are you interested in this project? Either entirely or partially, contact us for more information on how to help us fund it \ No newline at end of file diff --git a/src/components/fundable/descriptions/JupyterLabParquetFileViewer.md b/src/components/fundable/descriptions/JupyterLabParquetFileViewer.md new file mode 100644 index 000000000..dc53f7ac4 --- /dev/null +++ b/src/components/fundable/descriptions/JupyterLabParquetFileViewer.md @@ -0,0 +1,14 @@ +#### Overview +To be written. + +#### Option A +This is option A. + +#### Option B +This is option B. + +#### Custom option +This is custom option. + + +##### Are you interested in this project? Either entirely or partially, contact us for more information on how to help us fund it \ No newline at end of file diff --git a/src/components/fundable/descriptions/NbconvertModernization.md b/src/components/fundable/descriptions/NbconvertModernization.md new file mode 100644 index 000000000..eed71f638 --- /dev/null +++ b/src/components/fundable/descriptions/NbconvertModernization.md @@ -0,0 +1,18 @@ +#### Overview +Conversion of Jupyter notebooks to PDF currently relies on nbconvert in the backend, which in turns uses a headless browser for producing the PDF. We propose to directly perform the PDF conversion in the user's browser, which will simplify the architecture and make it function with JupyterLite. + +Nbconvert heavily relies on Jinja2 templates for conversion to different formats. + +We will utilize a JavaScript implementation of Jinja2 covering the required features of Jinja to produce a frontend version of nbconvert that does not require Python but still provides a good coverage of the nbconvert features, including the use of custom templates. + +#### Option A +This is option A. + +#### Option B +This is option B. + +#### Custom option +This is custom option. + + +##### Are you interested in this project? Either entirely or partially, contact us for more information on how to help us fund it \ No newline at end of file diff --git a/src/components/fundable/index.tsx b/src/components/fundable/index.tsx new file mode 100644 index 000000000..23176898a --- /dev/null +++ b/src/components/fundable/index.tsx @@ -0,0 +1,56 @@ +import styles from "./styles.module.css"; +import { fundableProjectsDetails } from "./projectsDetails"; +import ProjectCategory from "./ProjectCategory"; +import MenuSidebar from "./MenuSideBar"; + +export function getCategoryFromProjectPageName(pageName: string) { + for (const [categoryName, projectsByCategory] of Object.entries(fundableProjectsDetails)) { + const project = projectsByCategory.find((project) => project.pageName === pageName); + if (project) { + return projectsByCategory; + } + } + return null; +} + +export function MainAreaFundableProjects() { + return ( +
+

Check out our projects available for funding!

+ +
+ +
+
+ +
+
+ + ) +} + +export default function FundableProjects() { + return ( + +
+
+
+ +
+
+ +
+
+ +
+
+
+ + ); +} diff --git a/src/components/fundable/projectsDetails.ts b/src/components/fundable/projectsDetails.ts new file mode 100644 index 000000000..0c6727239 --- /dev/null +++ b/src/components/fundable/projectsDetails.ts @@ -0,0 +1,85 @@ +import NbconvertModernizationMD from "@site/src/components/fundable/descriptions/NbconvertModernization.md" +import JupyterGISRasterProcessingMD from "@site/src/components/fundable/descriptions/JupyterGISRasterProcessing.md" +import JupyterGISToolsForPythonAPIMD from "@site/src/components/fundable/descriptions/JupyterGISToolsForPythonAPI.md" +import EmscriptenForgePackageRequestsMD from "@site/src/components/fundable/descriptions/EmscriptenForgePackageRequests.md" +import JupyterLabParquetFileViewerMD from "@site/src/components/fundable/descriptions/JupyterLabParquetFileViewer.md" +import JupyterGISIcon from "/img/icons/JupyterGIS.svg"; +import ToolsIcon from "/img/icons/Tools.svg"; +import PythonIcon from "/img/icons/Python.svg"; +import GlobeIcon from "/img/icons/Globe.svg"; +import EmptyIcon from "/img/icons/Empty.svg"; +import JupyterIcon from "/img/icons/Jupyter.svg"; +import EmscriptenForgeIcon from "/img/icons/EmscriptenForge.svg"; + +export const fundableProjectsDetails = { + jupyterEcosystem: [ + { + category: "Jupyter Ecosystem", + title: "Modernize nbconvert", + pageName: "NbconvertModernization", + shortDescription: "Conversion of Jupyter notebooks to PDF currently relies on nbconvert in the backend, which in turns uses a headless browser for producing the PDF. We propose to directly perform the PDF conversion in the user's browser, which will simplify the architecture and make it function with JupyterLite.", + description: NbconvertModernizationMD, + icons: [JupyterIcon, EmptyIcon, EmptyIcon, EmptyIcon, EmptyIcon, EmptyIcon], + price: "15000 €", + maxNbOfFunders: 3, + currentNbOfFunders: 2, + currentFundingPercentage: 65, + note: "Note: Costs and features can be further adapted following discussion with the funding organization. Open-source under relevant licenses. The funding organization will be credited in communication about the project.", + repoLink: "https://github.com/jupyter/nbconvert" + }, + { + category: "Jupyter Ecosystem", + title: "Raster processing tools in JupyterGIS", + pageName: "JupyterGISRasterProcessing", + shortDescription: "JupyterGIS currently offers a set of vector processing and conversion tools. These capabilities are powered by a GDAL WebAssembly (WASM) build running in the browser. We will work on extending support to raster processing tools using the same underlying technology.", + description: JupyterGISRasterProcessingMD, + icons: [JupyterIcon, JupyterGISIcon, ToolsIcon, PythonIcon, GlobeIcon, EmptyIcon], + price: "15000 €", + maxNbOfFunders: 4, + currentNbOfFunders: 2, + currentFundingPercentage: 45, + repoLink: "https://github.com/geojupyter/jupytergis" + }, + { + category: "Jupyter Ecosystem", + title: "Bringing processing tools to the JupyterGIS Python API", + pageName: "JupyterGISToolsForPythonAPI", + shortDescription: "JupyterGIS currently supports several vector processing and conversion tools, currently available only through the JupyterGIS user interface. We plan to extend these capabilities to the JupyterGIS Python API, enabling users to access the same processing tools programmatically. ", + description: JupyterGISToolsForPythonAPIMD, + icons: [JupyterIcon, JupyterGISIcon, ToolsIcon, PythonIcon, GlobeIcon, EmptyIcon], + price: "10000 €", + maxNbOfFunders: 2, + currentNbOfFunders: 0, + currentFundingPercentage: 15, + repoLink: "https://github.com/geojupyter/jupytergis" + }, + { + category: "Jupyter Ecosystem", + title: "Parquet File Viewer For JupyterLab", + pageName: "JupyterLabParquetFileViewer", + shortDescription: "", + description: JupyterLabParquetFileViewerMD, + icons: [JupyterIcon, EmptyIcon, EmptyIcon, EmptyIcon, EmptyIcon, EmptyIcon], + price: "10000 €", + maxNbOfFunders: 3, + currentNbOfFunders: 1, + currentFundingPercentage: 15, + repoLink: "https://github.com/jupyterlab/jupyterlab" + } + ], + packageManagement: [ + { + category: "Package Management", + title: "Package requests for emscripten-forge", + pageName: "EmscriptenForgePackageRequests", + shortDescription: "Emscripten-forge is a conda package distribution specifically designed for WebAssembly. While the number of available emscripten-forge packages is growing quickly, many packages are still missing from the ecosystem. We will be working on adding new packages upon request.", + description: EmscriptenForgePackageRequestsMD, + icons: [EmscriptenForgeIcon, EmptyIcon, EmptyIcon, EmptyIcon, EmptyIcon, EmptyIcon], + price: "TBD", + maxNbOfFunders: 1, + currentNbOfFunders: 0, + currentFundingPercentage: 0, + repoLink: "https://github.com/mamba-org/mamba" + }], +} + diff --git a/src/components/fundable/styles.module.css b/src/components/fundable/styles.module.css new file mode 100644 index 000000000..14c714c62 --- /dev/null +++ b/src/components/fundable/styles.module.css @@ -0,0 +1,489 @@ +.small_project_card:hover { + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); +} + +.project_category_header { + font-family: var(--ifm-font-family-rubik-one); + font-style: normal; + font-weight: 400; + line-height: 20px; + text-align: center; + margin-bottom: var(--ifm-spacing-xl); + color: var(--ifm-color-secondary-s3); + text-align: left; +} + +.project_title { + color: var(--ifm-text-color-main-title); + font-family: var(--ifm-font-family-bebas-neue); + font-size: 32px; + font-style: normal; + font-weight: 600; + /*line-height: 150%; /* 72px */ + letter-spacing: 2.112px; + text-align: left; + padding: 0; +} + +.project_catch_up_phrase { + font-family: var(--ifm-font-family-roboto); + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + /* 150% */ + letter-spacing: 0.15px; + color: var(--ifm-color-secondary-s3); + padding: var(--ifm-spacing-sm) 0 +} + +.project_dialog_overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.3); + z-index: 1000; +} + +.project_dialog_content { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: white; + border: 1px solid #ccc; + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2); + border-radius: 20px; + z-index: 4000; +} + +.large_project_card_title { + font-family: var(--ifm-font-family-roboto); + font-size: 32px; + font-style: normal; + font-weight: 400; + line-height: 40px; + /* 125% */ + margin: var(--ifm-spacing-md) 0; + +} + +.large_project_card_text { + font-family: var(--ifm-font-family-roboto); + font-size: var(--ifm-font-size-small); + font-style: normal; + font-weight: 500; + line-height: 24px; + /* 150% */ + letter-spacing: 0.15px; + color: var(--ifm-text-color-on-primary-p1); + text-align: justify; +} + +.large_project_card_description_container { + text-align: justify; + padding: var(--ifm-spacing-md); +} + +.large_project_card_description p { + font-family: var(--ifm-font-family-roboto); + /*background-color: #F1F1F1;*/ + font-size: 16px; +} + +.link_to_get_a_quote { + background-color: var(--ifm-color-orange-jupyter); + color: white; + width: 358px; + font-weight: 700; +} + +.icon_container { + display: flex; + gap: 10px; + margin: var(--ifm-spacing-md) 0; +} + +.menu_sidebar { + padding: 1rem; + overflow-y: auto; +} + +.menu_sidebar_item { + font-family: var(--ifm-font-family-roboto); + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: 48px; + /* 300% */ + letter-spacing: 0.15px; +} + +.menu_sidebar_container { + position: fixed; + display: flex; + height: auto; +} + +.menu_sidebar_indicator { + display: inline-block; + width: 6px; + height: 20px; + border-radius: 4px; + background-color: transparent; + margin-right: 10px; + transition: background-color 0.3s ease; + vertical-align: middle; +} + +.active_section .menu_sidebar_indicator { + background-color: #D9D9D9; +} + +.send_button { + width: 258px; + height: 59px; + background: var(--ifm-color-blue-jupyter); +} + + + +.get_a_quote_form { + margin-top: var(--ifm-spacing-xl); + justify-content: center; +} + +.get_a_quote_form_label { + font-size: 12px; + color: var(--ifm-text-color); + background-color: var(--ifm-background-color); +} + +.project_information_container { + display: flex; + align-items: center; +} + +.project_information { + font-family: var(--ifm-font-family-roboto); + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 20px; + /* 142.857% */ + letter-spacing: 0.25px; + padding: var(--ifm-spacing-sm); + text-align: justify; +} + +.small_project_card_note { + font-family: var(--ifm-font-family-roboto); + font-size: 12px; + font-style: normal; + font-weight: 600; + line-height: 16px; + /* 145.455% */ + letter-spacing: 0.5px; + margin: var(--ifm-spacing-sm) 0; + text-align: justify; +} + +.small_project_card_price_container { + display: flex; + justify-content: center; + align-items: center; + padding: 8px 0; +} + +.small_project_card_price { + font-size: 20px; + padding: 8px 0; + background: var(--ifm-color-secondary-s1); + font-family: var(--ifm-font-family-roboto); + border-radius: 24px; + font-weight: 700; + width: 190px; + padding: 10px; + height: 56px; + text-align: center; + margin: var(--ifm-spacing-md) 0 var(--ifm-spacing-2xs) 0; +} + +.small_project_card_indicative_price_text { + text-align: center; + font-family: var(--ifm-font-family-roboto); + font-size: 12px; + font-style: normal; + font-weight: 600; + line-height: 150%; + /* 18px */ + letter-spacing: -0.132px; + text-transform: uppercase; +} + +.small_project_card_funded_at_text { + font-family: var(--ifm-font-family-roboto); + font-size: var(--ifm-font-size-small); + font-style: normal; + font-weight: 700; + line-height: 36px; +} + +.shareable_container { + display: flex; + align-items: center; +} + +.shareable_text { + font-family: var(--ifm-font-family-roboto); + font-size: 16px; + font-style: normal; + font-weight: 700; + line-height: 150%; + /* 18px */ + letter-spacing: -0.132px; + text-transform: uppercase; + padding: var(--ifm-spacing-sm); +} + +.link_to_more_information { + background-color: var(--ifm-color-secondary-s1); + color: black; + width: 150px; + height: 24px; + font-size: var(--ifm-font-size-small); + font-family: var(--ifm-font-family-roboto); + display: flex; + align-items: center; + justify-content: center; + margin: var(--ifm-spacing-sm) 0 0 0; + font-family: var(--ifm-font-family-roboto); + border-radius: 35px; + font-style: normal; + font-weight: 600; + line-height: 150%; + letter-spacing: -0.176px; + border: none; + text-align: center; +} + +.small_project_card_price_col { + background-color: rgba(217, 217, 217, 0.25); +} + +.project_category_list { + display: flex; + justify-content: center; +} + +@media only screen and (max-width: 500px) { + + /*Mobile*/ + .project_category_header { + font-size: 20px; + padding: var(--ifm-spacing-md); + } + + .main_area_desktop { + display: none + } + + .menu_sidebar { + display: none + } + + .small_project_card { + width: 90vw; + margin-bottom: var(--ifm-spacing-lg); + border: 1px solid #ccc; + cursor: pointer; + + } + + .small_project_card_text_col { + padding: var(--ifm-spacing-sm); + } + + .small_project_card_price_col { + padding: var(--ifm-spacing-sm); + } + + .large_project_card { + width: 90vw; + padding: var(--ifm-spacing-xl); + border-radius: 8px; + padding: var(--ifm-spacing-xl) var(--ifm-spacing-xl); + overflow-y: auto; + max-height: 95vh; + } + + .small_input { + width: 300px; + height: 56px; + border-radius: 4px; + } + + .large_input { + width: 300px; + height: 160px; + border-radius: 4px; + } + + .send_button_containder { + width: 300px; + } + + .get_a_quote_dialog { + width: 90vw; + padding: 40px; + overflow-y: auto; + max-height: 95vh; + } + + .get_a_quote_text_col_desktop { + display: none; + } + + .get_a_quote_form_col_desktop { + display: none; + } +} + +@media (min-width: 500px) and (max-width: 996px) { + + /*Tablet*/ + .project_category_header { + padding: var(--ifm-spacing-md); + } + + .small_project_card { + width: 80vw; + margin-bottom: var(--ifm-spacing-xl); + border: 1px solid #ccc; + cursor: pointer; + padding: var(--ifm-spacing-md) + } + + .small_project_card_text_col { + padding: var(--ifm-spacing-md); + } + + .small_project_card_price_col { + padding: var(--ifm-spacing-md); + } + + .large_project_card { + width: 80vw; + padding: 40px; + border-radius: 8px; + padding: var(--ifm-spacing-xl) var(--ifm-spacing-xl); + overflow-y: auto; + max-height: 95vh; + } + + .main_area_desktop { + display: none + } + + .small_input { + width: 400px; + height: 56px; + border-radius: 4px; + } + + .large_input { + width: 400px; + height: 160px; + border-radius: 4px; + } + + .menu_sidebar { + display: none + } + + .get_a_quote_dialog { + width: 80vw; + padding: 40px; + overflow-y: auto; + max-height: 95vh; + } + + .get_a_quote_text_col_desktop { + display: none; + } + + .get_a_quote_form_col_desktop { + display: none; + } +} + +@media only screen and (min-width: 996px) { + + /*Desktop*/ + .project_category_header { + font-size: 28px; + } + + .small_project_card { + width: 70vw; + margin: var(--ifm-spacing-2xl) 0; + border: 1px solid #ccc; + cursor: pointer; + } + + + .small_project_card_text_col { + padding: var(--ifm-spacing-lg); + } + + .small_project_card_price_col { + padding: var(--ifm-spacing-lg); + } + + .large_project_card { + width: 800px; + padding: 40px; + border-radius: 8px; + overflow-y: auto; + max-height: 95vh; + } + + .main_area_mobile { + display: none; + } + + .small_input { + width: 400px; + height: 56px; + border-radius: 4px; + } + + .large_input { + width: 400px; + height: 160px; + border-radius: 4px; + } + + .send_button_container { + height: 59px; + width: 400px; + } + + .get_a_quote_dialog { + width: 90vw; + padding: 40px; + overflow-y: auto; + max-height: 95vh; + } + + .get_a_quote_form_col_mobile { + display: none; + padding: var(--ifm-spacing-md) + } + + .get_a_quote_form_col_desktop { + justify-content: center; + } +} \ No newline at end of file diff --git a/src/components/home/AboutQS/styles.module.css b/src/components/home/AboutQS/styles.module.css index 78a6dcea0..90fa260f8 100644 --- a/src/components/home/AboutQS/styles.module.css +++ b/src/components/home/AboutQS/styles.module.css @@ -12,12 +12,10 @@ text-align: center; margin-bottom: var(--ifm-spacing-xl); } - } @media only screen and (min-width: 996px) { .aboutQS_container { - margin-top: var(--ifm-spacing-2xl); background-color: var(--ifm-color-primary-p1); color: var(--ifm-color-primary-p2); padding: var(--ifm-spacing-2xl) var(--ifm-spacing-5xl) 0 diff --git a/src/components/home/ProjectsOverview/DataAnalysis.tsx b/src/components/home/ProjectsOverview/DataAnalysis.tsx new file mode 100644 index 000000000..b1d732087 --- /dev/null +++ b/src/components/home/ProjectsOverview/DataAnalysis.tsx @@ -0,0 +1,25 @@ +import styles from "./styles.module.css"; +import DataAnalysisMD from "@site/src/components/home/ProjectsOverview/descriptions/DataAnalysis.md"; +import ApacheArrowPicture from "@site/static/img/projects/apache_arrow.svg"; + +export default function DataAnalysisProjects() { + return ( +
+
+
+

Data Analysis

+

+ Supporting the development of key data analysis technologies. +

+ +
+
+ + +
+
+
+ ); +} diff --git a/src/components/home/ProjectsOverview/SpecialProjects.tsx b/src/components/home/ProjectsOverview/SpecialProjects.tsx index 3be3aba20..1342d0649 100644 --- a/src/components/home/ProjectsOverview/SpecialProjects.tsx +++ b/src/components/home/ProjectsOverview/SpecialProjects.tsx @@ -1,6 +1,6 @@ import styles from "./styles.module.css"; import SpecialProjectsMD from "@site/src/components/home/ProjectsOverview/descriptions/SpecialProjects.md"; -import SpecialProjectsPictureUrl from "@site/static/img/projects/jupytercad.png"; +import SpecialProjectsPictureUrl from "@site/static/img/projects/special_projects.png"; export default function SpecialProjects() { return ( @@ -16,7 +16,7 @@ export default function SpecialProjects() {
- {"Picture + {"Picture
diff --git a/src/components/home/ProjectsOverview/descriptions/DataAnalysis.md b/src/components/home/ProjectsOverview/descriptions/DataAnalysis.md new file mode 100644 index 000000000..32292dd1f --- /dev/null +++ b/src/components/home/ProjectsOverview/descriptions/DataAnalysis.md @@ -0,0 +1,8 @@ + +Since 2024, QuantStack is involved in the development of: + +- Apache Arrow, a memory format designed for efficient columnar data storage. It serves as the foundation for many data science frameworks, enabling seamless interoperability between various data systems and programming languages, + +- Apache Parquet, a column-oriented data file format designed for efficient data storage and retrieval. + +QuantStack is home to several maintainers of the project who are committed to its continuous improvement and advancement. \ No newline at end of file diff --git a/src/components/home/ProjectsOverview/descriptions/SpecialProjects.md b/src/components/home/ProjectsOverview/descriptions/SpecialProjects.md index 73263d051..340ee4c83 100644 --- a/src/components/home/ProjectsOverview/descriptions/SpecialProjects.md +++ b/src/components/home/ProjectsOverview/descriptions/SpecialProjects.md @@ -1,9 +1,12 @@ Special projects leverage the open-source software stack that we -maintain. Both JupyterCAD and Glue-Web leverage the JupyterLab +maintain. They can rely, for instance, on the JupyterLab application framework and assemble JupyterLab components to produce a different application. Such examples include: - - JupyterCAD - - Glue-Web + + - Glue-Web: a JupyterLab extension to link visualisations of scientific datasets across many files, + - JupyterCAD: a JupyterLab extension for collaborative 3D geometry modeling, + - JupyterGIS : a JupyterLab extension for collaborative GIS (Geographical Information System) editor in Jupyter. + diff --git a/src/components/home/ProjectsOverview/index.tsx b/src/components/home/ProjectsOverview/index.tsx index b59354aab..29ff08841 100644 --- a/src/components/home/ProjectsOverview/index.tsx +++ b/src/components/home/ProjectsOverview/index.tsx @@ -3,6 +3,7 @@ import SupplyChainProjects from "./SupplyChain"; import SpecialProjects from "./SpecialProjects"; import RoboticsProjects from "./Robotics"; import ComputingProjects from "./Computing"; +import DataAnalysisProjects from "./DataAnalysis"; import styles from "./styles.module.css"; export default function ProjectsOverview() { @@ -13,6 +14,7 @@ export default function ProjectsOverview() { + ); } diff --git a/src/css/custom.css b/src/css/custom.css index 79a3da9e2..2e85319b1 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -18,6 +18,8 @@ --ifm-color-secondary-s1: #a0c9ff; --ifm-color-secondary-s2: #002646; + --ifm-color-secondary-s3: #00497F; + --ifm-color-neutral-n1: #605e58; --ifm-color-neutral-n2: #371300; @@ -185,6 +187,7 @@ ul { .row-with-margins { margin: var(--ifm-spacing-xl) 0; } + .col { padding: 0; } @@ -195,7 +198,8 @@ ul { font-size: 32px; font-style: normal; font-weight: 600; - line-height: 150%; /* 36px */ + line-height: 150%; + /* 36px */ letter-spacing: 1.056px; text-align: center; padding: 0; @@ -230,8 +234,7 @@ ul { font-size: 16px; font-weight: 500; color: var(--ifm-color-secondary-s2); - padding: var(--ifm-spacing-2xl) var(--ifm-spacing-lg) 0 - var(--ifm-spacing-lg); + padding: var(--ifm-spacing-2xl) var(--ifm-spacing-lg) 0 var(--ifm-spacing-lg); background-color: var(--ifm-color-secondary-s1); line-height: 20px; letter-spacing: 0.1px; @@ -341,8 +344,7 @@ ul { line-height: 150%; background-color: var(--ifm-color-secondary-s1); color: var(--ifm-color-secondary-s2); - padding: var(--ifm-spacing-2xl) var(--ifm-spacing-4xl) 0 - var(--ifm-spacing-4xl); + padding: var(--ifm-spacing-2xl) var(--ifm-spacing-4xl) 0 var(--ifm-spacing-4xl); } .blue-banner-header { @@ -385,6 +387,7 @@ ul { justify-content: center; } } + /***********************************************************/ .social-media-links { @@ -494,14 +497,20 @@ a { a:hover, /* We need to (re)override some of the infima rules to have proper states on navbar links, table of contents, and docs sidebar links, respectively */ -a.navbar__link:hover, /* Top bar navigation links */ -a.table-of-contents__link:hover, /*Right sidebar links (table of contents) */ -a[class^="sidebarItemLink"]:hover /* The docs sidebar links do not have its own class */ { +a.navbar__link:hover, +/* Top bar navigation links */ +a.table-of-contents__link:hover, +/*Right sidebar links (table of contents) */ +a[class^="sidebarItemLink"]:hover + +/* The docs sidebar links do not have its own class */ + { /*text-decoration: underline; text-decoration-thickness: var(--pydata-link-hover-decoration-thickness); text-decoration-skip-ink: none; text-decoration-skip: none;*/ } + a:active, a.navbar__link:active, a.table-of-contents__link:active, @@ -511,13 +520,15 @@ a[class^="sidebarItemLink"]:active { /* In some cases, we override the underlines because there are other elements that already report the state (e.g. borders, background colors, etc) */ -a[class^="sidebarItemLink"][aria-current="page"], /* No underline if this is the current page */ +a[class^="sidebarItemLink"][aria-current="page"], +/* No underline if this is the current page */ a.navbar__link, .navbar-sidebar__item, .menu a, .navbar__items--right a, .pagination-nav__link, -a.card, /* These cards are used in index-like documentation pages */ +a.card, +/* These cards are used in index-like documentation pages */ a.card:hover { text-decoration: none; } @@ -530,6 +541,7 @@ a.menu__link:active { background: white; color: #000; } + [data-theme="dark"] .pagination-nav__link:active, [data-theme="dark"] a.card:active, [data-theme="dark"] a.menu__link:active { @@ -549,16 +561,32 @@ a.menu__link:active { .contact { background-color: var(--ifm-color-primary-p1); color: var(--ifm-color-text-on-primary-p1); + font-size: 14px; border-radius: 4px; font-weight: bolder; font-style: normal; - margin: var(--ifm-navbar-item-padding-vertical) 20px; + margin: var(--ifm-navbar-item-padding-vertical) 2px; } .contact:hover { background-color: white; } +.fundable_projects { + background-color: var(--ifm-color-secondary-s1); + font-size: 14px; + color: black; + border-radius: 4px; + font-weight: bolder; + font-style: normal; + margin: var(--ifm-navbar-item-padding-vertical) 2px; +} + +.fundable_projects:hover { + background-color: var(--ifm-color-primary-p0); +} + + .custom_navbar_item { font-family: var(--ifm-font-family-roboto); width: 117px; @@ -594,8 +622,8 @@ a.menu__link:active { background: url(@site/static/img/socialmedias/RSS.svg); content: ""; display: flex; - height: 36px; - width: 36px; + height: 32px; + width: 32px; background-repeat: no-repeat; } @@ -607,8 +635,8 @@ a.menu__link:active { background: url(@site/static/img/socialmedias/GH.svg); content: ""; display: flex; - height: 36px; - width: 37px; + height: 32px; + width: 32px; background-repeat: no-repeat; } @@ -620,8 +648,8 @@ a.menu__link:active { background: url(@site/static/img/socialmedias/LinkedIn.svg); content: ""; display: flex; - height: 36px; - width: 37px; + height: 32px; + width: 32px; background-repeat: no-repeat; } @@ -633,8 +661,8 @@ a.menu__link:active { background: url(@site/static/img/socialmedias/Bluesky.svg); content: ""; display: flex; - height: 36px; - width: 37px; + height: 32px; + width: 32px; background-repeat: no-repeat; } @@ -646,8 +674,8 @@ a.menu__link:active { background: url(@site/static/img/socialmedias/Mastodon.svg); content: ""; display: flex; - height: 36px; - width: 37px; + height: 32px; + width: 32px; background-repeat: no-repeat; } @@ -688,3 +716,11 @@ ul.row { .items-list { list-style-type: none; } + +.custom-progress-bar::-webkit-progress-value { + background-color: var(--ifm-color-primary-p1); +} + +.custom-progress-bar::-webkit-progress-bar { + background-color: #eee; +} \ No newline at end of file diff --git a/src/pages/fundable.tsx b/src/pages/fundable.tsx new file mode 100644 index 000000000..8bb5a9295 --- /dev/null +++ b/src/pages/fundable.tsx @@ -0,0 +1,14 @@ +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import FundableProjects from '../components/fundable'; +import Footer from "../components/footer/Footer"; + +export default function FundableProjectsPage(): JSX.Element { + const { siteConfig } = useDocusaurusContext(); + return ( + + +