From c491366b880bc88060d1f154a1144ec5fe9e9910 Mon Sep 17 00:00:00 2001 From: jordyarms Date: Fri, 8 Nov 2024 11:08:13 -0500 Subject: [PATCH 1/7] initialize resources, updating read me. --- README.md | 45 +++++++++++++++++++++++++++++++++++++- src/pages/resources.tsx | 41 ++++++++++++++++++++++++++++++++++ static/json/resources.json | 16 ++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 src/pages/resources.tsx create mode 100644 static/json/resources.json diff --git a/README.md b/README.md index 26bf520..0a4f0b6 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,49 @@ When people show up to do good, let's make their odds great by being better toge 2) Attend a weekly hacknight at [CivicTechTO](https://civictech.ca) and join our group. 3) Contribution Guide on the [wiki](https://github.com/CivicTechTO/civicsaurus/wiki) `Coming Soon` +## 🚀 Development - Getting Started + +To run this project locally and start contributing, follow these steps: + +### Prerequisites + +- [Node.js](https://nodejs.org/) (LTS version recommended) +- npm (comes with Node.js) + +### Installation + +1. **Clone the Repository** + ```bash + git clone https://github.com/CivicTechTO/civicsaurus.git + cd civicsaurus + ``` + +2. **Install Dependencies** + ```bash + npm install + ``` + +### Running the Development Server + +```bash + npm start +``` + +This will start the local development server. The site will reload automatically if you make changes to the code. + +### Building the Site + +To create a production build of your site: + +```bash + npm run build +``` + +The build output will be generated in the `build` directory. You can serve this directory locally to test the production build: + +```bash + npm run serve +``` @@ -24,4 +67,4 @@ When people show up to do good, let's make their odds great by being better toge ## Colophon - Docusaurus: This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. -- GitHub Pages & Actions: This website is hosted using [GitHub Pages]([url](https://pages.github.com)) with [GitHub Actions](https://github.com/features/actions) deployment automations. +- GitHub Pages & Actions: This website is hosted using [GitHub Pages]([url](https://pages.github.com)) with [GitHub Actions](https://github.com/features/actions) deployment automations. \ No newline at end of file diff --git a/src/pages/resources.tsx b/src/pages/resources.tsx new file mode 100644 index 0000000..a6a60f1 --- /dev/null +++ b/src/pages/resources.tsx @@ -0,0 +1,41 @@ +// src/pages/resources.tsx +import React, { useEffect, useState } from 'react'; + +// Define a TypeScript interface for your resource data +interface Resource { + title: string; + description: string; + category: string; + url: string; + tags: string[]; +} + +const Resources: React.FC = () => { + const [resources, setResources] = useState([]); + + useEffect(() => { + // Fetch the resources.json file + fetch('/resources.json') + .then((response) => response.json()) + .then((data: Resource[]) => setResources(data)) + .catch((error) => console.error('Error fetching resources:', error)); + }, []); + + return ( +
+

Resource Database

