diff --git a/.eslintignore b/.eslintignore
index dd56aaa68f..e57be2186a 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,50 +1,50 @@
-/node_modules
+**/node_modules
**/dist
package-lock.json
**/.angular
-/resources/todomvc/architecture-examples/*
-!/resources/todomvc/architecture-examples/angular
-!/resources/todomvc/architecture-examples/angular-complex
-!/resources/todomvc/architecture-examples/backbone
-!/resources/todomvc/architecture-examples/backbone-complex
-!/resources/todomvc/architecture-examples/lit
-/resources/todomvc/architecture-examples/lit/.wireit
-/resources/todomvc/architecture-examples/lit/dist/index.js
-!/resources/todomvc/architecture-examples/lit-complex
-!/resources/todomvc/architecture-examples/preact
-!/resources/todomvc/architecture-examples/preact-complex
-!/resources/todomvc/architecture-examples/react
-!/resources/todomvc/architecture-examples/react-complex
-!/resources/todomvc/architecture-examples/react-redux
-!/resources/todomvc/architecture-examples/react-redux-complex
-!/resources/todomvc/architecture-examples/svelte
-!/resources/todomvc/architecture-examples/svelte-complex
-!/resources/todomvc/architecture-examples/vue
-!/resources/todomvc/architecture-examples/vue-complex
-
-/resources/todomvc/vanilla-examples/*
-!/resources/todomvc/vanilla-examples/javascript-es5
-!/resources/todomvc/vanilla-examples/javascript-es5-complex
-!/resources/todomvc/vanilla-examples/javascript-es6
-!/resources/todomvc/vanilla-examples/javascript-es6-complex
-!/resources/todomvc/vanilla-examples/javascript-es6-webpack
-!/resources/todomvc/vanilla-examples/javascript-es6-webpack-complex
-!/resources/todomvc/vanilla-examples/javascript-web-components
-!/resources/todomvc/vanilla-examples/javascript-web-components-complex/
-
-!/resources/todomvc/big-dom-generator
-
-!/resources/editors
-/resources/editors/assets
-
-!/resources/newssite
-!/resources/newssite/news-next
-!/resources/newssite/news-nuxt
-!/resources/newssite/news-site-css
-
-/resources/perf.webkit.org
-
-/resources/react-stockcharts
-
-/experimental/responsive-design/build-dev/
+/suites/todomvc/architecture-examples/*
+!/suites/todomvc/architecture-examples/angular
+!/suites/todomvc/architecture-examples/angular-complex
+!/suites/todomvc/architecture-examples/backbone
+!/suites/todomvc/architecture-examples/backbone-complex
+!/suites/todomvc/architecture-examples/lit
+/suites/todomvc/architecture-examples/lit/.wireit
+/suites/todomvc/architecture-examples/lit/dist/index.js
+!/suites/todomvc/architecture-examples/lit-complex
+!/suites/todomvc/architecture-examples/preact
+!/suites/todomvc/architecture-examples/preact-complex
+!/suites/todomvc/architecture-examples/react
+!/suites/todomvc/architecture-examples/react-complex
+!/suites/todomvc/architecture-examples/react-redux
+!/suites/todomvc/architecture-examples/react-redux-complex
+!/suites/todomvc/architecture-examples/svelte
+!/suites/todomvc/architecture-examples/svelte-complex
+!/suites/todomvc/architecture-examples/vue
+!/suites/todomvc/architecture-examples/vue-complex
+
+/suites/todomvc/vanilla-examples/*
+!/suites/todomvc/vanilla-examples/javascript-es5
+!/suites/todomvc/vanilla-examples/javascript-es5-complex
+!/suites/todomvc/vanilla-examples/javascript-es6
+!/suites/todomvc/vanilla-examples/javascript-es6-complex
+!/suites/todomvc/vanilla-examples/javascript-es6-webpack
+!/suites/todomvc/vanilla-examples/javascript-es6-webpack-complex
+!/suites/todomvc/vanilla-examples/javascript-web-components
+!/suites/todomvc/vanilla-examples/javascript-web-components-complex/
+
+!/suites/todomvc/big-dom-generator
+
+!/suites/editors
+/suites/editors/assets
+
+!/suites/newssite
+!/suites/newssite/news-next
+!/suites/newssite/news-nuxt
+!/suites/newssite/news-site-css
+
+/suites/perf.webkit.org
+
+/suites/react-stockcharts
+
+/suites-experimental/responsive-design/build-dev/
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 4a2cc58827..a835ce600b 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -26,6 +26,9 @@ jobs:
- name: Install Node Packages
run: npm ci
+ - name: Run package.json linter
+ run: npm run lint:pkg
+
- name: Run linters
run: npm run format
@@ -41,6 +44,25 @@ jobs:
exit 1
fi
+ test-node:
+ name: Node Unit Tests
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Branch
+ uses: actions/checkout@v4
+
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: "package.json"
+ cache: "npm"
+
+ - name: Install Node Packages
+ run: npm ci
+
+ - name: Run Node Unit Tests
+ run: npm test
+
build:
name: Build
runs-on: macos-latest
diff --git a/.gitignore b/.gitignore
index aa915477f0..d23bd70cef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,38 +2,12 @@
*.pyc
.DS_Store
.directory
-/node_modules
+node_modules/
+.agents
+.gemini
.vscode
.angular
-/resources/todomvc/architecture-examples/angular/node_modules/
-/resources/todomvc/architecture-examples/angular-complex/node_modules/
-/resources/todomvc/architecture-examples/backbone/node_modules/
-/resources/todomvc/architecture-examples/backbone-complex/node_modules/
-/resources/todomvc/architecture-examples/jquery/node_modules/
-/resources/todomvc/architecture-examples/jquery-complex/node_modules/
-/resources/todomvc/architecture-examples/preact/node_modules/
-/resources/todomvc/architecture-examples/preact-complex/node_modules/
-/resources/todomvc/architecture-examples/react/node_modules/
-/resources/todomvc/architecture-examples/react-complex/node_modules/
-/resources/todomvc/architecture-examples/react-redux/node_modules/
-/resources/todomvc/architecture-examples/react-redux-complex/node_modules/
-/resources/todomvc/architecture-examples/svelte/node_modules/
-/resources/todomvc/architecture-examples/svelte-complex/node_modules/
-/resources/todomvc/architecture-examples/vue/node_modules/
-/resources/todomvc/architecture-examples/vue-complex/node_modules/
-/resources/todomvc/architecture-examples/lit-complex/node_modules/
-/resources/todomvc/vanilla-examples/javascript-es5/node_modules/
-/resources/todomvc/vanilla-examples/javascript-es5-complex/node_modules/
-/resources/todomvc/vanilla-examples/javascript-es6/node_modules/
-/resources/todomvc/vanilla-examples/javascript-es6-complex/node_modules/
-/resources/todomvc/vanilla-examples/javascript-es6-webpack/node_modules/
-/resources/todomvc/vanilla-examples/javascript-es6-webpack-complex/node_modules/
-/resources/todomvc/vanilla-examples/javascript-web-components-complex/node_modules/
-
-/resources/charts/node_modules/
-/resources/todomvc/big-dom-generator/node_modules/
-/experimental/responsive-design/node_modules/
-/experimental/responsive-design/build-dev/
+/suites-experimental/**/build-dev/
diff --git a/.npmpackagejsonlintrc.json b/.npmpackagejsonlintrc.json
new file mode 100644
index 0000000000..800e07b4f3
--- /dev/null
+++ b/.npmpackagejsonlintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "npm-package-json-lint-config-default"
+}
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000000..cabf43b5dd
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+24
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
index 35bc1b522a..0b1b6168e3 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,50 +1,50 @@
-/node_modules
+**/node_modules
**/dist
package-lock.json
**/.angular
-/resources/todomvc/architecture-examples/*
-!/resources/todomvc/architecture-examples/angular
-!/resources/todomvc/architecture-examples/angular-complex
-!/resources/todomvc/architecture-examples/backbone
-!/resources/todomvc/architecture-examples/backbone-complex
-!/resources/todomvc/architecture-examples/lit
-/resources/todomvc/architecture-examples/lit/dist/index.js
-/resources/todomvc/architecture-examples/lit/.wireit
-!/resources/todomvc/architecture-examples/lit-complex
-!/resources/todomvc/architecture-examples/preact
-!/resources/todomvc/architecture-examples/preact-complex
-!/resources/todomvc/architecture-examples/react
-!/resources/todomvc/architecture-examples/react-complex
-!/resources/todomvc/architecture-examples/react-redux
-!/resources/todomvc/architecture-examples/react-redux-complex
-!/resources/todomvc/architecture-examples/svelte
-!/resources/todomvc/architecture-examples/svelte-complex
-!/resources/todomvc/architecture-examples/vue
-!/resources/todomvc/architecture-examples/vue-complex
+/suites/todomvc/architecture-examples/*
+!/suites/todomvc/architecture-examples/angular
+!/suites/todomvc/architecture-examples/angular-complex
+!/suites/todomvc/architecture-examples/backbone
+!/suites/todomvc/architecture-examples/backbone-complex
+!/suites/todomvc/architecture-examples/lit
+/suites/todomvc/architecture-examples/lit/dist/index.js
+/suites/todomvc/architecture-examples/lit/.wireit
+!/suites/todomvc/architecture-examples/lit-complex
+!/suites/todomvc/architecture-examples/preact
+!/suites/todomvc/architecture-examples/preact-complex
+!/suites/todomvc/architecture-examples/react
+!/suites/todomvc/architecture-examples/react-complex
+!/suites/todomvc/architecture-examples/react-redux
+!/suites/todomvc/architecture-examples/react-redux-complex
+!/suites/todomvc/architecture-examples/svelte
+!/suites/todomvc/architecture-examples/svelte-complex
+!/suites/todomvc/architecture-examples/vue
+!/suites/todomvc/architecture-examples/vue-complex
-/resources/todomvc/vanilla-examples/*
-!/resources/todomvc/vanilla-examples/javascript-es5
-!/resources/todomvc/vanilla-examples/javascript-es5-complex
-!/resources/todomvc/vanilla-examples/javascript-es6
-!/resources/todomvc/vanilla-examples/javascript-es6-complex
-!/resources/todomvc/vanilla-examples/javascript-es6-webpack
-!/resources/todomvc/vanilla-examples/javascript-es6-webpack-complex
-!/resources/todomvc/vanilla-examples/javascript-web-components
-!/resources/todomvc/vanilla-examples/javascript-web-components-complex/
+/suites/todomvc/vanilla-examples/*
+!/suites/todomvc/vanilla-examples/javascript-es5
+!/suites/todomvc/vanilla-examples/javascript-es5-complex
+!/suites/todomvc/vanilla-examples/javascript-es6
+!/suites/todomvc/vanilla-examples/javascript-es6-complex
+!/suites/todomvc/vanilla-examples/javascript-es6-webpack
+!/suites/todomvc/vanilla-examples/javascript-es6-webpack-complex
+!/suites/todomvc/vanilla-examples/javascript-web-components
+!/suites/todomvc/vanilla-examples/javascript-web-components-complex/
-!/resources/todomvc/big-dom-generator
+!/suites/todomvc/big-dom-generator
-!/resources/editors
-/resources/editors/assets
+!/suites/editors
+/suites/editors/assets
-!/resources/newssite
-!/resources/newssite/news-next
-!/resources/newssite/news-nuxt
-!/resources/newssite/news-site-css
+!/suites/newssite
+!/suites/newssite/news-next
+!/suites/newssite/news-nuxt
+!/suites/newssite/news-site-css
-/resources/perf.webkit.org
+/suites/perf.webkit.org
-/resources/react-stockcharts
-/experimental/responsive-design/build-dev/
-/experimental/responsive-design/**/*.generated.css
+/suites/react-stockcharts
+/suites-experimental/responsive-design/build-dev/
+/suites-experimental/responsive-design/**/*.generated.css
diff --git a/Testing.md b/Testing.md
index 684260b1cc..20685a7b14 100644
--- a/Testing.md
+++ b/Testing.md
@@ -8,7 +8,17 @@ Tests are located in the `/tests` folder.
## Local Testing
-To run this locally you'll need the browsers installed along with the corresponding driver:
+### Local Node.js Unit Testing
+
+You can run the unit tests directly in Node.js using:
+
+```bash
+npm run test:node
+```
+
+### In-Browser Testing
+
+To run the in-browser tests locally, you'll need the browsers installed along with the corresponding driver:
- [chromedriver](https://chromedriver.chromium.org/getting-started)
- [geckodriver](https://github.com/mozilla/geckodriver/releases)
diff --git a/about.html b/about.html
index 02db762a1f..bd1b8d0316 100644
--- a/about.html
+++ b/about.html
@@ -92,7 +92,7 @@
-