+ +
+ ); +}; + +export default Resources; \ No newline at end of file diff --git a/static/json/resources.json b/static/json/resources.json new file mode 100644 index 0000000..a87721b --- /dev/null +++ b/static/json/resources.json @@ -0,0 +1,16 @@ +[ + { + "title": "Docusaurus Documentation", + "description": "Official Docusaurus documentation site.", + "category": "Documentation", + "url": "https://docusaurus.io/docs", + "tags": ["docs", "docusaurus", "guide"] + }, + { + "title": "MDX Documentation", + "description": "Learn how to use MDX for writing content.", + "category": "MDX", + "url": "https://mdxjs.com/docs", + "tags": ["mdx", "content", "markdown"] + } + ] \ No newline at end of file From a44c4d8fa953f8b8c2b72cf7c4a786bf12564e59 Mon Sep 17 00:00:00 2001 From: jordyarms Date: Fri, 8 Nov 2024 11:09:38 -0500 Subject: [PATCH 2/7] npm audit fix --- package-lock.json | 50 ++++++++++++++++------------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2a5ee38..1c76fcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5342,9 +5342,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6598,9 +6598,9 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -6608,7 +6608,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6733,15 +6733,6 @@ "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", "license": "MIT" }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "license": "MIT", - "dependencies": { - "punycode": "^1.3.2" - } - }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -8022,9 +8013,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", @@ -12666,12 +12657,6 @@ "node": ">= 0.10" } }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "license": "MIT" - }, "node_modules/pupa": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", @@ -13842,25 +13827,24 @@ } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", "license": "MIT" }, "node_modules/serve-index": { From 4075250a011387135ad11364601b195b74d9b9dd Mon Sep 17 00:00:00 2001 From: jordyarms Date: Fri, 8 Nov 2024 11:12:38 -0500 Subject: [PATCH 3/7] blog tag clean up --- blog/2024-09-22-now-with-ctto.md | 2 +- blog/tags.yml | 18 ++++-------------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/blog/2024-09-22-now-with-ctto.md b/blog/2024-09-22-now-with-ctto.md index fcfa294..1ab104e 100644 --- a/blog/2024-09-22-now-with-ctto.md +++ b/blog/2024-09-22-now-with-ctto.md @@ -5,7 +5,7 @@ authors: [jordyarms] tags: [announcement] --- Happy to announce that the instance of the Civic Tech toolkit project has been ported over to Civic Tech Toronto’s GitHub instance! And, configured to build with GitHub actions! - + Phew, glad that’s done! 😅 The GitHub repo is up at [github.com/CivicTechTO/civicsaurus](https://github.com/CivicTechTO/civicsaurus). diff --git a/blog/tags.yml b/blog/tags.yml index bfaa778..2cbd5e4 100644 --- a/blog/tags.yml +++ b/blog/tags.yml @@ -1,19 +1,9 @@ -facebook: - label: Facebook - permalink: /facebook - description: Facebook tag description - hello: label: Hello permalink: /hello description: Hello tag description -docusaurus: - label: Docusaurus - permalink: /docusaurus - description: Docusaurus tag description - -hola: - label: Hola - permalink: /hola - description: Hola tag description +announcement: + label: Announcement + permalink: /announcements + description: Annnouncements From b1c87964d15999782f3769e0528c7a571ed45264 Mon Sep 17 00:00:00 2001 From: jordyarms Date: Fri, 8 Nov 2024 11:45:51 -0500 Subject: [PATCH 4/7] adding ESLint, updating modules --- eslint.config.mjs | 14 + package-lock.json | 2455 ++++++++++++++++++++++++++++++++++-- package.json | 7 +- src/pages/index.tsx | 3 +- src/pages/resources.tsx | 12 +- static/json/resources.json | 2 +- 6 files changed, 2389 insertions(+), 104 deletions(-) create mode 100644 eslint.config.mjs diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..aa0cd83 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,14 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; +import pluginReact from "eslint-plugin-react"; + + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + {files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"]}, + {languageOptions: { globals: globals.node }}, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + pluginReact.configs.flat.recommended, +]; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1c76fcc..3601f85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,12 @@ "@docusaurus/module-type-aliases": "3.5.2", "@docusaurus/tsconfig": "3.5.2", "@docusaurus/types": "3.5.2", - "typescript": "~5.5.2" + "@eslint/js": "^9.14.0", + "eslint": "^9.14.0", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.12.0", + "typescript": "~5.5.2", + "typescript-eslint": "^8.13.0" }, "engines": { "node": ">=18.0" @@ -1322,6 +1327,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", @@ -2324,6 +2338,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.25.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", @@ -3006,6 +3029,167 @@ "node": ">=18.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@eslint/js": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz", + "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -3021,6 +3205,72 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -3950,92 +4200,321 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "license": "ISC" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz", + "integrity": "sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/type-utils": "8.13.0", + "@typescript-eslint/utils": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "license": "MIT", + "node_modules/@typescript-eslint/parser": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz", + "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", + "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz", + "integrity": "sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==", + "dev": true, "license": "MIT", "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "@typescript-eslint/typescript-estree": "8.13.0", + "@typescript-eslint/utils": "8.13.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" + "node_modules/@typescript-eslint/types": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", + "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "license": "MIT" + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", + "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz", + "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", + "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", @@ -4149,9 +4628,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4421,12 +4900,50 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4436,6 +4953,105 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/astring": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", @@ -4491,6 +5107,22 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-loader": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", @@ -5823,13 +6455,67 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" - }, - "node_modules/debug": { + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", @@ -5895,6 +6581,13 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -6110,6 +6803,19 @@ "node": ">=6" } }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -6306,6 +7012,67 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -6327,12 +7094,95 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -6372,6 +7222,138 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.14.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -6385,6 +7367,189 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "devOptional": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "devOptional": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -6398,6 +7563,29 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -6727,6 +7915,13 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/fast-uri": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", @@ -6779,6 +7974,19 @@ "node": ">=0.4.0" } }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -6943,6 +8151,27 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "devOptional": true, + "license": "ISC" + }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -6963,6 +8192,16 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", @@ -7188,6 +8427,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7234,6 +8502,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", @@ -7342,12 +8628,33 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/globby": { @@ -7425,6 +8732,13 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -7483,6 +8797,16 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT" }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7528,6 +8852,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-yarn": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", @@ -8209,6 +9549,21 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", "license": "MIT" }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -8260,12 +9615,58 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -8278,6 +9679,36 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -8305,6 +9736,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -8348,6 +9811,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -8357,6 +9833,22 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8375,24 +9867,50 @@ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "license": "MIT", "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-npm": { @@ -8416,6 +9934,22 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -8476,6 +10010,23 @@ "@types/estree": "*" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -8494,6 +10045,35 @@ "node": ">=6" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -8506,12 +10086,103 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "license": "MIT" }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -8554,6 +10225,23 @@ "node": ">=0.10.0" } }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -8671,6 +10359,13 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -8695,6 +10390,22 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8756,6 +10467,20 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lilconfig": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", @@ -8830,6 +10555,13 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -11316,6 +13048,13 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -11479,6 +13218,58 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -11556,6 +13347,24 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -11940,6 +13749,16 @@ "node": ">=4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", @@ -12548,6 +14367,16 @@ "postcss": "^8.4.31" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -13127,6 +14956,28 @@ "node": ">=6.0.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -13160,6 +15011,25 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -13634,6 +15504,32 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -13654,6 +15550,24 @@ ], "license": "MIT" }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -13957,6 +15871,22 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14311,6 +16241,96 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -14698,12 +16718,38 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -14750,6 +16796,83 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -14772,6 +16895,46 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.13.0.tgz", + "integrity": "sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.13.0", + "@typescript-eslint/parser": "8.13.0", + "@typescript-eslint/utils": "8.13.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -15670,6 +17833,96 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -15691,6 +17944,16 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", diff --git a/package.json b/package.json index c9178b8..49d3c67 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,12 @@ "@docusaurus/module-type-aliases": "3.5.2", "@docusaurus/tsconfig": "3.5.2", "@docusaurus/types": "3.5.2", - "typescript": "~5.5.2" + "@eslint/js": "^9.14.0", + "eslint": "^9.14.0", + "eslint-plugin-react": "^7.37.2", + "globals": "^15.12.0", + "typescript": "~5.5.2", + "typescript-eslint": "^8.13.0" }, "browserslist": { "production": [ diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 562a3f5..58b2915 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -2,10 +2,9 @@ import clsx from 'clsx'; import Link from '@docusaurus/Link'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import Layout from '@theme/Layout'; -import HomepageFeatures from '@site/src/components/HomepageFeatures'; import Heading from '@theme/Heading'; - import styles from './index.module.css'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; function HomepageHeader() { const {siteConfig} = useDocusaurusContext(); diff --git a/src/pages/resources.tsx b/src/pages/resources.tsx index a6a60f1..9c70187 100644 --- a/src/pages/resources.tsx +++ b/src/pages/resources.tsx @@ -1,4 +1,3 @@ -// src/pages/resources.tsx import React, { useEffect, useState } from 'react'; // Define a TypeScript interface for your resource data @@ -14,9 +13,14 @@ const Resources: React.FC = () => { const [resources, setResources] = useState([]); useEffect(() => { - // Fetch the resources.json file - fetch('/resources.json') - .then((response) => response.json()) + // Fetch the resources.json file from the correct path + fetch('/json/resources.json') + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.json(); + }) .then((data: Resource[]) => setResources(data)) .catch((error) => console.error('Error fetching resources:', error)); }, []); diff --git a/static/json/resources.json b/static/json/resources.json index a87721b..5fc7792 100644 --- a/static/json/resources.json +++ b/static/json/resources.json @@ -13,4 +13,4 @@ "url": "https://mdxjs.com/docs", "tags": ["mdx", "content", "markdown"] } - ] \ No newline at end of file +] \ No newline at end of file From bf0c0aee8b01505e1995e7b7c756d24494875f2d Mon Sep 17 00:00:00 2001 From: jordyarms Date: Fri, 8 Nov 2024 19:16:39 -0500 Subject: [PATCH 5/7] conversion of inline to imported resources --- .env | 1 + README.md | 20 +- .../01-user-centered-and-inclusive.md | 26 - .../01-user-centered-and-inclusive.mdx | 22 + ...sparent.md => 02-open-and-transparent.mdx} | 22 +- .../03-iterative-and-responsive.md | 25 - .../03-iterative-and-responsive.mdx | 24 + .../04-sustainable-and-scalable.md | 23 - .../04-sustainable-and-scalable.mdx | 22 + .../01-orientation-and-vision-setting.md | 23 - .../01-orientation-and-vision-setting.mdx | 24 + .../02-connection-and-relationship.md | 23 - .../02-connection-and-relationship.mdx | 24 + ....md => 03-leadership-and-storytelling.mdx} | 15 +- ...urney.md => 04-continuing-the-journey.mdx} | 22 +- docs/04-project-lifecycle/01-explore.md | 41 - docs/04-project-lifecycle/01-explore.mdx | 41 + docs/04-project-lifecycle/02-reframe.md | 44 - docs/04-project-lifecycle/02-reframe.mdx | 42 + docs/04-project-lifecycle/03-create.md | 50 -- docs/04-project-lifecycle/03-create.mdx | 47 ++ docs/04-project-lifecycle/04-catalyze.md | 44 - docs/04-project-lifecycle/04-catalyze.mdx | 43 + docs/04-project-lifecycle/05-evolve.md | 47 -- docs/04-project-lifecycle/05-evolve.mdx | 44 + package-lock.json | 266 ++++++ package.json | 1 + scripts/exportResources.js | 44 + src/components/FilteredResources/index.tsx | 76 ++ src/pages/resources.tsx | 21 +- static/json/resources.json | 793 +++++++++++++++++- 31 files changed, 1555 insertions(+), 405 deletions(-) create mode 100644 .env delete mode 100644 docs/02-principles/01-user-centered-and-inclusive.md create mode 100644 docs/02-principles/01-user-centered-and-inclusive.mdx rename docs/02-principles/{02-open-and-transparent.md => 02-open-and-transparent.mdx} (52%) delete mode 100644 docs/02-principles/03-iterative-and-responsive.md create mode 100644 docs/02-principles/03-iterative-and-responsive.mdx delete mode 100644 docs/02-principles/04-sustainable-and-scalable.md create mode 100644 docs/02-principles/04-sustainable-and-scalable.mdx delete mode 100644 docs/03-ways-of-working/01-orientation-and-vision-setting.md create mode 100644 docs/03-ways-of-working/01-orientation-and-vision-setting.mdx delete mode 100644 docs/03-ways-of-working/02-connection-and-relationship.md create mode 100644 docs/03-ways-of-working/02-connection-and-relationship.mdx rename docs/03-ways-of-working/{03-leadership-and-storytelling.md => 03-leadership-and-storytelling.mdx} (50%) rename docs/03-ways-of-working/{04-continuing-the-journey.md => 04-continuing-the-journey.mdx} (51%) delete mode 100644 docs/04-project-lifecycle/01-explore.md create mode 100644 docs/04-project-lifecycle/01-explore.mdx delete mode 100644 docs/04-project-lifecycle/02-reframe.md create mode 100644 docs/04-project-lifecycle/02-reframe.mdx delete mode 100644 docs/04-project-lifecycle/03-create.md create mode 100644 docs/04-project-lifecycle/03-create.mdx delete mode 100644 docs/04-project-lifecycle/04-catalyze.md create mode 100644 docs/04-project-lifecycle/04-catalyze.mdx delete mode 100644 docs/04-project-lifecycle/05-evolve.md create mode 100644 docs/04-project-lifecycle/05-evolve.mdx create mode 100644 scripts/exportResources.js create mode 100644 src/components/FilteredResources/index.tsx diff --git a/.env b/.env new file mode 100644 index 0000000..6997b50 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +NOCODB_API_URL=https://nocodb.graphy.ca/api/v2/tables/maszfh7h1xk52m8/records?fields=title%2Cdescription%2Curl%2Ccategory_name%2Ctag_array%2Csection_name&limit=1000 \ No newline at end of file diff --git a/README.md b/README.md index 0a4f0b6..73ff8d3 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,15 @@ When people show up to do good, let's make their odds great by being better toge ## Essentials -**Current Focus:** +**Current Focus:** + - We are creating a civic tech project guide to help people interested in creating civic tech projects. **Get involved:** -1) Join the [CivicTechTO Slack]([url](http://link.civictech.ca/slack)) and our [#civic-tech-toolkit](https://civictechto.slack.com/archives/C0739GZADL6) channel. -2) Attend a weekly hacknight at [CivicTechTO](https://civictech.ca) and join our group. -3) Contribution Guide on the [wiki](https://github.com/CivicTechTO/civicsaurus/wiki) `Coming Soon` + +1. Join the [CivicTechTO Slack](<[url](http://link.civictech.ca/slack)>) and our [#civic-tech-toolkit](https://civictechto.slack.com/archives/C0739GZADL6) channel. +2. Attend a weekly hacknight at [CivicTechTO](https://civictech.ca) and join our group. +3. Contribution Guide on the [wiki](https://github.com/CivicTechTO/civicsaurus/wiki) `Coming Soon` ## 🚀 Development - Getting Started @@ -26,6 +28,7 @@ To run this project locally and start contributing, follow these steps: ### Installation 1. **Clone the Repository** + ```bash git clone https://github.com/CivicTechTO/civicsaurus.git cd civicsaurus @@ -58,8 +61,6 @@ The build output will be generated in the `build` directory. You can serve this npm run serve ``` - - ## Contributors `List Coming Soon -- w/ allcontributors.org` @@ -67,4 +68,9 @@ The build output will be generated in the `build` directory. You can serve this ## Colophon - Docusaurus: This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. -- GitHub Pages & Actions: This website is hosted using [GitHub Pages]([url](https://pages.github.com)) with [GitHub Actions](https://github.com/features/actions) deployment automations. \ No newline at end of file +- GitHub Pages & Actions: This website is hosted using [GitHub Pages](<[url](https://pages.github.com)>) with [GitHub Actions](https://github.com/features/actions) deployment automations. + +curl -X 'GET' \ + '' \ + -H 'accept: application/json' \ + -H 'xc-token: 3XPpISoV2l3VehhT6-fUSByMWpkaEZQ5UeiHWOPT' diff --git a/docs/02-principles/01-user-centered-and-inclusive.md b/docs/02-principles/01-user-centered-and-inclusive.md deleted file mode 100644 index ee65374..0000000 --- a/docs/02-principles/01-user-centered-and-inclusive.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: 1.1 User Centered and Inclusive -description: Put the needs of community members at the heart of every project. Ensure that solutions are accessible, equitable, and grounded in user needs. In civic tech, we try to *build with not for* our communities. ---- - -Being user-centered and inclusive means designing solutions that work for all members of the community, regardless of their background, abilities, or tech-savviness. This principle ensures our projects start with real needs or challenges, and create value for the community. - -## Why it matters for project success: - -Having real users in the community – whether individuals or organizations – is a key ingredient for successful civic tech projects. They can validate whether you’re solving a real problem and provide knowledge or relationships to drive your work forward. Connecting with your users helps you focus your efforts or decide your next step when your project (inevitably) gets a bit stuck. - -## What it means in practice: - -1. **Doing User Research**: Engage with a wide range of community members, including underrepresented groups, using various research methods. -2. **Designing for Accessibility**: Create solutions that are accessible to people with different abilities, devices, and levels of digital literacy. -3. **Measuring Inclusivity**: Set inclusivity goals, monitor usage data, and seek qualitative feedback to ensure your solution benefits all intended users. - -## Resources to help: - -* [‘build with, not for’](https://medium.com/organizer-sandbox/building-technology-with-not-for-communities-an-engagement-guide-for-civic-tech-b8880982e65a) -* INSERT: Templates for doing user research -* INSERT: guides for usability testing -* INSERT: easy to understand guides to WCAG (maybe from a11y) -* INSERT: example metrics for inclusion -* [Human Centred Design and User Research with Ariel Sim](https://learn.marsdd.com/article/human-centred-design-and-user-research-with-ariel-sim/) -* [How to Craft Buyer and User Personas to Benefit Your Business](https://learn.marsdd.com/article/how-to-craft-buyer-and-user-personas-to-benefit-your-business/) diff --git a/docs/02-principles/01-user-centered-and-inclusive.mdx b/docs/02-principles/01-user-centered-and-inclusive.mdx new file mode 100644 index 0000000..9f809b6 --- /dev/null +++ b/docs/02-principles/01-user-centered-and-inclusive.mdx @@ -0,0 +1,22 @@ +--- +title: 1.1 User Centered and Inclusive +description: Put the needs of community members at the heart of every project. Ensure that solutions are accessible, equitable, and grounded in user needs. In civic tech, we try to *build with not for* our communities. +--- + +Being user-centered and inclusive means designing solutions that work for all members of the community, regardless of their background, abilities, or tech-savviness. This principle ensures our projects start with real needs or challenges, and create value for the community. + +## Why it matters for project success: + +Having real users in the community – whether individuals or organizations – is a key ingredient for successful civic tech projects. They can validate whether you’re solving a real problem and provide knowledge or relationships to drive your work forward. Connecting with your users helps you focus your efforts or decide your next step when your project (inevitably) gets a bit stuck. + +## What it means in practice: + +1. **Doing User Research**: Engage with a wide range of community members, including underrepresented groups, using various research methods. +2. **Designing for Accessibility**: Create solutions that are accessible to people with different abilities, devices, and levels of digital literacy. +3. **Measuring Inclusivity**: Set inclusivity goals, monitor usage data, and seek qualitative feedback to ensure your solution benefits all intended users. + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/02-principles/02-open-and-transparent.md b/docs/02-principles/02-open-and-transparent.mdx similarity index 52% rename from docs/02-principles/02-open-and-transparent.md rename to docs/02-principles/02-open-and-transparent.mdx index d725a1f..075e965 100644 --- a/docs/02-principles/02-open-and-transparent.md +++ b/docs/02-principles/02-open-and-transparent.mdx @@ -1,6 +1,6 @@ --- -title: 1.2 Open and Transparent -description: Embrace openness in processes, data, code and content. Foster trust and collaboration by sharing knowledge and inviting participation. Strive to be ‘open source’ not only with your code, but also with your ideas. +title: 1.2 Open and Transparent +description: Embrace openness in processes, data, code and content. Foster trust and collaboration by sharing knowledge and inviting participation. Strive to be ‘open source’ not only with your code, but also with your ideas. --- Openness and transparency are cornerstones of civic tech. They involve sharing our work, processes, and decision-making openly with the community, fostering trust, collaboration, and shared ownership of civic solutions. @@ -9,20 +9,16 @@ Openness and transparency are cornerstones of civic tech. They involve sharing o Being open is one of the best ways for civic tech projects to scale their impact. When we share code, ideas and findings publicly, we make it possible for others to use and adapt that knowledge for future projects. And even if your project doesn’t launch, your early findings and code can help someone else pick up where you left off! -Working in the open also creates opportunities for more people to engage with your project, and can surface insights from valuable – if unexpected – places. +Working in the open also creates opportunities for more people to engage with your project, and can surface insights from valuable – if unexpected – places. ## What it means in practice: -1. **Open Source Development**: Make your project's source code publicly available and encourage community contributions. -2. **Open Data**: Use and produce open data, ensuring it's accessible and understandable to the public. -3. **Open Collaboration**: Create opportunities for diverse participation throughout the project by working and communicating in open places. +1. **Open Source Development**: Make your project's source code publicly available and encourage community contributions. +2. **Open Data**: Use and produce open data, ensuring it's accessible and understandable to the public. +3. **Open Collaboration**: Create opportunities for diverse participation throughout the project by working and communicating in open places. ## Resources to help: -* INSERT: Friendly intro to Github -* INSERT: Guide to CC licensing -* INSERT: links to the Toronto open data portal -* [“how to work open” by Matt Thompson](https://openmatt.org/2011/04/06/how-to-work-open/) -* [the Working Open Project Guide](https://mozillascience.github.io/leadership-training/index.html) from Mozilla -* INSERT: explainer on open source -* INSERT: how to use Slack for project coordination \ No newline at end of file +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/02-principles/03-iterative-and-responsive.md b/docs/02-principles/03-iterative-and-responsive.md deleted file mode 100644 index 84efe8d..0000000 --- a/docs/02-principles/03-iterative-and-responsive.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: 1.3 Iterative and Responsive -description: Always be learning and adapting. Listen to and respond to community feedback by regularly testing and refining solutions. ---- - -Being iterative and responsive in civic tech means continuously learning, and adapting our solutions (if you work in tech, you might be familiar with “agile”). This principle emphasizes flexibility, regular feedback loops, and small, but frequent improvements to meet community needs. - -## Why it matters for project success: - -Being iterative and responsive can help you both start and finish your civic tech project. Early, it gives your project momentum by delivering something small that you can build on. Later, showing your work to users and stakeholders will reduce the risk that you’re building the wrong thing. And having lots of smaller tasks on the go makes it easy to onboard new members to your project and give them something meaningful to do. - -## What it means in practice: - -1. **Start Small**: Projects that are too ambitious or vague often fail to take the first step (maybe you’ve heard of “boiling the ocean” or “scope creep”). Instead, focus on something small and tangible that you can deliver quickly. -2. **Prototype and Test With Users**: Once you’ve built something small, you can show it to your users and build the next iteration based on their feedback. Then, rinse and repeat\! -3. **Flexible Planning**: Project roadmaps are a great tool for keeping things moving, but don’t get too attached to them. Otherwise, it’ll be harder to pivot when you (inevitably) learn new things. - -## Resources to help: - -* INSERT: An intro to agile -* INSERT: templates for minimum viable roadmaps -* INSERT: minimum viable product canvases -* INSERT: usability testing guides -* [How and Why to Reduce Your Scope](https://www.samjulien.com/how-and-why-to-reduce-your-scope) -* [How To Use the Value Proposition Design Canvas](https://learn.marsdd.com/article/how-to-use-the-value-proposition-design-canvas-2/) \ No newline at end of file diff --git a/docs/02-principles/03-iterative-and-responsive.mdx b/docs/02-principles/03-iterative-and-responsive.mdx new file mode 100644 index 0000000..f81cbd9 --- /dev/null +++ b/docs/02-principles/03-iterative-and-responsive.mdx @@ -0,0 +1,24 @@ +--- +title: 1.3 Iterative and Responsive +description: Always be learning and adapting. Listen to and respond to community feedback by regularly testing and refining solutions. +--- + +Being iterative and responsive in civic tech means continuously learning, and adapting our solutions (if you work in tech, you might be familiar with “agile”). This principle emphasizes flexibility, regular feedback loops, and small, but frequent improvements to meet community needs. + +## Why it matters for project success: + +Being iterative and responsive can help you both start and finish your civic tech project. Early, it gives your project momentum by delivering something small that you can build on. Later, showing your work to users and stakeholders will reduce the risk that you’re building the wrong thing. And having lots of smaller tasks on the go makes it easy to onboard new members to your project and give them something meaningful to do. + +## What it means in practice: + +1. **Start Small**: Projects that are too ambitious or vague often fail to take the first step (maybe you’ve heard of “boiling the ocean” or “scope creep”). Instead, focus on something small and tangible that you can deliver quickly. +2. **Prototype and Test With Users**: Once you’ve built something small, you can show it to your users and build the next iteration based on their feedback. Then, rinse and repeat\! +3. **Flexible Planning**: Project roadmaps are a great tool for keeping things moving, but don’t get too attached to them. Otherwise, it’ll be harder to pivot when you (inevitably) learn new things. + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + + +{/* {/\* - INSERT: An intro to agile INSERT: usability testing guides \*/} */} diff --git a/docs/02-principles/04-sustainable-and-scalable.md b/docs/02-principles/04-sustainable-and-scalable.md deleted file mode 100644 index 04cbad1..0000000 --- a/docs/02-principles/04-sustainable-and-scalable.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: 1.4 Sustainable and Scalable -description: Where possible, design solutions with longevity and growth in mind. Create projects that can be maintained, expanded, and replicated to increase your long-term (and long-tail) impact. ---- - -Creating sustainable and scalable solutions in civic tech means designing projects with longevity and growth in mind. This principle emphasizes building solutions that can be maintained over time, expanded to serve more people, and potentially replicated in other contexts. - -## Why it matters for project success: - -Projects don’t end at launch; the most successful civic tech projects are ones that continue to deliver impact over time, get handed off to new teams and inspire others to do similar work. Taking time at the start of a project to think about the end of a project helps teams prepare for those milestones. - -## What it means in practice: - -1. **Long-term Thinking**: We encourage teams to start with ‘minimum viable’ projects, while also thinking about scaling up. What resources – technical or otherwise – will you need? What relationships would be beneficial? Is there a potential business model for your project? Would an organization or government department be able to take the project on in the future? -2. **Documentation**: Create clear, comprehensive documentation about as much of your project as possible – this isn’t just about documenting code, but also research findings, learnings about project planning and more. You never know who might find that information useful in the future! -3. **Knowledge Transfer**: Documenting your project is crucial, but how will you share that knowledge? Look for opportunities to connect with stakeholders and pass on your learnings, your hopes and your documents – you can start by presenting about your project at a hacknight! - -## Resources to help: - -* INSERT: An intro to documenting code -* [Business Model Canvas](https://www.cognidox.com/blog/2016/10/scale-process-gap-business-model-canvas) -* INSERT: youtube clips from project presentations at hacknights, -* [The Knight Foundation’s report on scaling civic tech](https://knightfoundation.org/wp-content/uploads/2020/03/Scaling\_Civic\_Tech\_final.pdf) \ No newline at end of file diff --git a/docs/02-principles/04-sustainable-and-scalable.mdx b/docs/02-principles/04-sustainable-and-scalable.mdx new file mode 100644 index 0000000..b20b281 --- /dev/null +++ b/docs/02-principles/04-sustainable-and-scalable.mdx @@ -0,0 +1,22 @@ +--- +title: 1.4 Sustainable and Scalable +description: Where possible, design solutions with longevity and growth in mind. Create projects that can be maintained, expanded, and replicated to increase your long-term (and long-tail) impact. +--- + +Creating sustainable and scalable solutions in civic tech means designing projects with longevity and growth in mind. This principle emphasizes building solutions that can be maintained over time, expanded to serve more people, and potentially replicated in other contexts. + +## Why it matters for project success: + +Projects don’t end at launch; the most successful civic tech projects are ones that continue to deliver impact over time, get handed off to new teams and inspire others to do similar work. Taking time at the start of a project to think about the end of a project helps teams prepare for those milestones. + +## What it means in practice: + +1. **Long-term Thinking**: We encourage teams to start with ‘minimum viable’ projects, while also thinking about scaling up. What resources – technical or otherwise – will you need? What relationships would be beneficial? Is there a potential business model for your project? Would an organization or government department be able to take the project on in the future? +2. **Documentation**: Create clear, comprehensive documentation about as much of your project as possible – this isn’t just about documenting code, but also research findings, learnings about project planning and more. You never know who might find that information useful in the future! +3. **Knowledge Transfer**: Documenting your project is crucial, but how will you share that knowledge? Look for opportunities to connect with stakeholders and pass on your learnings, your hopes and your documents – you can start by presenting about your project at a hacknight! + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/03-ways-of-working/01-orientation-and-vision-setting.md b/docs/03-ways-of-working/01-orientation-and-vision-setting.md deleted file mode 100644 index 7d49815..0000000 --- a/docs/03-ways-of-working/01-orientation-and-vision-setting.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: 2.1 Vision Setting -description: Establish a clear direction for your project, and align team members and stakeholders around common goals and values. ---- -Civic tech projects seldom move in a straight line (and that’s OK\!). But successful projects invest the time up front to craft a clear and compelling vision and roadmap for their work. - -## Why it matters for project success: - -Having a vision for your project, with goals and milestones, will help you stay motivated and prioritize your efforts. There are lots of little decisions to make throughout your project and a clear vision can help you align on the best way forward. - -A clear and compelling vision also helps you attract volunteers or convince stakeholders to lend you their time or resources. - -## What it looks like in practice: - -1. **Define your purpose and vision:** Work as a team to articulate why your project exists, what community need it addresses and what principles will guide you. You should be able to summarize this in a single sentence, e.g. “"We're building a tool to help residents easily report and track local infrastructure issues, making our city more responsive and transparent." -2. **Set clear goals and milestones:** Establish concrete, measurable objectives that align with your overall purpose. And even though your team is volunteering their time, don’t be afraid of setting deadlines. -3. **Revisit regularly:** Make time to review and refine your vision and roadmap, so you can adapt to changes in circumstance or incorporate what you’re learning. Think of your vision as a set of [strong opinions, weakly held](https://medium.com/@ameet/strong-opinions-weakly-held-a-framework-for-thinking-6530d417e364). - - ## Resources to help: - -* INSERT: Product roadmap templates ([like this](https://productschool.com/resources/templates/product-roadmap)), -* INSERT: guides on writing vision statements ([like this](https://thinkproductgroup.com/what-is-a-product-vision-statement-how-to-write-one-that-inspires-your-team/) -* INSERT: or [this](https://www.notion.so/blog/product-vision-boards-for-teams)) diff --git a/docs/03-ways-of-working/01-orientation-and-vision-setting.mdx b/docs/03-ways-of-working/01-orientation-and-vision-setting.mdx new file mode 100644 index 0000000..a3d58be --- /dev/null +++ b/docs/03-ways-of-working/01-orientation-and-vision-setting.mdx @@ -0,0 +1,24 @@ +--- +title: 2.1 Vision Setting +description: Establish a clear direction for your project, and align team members and stakeholders around common goals and values. +--- + +Civic tech projects seldom move in a straight line (and that’s OK\!). But successful projects invest the time up front to craft a clear and compelling vision and roadmap for their work. + +## Why it matters for project success: + +Having a vision for your project, with goals and milestones, will help you stay motivated and prioritize your efforts. There are lots of little decisions to make throughout your project and a clear vision can help you align on the best way forward. + +A clear and compelling vision also helps you attract volunteers or convince stakeholders to lend you their time or resources. + +## What it looks like in practice: + +1. **Define your purpose and vision:** Work as a team to articulate why your project exists, what community need it addresses and what principles will guide you. You should be able to summarize this in a single sentence, e.g. “"We're building a tool to help residents easily report and track local infrastructure issues, making our city more responsive and transparent." +2. **Set clear goals and milestones:** Establish concrete, measurable objectives that align with your overall purpose. And even though your team is volunteering their time, don’t be afraid of setting deadlines. +3. **Revisit regularly:** Make time to review and refine your vision and roadmap, so you can adapt to changes in circumstance or incorporate what you’re learning. Think of your vision as a set of [strong opinions, weakly held](https://medium.com/@ameet/strong-opinions-weakly-held-a-framework-for-thinking-6530d417e364). + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/03-ways-of-working/02-connection-and-relationship.md b/docs/03-ways-of-working/02-connection-and-relationship.md deleted file mode 100644 index ab7d7d8..0000000 --- a/docs/03-ways-of-working/02-connection-and-relationship.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: 2.2 Connection and Relationship -description: Create and maintain collaborative relationships within your team and with the broader community. ---- - -In civic tech, we agree with the old adage that ‘it takes a village.’ Strong relationships, whether within the team, with the community or with influential stakeholders, are a key ingredient of successful projects. - -## Why it matters for project success: - -It’s pretty hard to launch a civic tech project without people. You need people to write the code. You need people to test and validate your ideas or products. You need people to share their knowledge or networks. You need people to spread the word. - -If you take time to understand and appreciate your teammates, users and stakeholders, it’s more likely they’ll be there when you need a hand. - -## What it looks like in practice: - -1. **Map your ecosystem:** Identify key stakeholders, potential partners, and community members relevant to your project. Once you’ve mapped your stakeholders, ask yourself what you’d want them to know, think or do. -2. **Look beyond hacknights:** Meet your people where they’re at. If your stakeholders are often present at other events, workshops or meetings, you should be there too (at least sometimes)! -3. **Overcommunicate:** If people are curious about or invested in a project, they want to feel like they’re in the loop. Look for ways to share progress, prototypes or learnings with your project’s community whenever you can. - -## Resources to help: - -* INSERT: Stakeholder mapping tools ([here](https://lucidspark.com/blog/a-guide-to-stakeholder-mapping) or here), -* INSERT: lists of community organizations in Toronto, active listening guides, etc. \ No newline at end of file diff --git a/docs/03-ways-of-working/02-connection-and-relationship.mdx b/docs/03-ways-of-working/02-connection-and-relationship.mdx new file mode 100644 index 0000000..c2da165 --- /dev/null +++ b/docs/03-ways-of-working/02-connection-and-relationship.mdx @@ -0,0 +1,24 @@ +--- +title: 2.2 Connection and Relationship +description: Create and maintain collaborative relationships within your team and with the broader community. +--- + +In civic tech, we agree with the old adage that ‘it takes a village.’ Strong relationships, whether within the team, with the community or with influential stakeholders, are a key ingredient of successful projects. + +## Why it matters for project success: + +It’s pretty hard to launch a civic tech project without people. You need people to write the code. You need people to test and validate your ideas or products. You need people to share their knowledge or networks. You need people to spread the word. + +If you take time to understand and appreciate your teammates, users and stakeholders, it’s more likely they’ll be there when you need a hand. + +## What it looks like in practice: + +1. **Map your ecosystem:** Identify key stakeholders, potential partners, and community members relevant to your project. Once you’ve mapped your stakeholders, ask yourself what you’d want them to know, think or do. +2. **Look beyond hacknights:** Meet your people where they’re at. If your stakeholders are often present at other events, workshops or meetings, you should be there too (at least sometimes)! +3. **Overcommunicate:** If people are curious about or invested in a project, they want to feel like they’re in the loop. Look for ways to share progress, prototypes or learnings with your project’s community whenever you can. + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/03-ways-of-working/03-leadership-and-storytelling.md b/docs/03-ways-of-working/03-leadership-and-storytelling.mdx similarity index 50% rename from docs/03-ways-of-working/03-leadership-and-storytelling.md rename to docs/03-ways-of-working/03-leadership-and-storytelling.mdx index e9bdd30..c5e5233 100644 --- a/docs/03-ways-of-working/03-leadership-and-storytelling.md +++ b/docs/03-ways-of-working/03-leadership-and-storytelling.mdx @@ -9,17 +9,16 @@ Effective leadership in civic tech is often more about facilitation and empowerm ## Why it matters for project success: -Civic tech projects are unique. Volunteers don’t get paid, so you need different ways to keep them engaged and motivated. Project teams are less hierarchical, so you need different methods of making decisions or resolving disagreements. It’s normal for projects to have high turnover, so you need to be intentional about attracting and onboarding new contributors. There’s often no marketing budget, so how you talk about your project really matters. +Civic tech projects are unique. Volunteers don’t get paid, so you need different ways to keep them engaged and motivated. Project teams are less hierarchical, so you need different methods of making decisions or resolving disagreements. It’s normal for projects to have high turnover, so you need to be intentional about attracting and onboarding new contributors. There’s often no marketing budget, so how you talk about your project really matters. ## What it looks like in practice: -1. **Empower others:** People are more likely to participate in projects when they feel a sense of ownership. Consider making decisions collaboratively, or delegating decisions to team members who are leading aspects of the work (e.g. let the developers choose which software language to use). If you have regular meetings, consider rotating the role of facilitator to encourage diverse leadership styles. -2. **Make room for marketing:** Don’t neglect storytelling or marketing. Seek out volunteers with communications experience. Make a short video about your project for social media. Write some blog posts. Look for opportunities to present about your work and refine your pitch (hacknights are a safe space to practice presenting!). -3. **Celebrate progress:** Successful civic tech teams celebrate their milestones. Be intentional about celebrating wins, no matter how small, to maintain momentum. +1. **Empower others:** People are more likely to participate in projects when they feel a sense of ownership. Consider making decisions collaboratively, or delegating decisions to team members who are leading aspects of the work (e.g. let the developers choose which software language to use). If you have regular meetings, consider rotating the role of facilitator to encourage diverse leadership styles. +2. **Make room for marketing:** Don’t neglect storytelling or marketing. Seek out volunteers with communications experience. Make a short video about your project for social media. Write some blog posts. Look for opportunities to present about your work and refine your pitch (hacknights are a safe space to practice presenting!). +3. **Celebrate progress:** Successful civic tech teams celebrate their milestones. Be intentional about celebrating wins, no matter how small, to maintain momentum. ## Resources to help: -* INSERT: [Collaborative decision making frameworks or tools](https://slack.com/blog/collaboration/decisionmaking-process-team), -* INSERT: example meeting agendas or facilitation tools, -* INSERT: sample comms materials from past projects, -* INSERT: etc. \ No newline at end of file +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/03-ways-of-working/04-continuing-the-journey.md b/docs/03-ways-of-working/04-continuing-the-journey.mdx similarity index 51% rename from docs/03-ways-of-working/04-continuing-the-journey.md rename to docs/03-ways-of-working/04-continuing-the-journey.mdx index 7201dff..e28abf5 100644 --- a/docs/03-ways-of-working/04-continuing-the-journey.md +++ b/docs/03-ways-of-working/04-continuing-the-journey.mdx @@ -20,15 +20,19 @@ Continuing the journey in civic tech involves embracing continuous learning, ada ## How to practice: -1. **Embrace iterative development**: Continuously test, learn, and refine your solution based on feedback and data. -2. **Foster a learning culture**: Encourage experimentation, reflection, and knowledge sharing within your team. -3. **Stay connected to your community**: Regularly engage with users and stakeholders to understand changing needs and contexts. -4. **Monitor and evaluate**: Implement systems to track your project's impact and identify areas for improvement. -5. **Adapt to change**: Be prepared to pivot or evolve your approach as circumstances and needs shift. -6. **Plan for sustainability**: Develop strategies for long-term maintenance, funding, and community ownership. -7. **Share learnings**: Document and share your experiences, successes, and failures with the wider civic tech community. -8. **Cultivate resilience**: Build capacity to navigate challenges and setbacks while maintaining focus on your goals. +1. **Embrace iterative development**: Continuously test, learn, and refine your solution based on feedback and data. +2. **Foster a learning culture**: Encourage experimentation, reflection, and knowledge sharing within your team. +3. **Stay connected to your community**: Regularly engage with users and stakeholders to understand changing needs and contexts. +4. **Monitor and evaluate**: Implement systems to track your project's impact and identify areas for improvement. +5. **Adapt to change**: Be prepared to pivot or evolve your approach as circumstances and needs shift. +6. **Plan for sustainability**: Develop strategies for long-term maintenance, funding, and community ownership. +7. **Share learnings**: Document and share your experiences, successes, and failures with the wider civic tech community. +8. **Cultivate resilience**: Build capacity to navigate challenges and setbacks while maintaining focus on your goals. :::note[Remember] The journey of a civic tech project doesn't end with launch or implementation. Commit to ongoing development and adaptation to ensure your solution continues to create value for your community in the long term. -::: \ No newline at end of file +::: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/04-project-lifecycle/01-explore.md b/docs/04-project-lifecycle/01-explore.md deleted file mode 100644 index d349f15..0000000 --- a/docs/04-project-lifecycle/01-explore.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: 3.1 Discover -description: Get to know your community and the problem you're trying to solve. Talk to people, observe, and gather information. ---- - -This is where you learn about your community and the problem you're trying to solve. You'll do research to understand people's needs, how the community works, and what's already out there. - -Stay open-minded during this phase. Your goal is to learn, not to jump to solutions right away. - -:::tip -Include your team and community members in the research. It helps everyone understand the problem better. -::: - -## Key activities: - -1. User research - * Conduct interviews, surveys, and observations with diverse community members - * Create user personas and journey maps to visualize user experiences - * Identify pain points and opportunities in current processes or systems -2. Stakeholder mapping - * Identify and engage with key stakeholders, including government offices, community organizations, and local businesses - * Understand their perspectives, needs, and potential contributions to the project -3. Problem exploration - * Define the scope of the challenge you're addressing - * Investigate root causes and systemic factors contributing to the problem - * Research existing solutions and their effectiveness -4. Data gathering and analysis - * Collect and analyze relevant data from various sources - * Identify trends, patterns, and insights that inform your understanding -5. Context mapping - * Understand the broader ecosystem, including policy landscape, technological infrastructure, and community dynamics - * Identify potential barriers and enablers for your project -6. Opportunity identification - * Synthesize your research to identify key opportunity areas - * Generate initial ideas for potential solutions - -## Resources to help: - -- [https://www.gov.uk/service-manual/agile-delivery/how-the-discovery-phase-works](https://www.gov.uk/service-manual/agile-delivery/how-the-discovery-phase-works) -- [https://www.ontario.ca/page/service-design-playbook\#section-1](https://www.ontario.ca/page/service-design-playbook\#section-1) -- https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-1-discover/ \ No newline at end of file diff --git a/docs/04-project-lifecycle/01-explore.mdx b/docs/04-project-lifecycle/01-explore.mdx new file mode 100644 index 0000000..a0bc451 --- /dev/null +++ b/docs/04-project-lifecycle/01-explore.mdx @@ -0,0 +1,41 @@ +--- +title: 3.1 Discover +description: Get to know your community and the problem you're trying to solve. Talk to people, observe, and gather information. +--- + +This is where you learn about your community and the problem you're trying to solve. You'll do research to understand people's needs, how the community works, and what's already out there. + +Stay open-minded during this phase. Your goal is to learn, not to jump to solutions right away. + +:::tip +Include your team and community members in the research. It helps everyone understand the problem better. +::: + +## Key activities: + +1. User research + - Conduct interviews, surveys, and observations with diverse community members + - Create user personas and journey maps to visualize user experiences + - Identify pain points and opportunities in current processes or systems +2. Stakeholder mapping + - Identify and engage with key stakeholders, including government offices, community organizations, and local businesses + - Understand their perspectives, needs, and potential contributions to the project +3. Problem exploration + - Define the scope of the challenge you're addressing + - Investigate root causes and systemic factors contributing to the problem + - Research existing solutions and their effectiveness +4. Data gathering and analysis + - Collect and analyze relevant data from various sources + - Identify trends, patterns, and insights that inform your understanding +5. Context mapping + - Understand the broader ecosystem, including policy landscape, technological infrastructure, and community dynamics + - Identify potential barriers and enablers for your project +6. Opportunity identification + - Synthesize your research to identify key opportunity areas + - Generate initial ideas for potential solutions + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/04-project-lifecycle/02-reframe.md b/docs/04-project-lifecycle/02-reframe.md deleted file mode 100644 index 5c1f3ca..0000000 --- a/docs/04-project-lifecycle/02-reframe.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: 3.2 Define -description: Figure out exactly what needs fixing. This is where you narrow down your focus based on what you learned. ---- -This is where you make sense of what you've learned and pinpoint the real problem you want to solve. You'll challenge your assumptions and set a clear direction for your project. - -Take your time with this phase. A well-defined problem makes it much easier to find good solutions. - -:::tip -Try using diagrams or mind maps to organize your thoughts. It can help you see connections and explain your ideas to others. -::: - -## Key activities: - -1. Synthesize research - * Collate and analyze all data and insights from the Explore phase - * Identify key themes, patterns, and contradictions in your findings -2. Define the problem statement - * Articulate the core problem clearly and concisely - * Ensure the problem statement reflects user needs and community context -3. Challenge assumptions - * Critically examine existing beliefs about the problem and potential solutions - * Encourage diverse perspectives to uncover hidden biases or oversights -4. Identify success criteria - * Define what success looks like for your project - * Establish measurable goals and outcomes -5. Prioritize focus areas - * Determine which aspects of the problem to address first - * Consider factors like impact, feasibility, and resource availability -6. Create a design brief - * Document your problem statement, target users, goals, and constraints - * Use this brief to guide your team in the subsequent Create phase -7. Align stakeholders - * Present your reframed problem and approach to key stakeholders - * Ensure buy-in and shared understanding before moving forward - -## Resources to help: - -- "How to Define a Problem Statement": [https://www.nngroup.com/articles/problem-statements/](https://www.nngroup.com/articles/problem-statements/) -- [https://www.gov.uk/service-manual/agile-delivery/how-the-alpha-phase-works](https://www.gov.uk/service-manual/agile-delivery/how-the-alpha-phase-works) -- [https://www.ontario.ca/page/service-design-playbook\#section-2](https://www.ontario.ca/page/service-design-playbook\#section-2) -- [https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-2-define](https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-2-define) -- An example design brief? -- OKRs \ No newline at end of file diff --git a/docs/04-project-lifecycle/02-reframe.mdx b/docs/04-project-lifecycle/02-reframe.mdx new file mode 100644 index 0000000..26ccac3 --- /dev/null +++ b/docs/04-project-lifecycle/02-reframe.mdx @@ -0,0 +1,42 @@ +--- +title: 3.2 Define +description: Figure out exactly what needs fixing. This is where you narrow down your focus based on what you learned. +--- + +This is where you make sense of what you've learned and pinpoint the real problem you want to solve. You'll challenge your assumptions and set a clear direction for your project. + +Take your time with this phase. A well-defined problem makes it much easier to find good solutions. + +:::tip +Try using diagrams or mind maps to organize your thoughts. It can help you see connections and explain your ideas to others. +::: + +## Key activities: + +1. Synthesize research + - Collate and analyze all data and insights from the Explore phase + - Identify key themes, patterns, and contradictions in your findings +2. Define the problem statement + - Articulate the core problem clearly and concisely + - Ensure the problem statement reflects user needs and community context +3. Challenge assumptions + - Critically examine existing beliefs about the problem and potential solutions + - Encourage diverse perspectives to uncover hidden biases or oversights +4. Identify success criteria + - Define what success looks like for your project + - Establish measurable goals and outcomes +5. Prioritize focus areas + - Determine which aspects of the problem to address first + - Consider factors like impact, feasibility, and resource availability +6. Create a design brief + - Document your problem statement, target users, goals, and constraints + - Use this brief to guide your team in the subsequent Create phase +7. Align stakeholders + - Present your reframed problem and approach to key stakeholders + - Ensure buy-in and shared understanding before moving forward + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/04-project-lifecycle/03-create.md b/docs/04-project-lifecycle/03-create.md deleted file mode 100644 index 4fd076a..0000000 --- a/docs/04-project-lifecycle/03-create.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: 3.3 Develop -description: Come up with ideas and start building. Try things out, get feedback, and keep improving. ---- - -This is where you come up with ideas, build quick versions of your solution, and test them out. You'll keep improving your ideas based on what you learn. - -This phase is all about learning and improving. Don't worry if your first idea isn't perfect - that's normal! - -:::tip -Try to involve users throughout this phase, not just for testing. Consider having sessions where users help create and refine ideas. -::: - -## Key activities: - -1. Ideation - * Conduct brainstorming sessions to generate a wide range of potential solutions - * Encourage creative thinking and consider unconventional approaches - * Involve diverse participants to bring varied perspectives -2. Concept development - * Refine and combine ideas into coherent solution concepts - * Evaluate concepts against your problem statement and success criteria - * Select the most promising concepts for prototyping -3. Rapid prototyping - * Create low-fidelity prototypes to visualize and test key aspects of your solutions - * Use methods appropriate to your project (e.g., paper prototypes, wireframes, mock-ups) - * Focus on quickly demonstrating core functionality and user interactions -4. User testing - * Test prototypes with real users from your target community - * Gather feedback on usability, desirability, and potential impact - * Observe how users interact with your prototypes -5. Iteration - * Analyze user feedback and testing results - * Refine and improve your prototypes based on insights gained - * Repeat the prototyping and testing cycle as needed -6. Technical feasibility assessment - * Evaluate the technical requirements and constraints of your proposed solutions - * Consult with developers and other technical experts as needed -7. Stakeholder reviews - * Present prototypes and testing results to key stakeholders - * Gather input and ensure alignment with organizational goals and constraints - -## Resources to help: - -- "User Testing Basics": [https://www.usability.gov/how-to-and-tools/methods/usability-testing.html](https://www.usability.gov/how-to-and-tools/methods/usability-testing.html) -- -- https://www.gov.uk/service-manual/agile-delivery/how-the-beta-phase-works -- [https://www.ontario.ca/page/service-design-playbook\#Beta](https://www.ontario.ca/page/service-design-playbook\#Beta) -- [https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-3-develop/](https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-3-develop/) -- THIS SECTION REALLY NEEDS SOME TECHNICAL RESOURCES; LIKE HOW TO USE GITHUB, HOW TO QUICKLY HOST A WEBSITE, TOOLS LIKE DOCUSAURUS, FREE DATA TOOLS, OPEN SOURCE STUFF, ETC. diff --git a/docs/04-project-lifecycle/03-create.mdx b/docs/04-project-lifecycle/03-create.mdx new file mode 100644 index 0000000..49eca05 --- /dev/null +++ b/docs/04-project-lifecycle/03-create.mdx @@ -0,0 +1,47 @@ +--- +title: 3.3 Develop +description: Come up with ideas and start building. Try things out, get feedback, and keep improving. +--- + +This is where you come up with ideas, build quick versions of your solution, and test them out. You'll keep improving your ideas based on what you learn. + +This phase is all about learning and improving. Don't worry if your first idea isn't perfect - that's normal! + +:::tip +Try to involve users throughout this phase, not just for testing. Consider having sessions where users help create and refine ideas. +::: + +## Key activities: + +1. Ideation + - Conduct brainstorming sessions to generate a wide range of potential solutions + - Encourage creative thinking and consider unconventional approaches + - Involve diverse participants to bring varied perspectives +2. Concept development + - Refine and combine ideas into coherent solution concepts + - Evaluate concepts against your problem statement and success criteria + - Select the most promising concepts for prototyping +3. Rapid prototyping + - Create low-fidelity prototypes to visualize and test key aspects of your solutions + - Use methods appropriate to your project (e.g., paper prototypes, wireframes, mock-ups) + - Focus on quickly demonstrating core functionality and user interactions +4. User testing + - Test prototypes with real users from your target community + - Gather feedback on usability, desirability, and potential impact + - Observe how users interact with your prototypes +5. Iteration + - Analyze user feedback and testing results + - Refine and improve your prototypes based on insights gained + - Repeat the prototyping and testing cycle as needed +6. Technical feasibility assessment + - Evaluate the technical requirements and constraints of your proposed solutions + - Consult with developers and other technical experts as needed +7. Stakeholder reviews + - Present prototypes and testing results to key stakeholders + - Gather input and ensure alignment with organizational goals and constraints + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/04-project-lifecycle/04-catalyze.md b/docs/04-project-lifecycle/04-catalyze.md deleted file mode 100644 index a0d4446..0000000 --- a/docs/04-project-lifecycle/04-catalyze.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: 3.4 Deliver -description: Put your solution out there for people to use. Keep an eye on how it's working and make it better over time. ---- - -This is where you put your solution out into the world, help people use it, and keep making it better. You'll focus on getting people to use your tool and making sure it keeps working well over time. - -:::tip -Think about the long-term from the start. Consider how your project will keep running and improving over time. -::: - -## Key activities: - -1. Develop and launch - * Build out the full version of your solution based on validated prototypes - * Conduct thorough testing to ensure reliability and security - * Plan and execute a strategic launch to your target users -2. User onboarding and support - * Create clear, accessible user guides and documentation - * Develop a support system to assist users and address issues - * Provide training or workshops to key user groups if necessary -3. Monitor and evaluate - * Implement analytics and feedback mechanisms to track usage and impact - * Regularly collect and analyze data on key performance indicators - * Conduct ongoing user research to understand evolving needs and experiences -4. Iterate and improve - * Use insights from monitoring and evaluation to make continuous improvements - * Prioritize and implement updates based on user feedback and observed needs - * Stay responsive to changing community needs and technological advances -5. Scale and replicate - * Identify opportunities to expand the reach or functionality of your solution - * Document your process and learnings to facilitate replication in other contexts - * Engage with other civic tech communities to share knowledge and resources -6. Measure and communicate impact - * Collect and analyze data on the outcomes and impact of your project - * Create compelling narratives and visualizations to communicate your impact - * Share results with stakeholders, funders, and the broader civic tech community - -## Resources to help: - -- [https://codeforall.org/2023/03/20/scaling-for-success-best-practices-for-sustaining-civic-tech/](https://codeforall.org/2023/03/20/scaling-for-success-best-practices-for-sustaining-civic-tech/) -- [https://www.gov.uk/service-manual/agile-delivery/how-the-live-phase-works](https://www.gov.uk/service-manual/agile-delivery/how-the-live-phase-works) -- [https://www.ontario.ca/page/service-design-playbook\#section-4](https://www.ontario.ca/page/service-design-playbook\#section-4) -- [https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-4-deliver/](https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-4-deliver/) \ No newline at end of file diff --git a/docs/04-project-lifecycle/04-catalyze.mdx b/docs/04-project-lifecycle/04-catalyze.mdx new file mode 100644 index 0000000..638fd58 --- /dev/null +++ b/docs/04-project-lifecycle/04-catalyze.mdx @@ -0,0 +1,43 @@ +--- +title: 3.4 Deliver +description: Put your solution out there for people to use. Keep an eye on how it's working and make it better over time. +--- + +This is where you put your solution out into the world, help people use it, and keep making it better. You'll focus on getting people to use your tool and making sure it keeps working well over time. + +:::tip +Think about the long-term from the start. Consider how your project will keep running and improving over time. +::: + +## Key activities: + +1. Develop and launch + - Build out the full version of your solution based on validated prototypes + - Conduct thorough testing to ensure reliability and security + - Plan and execute a strategic launch to your target users +2. User onboarding and support + - Create clear, accessible user guides and documentation + - Develop a support system to assist users and address issues + - Provide training or workshops to key user groups if necessary +3. Monitor and evaluate + - Implement analytics and feedback mechanisms to track usage and impact + - Regularly collect and analyze data on key performance indicators + - Conduct ongoing user research to understand evolving needs and experiences +4. Iterate and improve + - Use insights from monitoring and evaluation to make continuous improvements + - Prioritize and implement updates based on user feedback and observed needs + - Stay responsive to changing community needs and technological advances +5. Scale and replicate + - Identify opportunities to expand the reach or functionality of your solution + - Document your process and learnings to facilitate replication in other contexts + - Engage with other civic tech communities to share knowledge and resources +6. Measure and communicate impact + - Collect and analyze data on the outcomes and impact of your project + - Create compelling narratives and visualizations to communicate your impact + - Share results with stakeholders, funders, and the broader civic tech community + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/docs/04-project-lifecycle/05-evolve.md b/docs/04-project-lifecycle/05-evolve.md deleted file mode 100644 index 8d5bdc9..0000000 --- a/docs/04-project-lifecycle/05-evolve.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: 3.5 Evolve -description: Decide on the next steps for your project. This could mean growing it, handing it off, or winding it down based on how it's working and what the community needs. ---- - -Once your project is out in the world, it might take different paths. This phase is about recognizing when your project needs to change direction and how to handle that change. - -Change is a normal part of any project's lifecycle. Be open to different outcomes and focus on what's best for your community. - -:::tip -Regular check-ins on your project's direction can help you spot the need for change early -::: - -## Why it matters: - -* Projects often need to adapt as community needs change -* Some projects fulfill their purpose and need to wind down -* Others might be ready to grow beyond your original team -* Understanding these possibilities helps you plan and make tough decisions - -## Key activities: - -1. Assess your project's current state - * Look at usage data, community feedback, and resource requirements - * Consider if the project is still meeting its original goals -2. Explore different paths - * Continuing: Keep running and improving the project - * Scaling: Grow the project to serve more people or address new needs - * Handing off: Transfer the project to another organization or government - * Hibernating: Put the project on pause if it's not currently needed - * Retiring: Wind down the project if it's completed its purpose -3. Plan for transitions - * If handing off, document everything clearly for the new owners - * If retiring, communicate clearly with users and archive the work - * If scaling, consider what new resources or partnerships you'll need -4. Learn and share - * Reflect on what worked well and what you'd do differently - * Share your experiences with the civic tech community - -## Resources to help: - -* Example documentation from a hibernated project, example project that was handed off and advice on how to do so, - - - -- [Retiring Your Service](https://www.gov.uk/service-manual/agile-delivery/retiring-your-service) -- [Its Okay to Hit Pause](https://opensource.guide/best-practices/\#its-okay-to-hit-pause) diff --git a/docs/04-project-lifecycle/05-evolve.mdx b/docs/04-project-lifecycle/05-evolve.mdx new file mode 100644 index 0000000..969c065 --- /dev/null +++ b/docs/04-project-lifecycle/05-evolve.mdx @@ -0,0 +1,44 @@ +--- +title: 3.5 Evolve +description: Decide on the next steps for your project. This could mean growing it, handing it off, or winding it down based on how it's working and what the community needs. +--- + +Once your project is out in the world, it might take different paths. This phase is about recognizing when your project needs to change direction and how to handle that change. + +Change is a normal part of any project's lifecycle. Be open to different outcomes and focus on what's best for your community. + +:::tip +Regular check-ins on your project's direction can help you spot the need for change early +::: + +## Why it matters: + +- Projects often need to adapt as community needs change +- Some projects fulfill their purpose and need to wind down +- Others might be ready to grow beyond your original team +- Understanding these possibilities helps you plan and make tough decisions + +## Key activities: + +1. Assess your project's current state + - Look at usage data, community feedback, and resource requirements + - Consider if the project is still meeting its original goals +2. Explore different paths + - Continuing: Keep running and improving the project + - Scaling: Grow the project to serve more people or address new needs + - Handing off: Transfer the project to another organization or government + - Hibernating: Put the project on pause if it's not currently needed + - Retiring: Wind down the project if it's completed its purpose +3. Plan for transitions + - If handing off, document everything clearly for the new owners + - If retiring, communicate clearly with users and archive the work + - If scaling, consider what new resources or partnerships you'll need +4. Learn and share + - Reflect on what worked well and what you'd do differently + - Share your experiences with the civic tech community + +## Resources to help: + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/package-lock.json b/package-lock.json index 3601f85..4befd90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,10 @@ "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/preset-classic": "3.5.2", + "@dotenvx/dotenvx": "^1.22.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", + "node-fetch": "^3.3.2", "prism-react-renderer": "^2.3.0", "react": "^18.0.0", "react-dom": "^18.0.0" @@ -3029,6 +3031,103 @@ "node": ">=18.0" } }, + "node_modules/@dotenvx/dotenvx": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.22.0.tgz", + "integrity": "sha512-EO09sE4iHu/MuKSx1FKQwXHQZ50mF0O4KUnBa3Rrlhgdwv0byg53lDcOpWpbaeq/f8z0dJ1EdV6Su1rugVanug==", + "license": "BSD-3-Clause", + "dependencies": { + "commander": "^11.1.0", + "dotenv": "^16.4.5", + "eciesjs": "^0.4.10", + "execa": "^5.1.1", + "fdir": "^6.2.0", + "ignore": "^5.3.0", + "object-treeify": "1.1.33", + "picomatch": "^4.0.2", + "which": "^4.0.0" + }, + "bin": { + "dotenvx": "src/cli/dotenvx.js", + "git-dotenvx": "src/cli/dotenvx.js" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@ecies/ciphers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.1.tgz", + "integrity": "sha512-ezMihhjW24VNK/2qQR7lH8xCQY24nk0XHF/kwJ1OuiiY5iEwQXOcKVSy47fSoHPRG8gVGXcK5SgtONDk5xMwtQ==", + "license": "MIT", + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", @@ -3416,6 +3515,45 @@ "react": ">=16" } }, + "node_modules/@noble/ciphers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.0.0.tgz", + "integrity": "sha512-wH5EHOmLi0rEazphPbecAzmjd12I6/Yv/SiHdkA9LSycsQk7RuuTp7am5/o62qYr0RScE7Pc9icXGBbsr6cesA==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -6455,6 +6593,15 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -6914,6 +7061,18 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -6926,6 +7085,23 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/eciesjs": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.11.tgz", + "integrity": "sha512-SmUG449n1w1YGvJD9R30tBGvpxTxA0cnn0rfvpFIBvmezfIhagLjsH2JG8HBHOLS8slXsPh48II7IDUTH/J3Mg==", + "license": "MIT", + "dependencies": { + "@ecies/ciphers": "^0.2.1", + "@noble/ciphers": "^1.0.0", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0" + }, + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7974,6 +8150,29 @@ "node": ">=0.4.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -8347,6 +8546,18 @@ "node": ">=0.4.x" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -13080,6 +13291,25 @@ "tslib": "^2.0.3" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", @@ -13095,6 +13325,24 @@ "node": ">=18" } }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -13200,6 +13448,15 @@ "node": ">= 0.4" } }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/object.assign": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", @@ -17470,6 +17727,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webpack": { "version": "5.94.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", diff --git a/package.json b/package.json index 49d3c67..899123a 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@docusaurus/preset-classic": "3.5.2", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", + "node-fetch": "^3.3.2", "prism-react-renderer": "^2.3.0", "react": "^18.0.0", "react-dom": "^18.0.0" diff --git a/scripts/exportResources.js b/scripts/exportResources.js new file mode 100644 index 0000000..608e146 --- /dev/null +++ b/scripts/exportResources.js @@ -0,0 +1,44 @@ +// scripts/exportResources.js +import fetch from "node-fetch"; +import fs from "fs"; +import { config } from "@dotenvx/dotenvx"; + +// Load environment variables from .env file +config(); +config({ path: ".env.local" }); + +const API_URL = process.env.NOCODB_API_URL; +const API_KEY = process.env.NOCODB_API_KEY; + +const exportData = async () => { + try { + if (!API_URL || !API_KEY) { + throw new Error("API_URL or API_KEY is missing. Check your .env file."); + } + + const response = await fetch(API_URL, { + headers: { + accept: "application/json", + "xc-token": API_KEY, + }, + }); + + if (!response.ok) { + throw new Error(`Status: ${response.status}`); + } + + const data = await response.json(); + const resourceList = data.list; + + // Save the data to resources.json in the root directory + fs.writeFileSync( + "static/json/resources.json", + JSON.stringify(resourceList, null, 2) + ); + console.log("Success"); + } catch (error) { + console.error("Error:", error); + } +}; + +exportData(); diff --git a/src/components/FilteredResources/index.tsx b/src/components/FilteredResources/index.tsx new file mode 100644 index 0000000..2a1489f --- /dev/null +++ b/src/components/FilteredResources/index.tsx @@ -0,0 +1,76 @@ +import React, { useEffect, useState } from "react"; + +interface Resource { + title: string; + description: string; + category_name: string; + section_name: string; + url: string; + tag_array: string[]; +} + +interface FilteredResourcesProps { + matchTag?: string; // Tag to filter resources by (optional) + matchSection?: string; // Section to filter resources by (optional) +} + +const FilteredResources: React.FC = ({ + matchTag, + matchSection, +}) => { + const [resources, setResources] = useState([]); + const [filteredResources, setFilteredResources] = useState([]); + + useEffect(() => { + // Fetch the resources.json file + fetch("/civicsaurus/json/resources.json") + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.json(); + }) + .then((data: Resource[]) => { + setResources(data); + }) + .catch((error) => console.error("Error fetching resources:", error)); + }, []); + + useEffect(() => { + // Filter resources based on matchTag or matchSection + const filtered = resources.filter((resource) => { + const tagMatch = matchTag ? resource.tag_array.includes(matchTag) : true; + const sectionMatch = matchSection + ? resource.section_name === matchSection + : true; + return tagMatch && sectionMatch; + }); + + setFilteredResources(filtered); + }, [resources, matchTag, matchSection]); + + return ( +
+

+ Resources {matchTag && `Tagged with "${matchTag}"`}{" "} + {matchSection && `in Section "${matchSection}"`} +

+ {filteredResources.length === 0 ? ( +

No resources found for the selected criteria.

+ ) : ( +
    + {filteredResources.map((resource, index) => ( +
  • + + {resource.title} + {" "} + | {resource.description} +
  • + ))} +
+ )} +
+ ); +}; + +export default FilteredResources; diff --git a/src/pages/resources.tsx b/src/pages/resources.tsx index 9c70187..66e14fc 100644 --- a/src/pages/resources.tsx +++ b/src/pages/resources.tsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useState } from "react"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; // Define a TypeScript interface for your resource data interface Resource { @@ -11,18 +12,22 @@ interface Resource { const Resources: React.FC = () => { const [resources, setResources] = useState([]); + const { siteConfig } = useDocusaurusContext(); + const baseUrl = siteConfig.baseUrl; useEffect(() => { - // Fetch the resources.json file from the correct path - fetch('/json/resources.json') + fetch(`${baseUrl}json/resources.json`) .then((response) => { if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } return response.json(); }) - .then((data: Resource[]) => setResources(data)) - .catch((error) => console.error('Error fetching resources:', error)); + .then((data: Resource[]) => { + console.log("Fetched data:", data); // Log the data + setResources(data); + }) + .catch((error) => console.error("Error fetching resources:", error)); }, []); return ( @@ -33,8 +38,8 @@ const Resources: React.FC = () => {
  • {resource.title} - -

    {resource.description}

    + {" "} + | {resource.description}
  • ))} @@ -42,4 +47,4 @@ const Resources: React.FC = () => { ); }; -export default Resources; \ No newline at end of file +export default Resources; diff --git a/static/json/resources.json b/static/json/resources.json index 5fc7792..1f9a745 100644 --- a/static/json/resources.json +++ b/static/json/resources.json @@ -1,16 +1,781 @@ [ - { - "title": "Docusaurus Documentation", - "description": "Official Docusaurus documentation site.", - "category": "Documentation", - "url": "https://docusaurus.io/docs", - "tags": ["docs", "docusaurus", "guide"] - }, - { - "title": "MDX Documentation", - "description": "Learn how to use MDX for writing content.", - "category": "MDX", - "url": "https://mdxjs.com/docs", - "tags": ["mdx", "content", "markdown"] - } + { + "title": "Usability – Digital.gov", + "description": "digital.gov's resources on usability", + "url": "https://digital.gov/topics/usability/", + "category_name": null, + "section_name": "user centered and inclusive", + "tag_array": [ + "user centered " + ] + }, + { + "title": "GitHub Skills", + "description": "Interactive courses designed for both beginners and experts to learn how to use GitHub effectively", + "url": "https://skills.github.com/", + "section_name": "open and transparent", + "category_name": "learn", + "tag_array": [ + "learning" + ] + }, + { + "title": "Creative Commons", + "description": "An organization that provides free, easy-to-use copyright licenses to make creative work legally shareable", + "url": "https://creativecommons.org/", + "category_name": null, + "section_name": "open and transparent", + "tag_array": [ + "licensing" + ] + }, + { + "title": "The Open Source Initiative (OSI)", + "description": "A non-profit organization that promotes and protects open source software through education, collaboration, and infrastructure", + "url": "https://opensource.org/", + "category_name": null, + "section_name": "open and transparent", + "tag_array": [ + "open source", + "licensing" + ] + }, + { + "title": "Software Freedom Law Center", + "description": "An organization that provides pro-bono legal services to protect free and open source software projects", + "url": "https://www.softwarefreedom.org/", + "category_name": null, + "section_name": null, + "tag_array": [ + "licensing" + ] + }, + { + "title": "Electronic Frontier Foundation (EFF)", + "description": "A non-profit defending civil liberties in the digital world, which provides resources on copyright and licensing issues", + "url": "https://www.eff.org/", + "category_name": null, + "section_name": null, + "tag_array": [ + "licensing" + ] + }, + { + "title": "Free Software Foundation (FSF)", + "description": "An organization that advocates for the freedom to use, study, and distribute software", + "url": "https://www.fsf.org/", + "category_name": null, + "section_name": null, + "tag_array": [ + "licensing" + ] + }, + { + "title": "Choose an Open Source License", + "description": "A guide to help you select the appropriate open source license for your project", + "url": "https://choosealicense.com/", + "section_name": "open and transparent", + "category_name": "guide", + "tag_array": [ + "open source", + "licensing" + ] + }, + { + "title": "Building Technology With, Not For Communities: An Engagement Guide for Civic Tech", + "description": "An article that provides guidelines on engaging communities effectively in civic tech projects", + "url": "https://medium.com/organizer-sandbox/building-technology-with-not-for-communities-an-engagement-guide-for-civic-tech-b8880982e65a", + "section_name": "user centered and inclusive", + "category_name": "idea", + "tag_array": [ + "community building", + "user centered " + ] + }, + { + "title": "Human-Centred Design and User Research with Ariel Sim", + "description": "An article that discusses human-centered design principles and the importance of user research in product development", + "url": "https://learn.marsdd.com/article/human-centred-design-and-user-research-with-ariel-sim/", + "category_name": null, + "section_name": "user centered and inclusive", + "tag_array": [ + "user research" + ] + }, + { + "title": "How to Craft Buyer and User Personas to Benefit Your Business", + "description": "An article offering guidance on creating detailed buyer and user personas to improve business strategies", + "url": "https://learn.marsdd.com/article/how-to-craft-buyer-and-user-personas-to-benefit-your-business/", + "section_name": "user centered and inclusive", + "category_name": "guide", + "tag_array": [ + "strategy" + ] + }, + { + "title": "How to Work Open", + "description": "An article explaining the principles and practices of working openly in collaborative projects", + "url": "https://openmatt.org/2011/04/06/how-to-work-open/", + "section_name": "open and transparent", + "category_name": "guide", + "tag_array": [ + "community building", + "open source" + ] + }, + { + "title": "Working Open – Mozilla Science Leadership Training", + "description": "An interactive training program designed to build leadership skills for open science and research initiatives", + "url": "https://mozillascience.github.io/leadership-training/index.html", + "section_name": "open and transparent", + "category_name": "guide", + "tag_array": [ + "community building" + ] + }, + { + "title": "How and Why to Reduce Your Scope", + "description": "An article discussing strategies for narrowing project scope to improve focus and efficiency", + "url": "https://www.samjulien.com/how-and-why-to-reduce-your-scope", + "section_name": "iterative and responsive", + "category_name": "guide", + "tag_array": [ + "product management" + ] + }, + { + "title": "How to Use the Value Proposition Design Canvas", + "description": "An article explaining how to utilize the Value Proposition Design Canvas to align product offerings with customer needs", + "url": "https://learn.marsdd.com/article/how-to-use-the-value-proposition-design-canvas-2/", + "section_name": "vision setting", + "category_name": "guide", + "tag_array": [ + "strategy", + "product management", + "user research" + ] + }, + { + "title": "The Business Model Canvas", + "description": "An article providing an overview of the Business Model Canvas and how it can be used to visualize, design, and pivot business models", + "url": "https://www.strategyzer.com/library/the-business-model-canvas", + "section_name": "sustainable and scalable", + "category_name": "tool", + "tag_array": [ + "strategy" + ] + }, + { + "title": "The Value Proposition Canvas", + "description": "A guide explaining the Value Proposition Canvas and how to use it to ensure products meet customer needs and desires", + "url": "https://www.strategyzer.com/library/the-value-proposition-canvas", + "section_name": "vision setting", + "category_name": "tool", + "tag_array": [ + "strategy", + "product management", + "user centered ", + "user research" + ] + }, + { + "title": "Scaling Civic Tech", + "description": "An in-depth report by the Knight Foundation on strategies for scaling civic tech projects and increasing their impact", + "url": "https://knightfoundation.org/wp-content/uploads/2020/03/Scaling_Civic_Tech_final.pdf", + "category_name": null, + "section_name": "sustainable and scalable", + "tag_array": [ + "scaling" + ] + }, + { + "title": "The Product Vision Board", + "description": "A tool designed by Roman Pichler to help teams describe, visualize, and validate their product vision and strategy", + "url": "https://www.romanpichler.com/tools/product-vision-board/", + "section_name": "vision setting", + "category_name": "tool", + "tag_array": [ + "strategy", + "product management" + ] + }, + { + "title": "Norms for Working in Teams", + "description": "Guidelines from Stanford d.school on setting team norms to enhance collaboration and effectiveness", + "url": "https://dschool.stanford.edu/resources/norms", + "section_name": "leadership and storytelling", + "category_name": "idea", + "tag_array": [ + "team development" + ] + }, + { + "title": "Stages of Team Development", + "description": "An article from MIT HR explaining the different stages of team development and how to navigate them effectively", + "url": "https://hr.mit.edu/learning-topics/teams/articles/stages-development", + "category_name": null, + "section_name": "leadership and storytelling", + "tag_array": [ + "leadership", + "team development" + ] + }, + { + "title": "Start with Why by Simon Sinek", + "description": "A TED Talk by Simon Sinek explaining the concept of starting with \"Why\" to inspire action and leadership", + "url": "https://www.youtube.com/watch?v=u4ZoJKF_VuA", + "section_name": "leadership and storytelling", + "category_name": "idea", + "tag_array": [ + "leadership" + ] + }, + { + "title": "Why Good Leaders Make You Feel Safe by Simon Sinek", + "description": "A TED Talk by Simon Sinek about the role of leadership in creating a sense of trust and safety within organizations", + "url": "https://www.youtube.com/watch?v=lmyZMtPVodo", + "section_name": "leadership and storytelling", + "category_name": "idea", + "tag_array": [ + "leadership", + "team development" + ] + }, + { + "title": "MIT 15.390 New Enterprises, Spring 2013", + "description": "A comprehensive lecture series from MIT's Sloan School of Management covering the process of identifying and quantifying market opportunities, and starting a new, technology-based enterprise", + "url": "https://www.youtube.com/playlist?list=PLUl4u3cNGP63CLq-GxVm4VSr-0iKAS-07", + "section_name": "iterative and responsive", + "category_name": "learn", + "tag_array": [ + "product management" + ] + }, + { + "title": "Stakeholder Analysis", + "description": "A guide on conducting stakeholder analysis, outlining methods to identify and understand the interests and influence of stakeholders in a project", + "url": "https://wikis.ec.europa.eu/display/ExactExternalWiki/Stakeholder+analysis", + "category_name": null, + "section_name": "connection and relationship", + "tag_array": [ + "user research", + "strategy" + ] + }, + { + "title": "Introduction to System Dynamics (MIT OCW)", + "description": "An MIT OpenCourseWare course covering the principles of system dynamics and how to model complex systems to improve decision-making", + "url": "https://ocw.mit.edu/courses/15-871-introduction-to-system-dynamics-fall-2013/", + "section_name": "connection and relationship", + "category_name": "learn", + "tag_array": [ + "systems thinking" + ] + }, + { + "title": "System Diagrams by Bob Williams", + "description": "A resource offering guidance and templates for creating effective system diagrams to understand and improve complex systems", + "url": "https://bobwilliams.gumroad.com/l/systemdiagrams", + "category_name": null, + "section_name": "connection and relationship", + "tag_array": [ + "systems thinking" + ] + }, + { + "title": "TANGO - Toronto Area Neighbourhood Groups Online", + "description": "A platform that maps and connects local residents' associations in Toronto, encouraging community involvement and engagement", + "url": "https://tango.to", + "category_name": null, + "section_name": "connection and relationship", + "tag_array": [ + "community building" + ] + }, + { + "title": "Group Decision Making", + "description": "A comprehensive guide from the University of Waterloo's Centre for Teaching Excellence outlining a seven-step model for effective group decision-making", + "url": "https://uwaterloo.ca/centre-for-teaching-excellence/catalogs/tip-sheets/group-decision-making", + "category_name": null, + "section_name": "leadership and storytelling", + "tag_array": [ + "decision making" + ] + }, + { + "title": "Team Decision-Making: How to Get It Right", + "description": "An article from Harvard Business School Online discussing strategies and best practices for effective team decision-making", + "url": "https://online.hbs.edu/blog/post/team-decision-making", + "category_name": null, + "section_name": "leadership and storytelling", + "tag_array": [ + "leadership", + "decision making" + ] + }, + { + "title": "How the Discovery Phase Works", + "description": "Guidance from the UK Government Service Manual on conducting the discovery phase in agile delivery, including research and user needs assessment", + "url": "https://www.gov.uk/service-manual/agile-delivery/how-the-discovery-phase-works", + "section_name": "discover", + "category_name": "guide", + "tag_array": [ + "discover phase" + ] + }, + { + "title": "Systemic Design Framework", + "description": "An in-depth resource from the Design Council introducing a framework for tackling complex problems using systemic design principles", + "url": "https://www.designcouncil.org.uk/our-resources/systemic-design-framework/", + "category_name": null, + "section_name": "leadership and storytelling", + "tag_array": [ + "decision making" + ] + }, + { + "title": "Seven Tenets of Human-Centred Design", + "description": "An article from the Design Council outlining the key principles of human-centred design and how to apply them in projects", + "url": "https://www.designcouncil.org.uk/our-resources/seven-tenets-of-human-centred-design/", + "section_name": "user centered and inclusive", + "category_name": "idea", + "tag_array": [ + "user centered " + ] + }, + { + "title": "Design Methods Step 1: Discover", + "description": "An article from the Design Council outlining the first step in the design process, focusing on discovery and understanding user needs", + "url": "https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-1-discover/", + "section_name": "discover", + "category_name": "guide", + "tag_array": [ + "discover phase" + ] + }, + { + "title": "Service Design Playbook", + "description": "A comprehensive guide by the Ontario Digital Service outlining the process of designing user-centered government services", + "url": "https://www.ontario.ca/page/service-design-playbook", + "category_name": null, + "section_name": "discover", + "tag_array": [ + "discover phase" + ] + }, + { + "title": "How the Alpha Phase Works", + "description": "Guidance from the UK Government Service Manual on what to do during the alpha phase of agile delivery, including prototyping and testing solutions", + "url": "https://www.gov.uk/service-manual/agile-delivery/how-the-alpha-phase-works", + "section_name": "define", + "category_name": "guide", + "tag_array": [ + "define phase" + ] + }, + { + "title": "How to Write a Problem Statement", + "description": "An article by Nielsen Norman Group that explains how to craft clear and effective problem statements to guide design and research efforts", + "url": "https://www.nngroup.com/articles/problem-statements/", + "category_name": null, + "section_name": "define", + "tag_array": [ + "problem definition" + ] + }, + { + "title": "Design Methods Step 2: Define", + "description": "An article from the Design Council detailing the second step in the design process, focusing on defining the problem and project scope", + "url": "https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-2-define", + "category_name": null, + "section_name": "define", + "tag_array": [ + "problem definition", + "define phase" + ] + }, + { + "title": "How the Beta Phase Works", + "description": "Guidance from the UK Government Service Manual on the beta phase of agile delivery, including developing, testing, and scaling a service", + "url": "https://www.gov.uk/service-manual/agile-delivery/how-the-beta-phase-works", + "section_name": "develop", + "category_name": "guide", + "tag_array": [ + "develop phase" + ] + }, + { + "title": "Service Design Playbook - Beta Phase", + "description": "A section of the Ontario Digital Service's Service Design Playbook that provides guidance on the beta phase, focusing on testing and improving a service before full launch", + "url": "https://www.ontario.ca/page/service-design-playbook#Beta", + "section_name": "develop", + "category_name": "guide", + "tag_array": [ + "develop phase" + ] + }, + { + "title": "Service Design Playbook - Alpha Phase", + "description": "A section of the Ontario Digital Service's Service Design Playbook that outlines key principles and practices for designing effective and user-centered services", + "url": "https://www.ontario.ca/page/service-design-playbook#section-2", + "section_name": "define", + "category_name": "guide", + "tag_array": [ + "define phase" + ] + }, + { + "title": "Design Methods Step 3: Develop", + "description": "An article from the Design Council that explains the third step in the design process, focusing on developing and iterating solutions", + "url": "https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-3-develop/", + "section_name": "develop", + "category_name": "guide", + "tag_array": [ + "develop phase" + ] + }, + { + "title": "How the Live Phase Works", + "description": "Guidance from the UK Government Service Manual on the live phase of agile delivery, including continuous improvement and monitoring of the service", + "url": "https://www.gov.uk/service-manual/agile-delivery/how-the-live-phase-", + "section_name": "deliver", + "category_name": "guide", + "tag_array": [ + "deliver phase" + ] + }, + { + "title": "Service Design Playbook - Live Phase", + "description": "A section of the Ontario Digital Service's Service Design Playbook that outlines key principles and practices for designing effective and user-centered services", + "url": "https://www.ontario.ca/page/service-design-playbook#section-3", + "category_name": null, + "section_name": "deliver", + "tag_array": [ + "deliver phase" + ] + }, + { + "title": "Design Methods Step 4: Deliver", + "description": "An article from the Design Council detailing the fourth step in the design process, focusing on delivering the final solution and assessing its impact", + "url": "https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-4-deliver/", + "section_name": "deliver", + "category_name": "guide", + "tag_array": [ + "deliver phase" + ] + }, + { + "title": "Scaling for Success: Best Practices for Sustaining Civic Tech", + "description": "An article from Code for All discussing strategies and best practices for scaling and sustaining civic tech initiatives", + "url": "https://codeforall.org/2023/03/20/scaling-for-success-best-practices-for-sustaining-civic-tech/", + "category_name": null, + "section_name": "sustainable and scalable", + "tag_array": [ + "scaling" + ] + }, + { + "title": "Retiring Your Service", + "description": "Guidance from the UK Government Service Manual on how to properly retire a service, including planning, communication, and data management", + "url": "https://www.gov.uk/service-manual/agile-delivery/retiring-your-service", + "section_name": "evolve", + "category_name": "guide", + "tag_array": [ + "strategy" + ] + }, + { + "title": "Open Source Best Practices: It's Okay to Hit Pause", + "description": "An article from Open Source Guide discussing best practices for pausing or archiving open source projects responsibly", + "url": "https://opensource.guide/best-practices/#its-okay-to-hit-pause", + "section_name": "evolve", + "category_name": "idea", + "tag_array": [ + "open source" + ] + }, + { + "title": "Open Source Code of Conduct", + "description": "A guide from Open Source Guide on creating and implementing a code of conduct for open source projects to ensure inclusive and respectful community interactions", + "url": "https://opensource.guide/code-of-conduct/", + "section_name": "open and transparent", + "category_name": "guide", + "tag_array": [ + "open source" + ] + }, + { + "title": "Design Brief Template", + "description": "A comprehensive template provided by Business Victoria to help businesses articulate their design project needs", + "url": "https://business.vic.gov.au/tools-and-templates/design-brief-template", + "category_name": null, + "section_name": "define", + "tag_array": [ + "problem definition", + "design" + ] + }, + { + "title": "What is OKR? Meaning, Definition, and Example", + "description": "A detailed explanation of OKRs (Objectives and Key Results), including definitions and examples to help organizations set and achieve their goals", + "url": "https://www.whatmatters.com/faqs/okr-meaning-definition-example", + "category_name": null, + "section_name": "define", + "tag_array": [ + "problem definition" + ] + }, + { + "title": "The Basics of Designing & Facilitating Meetings", + "description": "An article from MIT Human Resources outlining key questions and elements for effective meeting design and facilitation", + "url": "https://hr.mit.edu/learning-topics/meetings/articles/basics", + "section_name": "iterative and responsive", + "category_name": "learn", + "tag_array": [ + "facilitation" + ] + }, + { + "title": "Collaborative Decision-Making - Project Management Institute", + "description": "An article from the Project Management Institute discussing methods and best practices for collaborative decision-making in project environments", + "url": "https://www.pmi.org/learning/library/collaborative-decision-making-group-7667", + "section_name": "leadership and storytelling", + "category_name": "guide", + "tag_array": [ + "decision making" + ] + }, + { + "title": "How to Write Good Documentation", + "description": "Guidelines from UC Berkeley Library on writing clear and effective documentation, covering principles and best practices", + "url": "https://guides.lib.berkeley.edu/how-to-write-good-documentation", + "section_name": "sustainable and scalable", + "category_name": "guide", + "tag_array": [ + "documentation" + ] + }, + { + "title": "Write the Docs Guide", + "description": "A comprehensive guide from Write the Docs on creating and maintaining excellent documentation for software and technical projects", + "url": "https://www.writethedocs.org/guide/", + "section_name": "sustainable and scalable", + "category_name": "guide", + "tag_array": [ + "documentation", + "sustainability" + ] + }, + { + "title": "Documentation Best Practices (Google Style Guide)", + "description": "Google's style guide providing best practices for writing clear and concise documentation, including updating and managing documentation efficiently", + "url": "https://google.github.io/styleguide/docguide/best_practices.html", + "section_name": "sustainable and scalable", + "category_name": "guide", + "tag_array": [ + "documentation", + "sustainability" + ] + }, + { + "title": "Why It Is Necessary to Improve Team Communication", + "description": "An article from American Public University discussing the importance of improving team communication and strategies to enhance collaboration and productivity", + "url": "https://www.apu.apus.edu/area-of-study/business-and-management/resources/why-it-is-necessary-to-improve-team-communication/", + "section_name": "connection and relationship", + "category_name": "idea", + "tag_array": [ + "facilitation", + "team development" + ] + }, + { + "title": "Guide to UX Research Methods", + "description": "An article by Nielsen Norman Group providing a comprehensive overview of various UX research methods and when to use them", + "url": "https://www.nngroup.com/articles/guide-ux-research-methods/", + "section_name": "user centered and inclusive", + "category_name": "guide", + "tag_array": [ + "user research", + "user centered " + ] + }, + { + "title": "UX Expert Reviews", + "description": "An article explaining the process and benefits of conducting expert reviews for evaluating user interfaces", + "url": "https://www.nngroup.com/articles/ux-expert-reviews/", + "section_name": null, + "category_name": "guide", + "tag_array": [ + "user research", + "user centered " + ] + }, + { + "title": "How to Conduct a Heuristic Evaluation", + "description": "A guide on performing heuristic evaluations to identify usability issues in a user interface", + "url": "https://www.nngroup.com/articles/how-to-conduct-a-heuristic-evaluation/", + "section_name": null, + "category_name": "guide", + "tag_array": [ + "user research" + ] + }, + { + "title": "Informed Consent for UX Research", + "description": "An article discussing the importance of informed consent in UX research and how to implement it", + "url": "https://www.nngroup.com/articles/informed-consent/", + "section_name": "user centered and inclusive", + "category_name": "guide", + "tag_array": [ + "user research", + "ethics" + ] + }, + { + "title": "Stakeholder Interviews", + "description": "A guide on conducting effective stakeholder interviews to gather project requirements and expectations", + "url": "https://www.nngroup.com/articles/stakeholder-interviews/", + "section_name": null, + "category_name": "guide", + "tag_array": [ + "user research", + "user centered " + ] + }, + { + "title": "Interview Guide: UX Research", + "description": "An article on creating an effective interview guide for conducting user research interviews", + "url": "https://www.nngroup.com/articles/interview-guide/", + "section_name": null, + "category_name": "guide", + "tag_array": [ + "user research", + "user centered " + ] + }, + { + "title": "Usability Testing 101", + "description": "A beginner's guide to usability testing, covering the basics of planning and conducting usability tests", + "url": "https://www.nngroup.com/articles/usability-testing-101/", + "section_name": "user centered and inclusive", + "category_name": "learn", + "tag_array": [ + "user research" + ] + }, + { + "title": "Observer Guidelines for Usability Testing", + "description": "Guidelines for observers during usability testing sessions to ensure accurate data collection and respect for participants", + "url": "https://www.nngroup.com/articles/observer-guidelines/", + "section_name": "develop", + "category_name": "guide", + "tag_array": [ + "user research" + ] + }, + { + "title": "Workshop Facilitation 101", + "description": "A guide to facilitating workshops effectively, including preparation, execution, and follow-up strategies", + "url": "https://www.nngroup.com/articles/workshop-facilitation-101/", + "section_name": "leadership and storytelling", + "category_name": "learn", + "tag_array": [ + "facilitation" + ] + }, + { + "title": "Journey Mapping 101", + "description": "An introduction to journey mapping, a tool for visualizing the customer experience across various touchpoints", + "url": "https://www.nngroup.com/articles/journey-mapping-101/", + "section_name": "user centered and inclusive", + "category_name": "learn", + "tag_array": [ + "design", + "user centered " + ] + }, + { + "title": "Service Blueprinting Template", + "description": "A template and guide for creating service blueprints to analyze and improve service processes", + "url": "https://www.nngroup.com/articles/service-blueprinting-template/", + "section_name": "define", + "category_name": "tool", + "tag_array": [ + "design" + ] + }, + { + "title": "Paper Prototyping Cutout Kit", + "description": "A resource for creating paper prototypes, including cutout templates for common interface elements", + "url": "https://www.nngroup.com/articles/paper-prototyping-cutout-kit/", + "section_name": "define", + "category_name": "tool", + "tag_array": [ + "prototyping" + ] + }, + { + "title": "Design Critiques", + "description": "An article explaining how to conduct effective design critiques to improve design outcomes", + "url": "https://www.nngroup.com/articles/design-critiques/", + "section_name": "develop", + "category_name": "guide", + "tag_array": [ + "decision making", + "design" + ] + }, + { + "title": "The UNIX Philosophy", + "description": "An article detailing the principles of the UNIX philosophy, which emphasizes simplicity, modularity, and clarity in software design", + "url": "https://www.linfo.org/unix_philosophy.html", + "section_name": "vision setting", + "category_name": "idea", + "tag_array": [ + "product management", + "prototyping" + ] + }, + { + "title": "The Art of Unix Programming: The UNIX Philosophy", + "description": "A section from \"The Art of Unix Programming\" by Eric S. Raymond, explaining key principles of UNIX programming", + "url": "http://www.catb.org/esr/writings/taoup/html/ch01s06.html", + "section_name": "vision setting", + "category_name": "idea", + "tag_array": [ + "product management", + "prototyping", + "problem definition" + ] + }, + { + "title": "Accessibility Checklist", + "description": "An accessibility checklist provided by The A11Y Project to ensure digital content is accessible to all users", + "url": "https://www.a11yproject.com/checklist/", + "section_name": "user centered and inclusive", + "category_name": "tool", + "tag_array": [ + "accessibility" + ] + }, + { + "title": "What is WCAG?", + "description": "An article explaining the Web Content Accessibility Guidelines (WCAG) and their importance in creating accessible web content", + "url": "https://www.wcag.com/resource/what-is-wcag/", + "section_name": "user centered and inclusive", + "category_name": "guide", + "tag_array": [ + "accessibility" + ] + }, + { + "title": "Leverage Points: Places to Intervene in a System", + "description": "An article by Donella Meadows discussing leverage points for effecting change in complex systems", + "url": "https://donellameadows.org/archives/leverage-points-places-to-intervene-in-a-system/", + "section_name": "connection and relationship", + "category_name": "idea", + "tag_array": [ + "systems thinking" + ] + } ] \ No newline at end of file From 705417661a1187885e602c355e9f3569c4b56159 Mon Sep 17 00:00:00 2001 From: jordyarms Date: Fri, 8 Nov 2024 19:32:39 -0500 Subject: [PATCH 6/7] linter modifications --- babel.config.js | 2 +- docusaurus.config.ts | 109 ++++++++++++++++++++-------------------- src/pages/resources.mdx | 13 +++++ src/pages/resources.tsx | 50 ------------------ 4 files changed, 68 insertions(+), 106 deletions(-) create mode 100644 src/pages/resources.mdx delete mode 100644 src/pages/resources.tsx diff --git a/babel.config.js b/babel.config.js index e00595d..bfd75db 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], }; diff --git a/docusaurus.config.ts b/docusaurus.config.ts index a7d570f..e1e437b 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -1,64 +1,62 @@ -import {themes as prismThemes} from 'prism-react-renderer'; -import type {Config} from '@docusaurus/types'; -import type * as Preset from '@docusaurus/preset-classic'; +import { themes as prismThemes } from "prism-react-renderer"; +import type { Config } from "@docusaurus/types"; +import type * as Preset from "@docusaurus/preset-classic"; const config: Config = { - title: 'Civic Tech Toolkit Alpha', - tagline: 'Shazam! A website.', - favicon: 'img/favicon.ico', + title: "Civic Tech Toolkit Alpha", + tagline: "Shazam! A website.", + favicon: "img/favicon.ico", // Set the production url of your site here - url: 'https://civictechto.github.io/', + url: "https://civictechto.github.io/", // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: '/civicsaurus/', + baseUrl: "/civicsaurus/", // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. - organizationName: 'civictechto', // Usually your GitHub org/user name. - projectName: 'civicsaurus', // Usually your repo name. - deploymentBranch: 'gh-pages', // Use this branch for GitHub Pages deployment + organizationName: "civictechto", // Usually your GitHub org/user name. + projectName: "civicsaurus", // Usually your repo name. + deploymentBranch: "gh-pages", // Use this branch for GitHub Pages deployment trailingSlash: false, - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "warn", // Even if you don't use internationalization, you can use this field to set // useful metadata like html lang. For example, if your site is Chinese, you // may want to replace "en" with "zh-Hans". i18n: { - defaultLocale: 'en', - locales: ['en'], + defaultLocale: "en", + locales: ["en"], }, presets: [ [ - 'classic', + "classic", { docs: { - sidebarPath: './sidebars.ts', + sidebarPath: "./sidebars.ts", // Please change this to your repo. // Remove this to remove the "edit this page" links. - editUrl: - 'https://github.com/CivicTechTO/civicsaurus/tree/main/', + editUrl: "https://github.com/CivicTechTO/civicsaurus/tree/main/", }, blog: { showReadingTime: true, feedOptions: { - type: ['rss', 'atom'], + type: ["rss", "atom"], xslt: true, }, // Please change this to your repo. // Remove this to remove the "edit this page" links. - editUrl: - 'https://github.com/CivicTechTO/civicsaurus/tree/main/', + editUrl: "https://github.com/CivicTechTO/civicsaurus/tree/main/", // Useful options to enforce blogging best practices - onInlineTags: 'warn', - onInlineAuthors: 'warn', - onUntruncatedBlogPosts: 'warn', + onInlineTags: "warn", + onInlineAuthors: "warn", + onUntruncatedBlogPosts: "warn", }, theme: { - customCss: './src/css/custom.css', + customCss: "./src/css/custom.css", }, } satisfies Preset.Options, ], @@ -66,65 +64,66 @@ const config: Config = { themeConfig: { // Replace with your project's social card - image: 'img/docusaurus-social-card.jpg', + image: "img/docusaurus-social-card.jpg", navbar: { - title: 'civicsaurus', + title: "civicsaurus", logo: { - alt: 'My Site Logo', - src: 'img/logo.svg', + alt: "My Site Logo", + src: "img/logo.svg", }, items: [ { - type: 'docSidebar', - sidebarId: 'tutorialSidebar', - position: 'left', - label: 'Playbook', + type: "docSidebar", + sidebarId: "tutorialSidebar", + position: "left", + label: "Playbook", }, - {to: '/blog', label: 'Blog', position: 'left'}, + { to: "/blog", label: "Blog", position: "left" }, + { to: "/resources", label: "Resources", position: "left" }, { - href: 'https://github.com/CivicTechTO/civicsaurus/', - label: 'GitHub', - position: 'right', + href: "https://github.com/CivicTechTO/civicsaurus/", + label: "GitHub", + position: "right", }, ], }, footer: { - style: 'dark', + style: "dark", links: [ { - title: 'Docs', + title: "Docs", items: [ { - label: 'Playbook', - to: '/docs/intro', + label: "Playbook", + to: "/docs/intro", }, ], }, { - title: 'Updates', + title: "Updates", items: [ { - label: 'Blog', - to: '/blog', - } + label: "Blog", + to: "/blog", + }, ], - }, + }, { - title: 'Friends', + title: "Friends", items: [ { - label: 'CTTO (our home)', - href: 'http://civictech.ca', - } + label: "CTTO (our home)", + href: "http://civictech.ca", + }, ], }, { - title: 'Connect', + title: "Connect", items: [ { - label: 'Project Slack', - to: 'https://civictechto.slack.com/archives/C0739GZADL6', - } + label: "Project Slack", + to: "https://civictechto.slack.com/archives/C0739GZADL6", + }, ], }, ], diff --git a/src/pages/resources.mdx b/src/pages/resources.mdx new file mode 100644 index 0000000..2f47b18 --- /dev/null +++ b/src/pages/resources.mdx @@ -0,0 +1,13 @@ +--- +title: Resources +--- + +:::[!warn] + +::: + +This is a rough list of resources populated by a json file imported from a nocodb table. + +import FilteredResources from "@site/src/components/FilteredResources"; + + diff --git a/src/pages/resources.tsx b/src/pages/resources.tsx deleted file mode 100644 index 66e14fc..0000000 --- a/src/pages/resources.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React, { useEffect, useState } from "react"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; - -// Define a TypeScript interface for your resource data -interface Resource { - title: string; - description: string; - category: string; - url: string; - tags: string[]; -} - -const Resources: React.FC = () => { - const [resources, setResources] = useState([]); - const { siteConfig } = useDocusaurusContext(); - const baseUrl = siteConfig.baseUrl; - - useEffect(() => { - fetch(`${baseUrl}json/resources.json`) - .then((response) => { - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); - } - return response.json(); - }) - .then((data: Resource[]) => { - console.log("Fetched data:", data); // Log the data - setResources(data); - }) - .catch((error) => console.error("Error fetching resources:", error)); - }, []); - - return ( -
    -

    Resource Database

    - -
    - ); -}; - -export default Resources; From 842ce2559ad60966cdfaecad86f72d085edf3848 Mon Sep 17 00:00:00 2001 From: jordyarms Date: Fri, 8 Nov 2024 23:50:25 -0500 Subject: [PATCH 7/7] resource list functionality established --- README.md | 5 - .../03-iterative-and-responsive.mdx | 2 - package-lock.json | 276 ++++++++- package.json | 4 +- scripts/exportResources.js | 37 +- .../FilteredResources/index-alternate.tsx | 78 +++ src/components/FilteredResources/index.tsx | 97 ++-- src/components/HomepageFeatures/index.tsx | 40 +- .../InteractiveResourceTable/index.tsx | 243 ++++++++ .../styles.module.css | 100 ++++ src/pages/index.tsx | 27 +- src/pages/markdown-page.md | 7 - src/pages/resources.mdx | 10 +- static/json/resources.json | 549 +++++++++++------- 14 files changed, 1166 insertions(+), 309 deletions(-) create mode 100644 src/components/FilteredResources/index-alternate.tsx create mode 100644 src/components/InteractiveResourceTable/index.tsx create mode 100644 src/components/InteractiveResourceTable/styles.module.css delete mode 100644 src/pages/markdown-page.md diff --git a/README.md b/README.md index 73ff8d3..154d57b 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,3 @@ The build output will be generated in the `build` directory. You can serve this - Docusaurus: This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. - GitHub Pages & Actions: This website is hosted using [GitHub Pages](<[url](https://pages.github.com)>) with [GitHub Actions](https://github.com/features/actions) deployment automations. - -curl -X 'GET' \ - '' \ - -H 'accept: application/json' \ - -H 'xc-token: 3XPpISoV2l3VehhT6-fUSByMWpkaEZQ5UeiHWOPT' diff --git a/docs/02-principles/03-iterative-and-responsive.mdx b/docs/02-principles/03-iterative-and-responsive.mdx index f81cbd9..437efb4 100644 --- a/docs/02-principles/03-iterative-and-responsive.mdx +++ b/docs/02-principles/03-iterative-and-responsive.mdx @@ -20,5 +20,3 @@ Being iterative and responsive can help you both start and finish your civic tec import FilteredResources from "@site/src/components/FilteredResources"; - -{/* {/\* - INSERT: An intro to agile INSERT: usability testing guides \*/} */} diff --git a/package-lock.json b/package-lock.json index 4befd90..f0ce708 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,8 @@ "node-fetch": "^3.3.2", "prism-react-renderer": "^2.3.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-select": "^5.8.2" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.5.2", @@ -3128,6 +3129,135 @@ "@noble/ciphers": "^1.0.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", + "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", + "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", @@ -3289,6 +3419,31 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -4254,6 +4409,15 @@ "@types/react-router": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -5287,6 +5451,37 @@ "object.assign": "^4.1.0" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", @@ -6972,6 +7167,16 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -8325,6 +8530,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", @@ -11280,6 +11491,12 @@ "node": ">= 4.0.0" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -15158,6 +15375,43 @@ "react": ">=15" } }, + "node_modules/react-select": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.2.tgz", + "integrity": "sha512-a/LkOckoI62710gGPQSQqUp7A10fGbH/ya3/IR49qaq3XoBvwymgD5mJgtiHxBDsutyEQfdKNycWVh8Cg8UCjw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -16683,6 +16937,12 @@ "postcss": "^8.4.31" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17599,6 +17859,20 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 899123a..57a2a12 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,14 @@ "dependencies": { "@docusaurus/core": "3.5.2", "@docusaurus/preset-classic": "3.5.2", + "@dotenvx/dotenvx": "^1.22.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "node-fetch": "^3.3.2", "prism-react-renderer": "^2.3.0", "react": "^18.0.0", - "react-dom": "^18.0.0" + "react-dom": "^18.0.0", + "react-select": "^5.8.2" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.5.2", diff --git a/scripts/exportResources.js b/scripts/exportResources.js index 608e146..7c1e047 100644 --- a/scripts/exportResources.js +++ b/scripts/exportResources.js @@ -1,44 +1,53 @@ -// scripts/exportResources.js -import fetch from "node-fetch"; -import fs from "fs"; -import { config } from "@dotenvx/dotenvx"; +// A script to fetch nocodb table payload for resource list capabilities. -// Load environment variables from .env file -config(); -config({ path: ".env.local" }); +import fetch from "node-fetch"; // Import node-fetch for making HTTP requests +import fs from "fs"; // Import Node's file system module to handle file operations +import { config } from "@dotenvx/dotenvx"; // Import dotenvx to load environment variables +// Load environment variables from .env and .env.local files +config(); // Load default .env file +config({ path: ".env.local" }); // Load .env.local file if present + +// Retrieve API URL and API Key from environment variables const API_URL = process.env.NOCODB_API_URL; const API_KEY = process.env.NOCODB_API_KEY; +// Function to fetch and export data from the API const exportData = async () => { try { + // Check if API URL and API Key are available if (!API_URL || !API_KEY) { throw new Error("API_URL or API_KEY is missing. Check your .env file."); } + // Make a request to the API with appropriate headers const response = await fetch(API_URL, { headers: { - accept: "application/json", - "xc-token": API_KEY, + accept: "application/json", // Specify that we expect a JSON response + "xc-token": API_KEY, // Include the API key in the request headers }, }); + // Check if the response status is not OK (e.g., 404, 500) if (!response.ok) { - throw new Error(`Status: ${response.status}`); + throw new Error(`Status: ${response.status}`); // Throw an error with the status code } + // Parse the JSON response from the API const data = await response.json(); - const resourceList = data.list; + const resourceList = data.list; // Extract the 'list' of resources from the response - // Save the data to resources.json in the root directory + // Write the resource list to a local JSON file in the static directory fs.writeFileSync( "static/json/resources.json", - JSON.stringify(resourceList, null, 2) + JSON.stringify(resourceList, null, 2) // Format the JSON with 2-space indentation ); - console.log("Success"); + console.log("Success"); // Log a success message to the console } catch (error) { + // Catch and log any errors that occur during the process console.error("Error:", error); } }; +// Invoke the exportData function to execute the script exportData(); diff --git a/src/components/FilteredResources/index-alternate.tsx b/src/components/FilteredResources/index-alternate.tsx new file mode 100644 index 0000000..8dc7437 --- /dev/null +++ b/src/components/FilteredResources/index-alternate.tsx @@ -0,0 +1,78 @@ +// Storing an alternate flat filtered resource list. + +import React, { useEffect, useState } from "react"; + +interface Resource { + title: string; + description: string; + category_name: string; + section_name: string; + url: string; + tag_array: string[]; +} + +interface FilteredResourcesProps { + matchTag?: string; // Tag to filter resources by (optional) + matchSection?: string; // Section to filter resources by (optional) +} + +const FilteredResources: React.FC = ({ + matchTag, + matchSection, +}) => { + const [resources, setResources] = useState([]); + const [filteredResources, setFilteredResources] = useState([]); + + useEffect(() => { + // Fetch the resources.json file + fetch("/civicsaurus/json/resources.json") + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.json(); + }) + .then((data: Resource[]) => { + setResources(data); + }) + .catch((error) => console.error("Error fetching resources:", error)); + }, []); + + useEffect(() => { + // Filter resources based on matchTag or matchSection + const filtered = resources.filter((resource) => { + const tagMatch = matchTag ? resource.tag_array.includes(matchTag) : true; + const sectionMatch = matchSection + ? resource.section_name === matchSection + : true; + return tagMatch && sectionMatch; + }); + + setFilteredResources(filtered); + }, [resources, matchTag, matchSection]); + + return ( +
    +

    + Resources {matchTag && `Tagged with "${matchTag}"`}{" "} + {matchSection && `in Section "${matchSection}"`} +

    + {filteredResources.length === 0 ? ( +

    No resources found for the selected criteria.

    + ) : ( +
      + {filteredResources.map((resource, index) => ( +
    • + + {resource.title} + {" "} + | {resource.description} +
    • + ))} +
    + )} +
    + ); +}; + +export default FilteredResources; diff --git a/src/components/FilteredResources/index.tsx b/src/components/FilteredResources/index.tsx index 2a1489f..6b4ea86 100644 --- a/src/components/FilteredResources/index.tsx +++ b/src/components/FilteredResources/index.tsx @@ -1,28 +1,32 @@ import React, { useEffect, useState } from "react"; +// Interface for a single resource item interface Resource { title: string; description: string; + url: string; category_name: string; section_name: string; - url: string; tag_array: string[]; } +// Props for the component, allowing optional tag and section filters interface FilteredResourcesProps { - matchTag?: string; // Tag to filter resources by (optional) - matchSection?: string; // Section to filter resources by (optional) + matchTag?: string; // Optional tag to filter by + matchSection?: string; // Optional section to filter by } const FilteredResources: React.FC = ({ matchTag, matchSection, }) => { - const [resources, setResources] = useState([]); - const [filteredResources, setFilteredResources] = useState([]); + // State to store grouped resources by category + const [groupedResources, setGroupedResources] = useState<{ + [category: string]: Resource[]; + }>({}); + // Effect to fetch and filter resources when the component mounts or props change useEffect(() => { - // Fetch the resources.json file fetch("/civicsaurus/json/resources.json") .then((response) => { if (!response.ok) { @@ -31,43 +35,64 @@ const FilteredResources: React.FC = ({ return response.json(); }) .then((data: Resource[]) => { - setResources(data); - }) - .catch((error) => console.error("Error fetching resources:", error)); - }, []); + // Initial filtering of resources based on provided props + let filteredResources = data; - useEffect(() => { - // Filter resources based on matchTag or matchSection - const filtered = resources.filter((resource) => { - const tagMatch = matchTag ? resource.tag_array.includes(matchTag) : true; - const sectionMatch = matchSection - ? resource.section_name === matchSection - : true; - return tagMatch && sectionMatch; - }); + // Filter by matchTag if provided + if (matchTag) { + filteredResources = filteredResources.filter((resource) => + resource.tag_array.includes(matchTag) + ); + } - setFilteredResources(filtered); - }, [resources, matchTag, matchSection]); + // Filter by matchSection if provided + if (matchSection) { + filteredResources = filteredResources.filter( + (resource) => resource.section_name === matchSection + ); + } + + // Group resources by category + const grouped: { [category: string]: Resource[] } = {}; + filteredResources.forEach((resource) => { + if (!grouped[resource.category_name]) { + grouped[resource.category_name] = []; + } + grouped[resource.category_name].push(resource); + }); + + // Update state with grouped resources + setGroupedResources(grouped); + }) + .catch((error) => console.error("Error fetching resources:", error)); + }, [matchTag, matchSection]); // Dependencies to trigger the effect return (
    -

    - Resources {matchTag && `Tagged with "${matchTag}"`}{" "} - {matchSection && `in Section "${matchSection}"`} -

    - {filteredResources.length === 0 ? ( + {/* If no resources match, show a message */} + {Object.entries(groupedResources).length === 0 ? (

    No resources found for the selected criteria.

    ) : ( -
      - {filteredResources.map((resource, index) => ( -
    • - - {resource.title} - {" "} - | {resource.description} -
    • - ))} -
    + // Render each category and its corresponding resources + Object.entries(groupedResources).map(([category, resources]) => ( +
    +

    {category}

    + +
    + )) )}
    ); diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx index 1c48259..413b5da 100644 --- a/src/components/HomepageFeatures/index.tsx +++ b/src/components/HomepageFeatures/index.tsx @@ -1,46 +1,56 @@ -import clsx from 'clsx'; -import Heading from '@theme/Heading'; -import styles from './styles.module.css'; +/* eslint-disable @typescript-eslint/no-require-imports */ +import React from "react"; +import clsx from "clsx"; +import Heading from "@theme/Heading"; +import styles from "./styles.module.css"; type FeatureItem = { title: string; - Svg: React.ComponentType>; + Svg: React.ComponentType>; description: JSX.Element; }; const FeatureList: FeatureItem[] = [ { - title: 'Principles', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + title: "Principles", + Svg: require("@site/static/img/undraw_docusaurus_mountain.svg").default, description: ( <> - Discover the core values and guiding principles that underpin effective civic tech projects. Learn how to center your work on user needs, embrace openness and transparency, iterate responsively, and build sustainable solutions. + Discover the core values and guiding principles that underpin effective + civic tech projects. Learn how to center your work on user needs, + embrace openness and transparency, iterate responsively, and build + sustainable solutions. ), }, { - title: 'Ways of Working', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + title: "Ways of Working", + Svg: require("@site/static/img/undraw_docusaurus_tree.svg").default, description: ( <> - Explore the invisible design activities that support and enhance your project throughout its lifecycle. From setting a clear vision to building strong relationships, these practices will help you navigate complex challenges and drive meaningful change. + Explore the invisible design activities that support and enhance your + project throughout its lifecycle. From setting a clear vision to + building strong relationships, these practices will help you navigate + complex challenges and drive meaningful change. ), }, { - title: 'Project Lifecycle', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + title: "Project Lifecycle", + Svg: require("@site/static/img/undraw_docusaurus_react.svg").default, description: ( <> - Follow our adapted double diamond approach to guide your project from initial concept to real-world impact. Learn key activities and considerations for each phase: Explore, Reframe, Create, and Catalyze. + Follow our adapted double diamond approach to guide your project from + initial concept to real-world impact. Learn key activities and + considerations for each phase: Explore, Reframe, Create, and Catalyze. ), }, ]; -function Feature({title, Svg, description}: FeatureItem) { +function Feature({ title, Svg, description }: FeatureItem) { return ( -
    +
    diff --git a/src/components/InteractiveResourceTable/index.tsx b/src/components/InteractiveResourceTable/index.tsx new file mode 100644 index 0000000..7917375 --- /dev/null +++ b/src/components/InteractiveResourceTable/index.tsx @@ -0,0 +1,243 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import React, { useEffect, useState } from "react"; +import Select from "react-select"; // Import react-select for multi-select dropdowns +import styles from "./styles.module.css"; // Import the CSS module for styling + +// Define the structure of the Resource object +interface Resource { + title: string | null; + description: string | null; + url: string | null; + category_name: string | null; + tag_array: string[] | null; +} + +// Define the structure for sorting configuration +interface SortConfig { + field: keyof Resource; + order: "asc" | "desc"; +} + +const InteractiveResourceTable: React.FC = () => { + // State to hold all resources and the filtered list + const [resources, setResources] = useState([]); + const [filteredResources, setFilteredResources] = useState([]); + + // States for filters and search query + const [categoryFilter, setCategoryFilter] = useState([]); + const [tagFilter, setTagFilter] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + + // State to manage sorting configuration + const [sortConfig, setSortConfig] = useState({ + field: "title", + order: "asc", + }); + + // Fetch resources from the JSON file on component mount + useEffect(() => { + const fetchResources = async () => { + try { + const response = await fetch("/civicsaurus/json/resources.json"); + if (!response.ok) + throw new Error(`HTTP error! Status: ${response.status}`); + const data: Resource[] = await response.json(); + setResources(data); + setFilteredResources(data); // Initialize filtered resources with the full list + } catch (error) { + console.error("Error fetching resources:", error); + } + }; + fetchResources(); + }, []); + + // Apply filters and sorting whenever dependencies change + useEffect(() => { + let filtered = resources; + + // Filter resources by selected categories (OR logic) + if (categoryFilter.length) { + filtered = filtered.filter( + (resource) => + resource.category_name && + categoryFilter.includes(resource.category_name) + ); + } + + // Filter resources by selected tags (OR logic) + if (tagFilter.length) { + filtered = filtered.filter( + (resource) => + resource.tag_array && + resource.tag_array.some((tag) => tagFilter.includes(tag)) + ); + } + + // Filter resources based on the search query (case-insensitive) + if (searchQuery) { + const query = searchQuery.toLowerCase(); + filtered = filtered.filter( + (resource) => + (resource.title || "").toLowerCase().includes(query) || + (resource.description || "").toLowerCase().includes(query) + ); + } + + // Sort the filtered resources based on the selected field and order + filtered.sort((a, b) => { + const fieldA = (a[sortConfig.field] || "").toString().toLowerCase(); + const fieldB = (b[sortConfig.field] || "").toString().toLowerCase(); + return sortConfig.order === "asc" + ? fieldA.localeCompare(fieldB) + : fieldB.localeCompare(fieldA); + }); + + setFilteredResources(filtered); + }, [categoryFilter, tagFilter, searchQuery, resources, sortConfig]); + + // Generate unique category and tag options for filters + const uniqueCategories = Array.from( + new Set( + resources.map((resource) => resource.category_name || "Unknown Category") + ) + ); + const uniqueTags = Array.from( + new Set(resources.flatMap((resource) => resource.tag_array || [])) + ); + + // Toggle sort order or set a new sort field + const handleSort = (field: keyof Resource) => { + setSortConfig((prevConfig) => ({ + field, + order: + prevConfig.field === field && prevConfig.order === "asc" + ? "desc" + : "asc", + })); + }; + + // Helper function to handle changes in the multi-select dropdowns + const handleSelectChange = + (setter: React.Dispatch>) => + (selectedOptions: any) => { + const values = selectedOptions + ? selectedOptions.map((opt: any) => opt.value) + : []; + setter(values); + }; + + // Options for react-select components + const tagOptions = uniqueTags.map((tag) => ({ value: tag, label: tag })); + const categoryOptions = uniqueCategories.map((category) => ({ + value: category, + label: category, + })); + + return ( +
    + {/* Filter controls */} +
    + {/* Search input for text-based filtering */} + + + {/* Category filter using react-select */} + +
    + + {/* Resource table */} + {filteredResources.length === 0 ? ( +

    + No resources found for the selected criteria. +

    + ) : ( + + + + + + + + + {filteredResources.map((resource, index) => ( + + + + + ))} + +
    handleSort("title")} + > + Resource + {sortConfig.field === "title" && ( + + )} + Tags
    + + {resource.title || "Untitled Resource"} + {" "} + + {resource.category_name || "null"} + +
    + {resource.description || "No description available"} +
    + {resource.url || "No URL available"} +
    +
    + {resource.tag_array + ? resource.tag_array.map((tag, idx) => ( + + {tag} + + )) + : "No tags"} +
    + )} +
    + ); +}; + +export default InteractiveResourceTable; diff --git a/src/components/InteractiveResourceTable/styles.module.css b/src/components/InteractiveResourceTable/styles.module.css new file mode 100644 index 0000000..51b6839 --- /dev/null +++ b/src/components/InteractiveResourceTable/styles.module.css @@ -0,0 +1,100 @@ +/* Container styling for the entire filter section */ +.filterContainer { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 1rem; + margin-bottom: 1rem; +} + +/* Label styling for a clean and consistent appearance */ +.filterContainer label { + display: flex; + flex-direction: column; + font-weight: 500; + font-size: 0.9rem; + color: var(--ifm-font-color-base); + min-width: 250px; +} + +/* Styling for the search input */ +.filterContainer input { + padding: 8px; + border-radius: 4px; + border: 1px solid var(--ifm-color-secondary); + outline: none; + font-size: 0.9rem; + font-weight: 400; +} + +/* Sortable table headers */ +.sortable { + cursor: pointer; + user-select: none; + position: relative; +} + +/* Sort indicator styles */ +.sortIndicator { + margin-left: 5px; + font-size: 12px; + color: var(--ifm-color-primary); +} + +.sortIndicator.ascending::before { + content: "▲"; /* Up arrow for ascending sort */ +} + +.sortIndicator.descending::before { + content: "▼"; /* Down arrow for descending sort */ +} + +/* Table styling */ +.table { + width: 100%; + border-collapse: collapse; +} + +.table th, +.table td { + padding: 8px; + text-align: left; + font-size: 0.9rem; +} + +.table a { + text-decoration: none; + font-weight: 600; +} + +.table a:hover { + text-decoration: underline; +} + +/* Message for when no resources are found */ +.noResources { + text-align: center; + font-style: italic; + color: var(--ifm-font-color-base); +} + +/* Highlight styling for the category name */ +.category { + background-color: var(--ifm-color-primary-contrast-background); + color: var(--ifm-color-primary-contrast-foreground); + padding: 2px 4px; + border-radius: 4px; + font-weight: 500; + font-size: 0.8rem; +} + +/* Pill-style tags for resource tags */ +.pill { + display: inline-block; + background-color: var(--ifm-color-primary-contrast-background); + color: var(--ifm-color-primary-contrast-foreground); + border-radius: 12px; + padding: 2px 8px; + margin: 2px; + font-size: 0.8rem; + font-weight: 500; +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 58b2915..765e3c3 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,15 +1,16 @@ -import clsx from 'clsx'; -import Link from '@docusaurus/Link'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import Layout from '@theme/Layout'; -import Heading from '@theme/Heading'; -import styles from './index.module.css'; -import HomepageFeatures from '@site/src/components/HomepageFeatures'; +import React from "react"; +import clsx from "clsx"; +import Link from "@docusaurus/Link"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import Layout from "@theme/Layout"; +import Heading from "@theme/Heading"; +import styles from "./index.module.css"; +import HomepageFeatures from "@site/src/components/HomepageFeatures"; function HomepageHeader() { - const {siteConfig} = useDocusaurusContext(); + const { siteConfig } = useDocusaurusContext(); return ( -
    +
    {siteConfig.title} @@ -18,7 +19,8 @@ function HomepageHeader() {
    + to="/docs/intro" + > Head over to the toolkit!
    @@ -28,11 +30,12 @@ function HomepageHeader() { } export default function Home(): JSX.Element { - const {siteConfig} = useDocusaurusContext(); + const { siteConfig } = useDocusaurusContext(); return ( + description="Description will go into a meta tag in " + >
    diff --git a/src/pages/markdown-page.md b/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b..0000000 --- a/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/src/pages/resources.mdx b/src/pages/resources.mdx index 2f47b18..9bba522 100644 --- a/src/pages/resources.mdx +++ b/src/pages/resources.mdx @@ -2,12 +2,12 @@ title: Resources --- -:::[!warn] - +:::warning[Feature in Development] +This feature is in development. ::: -This is a rough list of resources populated by a json file imported from a nocodb table. +A List of resources populated by a json file imported from a nocodb table. -import FilteredResources from "@site/src/components/FilteredResources"; +import InteractiveResourceTable from "@site/src/components/InteractiveResourceTable"; - + diff --git a/static/json/resources.json b/static/json/resources.json index 1f9a745..bc86c2d 100644 --- a/static/json/resources.json +++ b/static/json/resources.json @@ -3,600 +3,575 @@ "title": "Usability – Digital.gov", "description": "digital.gov's resources on usability", "url": "https://digital.gov/topics/usability/", - "category_name": null, + "category_name": "Resource Collections", "section_name": "user centered and inclusive", "tag_array": [ - "user centered " + "User Centered Design" ] }, { "title": "GitHub Skills", "description": "Interactive courses designed for both beginners and experts to learn how to use GitHub effectively", "url": "https://skills.github.com/", + "category_name": "Learning Sources", "section_name": "open and transparent", - "category_name": "learn", - "tag_array": [ - "learning" - ] + "tag_array": [] }, { "title": "Creative Commons", "description": "An organization that provides free, easy-to-use copyright licenses to make creative work legally shareable", "url": "https://creativecommons.org/", - "category_name": null, + "category_name": "Organizations", "section_name": "open and transparent", "tag_array": [ - "licensing" + "Licenses" ] }, { "title": "The Open Source Initiative (OSI)", "description": "A non-profit organization that promotes and protects open source software through education, collaboration, and infrastructure", "url": "https://opensource.org/", - "category_name": null, + "category_name": "Organizations", "section_name": "open and transparent", "tag_array": [ - "open source", - "licensing" + "Licenses", + "Open Source" ] }, { "title": "Software Freedom Law Center", "description": "An organization that provides pro-bono legal services to protect free and open source software projects", "url": "https://www.softwarefreedom.org/", - "category_name": null, "section_name": null, + "category_name": "Organizations", "tag_array": [ - "licensing" + "Licenses" ] }, { "title": "Electronic Frontier Foundation (EFF)", "description": "A non-profit defending civil liberties in the digital world, which provides resources on copyright and licensing issues", "url": "https://www.eff.org/", - "category_name": null, "section_name": null, + "category_name": "Organizations", "tag_array": [ - "licensing" + "Licenses" ] }, { "title": "Free Software Foundation (FSF)", "description": "An organization that advocates for the freedom to use, study, and distribute software", "url": "https://www.fsf.org/", - "category_name": null, "section_name": null, + "category_name": "Organizations", "tag_array": [ - "licensing" + "Licenses" ] }, { "title": "Choose an Open Source License", "description": "A guide to help you select the appropriate open source license for your project", "url": "https://choosealicense.com/", + "category_name": "Methodology", "section_name": "open and transparent", - "category_name": "guide", "tag_array": [ - "open source", - "licensing" + "Licenses", + "Open Source" ] }, { - "title": "Building Technology With, Not For Communities: An Engagement Guide for Civic Tech", + "title": "Building Technology With, Not For Communities", "description": "An article that provides guidelines on engaging communities effectively in civic tech projects", "url": "https://medium.com/organizer-sandbox/building-technology-with-not-for-communities-an-engagement-guide-for-civic-tech-b8880982e65a", + "category_name": "Explanations", "section_name": "user centered and inclusive", - "category_name": "idea", "tag_array": [ - "community building", - "user centered " + "User Centered Design", + "Community Building" ] }, { "title": "Human-Centred Design and User Research with Ariel Sim", "description": "An article that discusses human-centered design principles and the importance of user research in product development", "url": "https://learn.marsdd.com/article/human-centred-design-and-user-research-with-ariel-sim/", - "category_name": null, + "category_name": "Explanations", "section_name": "user centered and inclusive", "tag_array": [ - "user research" + "User Research" ] }, { "title": "How to Craft Buyer and User Personas to Benefit Your Business", "description": "An article offering guidance on creating detailed buyer and user personas to improve business strategies", "url": "https://learn.marsdd.com/article/how-to-craft-buyer-and-user-personas-to-benefit-your-business/", + "category_name": "Methodology", "section_name": "user centered and inclusive", - "category_name": "guide", "tag_array": [ - "strategy" + "Strategy" ] }, { "title": "How to Work Open", "description": "An article explaining the principles and practices of working openly in collaborative projects", "url": "https://openmatt.org/2011/04/06/how-to-work-open/", + "category_name": "Methodology", "section_name": "open and transparent", - "category_name": "guide", "tag_array": [ - "community building", - "open source" + "Open Source", + "Community Building" ] }, { "title": "Working Open – Mozilla Science Leadership Training", "description": "An interactive training program designed to build leadership skills for open science and research initiatives", "url": "https://mozillascience.github.io/leadership-training/index.html", + "category_name": "Methodology", "section_name": "open and transparent", - "category_name": "guide", "tag_array": [ - "community building" + "Community Building" ] }, { "title": "How and Why to Reduce Your Scope", "description": "An article discussing strategies for narrowing project scope to improve focus and efficiency", "url": "https://www.samjulien.com/how-and-why-to-reduce-your-scope", + "category_name": "Explanations", "section_name": "iterative and responsive", - "category_name": "guide", "tag_array": [ - "product management" + "Product Management" ] }, { "title": "How to Use the Value Proposition Design Canvas", "description": "An article explaining how to utilize the Value Proposition Design Canvas to align product offerings with customer needs", "url": "https://learn.marsdd.com/article/how-to-use-the-value-proposition-design-canvas-2/", + "category_name": "Methodology", "section_name": "vision setting", - "category_name": "guide", "tag_array": [ - "strategy", - "product management", - "user research" + "Strategy", + "Product Management", + "User Research" ] }, { "title": "The Business Model Canvas", "description": "An article providing an overview of the Business Model Canvas and how it can be used to visualize, design, and pivot business models", "url": "https://www.strategyzer.com/library/the-business-model-canvas", + "category_name": "Tools", "section_name": "sustainable and scalable", - "category_name": "tool", "tag_array": [ - "strategy" + "Strategy" ] }, { "title": "The Value Proposition Canvas", "description": "A guide explaining the Value Proposition Canvas and how to use it to ensure products meet customer needs and desires", "url": "https://www.strategyzer.com/library/the-value-proposition-canvas", + "category_name": "Tools", "section_name": "vision setting", - "category_name": "tool", "tag_array": [ - "strategy", - "product management", - "user centered ", - "user research" + "Strategy", + "Product Management", + "User Centered Design", + "User Research" ] }, { "title": "Scaling Civic Tech", "description": "An in-depth report by the Knight Foundation on strategies for scaling civic tech projects and increasing their impact", "url": "https://knightfoundation.org/wp-content/uploads/2020/03/Scaling_Civic_Tech_final.pdf", - "category_name": null, + "category_name": "Ideas", "section_name": "sustainable and scalable", "tag_array": [ - "scaling" + "Scaling" ] }, { "title": "The Product Vision Board", "description": "A tool designed by Roman Pichler to help teams describe, visualize, and validate their product vision and strategy", "url": "https://www.romanpichler.com/tools/product-vision-board/", + "category_name": "Tools", "section_name": "vision setting", - "category_name": "tool", "tag_array": [ - "strategy", - "product management" + "Product Management", + "Strategy" ] }, { "title": "Norms for Working in Teams", "description": "Guidelines from Stanford d.school on setting team norms to enhance collaboration and effectiveness", "url": "https://dschool.stanford.edu/resources/norms", + "category_name": "Methodology", "section_name": "leadership and storytelling", - "category_name": "idea", "tag_array": [ - "team development" + "Team Development" ] }, { "title": "Stages of Team Development", "description": "An article from MIT HR explaining the different stages of team development and how to navigate them effectively", "url": "https://hr.mit.edu/learning-topics/teams/articles/stages-development", - "category_name": null, + "category_name": "Explanations", "section_name": "leadership and storytelling", "tag_array": [ - "leadership", - "team development" + "Team Development", + "Leadership" ] }, { "title": "Start with Why by Simon Sinek", "description": "A TED Talk by Simon Sinek explaining the concept of starting with \"Why\" to inspire action and leadership", "url": "https://www.youtube.com/watch?v=u4ZoJKF_VuA", + "category_name": "Explanations", "section_name": "leadership and storytelling", - "category_name": "idea", "tag_array": [ - "leadership" + "Leadership" ] }, { "title": "Why Good Leaders Make You Feel Safe by Simon Sinek", "description": "A TED Talk by Simon Sinek about the role of leadership in creating a sense of trust and safety within organizations", "url": "https://www.youtube.com/watch?v=lmyZMtPVodo", + "category_name": "Ideas", "section_name": "leadership and storytelling", - "category_name": "idea", "tag_array": [ - "leadership", - "team development" + "Team Development", + "Leadership" ] }, { "title": "MIT 15.390 New Enterprises, Spring 2013", "description": "A comprehensive lecture series from MIT's Sloan School of Management covering the process of identifying and quantifying market opportunities, and starting a new, technology-based enterprise", "url": "https://www.youtube.com/playlist?list=PLUl4u3cNGP63CLq-GxVm4VSr-0iKAS-07", + "category_name": "Learning Sources", "section_name": "iterative and responsive", - "category_name": "learn", "tag_array": [ - "product management" + "Product Management" ] }, { "title": "Stakeholder Analysis", "description": "A guide on conducting stakeholder analysis, outlining methods to identify and understand the interests and influence of stakeholders in a project", "url": "https://wikis.ec.europa.eu/display/ExactExternalWiki/Stakeholder+analysis", - "category_name": null, + "category_name": "Methodology", "section_name": "connection and relationship", "tag_array": [ - "user research", - "strategy" + "Strategy", + "User Research" ] }, { "title": "Introduction to System Dynamics (MIT OCW)", "description": "An MIT OpenCourseWare course covering the principles of system dynamics and how to model complex systems to improve decision-making", "url": "https://ocw.mit.edu/courses/15-871-introduction-to-system-dynamics-fall-2013/", + "category_name": "Learning Sources", "section_name": "connection and relationship", - "category_name": "learn", "tag_array": [ - "systems thinking" + "Systems Thinking" ] }, { "title": "System Diagrams by Bob Williams", "description": "A resource offering guidance and templates for creating effective system diagrams to understand and improve complex systems", "url": "https://bobwilliams.gumroad.com/l/systemdiagrams", - "category_name": null, + "category_name": "Books", "section_name": "connection and relationship", "tag_array": [ - "systems thinking" + "Systems Thinking" ] }, { "title": "TANGO - Toronto Area Neighbourhood Groups Online", "description": "A platform that maps and connects local residents' associations in Toronto, encouraging community involvement and engagement", "url": "https://tango.to", - "category_name": null, + "category_name": "Datasources", "section_name": "connection and relationship", "tag_array": [ - "community building" + "Community Building" ] }, { "title": "Group Decision Making", "description": "A comprehensive guide from the University of Waterloo's Centre for Teaching Excellence outlining a seven-step model for effective group decision-making", "url": "https://uwaterloo.ca/centre-for-teaching-excellence/catalogs/tip-sheets/group-decision-making", - "category_name": null, + "category_name": "Methodology", "section_name": "leadership and storytelling", "tag_array": [ - "decision making" + "Decision Making" ] }, { "title": "Team Decision-Making: How to Get It Right", "description": "An article from Harvard Business School Online discussing strategies and best practices for effective team decision-making", "url": "https://online.hbs.edu/blog/post/team-decision-making", - "category_name": null, + "category_name": "Explanations", "section_name": "leadership and storytelling", "tag_array": [ - "leadership", - "decision making" + "Decision Making", + "Leadership" ] }, { "title": "How the Discovery Phase Works", "description": "Guidance from the UK Government Service Manual on conducting the discovery phase in agile delivery, including research and user needs assessment", "url": "https://www.gov.uk/service-manual/agile-delivery/how-the-discovery-phase-works", + "category_name": "Playbooks", "section_name": "discover", - "category_name": "guide", - "tag_array": [ - "discover phase" - ] + "tag_array": [] }, { "title": "Systemic Design Framework", "description": "An in-depth resource from the Design Council introducing a framework for tackling complex problems using systemic design principles", "url": "https://www.designcouncil.org.uk/our-resources/systemic-design-framework/", - "category_name": null, + "category_name": "Playbooks", "section_name": "leadership and storytelling", "tag_array": [ - "decision making" + "Decision Making" ] }, { "title": "Seven Tenets of Human-Centred Design", "description": "An article from the Design Council outlining the key principles of human-centred design and how to apply them in projects", "url": "https://www.designcouncil.org.uk/our-resources/seven-tenets-of-human-centred-design/", + "category_name": "Ideas", "section_name": "user centered and inclusive", - "category_name": "idea", "tag_array": [ - "user centered " + "User Centered Design" ] }, { "title": "Design Methods Step 1: Discover", "description": "An article from the Design Council outlining the first step in the design process, focusing on discovery and understanding user needs", "url": "https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-1-discover/", + "category_name": "Playbooks", "section_name": "discover", - "category_name": "guide", - "tag_array": [ - "discover phase" - ] + "tag_array": [] }, { "title": "Service Design Playbook", "description": "A comprehensive guide by the Ontario Digital Service outlining the process of designing user-centered government services", "url": "https://www.ontario.ca/page/service-design-playbook", - "category_name": null, + "category_name": "Playbooks", "section_name": "discover", - "tag_array": [ - "discover phase" - ] + "tag_array": [] }, { "title": "How the Alpha Phase Works", "description": "Guidance from the UK Government Service Manual on what to do during the alpha phase of agile delivery, including prototyping and testing solutions", "url": "https://www.gov.uk/service-manual/agile-delivery/how-the-alpha-phase-works", + "category_name": "Playbooks", "section_name": "define", - "category_name": "guide", - "tag_array": [ - "define phase" - ] + "tag_array": [] }, { "title": "How to Write a Problem Statement", "description": "An article by Nielsen Norman Group that explains how to craft clear and effective problem statements to guide design and research efforts", "url": "https://www.nngroup.com/articles/problem-statements/", - "category_name": null, + "category_name": "Methodology", "section_name": "define", "tag_array": [ - "problem definition" + "Problem Definition" ] }, { "title": "Design Methods Step 2: Define", "description": "An article from the Design Council detailing the second step in the design process, focusing on defining the problem and project scope", "url": "https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-2-define", - "category_name": null, + "category_name": "Playbooks", "section_name": "define", "tag_array": [ - "problem definition", - "define phase" + "Problem Definition" ] }, { "title": "How the Beta Phase Works", "description": "Guidance from the UK Government Service Manual on the beta phase of agile delivery, including developing, testing, and scaling a service", "url": "https://www.gov.uk/service-manual/agile-delivery/how-the-beta-phase-works", + "category_name": "Playbooks", "section_name": "develop", - "category_name": "guide", - "tag_array": [ - "develop phase" - ] + "tag_array": [] }, { "title": "Service Design Playbook - Beta Phase", "description": "A section of the Ontario Digital Service's Service Design Playbook that provides guidance on the beta phase, focusing on testing and improving a service before full launch", "url": "https://www.ontario.ca/page/service-design-playbook#Beta", + "category_name": "Playbooks", "section_name": "develop", - "category_name": "guide", - "tag_array": [ - "develop phase" - ] + "tag_array": [] }, { "title": "Service Design Playbook - Alpha Phase", "description": "A section of the Ontario Digital Service's Service Design Playbook that outlines key principles and practices for designing effective and user-centered services", "url": "https://www.ontario.ca/page/service-design-playbook#section-2", + "category_name": "Playbooks", "section_name": "define", - "category_name": "guide", - "tag_array": [ - "define phase" - ] + "tag_array": [] }, { "title": "Design Methods Step 3: Develop", "description": "An article from the Design Council that explains the third step in the design process, focusing on developing and iterating solutions", "url": "https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-3-develop/", + "category_name": "Playbooks", "section_name": "develop", - "category_name": "guide", - "tag_array": [ - "develop phase" - ] + "tag_array": [] }, { "title": "How the Live Phase Works", "description": "Guidance from the UK Government Service Manual on the live phase of agile delivery, including continuous improvement and monitoring of the service", "url": "https://www.gov.uk/service-manual/agile-delivery/how-the-live-phase-", + "category_name": "Playbooks", "section_name": "deliver", - "category_name": "guide", - "tag_array": [ - "deliver phase" - ] + "tag_array": [] }, { "title": "Service Design Playbook - Live Phase", "description": "A section of the Ontario Digital Service's Service Design Playbook that outlines key principles and practices for designing effective and user-centered services", "url": "https://www.ontario.ca/page/service-design-playbook#section-3", - "category_name": null, + "category_name": "Playbooks", "section_name": "deliver", - "tag_array": [ - "deliver phase" - ] + "tag_array": [] }, { "title": "Design Methods Step 4: Deliver", "description": "An article from the Design Council detailing the fourth step in the design process, focusing on delivering the final solution and assessing its impact", "url": "https://www.designcouncil.org.uk/our-resources/archive/articles/design-methods-step-4-deliver/", + "category_name": "Playbooks", "section_name": "deliver", - "category_name": "guide", - "tag_array": [ - "deliver phase" - ] + "tag_array": [] }, { - "title": "Scaling for Success: Best Practices for Sustaining Civic Tech", + "title": "Scaling for Success", "description": "An article from Code for All discussing strategies and best practices for scaling and sustaining civic tech initiatives", "url": "https://codeforall.org/2023/03/20/scaling-for-success-best-practices-for-sustaining-civic-tech/", - "category_name": null, + "category_name": "Explanations", "section_name": "sustainable and scalable", "tag_array": [ - "scaling" + "Scaling" ] }, { "title": "Retiring Your Service", "description": "Guidance from the UK Government Service Manual on how to properly retire a service, including planning, communication, and data management", "url": "https://www.gov.uk/service-manual/agile-delivery/retiring-your-service", + "category_name": "Methodology", "section_name": "evolve", - "category_name": "guide", "tag_array": [ - "strategy" + "Strategy" ] }, { "title": "Open Source Best Practices: It's Okay to Hit Pause", "description": "An article from Open Source Guide discussing best practices for pausing or archiving open source projects responsibly", "url": "https://opensource.guide/best-practices/#its-okay-to-hit-pause", + "category_name": "Explanations", "section_name": "evolve", - "category_name": "idea", "tag_array": [ - "open source" + "Open Source" ] }, { "title": "Open Source Code of Conduct", "description": "A guide from Open Source Guide on creating and implementing a code of conduct for open source projects to ensure inclusive and respectful community interactions", "url": "https://opensource.guide/code-of-conduct/", + "category_name": "Methodology", "section_name": "open and transparent", - "category_name": "guide", "tag_array": [ - "open source" + "Open Source" ] }, { "title": "Design Brief Template", "description": "A comprehensive template provided by Business Victoria to help businesses articulate their design project needs", "url": "https://business.vic.gov.au/tools-and-templates/design-brief-template", - "category_name": null, + "category_name": "Templates", "section_name": "define", "tag_array": [ - "problem definition", - "design" + "Problem Definition", + "Design" ] }, { "title": "What is OKR? Meaning, Definition, and Example", "description": "A detailed explanation of OKRs (Objectives and Key Results), including definitions and examples to help organizations set and achieve their goals", "url": "https://www.whatmatters.com/faqs/okr-meaning-definition-example", - "category_name": null, + "category_name": "Explanations", "section_name": "define", "tag_array": [ - "problem definition" + "Problem Definition" ] }, { "title": "The Basics of Designing & Facilitating Meetings", "description": "An article from MIT Human Resources outlining key questions and elements for effective meeting design and facilitation", "url": "https://hr.mit.edu/learning-topics/meetings/articles/basics", + "category_name": "Learning Sources", "section_name": "iterative and responsive", - "category_name": "learn", "tag_array": [ - "facilitation" + "Facilitation" ] }, { - "title": "Collaborative Decision-Making - Project Management Institute", + "title": "Collaborative Decision-Making", "description": "An article from the Project Management Institute discussing methods and best practices for collaborative decision-making in project environments", "url": "https://www.pmi.org/learning/library/collaborative-decision-making-group-7667", + "category_name": "Explanations", "section_name": "leadership and storytelling", - "category_name": "guide", "tag_array": [ - "decision making" + "Decision Making" ] }, { "title": "How to Write Good Documentation", "description": "Guidelines from UC Berkeley Library on writing clear and effective documentation, covering principles and best practices", "url": "https://guides.lib.berkeley.edu/how-to-write-good-documentation", + "category_name": "Methodology", "section_name": "sustainable and scalable", - "category_name": "guide", "tag_array": [ - "documentation" + "Documentation" ] }, { "title": "Write the Docs Guide", "description": "A comprehensive guide from Write the Docs on creating and maintaining excellent documentation for software and technical projects", "url": "https://www.writethedocs.org/guide/", + "category_name": "Methodology", "section_name": "sustainable and scalable", - "category_name": "guide", "tag_array": [ - "documentation", - "sustainability" + "Maintainability", + "Documentation" ] }, { - "title": "Documentation Best Practices (Google Style Guide)", + "title": "Documentation Best Practices", "description": "Google's style guide providing best practices for writing clear and concise documentation, including updating and managing documentation efficiently", "url": "https://google.github.io/styleguide/docguide/best_practices.html", + "category_name": "Explanations", "section_name": "sustainable and scalable", - "category_name": "guide", "tag_array": [ - "documentation", - "sustainability" + "Maintainability", + "Documentation" ] }, { "title": "Why It Is Necessary to Improve Team Communication", "description": "An article from American Public University discussing the importance of improving team communication and strategies to enhance collaboration and productivity", "url": "https://www.apu.apus.edu/area-of-study/business-and-management/resources/why-it-is-necessary-to-improve-team-communication/", + "category_name": "Ideas", "section_name": "connection and relationship", - "category_name": "idea", "tag_array": [ - "facilitation", - "team development" + "Team Development", + "Facilitation" ] }, { "title": "Guide to UX Research Methods", "description": "An article by Nielsen Norman Group providing a comprehensive overview of various UX research methods and when to use them", "url": "https://www.nngroup.com/articles/guide-ux-research-methods/", + "category_name": "Methodology", "section_name": "user centered and inclusive", - "category_name": "guide", "tag_array": [ - "user research", - "user centered " + "User Centered Design", + "User Research" ] }, { @@ -604,10 +579,10 @@ "description": "An article explaining the process and benefits of conducting expert reviews for evaluating user interfaces", "url": "https://www.nngroup.com/articles/ux-expert-reviews/", "section_name": null, - "category_name": "guide", + "category_name": "Explanations", "tag_array": [ - "user research", - "user centered " + "User Centered Design", + "User Research" ] }, { @@ -615,20 +590,20 @@ "description": "A guide on performing heuristic evaluations to identify usability issues in a user interface", "url": "https://www.nngroup.com/articles/how-to-conduct-a-heuristic-evaluation/", "section_name": null, - "category_name": "guide", + "category_name": "Methodology", "tag_array": [ - "user research" + "User Research" ] }, { "title": "Informed Consent for UX Research", "description": "An article discussing the importance of informed consent in UX research and how to implement it", "url": "https://www.nngroup.com/articles/informed-consent/", + "category_name": "Explanations", "section_name": "user centered and inclusive", - "category_name": "guide", "tag_array": [ - "user research", - "ethics" + "User Research", + "Ethics" ] }, { @@ -636,10 +611,10 @@ "description": "A guide on conducting effective stakeholder interviews to gather project requirements and expectations", "url": "https://www.nngroup.com/articles/stakeholder-interviews/", "section_name": null, - "category_name": "guide", + "category_name": "Methodology", "tag_array": [ - "user research", - "user centered " + "User Centered Design", + "User Research" ] }, { @@ -647,135 +622,287 @@ "description": "An article on creating an effective interview guide for conducting user research interviews", "url": "https://www.nngroup.com/articles/interview-guide/", "section_name": null, - "category_name": "guide", + "category_name": "Methodology", "tag_array": [ - "user research", - "user centered " + "User Centered Design", + "User Research" ] }, { "title": "Usability Testing 101", "description": "A beginner's guide to usability testing, covering the basics of planning and conducting usability tests", "url": "https://www.nngroup.com/articles/usability-testing-101/", + "category_name": "Learning Sources", "section_name": "user centered and inclusive", - "category_name": "learn", "tag_array": [ - "user research" + "User Research" ] }, { "title": "Observer Guidelines for Usability Testing", "description": "Guidelines for observers during usability testing sessions to ensure accurate data collection and respect for participants", "url": "https://www.nngroup.com/articles/observer-guidelines/", + "category_name": "Methodology", "section_name": "develop", - "category_name": "guide", "tag_array": [ - "user research" + "User Research" ] }, { "title": "Workshop Facilitation 101", "description": "A guide to facilitating workshops effectively, including preparation, execution, and follow-up strategies", "url": "https://www.nngroup.com/articles/workshop-facilitation-101/", + "category_name": "Learning Sources", "section_name": "leadership and storytelling", - "category_name": "learn", "tag_array": [ - "facilitation" + "Facilitation" ] }, { "title": "Journey Mapping 101", "description": "An introduction to journey mapping, a tool for visualizing the customer experience across various touchpoints", "url": "https://www.nngroup.com/articles/journey-mapping-101/", + "category_name": "Learning Sources", "section_name": "user centered and inclusive", - "category_name": "learn", "tag_array": [ - "design", - "user centered " + "User Centered Design", + "Design" ] }, { "title": "Service Blueprinting Template", "description": "A template and guide for creating service blueprints to analyze and improve service processes", "url": "https://www.nngroup.com/articles/service-blueprinting-template/", + "category_name": "Templates", "section_name": "define", - "category_name": "tool", "tag_array": [ - "design" + "Design" ] }, { - "title": "Paper Prototyping Cutout Kit", - "description": "A resource for creating paper prototypes, including cutout templates for common interface elements", - "url": "https://www.nngroup.com/articles/paper-prototyping-cutout-kit/", + "title": "Paper Prototyping Tutorial", + "description": "A tutorial for creating paper prototypes, including cutout templates for common interface elements", + "url": "https://www.nngroup.com/videos/paper-prototyping-tutorial/", + "category_name": "Methodology", "section_name": "define", - "category_name": "tool", "tag_array": [ - "prototyping" + "Prototyping" ] }, { "title": "Design Critiques", "description": "An article explaining how to conduct effective design critiques to improve design outcomes", "url": "https://www.nngroup.com/articles/design-critiques/", + "category_name": "Methodology", "section_name": "develop", - "category_name": "guide", "tag_array": [ - "decision making", - "design" + "Decision Making", + "Design" ] }, { "title": "The UNIX Philosophy", "description": "An article detailing the principles of the UNIX philosophy, which emphasizes simplicity, modularity, and clarity in software design", "url": "https://www.linfo.org/unix_philosophy.html", + "category_name": "Ideas", "section_name": "vision setting", - "category_name": "idea", "tag_array": [ - "product management", - "prototyping" + "Prototyping", + "Product Management" ] }, { - "title": "The Art of Unix Programming: The UNIX Philosophy", + "title": "Do One Thing Well", "description": "A section from \"The Art of Unix Programming\" by Eric S. Raymond, explaining key principles of UNIX programming", "url": "http://www.catb.org/esr/writings/taoup/html/ch01s06.html", + "category_name": "Ideas", "section_name": "vision setting", - "category_name": "idea", "tag_array": [ - "product management", - "prototyping", - "problem definition" + "Product Management", + "Prototyping", + "Problem Definition" ] }, { "title": "Accessibility Checklist", "description": "An accessibility checklist provided by The A11Y Project to ensure digital content is accessible to all users", "url": "https://www.a11yproject.com/checklist/", + "category_name": "Tools", "section_name": "user centered and inclusive", - "category_name": "tool", "tag_array": [ - "accessibility" + "Accessibility" ] }, { "title": "What is WCAG?", "description": "An article explaining the Web Content Accessibility Guidelines (WCAG) and their importance in creating accessible web content", "url": "https://www.wcag.com/resource/what-is-wcag/", + "category_name": "Explanations", "section_name": "user centered and inclusive", - "category_name": "guide", "tag_array": [ - "accessibility" + "Accessibility" ] }, { "title": "Leverage Points: Places to Intervene in a System", "description": "An article by Donella Meadows discussing leverage points for effecting change in complex systems", "url": "https://donellameadows.org/archives/leverage-points-places-to-intervene-in-a-system/", + "category_name": "Ideas", "section_name": "connection and relationship", - "category_name": "idea", "tag_array": [ - "systems thinking" + "Systems Thinking" ] + }, + { + "title": "Civic Tech Field Guide", + "description": "An extensive collection of projects, tools, and organizations leveraging technology to enhance democracy and the public good\n", + "url": "https://civictech.guide", + "section_name": null, + "category_name": "Resource Collections", + "tag_array": [] + }, + { + "title": "Participedia Methods List", + "description": "A global crowdsourcing platform for researchers, activists, practitioners, and anyone interested in public participation and democratic innovations.", + "url": "https://participedia.net/search?selectedCategory=method", + "section_name": null, + "category_name": "Resource Collections", + "tag_array": [] + }, + { + "title": "Knight Foundation", + "description": "The Knight Foundation is a philanthropic organization dedicated to fostering informed and engaged communities through investments in journalism, the arts, and community initiatives", + "url": "https://knightfoundation.org", + "section_name": null, + "category_name": "Organizations", + "tag_array": [] + }, + { + "title": "Digital Public Goods Alliance", + "description": "A multi-stakeholder initiative that promotes the discovery, development, and use of digital public goods to help achieve the Sustainable Development Goals (SDGs)", + "url": "https://www.digitalpublicgoods.net", + "section_name": null, + "category_name": "Organizations", + "tag_array": [] + }, + { + "title": "Design for America's Design Process", + "description": "An overview of DFA's design process, emphasizing social innovation and human-centered problem-solving.", + "url": "https://www.designforamerica.org/designprocess", + "section_name": null, + "category_name": "Playbooks", + "tag_array": [] + }, + { + "title": "A Civic Technologist's Practice Guide by Cyd Harrell", + "description": "A practical guide to designing for the public good, focusing on civic technology and user experience in government contexts.", + "url": "https://cydharrell.wpcomstaging.com/book/", + "section_name": null, + "category_name": "Books", + "tag_array": [] + }, + { + "title": "Power to the Public by Tara Dawson McGuinness and Hana Schank", + "description": "A book detailing how digital tools and data can be harnessed to improve governance and empower citizens.", + "url": "https://press.princeton.edu/books/ebook/9780691216638/power-to-the-public", + "section_name": null, + "category_name": "Books", + "tag_array": [] + }, + { + "title": "Teardown by Dave Meslin", + "description": "A collection of solutions aimed at bringing our democratic ecosystem to life, not only in our legislatures but also in our daily lives.", + "url": "https://www.teardown.build/the_book", + "section_name": null, + "category_name": "Books", + "tag_array": [] + }, + { + "title": "Thinking In Systems by Donella Meadows", + "description": "Donella Meadows' seminal work on systems thinking, offering insights into understanding complex systems.", + "url": "https://en.wikipedia.org/wiki/Thinking_In_Systems:_A_Primer", + "section_name": null, + "category_name": "Books", + "tag_array": [] + }, + { + "title": "Plurality by E. Glen Weyl, Audrey Tang and ⿻ Community", + "description": "A project focused on exploring and promoting pluralistic governance and social structures that support diverse perspectives.", + "url": "https://www.plurality.net", + "section_name": null, + "category_name": "Books", + "tag_array": [] + }, + { + "title": "Open Government Partnership", + "description": "A resource outlining best practices for creating transparent, accountable, and participatory governance.", + "url": "https://www.opengovpartnership.org/open-gov-guide/", + "section_name": null, + "category_name": "Organizations", + "tag_array": [] + }, + { + "title": "Design Kit", + "description": "A collection of human-centered design methods curated by IDEO, providing practical tools for tackling complex challenges.", + "url": "https://www.designkit.org/methods.html", + "section_name": null, + "category_name": "Resource Collections", + "tag_array": [] + }, + { + "title": "Personas", + "description": "An in-depth exploration of personas as a UX tool, helping designers understand and cater to user needs effectively.", + "url": "https://www.interaction-design.org/literature/topics/personas", + "section_name": null, + "category_name": "Methodology", + "tag_array": [] + }, + { + "title": "Telling Stories with Data by Rohan Alexander", + "description": "A guidebook on using data visualization to communicate insights clearly and persuasively.", + "url": "https://tellingstorieswithdata.com", + "section_name": null, + "category_name": "Books", + "tag_array": [] + }, + { + "title": "UNESCO Institute for Statistics", + "description": "A database providing access to a wide array of global education, science, culture, and communication statistics.", + "url": "http://data.uis.unesco.org/Index.aspx", + "section_name": null, + "category_name": "Datasources", + "tag_array": [] + }, + { + "title": "The World Factbook", + "description": "A reliable source of comprehensive information on the countries of the world, including geography, demographics, and political structures.", + "url": "https://www.cia.gov/the-world-factbook/", + "section_name": null, + "category_name": "Datasources", + "tag_array": [] + }, + { + "title": "Open Collective", + "description": "A platform that enables groups to raise and manage money transparently, supporting open-source projects and community initiatives.", + "url": "https://opencollective.com/home", + "section_name": null, + "category_name": "Services", + "tag_array": [] + }, + { + "title": "Github", + "description": "GitHub, the world's leading platform for version control and collaborative software development.", + "url": "https://github.com/about", + "section_name": null, + "category_name": "Services", + "tag_array": [] + }, + { + "title": "Aspiration", + "description": "Aspiration's mission is to connect nonprofit organizations, free and open source projects, philanthropic funders and activists with strategic frameworks, technology solutions, digital practices and data skills that help them more fully realize their missions.", + "url": "https://aspirationtech.org", + "section_name": null, + "category_name": "Organizations", + "tag_array": [] } ] \ No newline at end of file