diff --git a/.env b/.env index 30f51746b11..39f82c6e848 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ # Production Build -BUILD_GRID_VERSION=35.2.1-beta.20260419.2046 -BUILD_CHARTS_VERSION=13.2.1-beta.20260419 +BUILD_GRID_VERSION=35.2.1-beta.20260503.2052 +BUILD_CHARTS_VERSION=13.2.1-beta.20260503 ENV=local NX_BATCH_MODE=true NX_ADD_PLUGINS=false diff --git a/.rulesync/rules/ag-grid.md b/.rulesync/rules/ag-grid.md index ee27b22b108..92d97260e11 100644 --- a/.rulesync/rules/ag-grid.md +++ b/.rulesync/rules/ag-grid.md @@ -113,7 +113,13 @@ For detailed information about preferred technologies and architectural constrai - `yarn nx test ` – execute Jest unit tests for the affected package. - `yarn nx test --testPathPattern=""` - test specific test file - `yarn nx test --testPathPattern="" --testNamePattern=""` - test specific test name in a specific test file -- `yarn nx e2e ` – run Playwright flows when altering website behaviour. +- `./docs-e2e.sh` – run docs Playwright E2E tests directly, bypassing Nx (chromium by default). +- `./docs-e2e.sh ""` – run E2E tests matching a file pattern. +- `./docs-e2e.sh "" --grep ""` – run a specific E2E test by name. +- `./docs-e2e.sh --all-browsers` – run E2E tests across chromium, firefox, and webkit. +- `./docs-e2e.sh --framework ` – run E2E tests with a specific framework (e.g. react, angular, vue). +- `./docs-e2e.sh --ui` – open Playwright UI mode. +- `yarn nx e2e ` – run Playwright flows via Nx when altering website behaviour. - `yarn nx lint ` – apply ESLint and custom rules before final review. ### Slash Commands diff --git a/.rulesync/rules/docs-pages.md b/.rulesync/rules/docs-pages.md index 31cd14999c8..621cb8fd52a 100644 --- a/.rulesync/rules/docs-pages.md +++ b/.rulesync/rules/docs-pages.md @@ -62,6 +62,6 @@ Test documentation changes: # Start dev server yarn nx dev -# Run E2E tests -yarn nx e2e ag-grid-docs +# Run E2E tests (chromium only, bypasses Nx) +./docs-e2e.sh feature-category ``` diff --git a/.rulesync/rules/testing.md b/.rulesync/rules/testing.md index 32cead38e86..13d00590490 100644 --- a/.rulesync/rules/testing.md +++ b/.rulesync/rules/testing.md @@ -88,10 +88,33 @@ yarn nx test ag-grid-community --testPathPattern="featureName" yarn nx test ag-grid-community --testPathPattern="featureName" --testNamePattern="should handle" ``` -### E2E Tests +### E2E Tests (Playwright) + +E2E tests run via Playwright against the docs site. `./docs-e2e.sh` runs them directly from the repo root, bypassing Nx, and defaults to chromium only: + +```bash +# Run all E2E tests (chromium) +./docs-e2e.sh + +# Run tests matching a file pattern +./docs-e2e.sh "toolbar" + +# Run a specific test by name +./docs-e2e.sh "toolbar" --grep "Quick filter" + +# Run against all browsers +./docs-e2e.sh --all-browsers + +# Run with a specific framework +./docs-e2e.sh --framework react + +# Open Playwright UI mode +./docs-e2e.sh --ui +``` + +The full Nx target is still available when needed: ```bash -# Run documentation E2E tests yarn nx e2e ag-grid-docs ``` diff --git a/.run/Column Tool Panel Icon bug.run.xml b/.run/Column Tool Panel Icon bug.run.xml new file mode 100644 index 00000000000..c192fe9ad77 --- /dev/null +++ b/.run/Column Tool Panel Icon bug.run.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.run/Pivot totals position bug.run.xml b/.run/Pivot totals position bug.run.xml deleted file mode 100644 index c8427849ca6..00000000000 --- a/.run/Pivot totals position bug.run.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index 2393616e564..2e528949c22 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -106,7 +106,13 @@ For detailed information about preferred technologies and architectural constrai - `yarn nx test ` – execute Jest unit tests for the affected package. - `yarn nx test --testPathPattern=""` - test specific test file - `yarn nx test --testPathPattern="" --testNamePattern=""` - test specific test name in a specific test file -- `yarn nx e2e ` – run Playwright flows when altering website behaviour. +- `./docs-e2e.sh` – run docs Playwright E2E tests directly, bypassing Nx (chromium by default). +- `./docs-e2e.sh ""` – run E2E tests matching a file pattern. +- `./docs-e2e.sh "" --grep ""` – run a specific E2E test by name. +- `./docs-e2e.sh --all-browsers` – run E2E tests across chromium, firefox, and webkit. +- `./docs-e2e.sh --framework ` – run E2E tests with a specific framework (e.g. react, angular, vue). +- `./docs-e2e.sh --ui` – open Playwright UI mode. +- `yarn nx e2e ` – run Playwright flows via Nx when altering website behaviour. - `yarn nx lint ` – apply ESLint and custom rules before final review. ### Slash Commands @@ -183,13 +189,11 @@ While this transition is in progress, changes made to Theming API should be appl #### Quick Playbooks - **Bug fix or feature work (community/enterprise)** - 1. Update the affected implementation (typically under `packages/ag-grid-*/src/`). 2. Sync any dependent docs/examples. 3. Run `yarn nx test ag-grid-community`, `yarn nx test ag-grid-enterprise`. - **Documentation/content update** - 1. Consult the [Documentation Pages Guide](.rulesync/rules/docs-pages.md) for structure and patterns. 2. Modify the relevant content under `documentation/ag-grid-docs/`. 3. Create or update examples in `_examples/` folder following the [Examples Guide](.rulesync/rules/examples.md). diff --git a/community-modules/locale/package.json b/community-modules/locale/package.json index 1e039678ff3..aa54184096f 100644 --- a/community-modules/locale/package.json +++ b/community-modules/locale/package.json @@ -1,6 +1,6 @@ { "name": "@ag-grid-community/locale", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "Localisation Module for AG Grid, providing translations in 31 languages.", "main": "./dist/package/main.cjs.js", "types": "./dist/types/src/main.d.ts", diff --git a/community-modules/styles/package.json b/community-modules/styles/package.json index 52cad3ce0af..9edf2d3b771 100644 --- a/community-modules/styles/package.json +++ b/community-modules/styles/package.json @@ -1,6 +1,6 @@ { "name": "@ag-grid-community/styles", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "AG Grid Styles and Themes", "main": "_index.scss", "files": [ diff --git a/e2e.sh b/docs-e2e.sh similarity index 67% rename from e2e.sh rename to docs-e2e.sh index 270437b38ae..61b7c206223 100755 --- a/e2e.sh +++ b/docs-e2e.sh @@ -3,15 +3,15 @@ # All arguments are forwarded to playwright. Defaults to chromium only. # # Usage: -# ./e2e.sh # Run all tests (chromium) -# ./e2e.sh "file-pattern" # Run tests matching pattern -# ./e2e.sh "file-pattern" --grep "name" # Run specific test by name -# ./e2e.sh --all-browsers # Run all browsers -# ./e2e.sh --framework react # Run with specific framework -# ./e2e.sh --url https://localhost:4610 # Run against specific URL -# ./e2e.sh --headed # Run in headed mode -# ./e2e.sh --ui # Open Playwright UI mode -# ./e2e.sh --debug # Debug mode +# ./docs-e2e.sh # Run all tests (chromium) +# ./docs-e2e.sh "file-pattern" # Run tests matching pattern +# ./docs-e2e.sh "file-pattern" --grep "name" # Run specific test by name +# ./docs-e2e.sh --all-browsers # Run all browsers +# ./docs-e2e.sh --framework react # Run with specific framework +# ./docs-e2e.sh --url https://localhost:4610 # Run against specific URL +# ./docs-e2e.sh --headed # Run in headed mode +# ./docs-e2e.sh --ui # Open Playwright UI mode +# ./docs-e2e.sh --debug # Debug mode set -euo pipefail @@ -19,7 +19,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" usage() { cat <<'EOF' -Usage: ./e2e.sh [options] [playwright-args] +Usage: ./docs-e2e.sh [options] [playwright-args] Runs docs Playwright e2e tests directly, bypassing Nx. Defaults to chromium only. Any unrecognised arguments are forwarded directly to playwright test. @@ -39,14 +39,14 @@ Playwright options (forwarded as-is): --debug Debug mode Examples: - ./e2e.sh - ./e2e.sh "toolbar" - ./e2e.sh "toolbar" --grep "Quick filter" - ./e2e.sh --all-browsers - ./e2e.sh --framework react - ./e2e.sh --url https://localhost:4610 - ./e2e.sh --headed - ./e2e.sh --ui + ./docs-e2e.sh + ./docs-e2e.sh "toolbar" + ./docs-e2e.sh "toolbar" --grep "Quick filter" + ./docs-e2e.sh --all-browsers + ./docs-e2e.sh --framework react + ./docs-e2e.sh --url https://localhost:4610 + ./docs-e2e.sh --headed + ./docs-e2e.sh --ui EOF } diff --git a/documentation/ag-grid-docs/package.json b/documentation/ag-grid-docs/package.json index c28ff5066b1..c0edd78556f 100644 --- a/documentation/ag-grid-docs/package.json +++ b/documentation/ag-grid-docs/package.json @@ -2,7 +2,7 @@ "name": "ag-grid-docs", "description": "Documentation for AG Grid", "type": "module", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "repository": { "type": "git", "url": "https://github.com/ag-grid/ag-grid.git" @@ -59,11 +59,11 @@ "ag-charts-types": "13.2.1-beta.20260503", "ag-charts-react": "13.2.1-beta.20260503", "ag-charts-vue3": "13.2.1-beta.20260503", - "ag-grid-angular": "35.2.1-beta.20260419.2046", - "ag-grid-community": "35.2.1-beta.20260419.2046", - "ag-grid-enterprise": "35.2.1-beta.20260419.2046", - "ag-grid-react": "35.2.1-beta.20260419.2046", - "ag-grid-vue3": "35.2.1-beta.20260419.2046", + "ag-grid-angular": "35.2.1-beta.20260503.2052", + "ag-grid-community": "35.2.1-beta.20260503.2052", + "ag-grid-enterprise": "35.2.1-beta.20260503.2052", + "ag-grid-react": "35.2.1-beta.20260503.2052", + "ag-grid-vue3": "35.2.1-beta.20260503.2052", "algoliasearch": "^5.51.0", "astro": "6.1.9", "cheerio": "^1.0.0", diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/logo-btp.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/logo-btp.svg new file mode 100644 index 00000000000..d7538528e56 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/logo-btp.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/social-card.png b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/social-card.png new file mode 100644 index 00000000000..92cc20fd981 Binary files /dev/null and b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/social-card.png differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/speakers/david-kourshid.webp b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/speakers/david-kourshid.webp new file mode 100644 index 00000000000..e4d14ec7ed2 Binary files /dev/null and b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/speakers/david-kourshid.webp differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/speakers/matt-pocock.webp b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/speakers/matt-pocock.webp new file mode 100644 index 00000000000..1d6a536389c Binary files /dev/null and b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/speakers/matt-pocock.webp differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/adam-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/adam-orange-bg.svg new file mode 100644 index 00000000000..5d1a9249491 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/adam-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/adam.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/adam.svg new file mode 100644 index 00000000000..0d2f0e759d7 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/adam.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/bernie-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/bernie-orange-bg.svg new file mode 100644 index 00000000000..0f4fa5b0268 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/bernie-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/bernie.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/bernie.svg new file mode 100644 index 00000000000..bab668f868e --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/bernie.svg @@ -0,0 +1,2712 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/david-kourshid-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/david-kourshid-orange-bg.svg new file mode 100644 index 00000000000..f23b31774b6 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/david-kourshid-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/david-kourshid.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/david-kourshid.svg new file mode 100644 index 00000000000..3f053fad1dd --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/david-kourshid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan-1.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan-1.svg new file mode 100644 index 00000000000..e6269cd161b --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan-1.svg @@ -0,0 +1,3525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan-orange-bg.svg new file mode 100644 index 00000000000..e118af0498f --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan.svg new file mode 100644 index 00000000000..aa7de7ba46b --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/johan.svg @@ -0,0 +1,1679 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/john-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/john-orange-bg.svg new file mode 100644 index 00000000000..bd6dbb5ab10 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/john-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/john.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/john.svg new file mode 100644 index 00000000000..cf280cbfcc7 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/john.svg @@ -0,0 +1,2641 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/josh-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/josh-orange-bg.svg new file mode 100644 index 00000000000..0c55d210af5 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/josh-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/josh.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/josh.svg new file mode 100644 index 00000000000..cc9a8494d93 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/josh.svg @@ -0,0 +1,3962 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/logo-btp.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/logo-btp.svg new file mode 100644 index 00000000000..d7538528e56 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/logo-btp.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/maggie-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/maggie-orange-bg.svg new file mode 100644 index 00000000000..c4cc94ff632 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/maggie-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/maggie.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/maggie.svg new file mode 100644 index 00000000000..0fc547ebe0a --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/maggie.svg @@ -0,0 +1,4890 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mat-web-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mat-web-orange-bg.svg new file mode 100644 index 00000000000..dddf13daae5 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mat-web-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mat-web.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mat-web.svg new file mode 100644 index 00000000000..3371cdfd2a2 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mat-web.svg @@ -0,0 +1,3126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mats-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mats-orange-bg.svg new file mode 100644 index 00000000000..ed0720ee124 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mats-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mats.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mats.svg new file mode 100644 index 00000000000..b9755f8cef9 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/mats.svg @@ -0,0 +1,1508 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/matt-pocock-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/matt-pocock-orange-bg.svg new file mode 100644 index 00000000000..e455692b151 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/matt-pocock-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/matt-pocock.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/matt-pocock.svg new file mode 100644 index 00000000000..c987818efbd --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/matt-pocock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/phil-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/phil-orange-bg.svg new file mode 100644 index 00000000000..f272eb630e0 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/phil-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/phil.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/phil.svg new file mode 100644 index 00000000000..a5bf91dc863 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/phil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sophie-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sophie-orange-bg.svg new file mode 100644 index 00000000000..14ebf586844 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sophie-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sophie.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sophie.svg new file mode 100644 index 00000000000..ba2aad5aa2f --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sophie.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/stephen-orange-bg.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/stephen-orange-bg.svg new file mode 100644 index 00000000000..cbb22f772c1 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/stephen-orange-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/stephen.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/stephen.svg new file mode 100644 index 00000000000..9fbd240c6d1 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/stephen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sylwia.svg b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sylwia.svg new file mode 100644 index 00000000000..06860234426 --- /dev/null +++ b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/svg/sylwia.svg @@ -0,0 +1,4536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/savoy-mobile.webp b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/savoy-mobile.webp new file mode 100644 index 00000000000..12346b1c3e9 Binary files /dev/null and b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/savoy-mobile.webp differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/savoy.webp b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/savoy.webp new file mode 100644 index 00000000000..793a8bf871e Binary files /dev/null and b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/savoy.webp differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-1.webp b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-1.webp deleted file mode 100644 index 42c19771f96..00000000000 Binary files a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-1.webp and /dev/null differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-2.webp b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-2.webp deleted file mode 100644 index 84e8949415c..00000000000 Binary files a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-2.webp and /dev/null differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-3.webp b/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-3.webp deleted file mode 100644 index 36d47c59927..00000000000 Binary files a/documentation/ag-grid-docs/public/images/campaigns/beyond-the-prompt/venue/venue-3.webp and /dev/null differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/bryntum-logo.png b/documentation/ag-grid-docs/public/images/campaigns/bryntum-logo.png deleted file mode 100644 index 5c3210b5605..00000000000 Binary files a/documentation/ag-grid-docs/public/images/campaigns/bryntum-logo.png and /dev/null differ diff --git a/documentation/ag-grid-docs/public/images/campaigns/bryntum-logo.webp b/documentation/ag-grid-docs/public/images/campaigns/bryntum-logo.webp new file mode 100644 index 00000000000..8632d1d7382 Binary files /dev/null and b/documentation/ag-grid-docs/public/images/campaigns/bryntum-logo.webp differ diff --git a/documentation/ag-grid-docs/src/layouts/Layout.astro b/documentation/ag-grid-docs/src/layouts/Layout.astro index f34a1d7b955..f38c07b2b35 100644 --- a/documentation/ag-grid-docs/src/layouts/Layout.astro +++ b/documentation/ag-grid-docs/src/layouts/Layout.astro @@ -25,12 +25,7 @@ interface Props { hidePageFromSearchEngines?: boolean; showMicrosoftMessage?: boolean; showAnnouncementBanner?: boolean; - announcementBannerProps?: { - href: string; - title: string; - description: string; - ctaLabel: string; - }; + overrideSocialImage?: string; } const { data: metadata } = (await getEntry('metadata', 'metadata')) as CollectionEntry<'metadata'>; @@ -54,10 +49,12 @@ const { hideFooter, hidePageFromSearchEngines, showMicrosoftMessage, + showAnnouncementBanner = true, + overrideSocialImage, } = Astro.props; const path = Astro.url.pathname; -const socialImage = urlWithBaseUrl(metadata.socialImage); +const socialImage = urlWithBaseUrl(overrideSocialImage ?? metadata.socialImage); const lightModeCSSUrl = `url("${urlWithBaseUrl('/images/sun.svg')}")`; const darkModeCSSUrl = `url("${urlWithBaseUrl('/images/moon.svg')}")`; @@ -192,7 +189,7 @@ const announcementBannerProps = { { - !isArchive && ( + !isArchive && showAnnouncementBanner && ( tags in the page frontmatter so that +// only this page pays the cost of importing them. + +// ─── Brand tokens ──────────────────────────────────────────────────────────── +$btp-orange: #f43800; +$btp-orange-dark: #c02c00; +$btp-bg: #f2f2f2; +$btp-bg-alt: #e9e9e9; +// All copy uses brand orange. Hierarchy comes from size/weight, not colour. +$btp-ink: #f43800; +$btp-ink-muted: rgba(244, 56, 0, 0.75); +$btp-border: rgba(244, 56, 0, 0.2); +$btp-card: #ffffff; + +// ─── Page wrapper ──────────────────────────────────────────────────────────── +.page { + --btp-orange: #{$btp-orange}; + --btp-orange-dark: #{$btp-orange-dark}; + --btp-bg: #{$btp-bg}; + --btp-bg-alt: #{$btp-bg-alt}; + --btp-ink: #{$btp-ink}; + --btp-ink-muted: #{$btp-ink-muted}; + --btp-border: #{$btp-border}; + --btp-card: #{$btp-card}; + + background: var(--btp-bg); + color: var(--btp-ink); + font-family: + 'Geist', + system-ui, + -apple-system, + 'Segoe UI', + sans-serif; + font-feature-settings: 'cv11', 'ss01'; + line-height: 1.55; + min-height: 100vh; + width: 100%; + overflow: hidden; -.logoStrip { - display: flex; + // Reset link colour expectations from the global design system. + a { + color: inherit; + text-decoration: none; + } + + h1, + h2, + h3, + h4 { + font-family: + 'Geist', + system-ui, + -apple-system, + 'Segoe UI', + sans-serif; + font-weight: 600; + letter-spacing: -0.02em; + color: var(--btp-ink); + margin: 0; + } + + p { + margin: 0; + color: var(--btp-ink); + } + + ul, + ol { + list-style: none; + margin: 0; + padding: 0; + } +} + +// ─── Eyebrows (Geist Mono UPPERCASE) ───────────────────────────────────────── +.eyebrow { + display: inline-flex; align-items: center; - justify-content: center; - gap: $spacing-size-4; - margin-bottom: $spacing-size-8; + font-family: 'Geist Mono', ui-monospace, 'SFMono-Regular', monospace; + font-size: 12px; + font-weight: 500; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--btp-ink); +} + +.eyebrowPill { + composes: eyebrow; + padding: 6px 14px; + border: 1px solid var(--btp-ink); + border-radius: 999px; + background: transparent; +} - @media screen and (min-width: $breakpoint-hero-large) { - justify-content: flex-start; +.eyebrowAccent { + composes: eyebrow; + color: var(--btp-orange); +} + +// ─── Layout primitives ─────────────────────────────────────────────────────── +.container { + width: 100%; + max-width: 1320px; + margin: 0 auto; + padding-left: 24px; + padding-right: 24px; + + @media (min-width: 768px) { + padding-left: 40px; + padding-right: 40px; } } -.logoDivider { - font-size: var(--text-fs-xl); - opacity: 0.6; - color: var(--color-white); +// ─── Sticky page nav ───────────────────────────────────────────────────────── +// Hidden until the hero leaves the viewport, then slides down. The page-bg +// colour is reused so the bar reads as a continuation of the page rather +// than chrome — the only visual separator is the hairline brand-tinted +// bottom border. Visibility is controlled via `data-visible="true"` set by +// the IntersectionObserver script in the page (no CSS-Modules hash round-trip). +.stickyNav { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 50; + background: var(--btp-bg); + border-bottom: 1px solid var(--btp-border); + transform: translateY(-100%); + opacity: 0; + pointer-events: none; + transition: + transform 0.32s ease, + opacity 0.32s ease; + + &[data-visible='true'] { + transform: translateY(0); + opacity: 1; + pointer-events: auto; + } + + @media (prefers-reduced-motion: reduce) { + transition: opacity 0.2s ease; + transform: none; + } } -.logoAgGrid { - height: 38px; - width: auto; +.stickyNavInner { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding-top: 12px; + padding-bottom: 12px; } -.logoBryntum { - height: 24px; - width: auto; +.stickyNavBrand { + display: inline-flex; + align-items: center; + gap: 12px; + text-decoration: none; + color: var(--btp-ink); + min-width: 0; +} + +.stickyNavLogo { + display: block; + width: 36px; + height: auto; + + @media (min-width: 720px) { + width: 44px; + } +} + +// Size overrides only — the actual primary-button visuals are layered on +// at the markup level by combining `.btnPrimary` with this class. Avoids +// composing forward across the file (CSS Modules' `composes` requires +// the referenced class to be declared earlier in the module). +.stickyNavCta { + padding: 10px 18px; + font-size: 14px; + text-decoration: none; } +// ─── Hero ──────────────────────────────────────────────────────────────────── .hero { position: relative; - background-image: - linear-gradient( - 135deg, - color-mix(in srgb, var(--color-util-brand-500) 92%, transparent) 0%, - color-mix(in srgb, var(--color-util-brand-500) 55%, transparent) 100% - ), - var(--hero-bg-image); - background-size: cover; - background-position: center; - background-repeat: no-repeat; - - #{$selector-darkmode} & { - background-image: - linear-gradient( - 135deg, - color-mix(in srgb, var(--color-util-gray-100) 90%, transparent) 0%, - color-mix(in srgb, var(--color-util-gray-100) 55%, transparent) 100% - ), - var(--hero-bg-image); + background: var(--btp-bg); + padding: 48px 0 64px; + overflow: hidden; + + @media (min-width: 900px) { + padding: 72px 0 96px; + } + + // Page-scoped widening: only the hero's container gets the extra room so + // the logomark and the speaker portraits can spread out comfortably across + // wide screens. All other sections keep the standard 1320px page width. + // Both classes live in this CSS module so the selector is hashed locally. + .container { + max-width: 1480px; + } +} + +.heroInner { + display: flex; + flex-direction: column; + gap: 48px; + + // The first hero face (Maggie) is rendered at `scale(1.3)` with + // `transform-origin: top right`, so its rendered box overflows ~30% of + // its column-width to the LEFT, into the corridor between this flex + // column and the heroContent text. We need this gap to be wider than + // that overflow so the text never sits beneath the SVG. 64–96px clears + // it comfortably on every desktop width. + @media (min-width: 900px) { + flex-direction: row; + align-items: center; + gap: 64px; + } + + @media (min-width: 1200px) { + gap: 96px; } } .heroContent { - max-width: 720px; + flex: 1 1 540px; + min-width: 0; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 24px; - @media screen and (min-width: $breakpoint-hero-large) { - max-width: 640px; + @media (min-width: 900px) { + flex: 1 1 50%; } } -.sectionNav { +.heroLogos { display: flex; - flex-wrap: wrap; - justify-content: center; align-items: center; - width: 100%; + gap: 12px; + margin-bottom: 8px; } -.sectionNavLink { - &:not(:last-child)::after { - content: '•'; - display: inline-block; - margin: 0 $spacing-size-3; - color: var(--color-fg-secondary); - pointer-events: none; - } +// Recolour brand logos to match the page's brand orange (#f43800). +// Filter chain via https://codepen.io/sosuke/pen/Pjoqqp. +$btp-logo-orange-filter: brightness(0) saturate(100%) invert(31%) sepia(87%) saturate(3924%) hue-rotate(7deg) + brightness(99%) contrast(108%); + +.heroLogoAg { + height: 40px; + width: auto; + filter: $btp-logo-orange-filter; } -.eventMeta { - display: flex; - flex-wrap: wrap; - flex-direction: column; - justify-content: center; - gap: $spacing-size-4 $spacing-size-6; - margin: 0 0 $spacing-size-8; +.heroLogoX { + font-family: 'Geist Mono', ui-monospace, monospace; + font-size: 18px; + font-weight: 400; + color: var(--btp-ink-muted); +} + +.heroLogoBryntum { + height: 22px; + width: auto; + filter: $btp-logo-orange-filter; +} + +// The hero title is rendered as an SVG logomark wrapped in an

for SEO/a11y. +// We zero out the typographic chrome that would otherwise add space around the +// inline image, and let `.heroTitleLogo` control the visual size. +.page .heroTitle { + margin: 0; padding: 0; - list-style: none; + line-height: 0; + color: inherit; +} - @media screen and (min-width: $breakpoint-hero-large) { - justify-content: flex-start; +.heroTitleLogo { + display: block; + width: 100%; + max-width: 420px; + // Fixed mobile height so the logomark renders at a consistent size + // regardless of the SVG's intrinsic aspect ratio at narrow widths. + height: 172px; + + @media (min-width: 900px) { + max-width: 480px; + height: auto; } +} + +// Nested under `.page` so the weight wins over the generic `.page h2` reset. +.page .heroTagline { + font-family: + 'Geist', + system-ui, + -apple-system, + 'Segoe UI', + sans-serif; + font-size: clamp(18px, 1.6vw, 22px); + line-height: 1.4; + font-weight: 400; + letter-spacing: -0.005em; + color: var(--btp-ink-muted); + max-width: 42ch; +} + +.noWrap { + white-space: nowrap; +} + +.heroMeta { + display: flex; + flex-wrap: wrap; + gap: 8px 24px; + margin-top: 8px; + font-family: 'Geist Mono', ui-monospace, monospace; + font-size: 13px; + text-transform: uppercase; + letter-spacing: 0.08em; li { display: flex; align-items: center; - gap: $spacing-size-2; - color: var(--color-white); - font-size: var(--text-fs-base); + gap: 8px; + color: var(--btp-ink); :global(.icon) { - --icon-size: 20px; - --icon-color: var(--color-white); - flex-shrink: 0; + --icon-size: 16px; + --icon-color: var(--btp-orange); } } } -.intro { - text-align: center; - max-width: 70ch; +.heroCtas { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-top: 8px; +} - h2 { - font-size: var(--text-fs-2xl); - line-height: var(--text-lh-2xl); - margin-bottom: $spacing-size-6; - } +// ─── Hero faces (right side) ───────────────────────────────────────────────── +// Three same-sized portraits laid out with a clear gap. They share a single +// `max-height` so the heads read at a uniform scale; the only variation is +// vertical start position — the middle slot drops down a touch to create a +// gentle zigzag (up / down / up) rather than a flat baseline. +.heroFaces { + flex: 1 1 50%; + position: relative; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; + align-items: start; - p { - font-size: var(--text-fs-lg); - line-height: var(--text-lh-lg); - margin-bottom: $spacing-size-4; + @media (min-width: 900px) { + gap: 28px; } } -.atAGlance { +.heroFace { width: 100%; + height: auto; + display: block; + object-fit: contain; + object-position: top; + filter: drop-shadow(0 12px 24px rgba(244, 56, 0, 0.08)); + transition: transform 0.4s ease; - h2 { - text-align: center; - font-size: var(--text-fs-2xl); - line-height: var(--text-lh-2xl); - margin-bottom: $spacing-size-8; + &:hover { + transform: translateY(-4px); } } -.atAGlanceGrid { - display: grid; - gap: $spacing-size-4; - grid-template-columns: 1fr; +// Per-face calibration. The three SVG canvases were exported at very +// different head-to-frame ratios: +// • Maggie (322 × 361) — head + shoulders, head only ~40% of canvas +// • Mats (193 × 352) — head-only crop, head ~75% of canvas +// • John (232 × 388) — head-only crop, head ~75% of canvas +// A single `max-height` therefore renders the heads at very different +// visible scales. To equalise: +// 1. Give all three the same `max-height` budget for a consistent baseline. +// 2. Up-scale Maggie via `transform: scale()` to compensate for her +// surrounding whitespace (the parent `.heroFaces` has no overflow +// clipping so the visual overflow into adjacent columns is fine). +// 3. Drop the middle face down to create the alternating zigzag. + +.heroFace:nth-child(1) { + max-height: 220px; + // Origin `top right` means Maggie scales leftward into the gap between + // the hero copy and the faces grid, instead of rightward into Mats's + // column where she'd otherwise occlude him. + transform: scale(1.15); + transform-origin: top right; + + @media (min-width: 900px) { + max-height: 260px; + } - @media screen and (min-width: $breakpoint-landing-page-medium) { - grid-template-columns: repeat(3, 1fr); + &:hover { + transform: scale(1.15) translateY(-4px); } } -.atAGlanceCard { - display: flex; - flex-direction: column; - align-items: flex-start; - padding: $spacing-size-6; - border: 1px solid var(--color-util-gray-200); - border-radius: 8px; - background-color: var(--color-bg-primary); - box-shadow: 0 2px 4px #0000001a; +.heroFace:nth-child(2) { + max-height: 220px; + // Slot 2 is dropped well below the bookend portraits to make the zigzag + // read as a deliberate compositional move rather than a small offset. + // Mobile uses a much smaller drop (100px) than desktop (238px) — at + // narrow viewports the portrait was sliding past the hero's bottom + // edge into the section nav, getting clipped. + transform: translateY(100px); + + @media (min-width: 900px) { + max-height: 323px; + transform: translateY(238px); + } + + &:hover { + transform: translateY(96px); - #{$selector-darkmode} & { - border-color: var(--color-util-gray-300); - background-color: #192232; + @media (min-width: 900px) { + transform: translateY(234px); + } } +} + +.heroFace:nth-child(3) { + max-height: 220px; + + @media (min-width: 900px) { + max-height: 260px; + } + + &:hover { + transform: translateY(-4px); + } +} + +// ─── Hero entrance animation ───────────────────────────────────────────────── +// A blur-rise stagger plays once on page load: +// • Left group — `.heroContent > *` rise + un-blur sequentially. +// • Right group — the three `.heroFace` SVGs un-blur in place, slightly +// offset from the left so the eye finishes reading the copy as the +// portraits resolve. We only animate `opacity` and `filter` for the +// faces because each one already owns a bespoke `transform` (Maggie's +// `scale(1.15)`, Mats's `translateY(211px)` etc.) that we must not +// clobber. The existing `drop-shadow` is preserved in both keyframe +// stages so the filter function chain stays consistent and CSS can +// interpolate cleanly. +// +// `animation-fill-mode: both` is critical: it keeps each element in the +// `from` state during its individual `animation-delay`, otherwise the +// not-yet-started elements would flash visible before their turn. +@keyframes btp-hero-rise { + from { + opacity: 0; + filter: blur(14px); + transform: translateY(12px); + } + to { + opacity: 1; + filter: blur(0); + transform: translateY(0); + } +} + +@keyframes btp-hero-face-in { + from { + opacity: 0; + filter: drop-shadow(0 12px 24px rgba(244, 56, 0, 0.08)) blur(18px); + } + to { + opacity: 1; + filter: drop-shadow(0 12px 24px rgba(244, 56, 0, 0.08)) blur(0); + } +} + +.heroContent > * { + animation: btp-hero-rise 720ms cubic-bezier(0.2, 0.8, 0.2, 1) both; +} + +.heroContent > *:nth-child(1) { + animation-delay: 0ms; +} +.heroContent > *:nth-child(2) { + animation-delay: 90ms; +} +.heroContent > *:nth-child(3) { + animation-delay: 180ms; +} +.heroContent > *:nth-child(4) { + animation-delay: 270ms; +} +.heroContent > *:nth-child(5) { + animation-delay: 360ms; +} + +.heroFace { + animation: btp-hero-face-in 820ms cubic-bezier(0.2, 0.8, 0.2, 1) both; +} + +// Right group lags the left group by a beat so the faces feel like they +// resolve _into_ a finished hero, rather than racing the copy. +.heroFace:nth-child(1) { + animation-delay: 220ms; +} +.heroFace:nth-child(2) { + animation-delay: 320ms; +} +.heroFace:nth-child(3) { + animation-delay: 420ms; +} + +@media (prefers-reduced-motion: reduce) { + .heroContent > *, + .heroFace { + animation: none; + } +} + +// ─── Buttons (brand) ───────────────────────────────────────────────────────── +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 14px 22px; + border-radius: 999px; + font-family: 'Geist', system-ui, sans-serif; + font-size: 15px; + font-weight: 600; + letter-spacing: -0.005em; + line-height: 1; + border: 1.5px solid transparent; + cursor: pointer; + transition: + background 0.2s ease, + color 0.2s ease, + border-color 0.2s ease, + transform 0.2s ease; + white-space: nowrap; :global(.icon) { - --icon-size: 28px; - --icon-color: var(--color-link); - margin-bottom: $spacing-size-3; + --icon-size: 16px; + transition: transform 0.2s ease; } - h3 { - font-size: var(--text-fs-lg); - margin-bottom: $spacing-size-2; - color: var(--color-fg-primary); + &:hover :global(.icon) { + transform: translateX(2px); } +} - p { - margin-bottom: $spacing-size-3; - line-height: 1.5; +.btnPrimary { + composes: btn; + background: var(--btp-orange); + color: #fff !important; + border-color: var(--btp-orange); + + :global(.icon) { + --icon-color: #fff; } - a:global(.button-tertiary) { - margin-top: auto; + &:hover { + background: var(--btp-orange-dark); + border-color: var(--btp-orange-dark); } +} - a:not(:global(.button-tertiary)) { - color: var(--color-link); - display: inline-flex; - align-items: center; - gap: $spacing-size-1; +.btnSecondary { + composes: btn; + background: transparent; + color: var(--btp-ink) !important; + border-color: var(--btp-ink); + + :global(.icon) { + --icon-color: var(--btp-ink); + } + + &:hover { + background: var(--btp-ink); + color: #fff !important; :global(.icon) { - --icon-size: 16px; - --icon-color: currentColor; - margin-bottom: 0; + --icon-color: #fff; } } } -.agendaSection { - width: 100%; - scroll-margin-top: $spacing-size-16; +.btnGhost { + composes: btn; + background: transparent; + color: var(--btp-orange) !important; + border-color: transparent; + padding: 8px 0; - h2 { - text-align: center; - font-size: var(--text-fs-2xl); - line-height: var(--text-lh-2xl); - margin-bottom: $spacing-size-2; + :global(.icon) { + --icon-color: var(--btp-orange); } -} -.agendaIntro { - text-align: center; - color: var(--color-fg-secondary); - margin-bottom: $spacing-size-8; + &:hover { + color: var(--btp-orange-dark) !important; + + :global(.icon) { + --icon-color: var(--btp-orange-dark); + } + } } -.agenda { - list-style: none; - padding: 0; - margin: 0; - border: 1px solid var(--color-util-gray-200); - border-radius: 8px; +// ─── Roll-up text animation ────────────────────────────────────────────────── +// Wraps a button label in two stacked copies of the same text. On hover both +// layers translate up by exactly one row with a per-character stagger so the +// front text rolls out the top while an identical copy rolls in from below — +// the classic editorial-style "filmstrip" hover. +.btnRoll { + position: relative; + display: inline-flex; overflow: hidden; - background-color: var(--color-bg-primary); + line-height: 1; + vertical-align: middle; +} + +.btnRollLayer { + display: inline-flex; +} + +// Stack the second layer directly on top of the first so the two rows occupy +// the same horizontal slot; the per-char `translateY(100%)` below pushes its +// glyphs out of the visible row, ready to roll up on hover. +.btnRollLayer + .btnRollLayer { + position: absolute; + inset: 0; +} + +.btnRollChar { + display: inline-block; + transition: transform 0.45s cubic-bezier(0.7, 0, 0.2, 1); + transition-delay: calc(var(--btn-roll-i, 0) * 22ms); + will-change: transform; +} - #{$selector-darkmode} & { - border-color: var(--color-util-gray-300); - background-color: #192232; +// Back layer starts one row below the visible area. +.btnRollLayer + .btnRollLayer .btnRollChar { + transform: translateY(100%); +} + +// On hover the whole filmstrip advances by exactly one row, in both +// directions, so unhover plays the animation in reverse for free. +.btn:hover .btnRollLayer:first-child .btnRollChar, +.btn:focus-visible .btnRollLayer:first-child .btnRollChar { + transform: translateY(-100%); +} + +.btn:hover .btnRollLayer + .btnRollLayer .btnRollChar, +.btn:focus-visible .btnRollLayer + .btnRollLayer .btnRollChar { + transform: translateY(0); +} + +@media (prefers-reduced-motion: reduce) { + .btnRollChar { + transition: none; } } -.agendaRow { +// ─── Section nav ───────────────────────────────────────────────────────────── +// Full-width jump nav. Lives outside `.container` in the markup (matching the +// `.sectionRule` blocks) so the top/bottom rules span the viewport edge to +// edge. Padding/spacing is kept in sync with `.sectionRule` so the rhythm of +// horizontal lines down the page reads as one consistent system. +.sectionNav { display: flex; - flex-direction: column; - gap: $spacing-size-1; - margin-bottom: 0; - padding: $spacing-size-4 $spacing-size-6; - - @media screen and (min-width: $breakpoint-landing-page-medium) { - flex-direction: row; - gap: $spacing-size-6; - padding: $spacing-size-5 $spacing-size-8; + flex-wrap: wrap; + align-items: center; + justify-content: center; + gap: 24px; + padding: 18px 0; + border-top: 1px solid var(--btp-border); + border-bottom: 1px solid var(--btp-border); + margin-bottom: 80px; + + @media (min-width: 900px) { + padding: 22px 0; } - &:not(:last-child) { - border-bottom: 1px solid var(--color-util-gray-200); + a { + font-family: 'Geist Mono', ui-monospace, monospace; + font-size: 12px; + font-weight: 500; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--btp-ink); + transition: color 0.2s ease; - #{$selector-darkmode} & { - border-bottom-color: var(--color-util-gray-300); + &:hover { + color: var(--btp-orange); } } } -.agendaBreak { - background-color: color-mix(in srgb, var(--color-util-gray-100) 40%, transparent); - color: var(--color-fg-secondary); +// ─── Generic section ───────────────────────────────────────────────────────── +.section { + padding: 64px 0; + scroll-margin-top: 32px; - #{$selector-darkmode} & { - background-color: color-mix(in srgb, var(--color-util-gray-200) 20%, transparent); + @media (min-width: 900px) { + padding: 96px 0; } +} - .agendaBody h3 { - font-weight: var(--text-regular); - color: var(--color-fg-secondary); - } +.sectionHeader { + display: flex; + flex-direction: column; + gap: 16px; + margin-bottom: 48px; + max-width: 720px; } -.agendaTime { - flex-shrink: 0; - font-variant-numeric: tabular-nums; - font-weight: var(--text-semibold); - color: var(--color-fg-secondary); +// Nested under `.page` to win specificity over the generic `.page h2` reset. +.page .sectionTitle { + font-size: 56px; + line-height: 1.05; + letter-spacing: -0.025em; + font-weight: 500; +} + +.sectionLead { + font-size: 18px; + line-height: 1.55; + color: var(--btp-ink-muted); + max-width: 720px; +} - @media screen and (min-width: $breakpoint-landing-page-medium) { - width: 140px; - padding-top: 2px; +// ─── Full-width section title rule ─────────────────────────────────────────── +// Editorial banner that replaces the large `.sectionTitle` heading on the +// At a glance / Speakers / Full schedule / The venue sections. Top + bottom +// borders span the full viewport width; the label uses Geist Mono uppercase +// to echo the section nav at the top of the page. +.sectionRule { + border-top: 1px solid var(--btp-border); + border-bottom: 1px solid var(--btp-border); + padding: 18px 0; + margin-bottom: 48px; + + @media (min-width: 900px) { + padding: 22px 0; + margin-bottom: 64px; } } -.agendaBody { - flex: 1; - min-width: 0; +.page .sectionRuleTitle { + font-family: 'Geist Mono', ui-monospace, 'SFMono-Regular', monospace; + font-size: 13px; + font-weight: 500; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--btp-ink); + text-align: center; + margin: 0; +} - h3 { - font-size: var(--text-fs-lg); - line-height: 1.3; - margin: 0 0 $spacing-size-1; - color: var(--color-fg-primary); +// When a `.sectionLead` follows the full-width rule, it lives inside the +// container directly and needs its own bottom spacing before the section grid. +.sectionLead + * { + margin-top: 32px; + + @media (min-width: 900px) { + margin-top: 48px; } } -.agendaSpeakers { - margin: 0 0 $spacing-size-2; - font-size: var(--text-fs-sm); - color: var(--color-link); - font-weight: var(--text-semibold); +// On the Agenda section, `.sectionLead` lives in its own `.container` div +// (separate from the cards), so the adjacent-sibling `+` rule above can't +// reach across the wrapping containers. Mirror the same gap by pushing the +// `.container` that immediately follows the lead's container down instead. +// Speakers and Venue keep `.sectionLead` and their grids inside a single +// `.container`, so that pattern continues to use the rule above. +.container:has(> .sectionLead) + .container { + margin-top: 32px; + + @media (min-width: 900px) { + margin-top: 48px; + } } -.agendaDescription { - margin: 0; - line-height: 1.5; +// ─── Intro ─────────────────────────────────────────────────────────────────── +.intro { + composes: section; + background: var(--btp-bg); } -.speakersSection { - width: 100%; - scroll-margin-top: $spacing-size-16; +.introBody { + display: grid; + gap: 24px; + max-width: 70ch; - h2 { - text-align: center; - font-size: var(--text-fs-2xl); - line-height: var(--text-lh-2xl); - margin-bottom: $spacing-size-2; + p { + font-size: 18px; + line-height: 1.65; + color: var(--btp-ink-muted); } } -.speakersIntro { - text-align: center; - color: var(--color-fg-secondary); - margin-bottom: $spacing-size-8; +// ─── At a glance ───────────────────────────────────────────────────────────── +.atAGlance { + composes: section; } -.speakersMore { - display: block; - text-align: center; - margin: $spacing-size-8 auto 0; - padding: $spacing-size-5 $spacing-size-6; - max-width: 640px; - border: 2px dashed var(--color-util-gray-300); - border-radius: 8px; - font-size: var(--text-fs-lg); - font-weight: var(--text-semibold); - color: var(--color-fg-primary); - background-color: color-mix(in srgb, var(--color-util-gray-100) 30%, transparent); +.atAGlanceGrid { + display: grid; + gap: 16px; + grid-template-columns: 1fr; - #{$selector-darkmode} & { - border-color: var(--color-util-gray-300); - background-color: color-mix(in srgb, var(--color-util-gray-200) 20%, transparent); + @media (min-width: 720px) { + grid-template-columns: repeat(3, 1fr); } } +// Default card = white background, orange text. Used by the first two +// cards (When + Where), which are informational. The third card (Tickets) +// inherits this base then gets overridden below into an orange knockout +// to bias attention toward the booking CTA. +// +// Border is kept (1px transparent) only so the box dimensions match the +// orange Tickets card sitting next to it — but never renders any colour +// in either default or hover state on the informational cards. +.atAGlanceCard { + display: flex; + flex-direction: column; + gap: 12px; + padding: 32px; + background: var(--btp-card); + border: 1px solid transparent; + transition: + background-color 0.2s ease, + border-color 0.2s ease; + + :global(.icon) { + --icon-size: 24px; + --icon-color: var(--btp-orange); + } + + h3 { + font-size: 13px; + font-family: 'Geist Mono', ui-monospace, monospace; + font-weight: 500; + letter-spacing: 0.12em; + text-transform: uppercase; + color: var(--btp-ink-muted); + } + + .atAGlancePrimary { + font-size: 22px; + font-weight: 600; + letter-spacing: -0.02em; + color: var(--btp-ink); + } + + .atAGlanceDetail { + font-size: 15px; + line-height: 1.5; + color: var(--btp-ink-muted); + } + + a { + margin-top: auto; + align-self: flex-start; + } +} + +// Third card (Tickets) gets the orange knockout treatment so the booking +// action stands out against its two informational siblings. Hover deepens +// to `--btp-orange-dark` and the inner `.btnGhost` is re-skinned so its +// default orange text + icon stay legible on the new orange surface. +.atAGlanceCard:nth-child(3) { + background: var(--btp-orange); + border-color: var(--btp-orange); + + &:hover { + background: var(--btp-orange-dark); + border-color: var(--btp-orange-dark); + } + + :global(.icon) { + --icon-color: var(--btp-bg); + } + + h3 { + color: var(--btp-bg); + opacity: 0.8; + } + + .atAGlancePrimary { + color: var(--btp-bg); + } + + .atAGlanceDetail { + color: var(--btp-bg); + opacity: 0.85; + } + + .btnGhost { + color: var(--btp-bg) !important; + + :global(.icon) { + --icon-color: var(--btp-bg); + } + + &:hover { + color: var(--btp-bg) !important; + opacity: 0.85; + + :global(.icon) { + --icon-color: var(--btp-bg); + } + } + } +} + +// ─── Speakers ──────────────────────────────────────────────────────────────── +.speakersSection { + composes: section; +} + .speakerGrid { display: grid; - gap: $spacing-size-6; + gap: 32px 16px; grid-template-columns: 1fr; - @media screen and (min-width: $breakpoint-landing-page-medium) { + @media (min-width: 600px) { grid-template-columns: repeat(2, 1fr); } - @media screen and (min-width: 960px) { + @media (min-width: 960px) { grid-template-columns: repeat(3, 1fr); } } @@ -354,156 +942,581 @@ .speakerCard { display: flex; flex-direction: column; - padding: $spacing-size-4; - border: 1px solid var(--color-util-gray-200); - border-radius: 8px; - background-color: var(--color-bg-primary); + gap: 12px; +} - #{$selector-darkmode} & { - border-color: var(--color-util-gray-300); - background-color: #192232; - } +// Fixed-size portrait box — every speaker gets the same 250×312 frame +// (4:5 ratio) so the row reads at a consistent rhythm regardless of how +// the underlying SVG was cropped. The image fills the box top-to-bottom +// via `object-fit: cover`, anchored to the top so faces are never clipped. +// +// On hover the wrap paints orange and the orange-bg portrait crossfades +// in on top — see `.speakerImageOrange` and the hover rule below. +.speakerImageWrap { + position: relative; + width: 250px; + aspect-ratio: 4 / 5; + border-radius: 12px; + overflow: hidden; + transition: + background-color 0.32s ease, + border-radius 0.32s ease; } .speakerImage { width: 100%; - aspect-ratio: 1; + height: 100%; object-fit: cover; - border-radius: 6px; - margin-bottom: $spacing-size-4; - background-color: var(--color-util-gray-100); + object-position: center top; + display: block; +} + +// Re-shaded portrait used only on hover. Stacks directly on top of the +// default illustration, sharing all sizing rules so swapping is a pure +// opacity crossfade with no layout reflow. The dither pattern in this +// variant is tuned for the #F43800 hover background. +.speakerImageOrange { + position: absolute; + inset: 0; + opacity: 0; + transition: opacity 0.32s ease; +} + +// Mats and John have unusually narrow/tall SVG viewBoxes (~0.55 / 0.60 +// aspect ratio vs. the 0.8 portrait box). With the default `cover` rule +// above, the bottom ~140px of their figure clips off the frame. Switching +// to `contain` and anchoring to the bottom keeps the whole figure visible +// while maintaining a matching baseline with the other portraits. Applied +// to both the default and orange-bg images so the swap stays in register. +.speakerImageContain { + object-fit: contain; + object-position: center bottom; +} + +// Hover-driven crossfade. Gated on `(hover: hover)` so touch devices +// (where there's no pointer to leave the card) don't latch into the +// orange state with no obvious way to undo it. +@media (hover: hover) { + .speakerCard:hover .speakerImageWrap { + background-color: var(--btp-orange); + // Square off the corners on hover so the orange-bg illustration + // reads as a hard editorial block rather than a soft avatar tile + // — matches the agenda hover treatment, which has no rounding. + border-radius: 0; + } + + .speakerCard:hover .speakerImageOrange { + opacity: 1; + } +} + +@media (prefers-reduced-motion: reduce) { + .speakerImageWrap, + .speakerImageOrange { + transition: none; + } } .speakerName { - font-size: var(--text-fs-lg); - line-height: 1.3; - margin: 0 0 $spacing-size-1; - color: var(--color-fg-primary); + font-size: 20px; + font-weight: 600; + letter-spacing: -0.02em; + color: var(--btp-ink); + margin-top: 4px; } .speakerTitle { - margin: 0 0 $spacing-size-3; - font-size: var(--text-fs-sm); - color: var(--color-link); - font-weight: var(--text-semibold); + font-family: 'Geist Mono', ui-monospace, monospace; + font-size: 12px; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--btp-orange); } .speakerBio { - margin: 0; - line-height: 1.5; - color: var(--color-fg-secondary); + font-size: 14px; + line-height: 1.55; + color: var(--btp-ink-muted); } -.venueSection { - width: 100%; - scroll-margin-top: $spacing-size-16; +.speakersMore { + margin-top: 48px; + padding: 24px; + text-align: center; + border: 1.5px dashed var(--btp-border); + border-radius: 12px; + font-family: 'Geist Mono', ui-monospace, monospace; + font-size: 13px; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--btp-ink-muted); +} + +// ─── Agenda ────────────────────────────────────────────────────────────────── +.agendaSection { + composes: section; +} + +// Each Morning / Afternoon block is its own white card with hard corners. +// The section label sits inside the card as a banner, sharing the same hairline +// border that separates the rows below it, so the whole thing reads as one +// continuous slab rather than a card with a floating header above it. +.agenda { + border: 1px solid var(--btp-border); + overflow: hidden; + background: var(--btp-card); + + // When two agenda cards stack (Morning then Afternoon), give them a small + // breathing gap so the borders don't double-up into a heavy 2px line. + & + & { + margin-top: 24px; + } +} + +// "Morning" / "Afternoon" header strip inside each agenda card. We dress +// it up with a subtle orange wash plus a pixel-art dither: a sparse +// checker covers the whole strip, and a denser checker fades in from +// the right edge so the eye lands there as a graphic accent. The label +// sits above both layers via `isolation: isolate` + `z-index: -1` on the +// pseudo-elements (no positioning needed on the

itself). +.agendaSectionHeader { + position: relative; + isolation: isolate; + overflow: hidden; + border-bottom: 1px solid var(--btp-border); + padding: 18px 0; + background-color: rgba(244, 56, 0, 0.04); + + @media (min-width: 900px) { + padding: 22px 0; + } - h2 { - text-align: center; - font-size: var(--text-fs-2xl); - line-height: var(--text-lh-2xl); - margin-bottom: $spacing-size-2; + // Whisper-light checker across the whole strip. The two staggered + // 45deg gradients are the classic CSS checkerboard recipe — each + // gradient draws opposite triangles, and offsetting the second tile + // by half its size aligns them into squares. + &::before { + content: ''; + position: absolute; + inset: 0; + z-index: -1; + background-image: + linear-gradient( + 45deg, + rgba(244, 56, 0, 0.55) 25%, + transparent 25%, + transparent 75%, + rgba(244, 56, 0, 0.55) 75% + ), + linear-gradient( + 45deg, + rgba(244, 56, 0, 0.55) 25%, + transparent 25%, + transparent 75%, + rgba(244, 56, 0, 0.55) 75% + ); + background-size: 4px 4px; + background-position: + 0 0, + 2px 2px; + opacity: 0.16; + pointer-events: none; + } + + // Denser dither cluster anchored to the right edge. A horizontal + // mask-image fades the cluster out to the left so it reads as a + // pixel-art "fall-off" rather than a hard band. + &::after { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 240px; + z-index: -1; + background-image: + linear-gradient(45deg, var(--btp-orange) 25%, transparent 25%, transparent 75%, var(--btp-orange) 75%), + linear-gradient(45deg, var(--btp-orange) 25%, transparent 25%, transparent 75%, var(--btp-orange) 75%); + background-size: 5px 5px; + background-position: + 0 0, + 2.5px 2.5px; + opacity: 0.4; + mask-image: linear-gradient(to right, transparent, black 75%); + -webkit-mask-image: linear-gradient(to right, transparent, black 75%); + pointer-events: none; + + @media (min-width: 900px) { + width: 320px; + } } } -.venueIntro { +.page .agendaSectionLabel { + font-family: 'Geist Mono', ui-monospace, 'SFMono-Regular', monospace; + font-size: 13px; + font-weight: 500; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--btp-ink); text-align: center; - color: var(--color-fg-secondary); - margin-bottom: $spacing-size-8; + margin: 0; } -.venueCarousel { +.agendaList { + list-style: none; + margin: 0; + padding: 0; +} + +// Three-column flex layout per row: [time] [title + speakers] [description]. +// On mobile the columns stack in document order. On ≥720px the row becomes a +// flex row, with the time pinned at 160px and the body / description sharing +// the remaining width 50/50. When a row has no description (e.g. "Welcome", +// "Coffee break"), the body simply fills the post-time area. +.agendaRow { position: relative; - width: 100%; + display: flex; + flex-direction: column; + gap: 4px; + // Mobile keeps the classic outer padding — the row stacks vertically + // and there's no portrait overlay to fight with, so a unified inset + // reads as expected. On desktop the vertical padding moves onto the + // inner columns (see `.agendaTime` / `.agendaBody` / `.agendaDescription`) + // so the speaker portrait overlay can fill the row's full height. If + // we kept the padding on the row itself, the orange hover background + // would render correctly but the portrait inside `.agendaDescriptionWrap` + // would stop short of the row top/bottom, leaving a visible "padding + // gap" above and below the speaker on hover. + padding: 16px 24px; + // Belt-and-braces against any default `

  • ` margin (some user agents + // / global resets add it) — without this, the hovered row's orange + // background would float on a sliver of cream between rows. + margin-bottom: 0; + border-bottom: 1px solid var(--btp-border); + // `overflow: hidden` lets the speaker portrait scale up past the cell on + // hover and bleed into the row's padding without affecting siblings. + overflow: hidden; + transition: + background-color 0.32s ease, + border-bottom-color 0.32s ease; + + &:last-child { + border-bottom: 0; + } + + @media (min-width: 720px) { + flex-direction: row; + align-items: flex-start; + gap: 32px; + padding: 0 32px; + } } -.venueTrack { +.agendaBreak { + .agendaTitle { + // Break rows (Registration, Coffee break, Lunch, Networking) read + // as labels rather than session titles, so we drop them into an + // uppercase mono treatment. Kept at full ink colour (not muted) + // so the break still anchors the schedule visually. + font-family: 'Geist Mono', ui-monospace, monospace; + font-size: 14px; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; + } +} + +.agendaTime { + font-family: 'Geist Mono', ui-monospace, monospace; + font-size: 13px; + font-weight: 500; + letter-spacing: 0.05em; + color: var(--btp-orange); + font-variant-numeric: tabular-nums; + transition: color 0.32s ease; + + @media (min-width: 720px) { + flex: 0 0 160px; + // Vertical padding lives on the column (not the row) so the speaker + // overlay in `.agendaDescriptionWrap` can stretch the full row height. + padding: 18px 0; + } +} + +.agendaBody { display: flex; - gap: $spacing-size-4; - overflow-x: auto; - scroll-snap-type: x mandatory; - scroll-behavior: smooth; - scrollbar-width: none; - -webkit-overflow-scrolling: touch; - padding-bottom: $spacing-size-2; + flex-direction: column; + gap: 6px; - &::-webkit-scrollbar { - display: none; + @media (min-width: 720px) { + flex: 1 1 0; + min-width: 0; + padding: 18px 0; } } -.venueSlide { - flex: 0 0 100%; - scroll-snap-align: start; - margin: 0; +.agendaTitle { + font-size: 18px; + font-weight: 600; + letter-spacing: -0.01em; + color: var(--btp-ink); + line-height: 1.3; + transition: color 0.32s ease; +} + +.agendaSpeakers { + font-family: 'Geist Mono', ui-monospace, monospace; + font-size: 12px; + font-weight: 500; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--btp-ink-muted); + transition: color 0.32s ease; +} + +// `.agendaDescriptionWrap` is the flex item on desktop (the description +// itself used to play that role). It exists so we can layer a speaker +// portrait overlay (`.agendaSpeakerStack`) on top of the description and +// swap between the two on row hover. +// +// `align-self: stretch` is what lets the overlay use the row's full +// content height — important for short rows like the David Kourshid +// keynote where there's no description and the wrap would otherwise +// collapse to nothing. +.agendaDescriptionWrap { + position: relative; - @media screen and (min-width: $breakpoint-landing-page-medium) { - flex: 0 0 calc(50% - #{$spacing-size-2}); + @media (min-width: 720px) { + flex: 1 1 0; + min-width: 0; + align-self: stretch; } +} - @media screen and (min-width: 960px) { - flex: 0 0 calc(33.333% - #{$spacing-size-3}); +.agendaDescription { + font-size: 15px; + line-height: 1.55; + color: var(--btp-ink-muted); + transition: + opacity 0.32s ease, + color 0.32s ease; + + // Match the vertical inset that used to live on `.agendaRow`. Padding + // is on the text, not on `.agendaDescriptionWrap`, so the wrap itself + // can stretch the full row height and the speaker overlay (`inset: 0` + // of the wrap) covers the whole row top-to-bottom. + @media (min-width: 720px) { + padding: 18px 0; } } -.venueImage { - width: 100%; - aspect-ratio: 3 / 2; - object-fit: cover; - border-radius: 8px; - background-color: var(--color-util-gray-100); - display: block; +// Speaker portrait overlay. Anchored to the right of the wrap and sized +// taller than the row so the silhouette reads as a knockout that bleeds +// into the cell padding. The row's `overflow: hidden` clips the bottom +// edge — the user explicitly opted into this clipping over the previous +// `object-fit: contain` (which kept portraits prim but tiny). +// +// On hover the stack rises 16px and fades in, choreographed with the +// row's bg colour shift to feel like a single gesture. +.agendaSpeakerStack { + position: absolute; + inset: 0; + display: flex; + align-items: stretch; + justify-content: flex-end; + // 24px feels right at the row scale: enough breathing room between + // two heads (e.g. Opening Keynote: John + Mats) that they read as + // distinct portraits, but tight enough that they still feel like a + // pair sharing the right column. + gap: 24px; + opacity: 0; + transform: translateY(16px); + pointer-events: none; + transition: + opacity 0.32s ease, + transform 0.32s ease; } -.venueCaption { - margin-top: $spacing-size-2; - font-size: var(--text-fs-sm); - color: var(--color-fg-secondary); - text-align: center; +// Multi-speaker rows keep the flex layout — two portraits laid out +// side-by-side with the 24px gap from `.agendaSpeakerStack`. Scale stays +// modest here so John+Mats / Johan+Adam / Maggie+Matt P don't overlap +// or fight each other for space. +.agendaSpeakerImage { + height: 100%; + width: auto; + object-fit: contain; + // `transform-origin: top right` keeps the head pinned at the top of + // the cell while the body extends downwards (and gets clipped). If + // we anchored bottom-right the head would shift up and out of frame. + transform: scale(1.4); + transform-origin: top right; +} + +// Solo-speaker rows. Most of these have short or no descriptions, so the +// row's content height is dictated by the title + speakers column on the +// left and `height: 100%` ends up tiny. Pop out of the flex layout, scale +// hard, and lift up so the portrait dominates the right side of the row +// — the row's `overflow: hidden` then clips whatever overflows. +.agendaSpeakerImage:only-child { + position: absolute; + top: -20px; + right: 0; + transform: scale(2.4); + transform-origin: top; +} + +// Per-row opt-out for solo-speaker cells that are already tall (e.g. +// David Khourshid's row, which has a long description). Reverts the +// portrait to the default flex layout + 1.4x scale so the heavy 2.4x +// crop doesn't clip the head off the top and right edges. +.agendaSpeakerImage:only-child.agendaSpeakerImageDefaultScale { + position: static; + top: auto; + right: auto; + transform: scale(1.4); + transform-origin: top right; +} + +// Hover state. Gated on: +// 1. `(hover: hover)` — touch devices would otherwise latch into the +// hover state on tap with no obvious way to undo it. +// 2. `:has(.agendaSpeakerStack)` — rows without a matching speaker +// (`Welcome`, `Customer Showcase`) keep their default appearance, +// so we never fade copy out into nothing or flip a row to orange +// with no payoff. +@media (hover: hover) { + .agendaRow:has(.agendaSpeakerStack):hover { + background-color: var(--btp-orange); + // Hide the hairline at the bottom of the hovered row so the + // orange block sits flush against the next row with no white-ish + // sliver showing through. The pair rule below kills the hairline + // above by retroactively dropping the *previous* row's border. + border-bottom-color: transparent; + } + + // `:has(+ X)` is the closest CSS gets to a "previous sibling" selector. + // It matches a row whose immediate next sibling is the hovered orange + // row, letting us erase that neighbour's bottom border so the orange + // block extends right up to the row above it. + .agendaRow:has(+ .agendaRow:has(.agendaSpeakerStack):hover) { + border-bottom-color: transparent; + } + + .agendaRow:has(.agendaSpeakerStack):hover .agendaTime, + .agendaRow:has(.agendaSpeakerStack):hover .agendaTitle, + .agendaRow:has(.agendaSpeakerStack):hover .agendaSpeakers, + .agendaRow:has(.agendaSpeakerStack):hover .agendaDescription { + color: var(--btp-bg); + } + + .agendaRow:has(.agendaSpeakerStack):hover .agendaDescription { + opacity: 0; + } + + .agendaRow:has(.agendaSpeakerStack):hover .agendaSpeakerStack { + opacity: 1; + transform: translateY(0); + } +} + +@media (prefers-reduced-motion: reduce) { + .agendaRow, + .agendaTime, + .agendaTitle, + .agendaSpeakers, + .agendaDescription, + .agendaSpeakerStack { + transition: none; + } } -.venueNav { +// ─── Venue ─────────────────────────────────────────────────────────────────── +.venueSection { + composes: section; + + // Page-scoped container override (mirrors the same pattern used by `.hero`). + // The Savoy line drawing reads better at a generous size, so on wide + // screens we let the venue's `.container` stretch wider than the standard + // 1320px page container. Both class names live in this CSS module so the + // selector is hashed locally — no other section/page is affected. + .container { + max-width: 1480px; + } +} + +// Single hero image of the venue. No card chrome — we want the line drawing +// to read as a piece of editorial illustration sitting directly on the page. +.venueGrid { display: flex; justify-content: center; - gap: $spacing-size-2; - margin-top: $spacing-size-4; } -.venueNavButton { - --icon-size: 20px; - --icon-color: var(--color-fg-primary); +.venueSlide { + position: relative; + margin: 0; + width: 100%; + // Allow the figure to fill the (now wider) venue container all the way + // out to the section's max width. Previously capped at 960px, which + // looked dwarfed inside the page container. + max-width: 100%; +} + +.venueImage { + display: block; + width: 100%; + height: auto; +} - display: inline-flex; - align-items: center; +// The "IET London" CTA sits directly under the illustration and links out to +// Google Maps. Centred and given breathing room so it reads as a deliberate +// closing beat for the section rather than a footer afterthought. +.venueCta { + display: flex; justify-content: center; - width: 44px; - height: 44px; - padding: 0; - border: 1px solid var(--color-util-gray-200); - border-radius: 50%; - background-color: var(--color-bg-primary); - cursor: pointer; - transition: - background-color 0.2s, - border-color 0.2s; + margin-top: 32px; - &:hover { - background-color: var(--color-util-gray-100); - border-color: var(--color-util-gray-300); + @media (min-width: 900px) { + margin-top: 40px; } +} - &:focus-visible { - outline: 2px solid var(--color-link); - outline-offset: 2px; - } +// ─── Final CTA ─────────────────────────────────────────────────────────────── +.finalCta { + padding: 96px 0 128px; + text-align: center; +} + +.finalCtaInner { + max-width: 640px; + margin: 0 auto; + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; +} + +.finalCtaTitle { + font-size: clamp(32px, 4vw, 48px); + line-height: 1.05; + letter-spacing: -0.025em; + font-weight: 600; +} + +.finalCtaBody { + font-size: 18px; + line-height: 1.55; + color: var(--btp-ink-muted); - #{$selector-darkmode} & { - --icon-color: var(--color-white); - border-color: var(--color-util-gray-300); - background-color: #192232; + a { + color: var(--btp-orange); + text-decoration: underline; + text-underline-offset: 2px; &:hover { - background-color: var(--color-util-gray-200); + color: var(--btp-orange-dark); } } } diff --git a/documentation/ag-grid-docs/src/pages/campaigns/beyond-the-prompt.astro b/documentation/ag-grid-docs/src/pages/campaigns/beyond-the-prompt.astro index 65493770b7c..f18aa090e07 100644 --- a/documentation/ag-grid-docs/src/pages/campaigns/beyond-the-prompt.astro +++ b/documentation/ag-grid-docs/src/pages/campaigns/beyond-the-prompt.astro @@ -1,18 +1,14 @@ --- import Layout from '../../layouts/Layout.astro'; -import styles from '../../pages-styles/campaigns.module.scss'; -import pageStyles from '../../pages-styles/beyond-the-prompt.module.scss'; +import styles from '../../pages-styles/beyond-the-prompt.module.scss'; import { Icon } from '@ag-website-shared/components/icon/Icon'; import { urlWithBaseUrl } from '@utils/urlWithBaseUrl'; -// Links const MAILTO_HREF = 'mailto:info@ag-grid.com?subject=Beyond the Prompt enquiry'; const BOOK_TICKETS_HREF = 'https://maglo.co.uk/event/ag-grid/ag-grid-bryntum'; const VENUE_MAP_HREF = 'https://maps.app.goo.gl/GRcWV6LPBoXJwDLu6'; - -// Hero background (full-bleed venue photo with brand-colour overlay) -const HERO_BG_URL = urlWithBaseUrl('images/campaigns/beyond-the-prompt/iet-savoy.webp'); +const SOCIAL_IMAGE_URL = 'images/campaigns/beyond-the-prompt/social-card.png'; type AgendaItem = { time: string; @@ -20,6 +16,17 @@ type AgendaItem = { speakers?: string; description?: string; isBreak?: boolean; + // Solo-speaker rows normally get a heavy 2.4x portrait on hover to fill + // the otherwise short cell. Set this on rows that are already tall (long + // description) where the heavy scale clips the head awkwardly. + keepDefaultPortraitScale?: boolean; +}; + +// The schedule is grouped into named blocks (Morning / Afternoon) so each +// chunk can sit between full-width section rules in the rendered page. +type AgendaSection = { + label: string; + items: AgendaItem[]; }; type Speaker = { @@ -27,381 +34,717 @@ type Speaker = { title: string; bio: string; image: string; + // Re-shaded variant designed for orange backgrounds. The ditherpattern + // and knockout values are tuned for #F43800; we crossfade to it on + // card hover (Speakers grid) and use it directly in the agenda hover + // overlay, where the row turns orange behind the portrait. + imageOrange?: string; + // Some speaker SVGs are exported as full-figure portraits with very tall, + // narrow aspect ratios (e.g. Mats 193×352, John 232×388). Using the + // default `object-fit: cover` on a 4:5 box clips ~140px off the bottom. + // Setting `imageFit: 'contain'` switches just those cards to fit-the-whole + // SVG while staying anchored to the bottom of the frame. + imageFit?: 'contain'; }; type VenueImage = { src: string; + // Optional narrow-viewport variant. When present we render a `` + // with a mobile `` so portrait phones get a re-cropped/re-stacked + // version of the same illustration. Falls through to `src` on desktop. + srcMobile?: string; alt: string; caption?: string; }; -const AGENDA: AgendaItem[] = [ - { - time: '08:30 – 09:30', - title: 'Registration and coffee', - isBreak: true, - }, - { - time: '09:30 – 09:45', - title: 'Welcome', - description: 'Opening remarks to set the theme for the day: building with tools you can trust.', - }, - { - time: '09:45 – 10:15', - title: 'Opening Keynote', - speakers: 'John Masterson (CEO, AG Grid) & Mats Bryntse (Founder & CEO, Bryntum)', - }, - { - time: '10:15 – 10:45', - title: 'Coffee break', - isBreak: true, - }, - { - time: '10:45 – 11:15', - title: 'Codebase design for the agent era', - speakers: 'Stephen Cooper (Team Lead, AG Grid)', - description: - "As AI agents become part of the development workflow, codebase structure and well-designed system prompts matter more than ever. This session will show you how we're approaching this in the AG Grid and AG Charts codebases..", - }, - { - time: '11:15 – 11:45', - title: 'One-click agentic SDLC', - speakers: 'Mats Bryntse (Founder & CEO, Bryntum)', - description: - 'A demo of a headless Claude workflow, built by Bryntum CEO Mats, that turns GitHub issues into mergeable PRs, with agents doing the work, and a custom Kanban UI keeping things in check.', - }, - { - time: '11:45 – 13:00', - title: 'Lunch and product demos', - isBreak: true, - }, - { - time: '13:00 – 13:30', - title: 'Debugging CSS performance with AI', - speakers: 'Bernie Sumption (Engineer, AG Grid)', - description: - 'CSS performance issues can be subtle and time-consuming. This talk will show you how you can guide AI to uncover bugs without needing to learn the intricacies of CSS rendering internals.', - }, - { - time: '13:30 – 14:00', - title: 'AI in AG Studio', - speakers: 'Josh Hobson (Developer, AG Grid)', - description: - "How do you build a dashboard you can't see? A behind-the-scenes look at AG Studio's multi-agent architecture and the client-side tools that let any LLM build reports it otherwise couldn't.", - }, - { - time: '14:00 – 14:30', - title: 'Customer Showcase', - description: 'To be announced', - }, - { - time: '14:30 – 15:00', - title: 'Coffee break', - isBreak: true, - }, - { - time: '15:00 – 15:30', - title: 'Product Roadmap', - speakers: 'Johan Isaksson (Head of Engineering, Bryntum) & Adam Wang (AG Studio Product Lead, AG Grid)', - description: "A detailed look at our upcoming roadmap, covering AG Grid and Bryntum's suite of tools.", - }, +// Lunch sits at the boundary between the morning and afternoon programmes; +// we keep it at the end of the morning block so the afternoon section opens +// with a return-to-sessions cue (the 13:15 talk) rather than a long break. +const AGENDA_SECTIONS: AgendaSection[] = [ { - time: '15:30 – 16:15', - title: 'Panel Discussion', - description: 'To be announced', + label: 'Morning', + items: [ + { time: '08:30 – 09:30', title: 'Registration and coffee', isBreak: true }, + { + time: '09:30 – 09:40', + title: 'Welcome', + description: 'Opening remarks to set the theme for the day: building with tools you can trust.', + }, + { + time: '09:40 – 10:10', + title: 'Opening Keynote', + speakers: 'John Masterson (CEO, AG Grid) & Mats Bryntse (Founder & CEO, Bryntum)', + }, + { + time: '10:10 – 10:40', + title: 'Goodbye slop; welcome determinism', + speakers: 'David Khourshid', + description: + 'Vibe coding feels productive until you have to maintain it. Behind the agent "thinking..." you ignore and the code you never opened lies a growing pile of wasted tokens, nondeterministic behavior, and compounding errors hiding in plain sight. This talk pushes back on the status quo: elaborate agent architectures, "prompting astrology", overnight automation loops burning through context windows and credit cards. Come for the critique, leave with a framework for using AI to build software you actually understand.', + keepDefaultPortraitScale: true, + }, + { time: '10:40 – 11:10', title: 'Coffee break', isBreak: true }, + { + time: '11:10 – 11:35', + title: 'Codebase design for the agent era', + speakers: 'Stephen Cooper (Team Lead, AG Grid)', + description: + "As AI agents become part of the development workflow, codebase structure and well-designed system prompts matter more than ever. This session will show you how we're approaching this in the AG Grid and AG Charts codebases..", + keepDefaultPortraitScale: true, + }, + { + time: '11:35 – 12:00', + title: 'One-click agentic SDLC', + speakers: 'Mats Bryntse (Founder & CEO, Bryntum)', + description: + 'A demo of a headless Claude workflow, built by Bryntum CEO Mats, that turns GitHub issues into mergeable PRs, with agents doing the work, and a custom Kanban UI keeping things in check.', + }, + { time: '12:00 – 13:10', title: 'Lunch and product demos', isBreak: true }, + ], }, { - time: '16:15 – 16:45', - title: 'Vibe Coding as a Maker', - speakers: 'Matt Webb', - description: - 'Matt will show his vibe coding experiments, from his AI clock to an app that points to the centre of the galaxy, and share some learnings from building hardware at his startup, Inanimate. Then we ask: what are the limits of vibing and agentic coding? And how might we create libraries that agents love?', - }, - { - time: '17:00 – 20:00', - title: 'Networking reception', - isBreak: true, + label: 'Afternoon', + items: [ + { + time: '13:10 – 13:40', + title: 'Debugging CSS performance with AI', + speakers: 'Bernie Sumption (Engineer, AG Grid)', + description: + 'CSS performance issues can be subtle and time-consuming. This talk will show you how you can guide AI to uncover bugs without needing to learn the intricacies of CSS rendering internals.', + }, + { + time: '13:40 – 14:05', + title: 'AI in AG Studio', + speakers: 'Josh Hobson (Developer, AG Grid)', + description: + "How do you build a dashboard you can't see? A behind-the-scenes look at AG Studio's multi-agent architecture and the client-side tools that let any LLM build reports it otherwise couldn't.", + }, + { time: '14:05 – 14:30', title: 'Customer Showcase', description: 'TBA' }, + { time: '14:30 – 15:00', title: 'Coffee break', isBreak: true }, + { + time: '15:00 – 15:30', + title: 'Product Roadmap', + speakers: 'Johan Isaksson (Head of Engineering, Bryntum) & Adam Wang (AG Studio Product Lead, AG Grid)', + description: "A detailed look at our upcoming roadmap, covering AG Grid and Bryntum's suite of tools.", + }, + { + time: '15:30 – 16:15', + title: 'Panel Discussion', + speakers: + 'Maggie Appleton (Staff Research Engineer, GitHub), Matt Pocock (Senior Developer Educator, AI Hero), & Sophie Koonin (Web Discipline Lead, Monzo)', + description: 'TBA', + }, + { + time: '16:15 – 16:45', + title: 'Vibe Coding as a Maker', + speakers: 'Matt Webb', + description: + 'Matt will show his vibe coding experiments, from his AI clock to an app that points to the centre of the galaxy, and share some learnings from building hardware at his startup, Inanimate. Then we ask: what are the limits of vibing and agentic coding? And how might we create libraries that agents love?', + keepDefaultPortraitScale: true, + }, + { time: '17:00 – 20:00', title: 'Networking reception', isBreak: true }, + ], }, ]; -// Drop speaker headshots at /public/images/campaigns/beyond-the-prompt/speakers/ -// (recommend 400x400 square JPG/PNG). const SPEAKERS: Speaker[] = [ { name: 'Matt Webb', title: 'Co-founder, Inanimate', bio: "Matt is co-founder of Inanimate, consumer hardware bringing agents into the real world. Previously he has consulted with Google's AI research group, run startup accelerators with R/GA Ventures, and was CEO and co-founder of the design studio BERG which invented some of the world’s first internet-connected consumer products like Little Printer (and has work in the New York MoMA). He is co-author of Mind Hacks (O’Reilly, 2004). Since 2000 Matt has blogged at interconnected.org. He writes weekly+ on computing, design, and speculative futures. He lives in London.", - image: 'images/campaigns/beyond-the-prompt/speakers/matt-webb.webp', + image: 'images/campaigns/beyond-the-prompt/svg/mat-web.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/mat-web-orange-bg.svg', }, { name: 'Stephen Cooper', title: 'Team Lead, AG Grid', bio: `Stephen is the Team Lead for AG Grid and loves sharing practical, experience-based tips, tricks, and case studies from years in the codebase. He's gone deep into grid performance and framework integrations, and has spent more time than he'd like profiling render cycles. Outside of work, life revolves around family, four kids and two dogs, and he's happiest when the whole crew is out together exploring in the park.`, - image: 'images/campaigns/beyond-the-prompt/speakers/stephen-cooper.webp', + image: 'images/campaigns/beyond-the-prompt/svg/stephen.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/stephen-orange-bg.svg', }, { name: 'Maggie Appleton', title: 'Staff Research Engineer, GitHub', bio: `Maggie is a Staff Research Engineer at GitHub, where she works on tools for thinking, writing, and building with code. With a background in anthropology, she’s known for her visual essays that explore how developers understand systems, languages, and ideas. She’s a strong advocate for “digital gardens” over traditional publishing, and spends her time mapping out how knowledge grows on the web. Outside of work, she’s usually sketching concepts, writing, or connecting dots between code and culture.`, - image: 'images/campaigns/beyond-the-prompt/speakers/maggie-appleton.webp', + image: 'images/campaigns/beyond-the-prompt/svg/maggie.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/maggie-orange-bg.svg', + }, + { + name: 'Sophie Koonin', + title: 'Web Discipline Lead, Monzo', + bio: `Sophie leads a team within the Operations collective at Monzo, building the software that powers the bank's award-winning customer experience. She's also Monzo's Web Discipline Lead, advocating for web and empowering others to lead web platform improvements throughout the company. Outside of work, Sophie loves arranging pop songs for her choir Mixtape, playing video games, cooking, and gardening.`, + image: 'images/campaigns/beyond-the-prompt/svg/sophie.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/sophie-orange-bg.svg', + }, + { + name: 'David Khourshid', + title: 'Founder, Stately.ai', + bio: `David is the founder of Stately.ai and creator of XState, the most popular open-source state machine & statecharts library. He's a longtime advocate for event-driven modeling and visual diagramming as the foundation for reliable UIs and, increasingly, AI agents. When he's not at a computer keyboard, he's at a piano keyboard.`, + image: 'images/campaigns/beyond-the-prompt/svg/david-kourshid.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/david-kourshid-orange-bg.svg', }, { name: 'Mats Bryntse', title: 'Founder & CEO, Bryntum', bio: `Mats is the founder and CEO of Bryntum, where he and his team build advanced scheduling and project planning tools for modern web apps. For the past 15 years, he has obsessed over JavaScript performance, developer experience, and making complex UIs feel simple. He used to enjoy chess, badminton, and independent thought, until Claude entered his life and optimized those away.`, - image: 'images/campaigns/beyond-the-prompt/speakers/mats-bryntse.webp', + image: 'images/campaigns/beyond-the-prompt/svg/mats.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/mats-orange-bg.svg', + imageFit: 'contain', + }, + { + name: 'Matt Pocock', + title: 'Senior Developer Educator, AI Hero', + bio: `Matt is a senior developer educator at AI Hero, a TypeScript author, and an educator passionate about bringing real software engineering rigour to the age of AI. He co-organizes the AI Coding for Real Engineers cohort, a community for experienced developers who want to build with AI tools without throwing away everything they already know. Outside of the keyboard, Matt enjoys long runs through the Oxfordshire countryside, loudly supporting Arsenal, and experimenting with new ways to make complex ideas click for developers everywhere.`, + image: 'images/campaigns/beyond-the-prompt/svg/matt-pocock.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/matt-pocock-orange-bg.svg', }, { name: 'Bernie Sumption', title: 'Engineer, AG Grid', bio: `Bernie is an engineer at AG Grid specialising in theming. "The other engineers make it work fast and well, I make it look pretty" he likes to say. Outside work he goes hiking, plays with his kids, and once made a tweeting cat flap that has 10x more social media followers than he does.`, - image: 'images/campaigns/beyond-the-prompt/speakers/bernie-sumption.webp', + image: 'images/campaigns/beyond-the-prompt/svg/bernie.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/bernie-orange-bg.svg', }, { name: 'Josh Hobson', title: 'Developer, AG Grid', bio: `Josh is a developer at AG Grid, where he's been building AG Studio — a new dashboard library with multi-agent AI baked in. He's a mathematician by training and a maker by instinct, with a particular love for developer tooling, type systems, and intelligent interfaces. Outside of work, Josh can be found tinkering with 3D printers, ski touring in the Alps, or out on long walks with his dog.`, - image: 'images/campaigns/beyond-the-prompt/speakers/josh-hobson.webp', + image: 'images/campaigns/beyond-the-prompt/svg/josh.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/josh-orange-bg.svg', }, { name: 'Adam Wang', title: 'AG Studio Product Lead, AG Grid', bio: `Adam is the AG Studio Product Lead at AG Grid, with around 10 years of experience in product management across various disciplines. He previously worked on AG Grid Integrated Charts before focusing on AG Studio. He enjoys the creative process of product management and is keen to solve problems by truly understanding user needs. Outside of work, he's a spin instructor who loves to put together a fire playlist. He also collects coloured vinyl.`, - image: 'images/campaigns/beyond-the-prompt/speakers/adam-wang.webp', + image: 'images/campaigns/beyond-the-prompt/svg/adam.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/adam-orange-bg.svg', }, { name: 'Johan Isaksson', title: 'Head of Engineering, Bryntum', bio: `Johan is responsible for architecture, gate keeping, performance and styling across all Bryntum products. When not checking pull requests, recording performance profiles or tweaking CSS he enjoys watching hockey and playing floorball.`, - image: 'images/campaigns/beyond-the-prompt/speakers/johan-isaksson.webp', + image: 'images/campaigns/beyond-the-prompt/svg/johan.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/johan-orange-bg.svg', }, { name: 'John Masterson', title: 'CEO, AG Grid', bio: `John is the CEO of AG Grid, which he first joined in 2016 as employee number two. After a detour as CTO of a London health-tech startup, he returned in 2020 and stepped into the CEO role in 2024. He's spent fifteen years building software and leading engineering teams, and is determined to keep AG Grid the first choice for JavaScript developers. Outside of work, John can be found on his bike, in his headphones listening to a podcast, or picking up a guitar.`, - image: 'images/campaigns/beyond-the-prompt/speakers/john-masterson.webp', + image: 'images/campaigns/beyond-the-prompt/svg/john.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/john-orange-bg.svg', + imageFit: 'contain', }, { name: 'Phil Hawksworth', title: 'Event MC', bio: `With a passion for browser technologies, and the empowering properties of the web, Phil loves seeking out ingenuity and simplicity, especially in places where over-engineering is common. After 25 years of building web applications for companies such as Google, Apple, Nike, R/GA, and The London Stock Exchange, he has worked to challenge traditional technical architectures in favour of simplicity and effectiveness, working in Developer Experience at Netlify and Deno.`, - image: 'images/campaigns/beyond-the-prompt/speakers/phil-hawksworth.webp', + image: 'images/campaigns/beyond-the-prompt/svg/phil.svg', + imageOrange: 'images/campaigns/beyond-the-prompt/svg/phil-orange-bg.svg', }, ]; -// TODO: drop venue photos into /public/images/campaigns/beyond-the-prompt/venue/ -// (recommend landscape 3:2, min 1600x1067). +// Map an agenda item's free-text `speakers` string to the matching SVG +// portraits. We do a substring `includes` check against each canonical +// `SPEAKERS[].name` so strings like +// "Johan Isaksson (Head of Engineering, Bryntum) & Adam Wang (...)" +// resolve to multiple portraits. Iterating `SPEAKERS` (rather than +// splitting the input string) keeps the render order stable across rows +// even when the agenda lists speakers in a different sequence. +// +// We return the *orange-bg* variant here because the agenda overlay only +// renders behind the row's hover state (which paints the row orange); +// the orange-tuned dither pattern reads correctly there. Falls back to +// the default illustration if a speaker hasn't been given an orange +// variant yet. +const getSpeakerImagesForItem = (speakers?: string): string[] => { + if (!speakers) return []; + return SPEAKERS.filter((s) => speakers.includes(s.name)).map((s) => s.imageOrange ?? s.image); +}; + +// Featured faces for the hero (use the SVG illustrations). +// Order is intentional: the middle slot drops down in the layout to create a +// small zigzag, so the bookend slots (1 and 3) sit at the natural top while +// slot 2 takes the dropped position. +const HERO_FACES = [ + { name: 'Maggie', src: 'images/campaigns/beyond-the-prompt/svg/maggie.svg' }, + { name: 'Stephen', src: 'images/campaigns/beyond-the-prompt/svg/stephen.svg' }, + { name: 'Matt Pocock', src: 'images/campaigns/beyond-the-prompt/svg/matt-pocock.svg' }, +]; + const VENUE_IMAGES: VenueImage[] = [ { - src: 'images/campaigns/beyond-the-prompt/venue/venue-1.webp', - alt: 'IET London exterior', - caption: 'IET London', - }, - { - src: 'images/campaigns/beyond-the-prompt/venue/venue-2.webp', - alt: 'Networking reception space', - caption: 'Entrance and Foyer', - }, - { - src: 'images/campaigns/beyond-the-prompt/venue/venue-3.webp', - alt: 'Kelvin Lecture Theatre', - caption: 'Kelvin Lecture Theatre', + src: 'images/campaigns/beyond-the-prompt/venue/savoy.webp', + srcMobile: 'images/campaigns/beyond-the-prompt/venue/savoy-mobile.webp', + alt: 'Line drawing of IET London at 2 Savoy Place', }, ]; --- +{/* Astro hoists these tags into at build time, so the Geist fonts only load on this page. */} + + + + +{ + /* + Page-only global override: the campaign uses a #F2F2F2 page background, but the + html/body still default to white from the global design system so over-scroll + (macOS bounce, mobile rubber-band) flashes white. Scope this to the page by + only emitting it from this .astro file. +*/ +} + + -
    -
    -
    -
    - AG Grid - +
    + { + /* + Sticky page nav. Hidden by default; revealed via `data-visible="true"` + once the hero scrolls fully out of view. The IntersectionObserver + script lives at the end of this file. Background matches the page + (var(--btp-bg) === #f2f2f2) so it reads as a continuation rather + than a chrome bar. + */ + } +
    + -

    Beyond the Prompt

    +
    +
    +
    +
    +
    + AG Grid + + Bryntum +
    -

    - A one-day conference on building applications that hold up in production — hosted by - AG Grid and Bryntum. -

    +

    + Beyond the Prompt +

    -
      -
    • - - Tuesday 19 May 2026 -
    • -
    • - - IET London, 2 Savoy Place -
    • -
    • - - Early bird £149 -
    • -
    +

    + A one-day conference on building applications that hold up in production — hosted by + AG Grid and Bryntum. +

    - + +
    -
    -
    + -
    -
    + +
    + + diff --git a/documentation/update-algolia-indices/package.json b/documentation/update-algolia-indices/package.json index 5018d8df8a2..c751dbd677e 100644 --- a/documentation/update-algolia-indices/package.json +++ b/documentation/update-algolia-indices/package.json @@ -1,6 +1,6 @@ { "name": "update-algolia-indices", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "Update algolia indices", "main": "src/index.ts", "type": "module", diff --git a/external/ag-website-shared/.gitrepo b/external/ag-website-shared/.gitrepo index d0d709179a1..4fb0d8f8e56 100644 --- a/external/ag-website-shared/.gitrepo +++ b/external/ag-website-shared/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = git@github.com:ag-grid/ag-website-shared.git branch = latest - commit = 01e1bd873328886ae6aa639e0c069ada9ca068c2 - parent = 46ce864be91ce5a79f57ddd6ffeb22c3bb2af1ed + commit = a75e88d91497abb4590d1833cfd2f869fde1a1d8 + parent = bbde58add0cd9395945c0a5daadaa8468b52a6da method = rebase cmdver = 0.4.9 diff --git a/external/ag-website-shared/src/components/codeSandbox/components/OpenInCodeSandbox.tsx b/external/ag-website-shared/src/components/codeSandbox/components/OpenInCodeSandbox.tsx index 7fa2b1c9689..28d781edee8 100644 --- a/external/ag-website-shared/src/components/codeSandbox/components/OpenInCodeSandbox.tsx +++ b/external/ag-website-shared/src/components/codeSandbox/components/OpenInCodeSandbox.tsx @@ -13,6 +13,7 @@ interface Props { internalFramework: InternalFramework; files: FileContents; htmlUrl: string; + boilerPlateFiles?: FileContents; packageJson: Record; isDev: boolean; } @@ -22,6 +23,7 @@ export const OpenInCodeSandbox: FunctionComponent = ({ internalFramework, files, htmlUrl, + boilerPlateFiles, packageJson, isDev, }) => { @@ -42,6 +44,7 @@ export const OpenInCodeSandbox: FunctionComponent = ({ openCodeSandbox({ title, files: sandboxFiles, + boilerPlateFiles, internalFramework, }); }} diff --git a/external/ag-website-shared/src/components/codeSandbox/utils/codeSandbox.ts b/external/ag-website-shared/src/components/codeSandbox/utils/codeSandbox.ts index 0c33a92ac2a..4f48b252ddf 100644 --- a/external/ag-website-shared/src/components/codeSandbox/utils/codeSandbox.ts +++ b/external/ag-website-shared/src/components/codeSandbox/utils/codeSandbox.ts @@ -61,9 +61,11 @@ const getCodeSandboxRuntime = (internalFramework: InternalFramework) => { const getCodeSandboxFiles = ({ files, + boilerPlateFiles, internalFramework, }: { files: FileContents; + boilerPlateFiles?: FileContents; internalFramework: InternalFramework; }) => { const sandboxFiles: SandboxFiles = {}; @@ -107,10 +109,12 @@ const createHiddenInputFactory = const getCodeSandboxFilesToSubmit = ({ title, files, + boilerPlateFiles, internalFramework, }: { title: string; files: FileContents; + boilerPlateFiles?: FileContents; internalFramework: InternalFramework; }) => { const runtime = getCodeSandboxRuntime(internalFramework); @@ -124,6 +128,7 @@ const getCodeSandboxFilesToSubmit = ({ ...configFiles, ...getCodeSandboxFiles({ files, + boilerPlateFiles, internalFramework, }), }; @@ -140,10 +145,12 @@ const getCodeSandboxFilesToSubmit = ({ export const openCodeSandbox = ({ title, files, + boilerPlateFiles, internalFramework, }: { title: string; files: FileContents; + boilerPlateFiles?: FileContents; internalFramework: InternalFramework; }) => { const form = document.createElement('form'); @@ -157,6 +164,7 @@ export const openCodeSandbox = ({ files: getCodeSandboxFilesToSubmit({ title, files, + boilerPlateFiles, internalFramework, }), template: getCodeSandboxRuntime(internalFramework), diff --git a/external/ag-website-shared/src/components/plunkr/components/OpenInPlunkr.tsx b/external/ag-website-shared/src/components/plunkr/components/OpenInPlunkr.tsx index 1e27c6670c7..5e6229acf1c 100644 --- a/external/ag-website-shared/src/components/plunkr/components/OpenInPlunkr.tsx +++ b/external/ag-website-shared/src/components/plunkr/components/OpenInPlunkr.tsx @@ -11,12 +11,21 @@ interface Props { title: string; files: FileContents; htmlUrl: string; + boilerPlateFiles?: FileContents; packageJson: Record; fileToOpen: string; isDev: boolean; } -export const OpenInPlunkr: FunctionComponent = ({ title, files, htmlUrl, packageJson, fileToOpen, isDev }) => { +export const OpenInPlunkr: FunctionComponent = ({ + title, + files, + htmlUrl, + boilerPlateFiles, + packageJson, + fileToOpen, + isDev, +}) => { return ( = ({ title, files, htmlUrl, stripOutExampleGeneratorCode(localFiles); const plunkrExampleFiles = { ...localFiles, + ...boilerPlateFiles, 'package.json': JSON.stringify(packageJson, null, 2), 'index.html': indexHtml, }; diff --git a/package.json b/package.json index 84640cc9ca7..79faaa187c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "license": "MIT", "scripts": { "compressVideo": "tsx external/ag-website-shared/scripts/compress-video", @@ -14,7 +14,8 @@ "bootstrap": "SHARP_IGNORE_GLOBAL_LIBVIPS=true YARN_REGISTRY=\"https://registry.ag-grid.com\" yarn", "git-clean": "git clean -fdx && git reset --hard HEAD", "git-purge-local-only": "git fetch -p && for branch in $(git for-each-ref --format '%(refname) %(upstream:track)' refs/heads | awk '$2 == \"[gone]\" {sub(\"refs/heads/\", \"\", $1); print $1}'); do git branch -D $branch; done", - "behave": "./behave.sh" + "behave": "./behave.sh", + "docs-e2e": "./docs-e2e.sh" }, "private": true, "engines": { diff --git a/packages/ag-grid-angular/package.json b/packages/ag-grid-angular/package.json index 2dc4b8f9317..b9275be3353 100644 --- a/packages/ag-grid-angular/package.json +++ b/packages/ag-grid-angular/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-angular", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "AG Grid Angular Component", "scripts": { "clean": "rimraf dist", @@ -15,7 +15,7 @@ "module": "./dist/ag-grid-angular/fesm2022/ag-grid-angular.mjs", "typings": "./dist/ag-grid-angular/index.d.ts", "dependencies": { - "ag-grid-community": "35.2.1-beta.20260419.2046", + "ag-grid-community": "35.2.1-beta.20260503.2052", "@angular/animations": "^18.0.7", "@angular/common": "^18.0.7", "@angular/compiler": "^18.0.7", @@ -27,7 +27,7 @@ "zone.js": "~0.15.1" }, "devDependencies": { - "ag-grid-community": "35.2.1-beta.20260419.2046", + "ag-grid-community": "35.2.1-beta.20260503.2052", "@angular-devkit/build-angular": "^18.0.7", "@angular/cli": "^18.0.7", "@angular/forms": "^18.0.7", diff --git a/packages/ag-grid-angular/projects/ag-grid-angular/package.json b/packages/ag-grid-angular/projects/ag-grid-angular/package.json index 09c2ad00815..e1e5ec227a3 100644 --- a/packages/ag-grid-angular/projects/ag-grid-angular/package.json +++ b/packages/ag-grid-angular/projects/ag-grid-angular/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-angular", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "AG Grid Angular Component", "license": "MIT", "peerDependencies": { @@ -8,7 +8,7 @@ "@angular/core": ">= 18.0.0" }, "dependencies": { - "ag-grid-community": "35.2.1-beta.20260419.2046", + "ag-grid-community": "35.2.1-beta.20260503.2052", "tslib": "^2.8.1" }, "repository": { diff --git a/packages/ag-grid-community/package.json b/packages/ag-grid-community/package.json index 62086f6edaf..acdf43b26e9 100644 --- a/packages/ag-grid-community/package.json +++ b/packages/ag-grid-community/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-community", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue", "main": "./dist/package/main.cjs.js", "types": "./dist/types/src/main.d.ts", diff --git a/packages/ag-grid-community/src/columns/columnModel.ts b/packages/ag-grid-community/src/columns/columnModel.ts index 721e69c86ff..da3becb4a15 100644 --- a/packages/ag-grid-community/src/columns/columnModel.ts +++ b/packages/ag-grid-community/src/columns/columnModel.ts @@ -174,7 +174,7 @@ export class ColumnModel extends BeanStub implements NamedBean { // setPivotMode, applyColumnState, // functionColsService.setPrimaryColList, functionColsService.updatePrimaryColList, // pivotResultCols.setPivotResultCols - public refreshCols(newColDefs: boolean, source: ColumnEventType, useGeneratedOrder: boolean = false): void { + public refreshCols(newColDefs: boolean, source: ColumnEventType): void { if (!this.colDefCols) { return; } @@ -206,7 +206,7 @@ export class ColumnModel extends BeanStub implements NamedBean { this.createColumnsForService([autoColSvc, selectionColSvc, rowNumbersSvc], cols, source); const shouldSortNewColDefs = _shouldMaintainColumnOrder(this.gos, this.showingPivotResult); - if (!useGeneratedOrder && (!newColDefs || shouldSortNewColDefs)) { + if (!newColDefs || shouldSortNewColDefs) { this.restoreColOrder(cols); } @@ -460,54 +460,23 @@ export class ColumnModel extends BeanStub implements NamedBean { // in results array const previousSiblingPosMap: Map = new Map(); - // Single forward pass over cols.list pre-computes each pivot row-total's - // anchor (the most-recent preserved col seen). null value = row total with - // no preceding preserved col — falls through to noSiblingsAvailable below. - const { pivotColDefSvc } = this.beans; - let rowTotalAnchors: Map | null = null; - if (pivotColDefSvc != null) { - let lastPositioned: AgColumn | null = null; - for (const col of cols.list) { - if (colPositionMap.has(col)) { - lastPositioned = col; - } else if (pivotColDefSvc.isPivotRowTotalColumn(col.colDef)) { - rowTotalAnchors ??= new Map(); - rowTotalAnchors.set(col, lastPositioned); - } - } - } - - const addColAfter = (anchor: AgColumn, col: AgColumn): void => { - const prev = previousSiblingPosMap.get(anchor); - if (prev === undefined) { - previousSiblingPosMap.set(anchor, col); - } else if (Array.isArray(prev)) { - prev.push(col); - } else { - // if we have a single col, then we need to add the new col to the array - previousSiblingPosMap.set(anchor, [prev, col]); - } - }; - // for each new col, find the col it needs inserted after and store for when array is constructed for (const col of additionalCols) { - const rowTotalAnchor = rowTotalAnchors?.get(col); - if (rowTotalAnchor !== undefined) { - if (rowTotalAnchor === null) { - noSiblingsAvailable.push(col); - } else { - addColAfter(rowTotalAnchor, col); - } - continue; - } - const prevSiblingIdx = getPreviousSibling(col, null); if (prevSiblingIdx == null) { noSiblingsAvailable.push(col); continue; } - addColAfter(prevSiblingIdx, col); + const prev = previousSiblingPosMap.get(prevSiblingIdx); + if (prev === undefined) { + previousSiblingPosMap.set(prevSiblingIdx, col); + } else if (Array.isArray(prev)) { + prev.push(col); + } else { + // if we have a single col, then we need to add the new col to the array + previousSiblingPosMap.set(prevSiblingIdx, [prev, col]); + } } // the following code starts at the tail of the array and works backwards. @@ -517,7 +486,6 @@ export class ColumnModel extends BeanStub implements NamedBean { const result = new Array(cols.list.length); let resultPointer = result.length - 1; - // work backwards, first adding no siblings to end for (let i = noSiblingsAvailable.length - 1; i >= 0; i--) { result[resultPointer--] = noSiblingsAvailable[i]; @@ -539,7 +507,6 @@ export class ColumnModel extends BeanStub implements NamedBean { } result[resultPointer--] = nextCol; } - cols.list = result; } diff --git a/packages/ag-grid-community/src/interfaces/iPivotColDefService.ts b/packages/ag-grid-community/src/interfaces/iPivotColDefService.ts index 230483cba52..76c93c1637a 100644 --- a/packages/ag-grid-community/src/interfaces/iPivotColDefService.ts +++ b/packages/ag-grid-community/src/interfaces/iPivotColDefService.ts @@ -4,5 +4,4 @@ import type { ColDef, ColGroupDef } from '../entities/colDef'; export interface IPivotColDefService { createColDefsFromFields: (fields: string[]) => (ColDef | ColGroupDef)[]; recreateColDef(colDef: ColDef): ColDef; - isPivotRowTotalColumn(colDef: ColDef): boolean; } diff --git a/packages/ag-grid-community/src/interfaces/iPivotResultColsService.ts b/packages/ag-grid-community/src/interfaces/iPivotResultColsService.ts index 2a06bcfcb38..86c208f6d3e 100644 --- a/packages/ag-grid-community/src/interfaces/iPivotResultColsService.ts +++ b/packages/ag-grid-community/src/interfaces/iPivotResultColsService.ts @@ -13,11 +13,7 @@ export interface IPivotResultColsService { getPivotResultCol(key: ColKey): AgColumn | null; - setPivotResultCols( - colDefs: (ColDef | ColGroupDef)[] | null, - source: ColumnEventType, - useGeneratedOrder?: boolean - ): void; + setPivotResultCols(colDefs: (ColDef | ColGroupDef)[] | null, source: ColumnEventType): void; /** Returns pivot result columns ordered for aggregation: regular columns first, total columns after. * Cached — only recomputed when pivot result columns change. */ diff --git a/packages/ag-grid-community/src/version.ts b/packages/ag-grid-community/src/version.ts index 2b7104ca9c3..3bf0b58ee2a 100644 --- a/packages/ag-grid-community/src/version.ts +++ b/packages/ag-grid-community/src/version.ts @@ -1,2 +1,2 @@ // DO NOT UPDATE MANUALLY: Generated from script during build time -export const VERSION = '35.2.1-beta.20260419.2046'; +export const VERSION = '35.2.1-beta.20260503.2052'; diff --git a/packages/ag-grid-enterprise/package.json b/packages/ag-grid-enterprise/package.json index c587a89bd05..5ba96d4ddaf 100644 --- a/packages/ag-grid-enterprise/package.json +++ b/packages/ag-grid-enterprise/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-enterprise", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue", "main": "./dist/package/main.cjs.js", "types": "./dist/types/src/main.d.ts", @@ -113,7 +113,7 @@ ], "homepage": "https://www.ag-grid.com/", "dependencies": { - "ag-grid-community": "35.2.1-beta.20260419.2046" + "ag-grid-community": "35.2.1-beta.20260503.2052" }, "optionalDependencies": { "ag-charts-community": "13.2.1-beta.20260503", diff --git a/packages/ag-grid-enterprise/src/pivot/pivotColDefService.ts b/packages/ag-grid-enterprise/src/pivot/pivotColDefService.ts index e1241d3c232..47a30c6c06c 100644 --- a/packages/ag-grid-enterprise/src/pivot/pivotColDefService.ts +++ b/packages/ag-grid-enterprise/src/pivot/pivotColDefService.ts @@ -482,10 +482,6 @@ export class PivotColDefService extends BeanStub implements NamedBean, IPivotCol return `pivot_${pivotCols.join('-')}_${pivotKeys.join('-')}_${measureColumnId}`; } - public isPivotRowTotalColumn(colDef: ColDef): boolean { - return colDef.colId?.startsWith(PIVOT_ROW_TOTAL_PREFIX) ?? false; - } - /** * Used by the SSRM to create secondary columns from provided fields * @param fields diff --git a/packages/ag-grid-enterprise/src/pivot/pivotResultColsService.ts b/packages/ag-grid-enterprise/src/pivot/pivotResultColsService.ts index 9af6b089468..2f3fdc02033 100644 --- a/packages/ag-grid-enterprise/src/pivot/pivotResultColsService.ts +++ b/packages/ag-grid-enterprise/src/pivot/pivotResultColsService.ts @@ -129,11 +129,7 @@ export class PivotResultColsService extends BeanStub implements NamedBean, IPivo return result; } - public setPivotResultCols( - colDefs: (ColDef | ColGroupDef)[] | null, - source: ColumnEventType, - useGeneratedOrder: boolean = false - ): void { + public setPivotResultCols(colDefs: (ColDef | ColGroupDef)[] | null, source: ColumnEventType): void { this.aggOrderedList = undefined; // Invalidate cached aggregation order if (!this.colModel.ready) { return; @@ -168,7 +164,7 @@ export class PivotResultColsService extends BeanStub implements NamedBean, IPivo } const hasPreviousCols = !!this.previousPivotResultCols; this.previousPivotResultCols = null; - this.colModel.refreshCols(!hasPreviousCols, source, useGeneratedOrder); + this.colModel.refreshCols(!hasPreviousCols, source); } else { this.previousPivotResultCols = this.pivotResultCols ? this.pivotResultCols.tree : null; this.pivotResultCols = null; diff --git a/packages/ag-grid-enterprise/src/pivot/pivotStage.ts b/packages/ag-grid-enterprise/src/pivot/pivotStage.ts index 9898f6a1827..9149805be8f 100644 --- a/packages/ag-grid-enterprise/src/pivot/pivotStage.ts +++ b/packages/ag-grid-enterprise/src/pivot/pivotStage.ts @@ -44,7 +44,6 @@ export class PivotStage extends BeanStub implements NamedBean, _IRowNodePivotSta private uniqueValues: Map = new Map(); private aggregationColumnsHashLastTime: string | null; - private aggregationColumnIdsLastTime: string[] | null; private aggregationFuncsHashLastTime: string; private pivotOrderLastTime: string[] = []; @@ -65,7 +64,6 @@ export class PivotStage extends BeanStub implements NamedBean, _IRowNodePivotSta private executePivotOff(): boolean { this.aggregationColumnsHashLastTime = null; - this.aggregationColumnIdsLastTime = null; this.pivotOrderLastTime = []; this.uniqueValues = new Map(); if (this.pivotResultCols.isPivotResultColsPresent()) { @@ -139,23 +137,8 @@ export class PivotStage extends BeanStub implements NamedBean, _IRowNodePivotSta pivotOrderChanged || anyGridOptionsChanged ) { - // Reorder detection only matters on the rebuild path. Computing the id - // list (and the includes-scan against last time) on every transaction - // would burn allocations on the no-op hot path. - const aggregationColumnIds = aggregationColumns.map((column) => column.getId()); - const lastIds = this.aggregationColumnIdsLastTime; - const aggregationColumnsReordered = - lastIds?.length === aggregationColumnIds.length && - !_areEqual(lastIds, aggregationColumnIds) && - lastIds.every((id) => aggregationColumnIds.includes(id)); - this.aggregationColumnIdsLastTime = aggregationColumnIds; - const pivotColumnGroupDefs = this.pivotColDefSvc.createPivotColumnDefs(this.uniqueValues); - this.pivotResultCols.setPivotResultCols( - pivotColumnGroupDefs, - 'rowModelUpdated', - aggregationColumnsReordered - ); + this.pivotResultCols.setPivotResultCols(pivotColumnGroupDefs, 'rowModelUpdated'); // Because the secondary columns have changed, the aggregation needs to visit the whole // tree again, so signal the caller to deactivate the changedPath. this.lastTimeFailed = false; diff --git a/packages/ag-grid-enterprise/src/version.ts b/packages/ag-grid-enterprise/src/version.ts index 2b7104ca9c3..3bf0b58ee2a 100644 --- a/packages/ag-grid-enterprise/src/version.ts +++ b/packages/ag-grid-enterprise/src/version.ts @@ -1,2 +1,2 @@ // DO NOT UPDATE MANUALLY: Generated from script during build time -export const VERSION = '35.2.1-beta.20260419.2046'; +export const VERSION = '35.2.1-beta.20260503.2052'; diff --git a/packages/ag-grid-react/package.json b/packages/ag-grid-react/package.json index 5123550806b..98d6679d356 100644 --- a/packages/ag-grid-react/package.json +++ b/packages/ag-grid-react/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-react", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "AG Grid React Component", "main": "./dist/package/index.cjs.js", "types": "./dist/types/src/index.d.ts", @@ -31,7 +31,7 @@ "devDependencies": { "@babel/runtime": "^7.29.2", "prop-types": "^15.6.2", - "ag-grid-community": "35.2.1-beta.20260419.2046", + "ag-grid-community": "35.2.1-beta.20260503.2052", "@babel/plugin-proposal-throw-expressions": "^7.27.1", "@babel/preset-typescript": "^7.28.5", "@types/react": "~18.3.26", @@ -44,7 +44,7 @@ }, "dependencies": { "prop-types": "^15.8.1", - "ag-grid-community": "35.2.1-beta.20260419.2046" + "ag-grid-community": "35.2.1-beta.20260503.2052" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", diff --git a/packages/ag-grid-react/src/reactUi/cells/cellComp.tsx b/packages/ag-grid-react/src/reactUi/cells/cellComp.tsx index 1a25dbe13a3..e26eae7d2f3 100644 --- a/packages/ag-grid-react/src/reactUi/cells/cellComp.tsx +++ b/packages/ag-grid-react/src/reactUi/cells/cellComp.tsx @@ -133,21 +133,19 @@ const CellComp = ({ const newDetails = renderDetails; lastRenderDetails.current = renderDetails; - // if not updating renderDetails, do nothing - if ( - oldDetails == null || - oldDetails.compDetails == null || - newDetails == null || - newDetails.compDetails == null - ) { + // Skip the effect unless we have a real renderDetails change. A wrapper-only change (same inner + // compDetails ref, new wrapper object) would otherwise drive an infinite update loop: + // refresh() → setRenderKey → renderer remount → cellCtrl re-emits compDetails → repeat + // (e.g. during column drag-and-drop with agGroupCellRenderer, whose refresh() deliberately + // returns false). + const oldCompDetails = oldDetails?.compDetails; + const newCompDetails = newDetails?.compDetails; + if (oldCompDetails == null || newCompDetails == null || oldCompDetails === newCompDetails) { return; } rowDragCompRef.current?.refreshVisibility(); - const oldCompDetails = oldDetails.compDetails; - const newCompDetails = newDetails.compDetails; - // if different Cell Renderer, then do nothing, as renderer will be recreated if (oldCompDetails.componentClass != newCompDetails.componentClass) { return; diff --git a/packages/ag-grid-vue3/package.json b/packages/ag-grid-vue3/package.json index d40cf160f08..686e3fd1e85 100644 --- a/packages/ag-grid-vue3/package.json +++ b/packages/ag-grid-vue3/package.json @@ -1,7 +1,7 @@ { "name": "ag-grid-vue3", "description": "AG Grid Vue 3 Component", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "author": "Sean Landsman ", "license": "MIT", "files": [ @@ -44,7 +44,7 @@ "build-only:watch": "vite build --watch" }, "dependencies": { - "ag-grid-community": "35.2.1-beta.20260419.2046" + "ag-grid-community": "35.2.1-beta.20260503.2052" }, "devDependencies": { "vue": "^3.5.32", diff --git a/plugins/ag-grid-generate-code-reference-files/package.json b/plugins/ag-grid-generate-code-reference-files/package.json index 940c1857a88..d8e24518ac6 100644 --- a/plugins/ag-grid-generate-code-reference-files/package.json +++ b/plugins/ag-grid-generate-code-reference-files/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-generate-code-reference-files", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "private": true, "dependencies": { "ag-shared": "0.0.1", diff --git a/plugins/ag-grid-generate-example-files/package.json b/plugins/ag-grid-generate-example-files/package.json index c5d5d46907c..e861518d433 100644 --- a/plugins/ag-grid-generate-example-files/package.json +++ b/plugins/ag-grid-generate-example-files/package.json @@ -1,10 +1,10 @@ { "name": "ag-grid-generate-example-files", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "private": true, "dependencies": { "ag-shared": "0.0.1", - "ag-grid-community": "35.2.1-beta.20260419.2046", + "ag-grid-community": "35.2.1-beta.20260503.2052", "glob": "^11.1.0", "typescript": "~5.4.5", "cheerio": "^1.2.0", diff --git a/plugins/ag-grid-task-autogen/package.json b/plugins/ag-grid-task-autogen/package.json index 89942bf7ca2..dc90996ed8f 100644 --- a/plugins/ag-grid-task-autogen/package.json +++ b/plugins/ag-grid-task-autogen/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-task-autogen", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "private": true, "dependencies": { "@nx/devkit": "20.8.4", diff --git a/testing/accessibility/package.json b/testing/accessibility/package.json index a5e4936cf95..24e604f49b5 100644 --- a/testing/accessibility/package.json +++ b/testing/accessibility/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-accessibility", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "scripts": { "download-examples": "curl --retry 5 -retry-all-errors https://grid-staging.ag-grid.com/debug/all-examples.json > ./all-examples.json", "download-examples-local": "curl https://localhost:4610/debug/all-examples.json > ./all-examples.json", @@ -18,9 +18,9 @@ "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", - "ag-grid-angular": "35.2.1-beta.20260419.2046", - "ag-grid-community": "35.2.1-beta.20260419.2046", - "ag-grid-enterprise": "35.2.1-beta.20260419.2046", + "ag-grid-angular": "35.2.1-beta.20260503.2052", + "ag-grid-community": "35.2.1-beta.20260503.2052", + "ag-grid-enterprise": "35.2.1-beta.20260503.2052", "ag-charts-community": "13.2.1-beta.20260503", "ag-charts-enterprise": "13.2.1-beta.20260503", "rxjs": "~7.8.2", diff --git a/testing/angular-tests/package.json b/testing/angular-tests/package.json index 4f8a33476d3..0977925c8e4 100644 --- a/testing/angular-tests/package.json +++ b/testing/angular-tests/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-angular-tests", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "private": true, "scripts": { "test:e2e": "jest --no-cache" @@ -11,8 +11,8 @@ "@angular/core": "^21.0.0", "@angular/platform-browser": "^21.0.0", "@angular/platform-browser-dynamic": "^21.0.0", - "ag-grid-angular": "35.2.1-beta.20260419.2046", - "ag-grid-community": "35.2.1-beta.20260419.2046", + "ag-grid-angular": "35.2.1-beta.20260503.2052", + "ag-grid-community": "35.2.1-beta.20260503.2052", "rxjs": "~7.8.2", "tslib": "^2.8.1", "zone.js": "~0.15.0" diff --git a/testing/behavioural/package.json b/testing/behavioural/package.json index 30c453b85a9..89f598418d1 100644 --- a/testing/behavioural/package.json +++ b/testing/behavioural/package.json @@ -1,6 +1,6 @@ { "name": "ag-behavioural-testing", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "private": true, "description": "Behavioural unit testing for ag-Grid", "dependencies": { @@ -8,9 +8,9 @@ }, "type": "module", "devDependencies": { - "ag-grid-community": "35.2.1-beta.20260419.2046", - "ag-grid-enterprise": "35.2.1-beta.20260419.2046", - "ag-grid-react": "35.2.1-beta.20260419.2046", + "ag-grid-community": "35.2.1-beta.20260503.2052", + "ag-grid-enterprise": "35.2.1-beta.20260503.2052", + "ag-grid-react": "35.2.1-beta.20260503.2052", "@types/react": "^18.3.23", "@types/react-dom": "^18.3.7", "@testing-library/dom": "^10.4.1", diff --git a/testing/behavioural/src/columns/order/pivot-row-totals-value-toggle.test.ts b/testing/behavioural/src/columns/order/pivot-row-totals-value-toggle.test.ts deleted file mode 100644 index 9d27a5a7186..00000000000 --- a/testing/behavioural/src/columns/order/pivot-row-totals-value-toggle.test.ts +++ /dev/null @@ -1,175 +0,0 @@ -import type { ColDef, ColGroupDef } from 'ag-grid-community'; -import { ClientSideRowModelModule } from 'ag-grid-community'; -import { PivotModule, RowGroupingModule } from 'ag-grid-enterprise'; - -import { TestGridsManager } from '../../test-utils'; -import { getColumnOrder } from '../column-test-utils'; - -// Regression coverage for AG-16677: -// When value columns in pivot mode are removed and then re-added, every -// re-added value column should produce a pivotRowTotals column group that -// sits next to the existing row total groups — not pushed to the end of -// the grid. -describe('pivotRowTotals + value column toggling', () => { - const gridsManager = new TestGridsManager({ - modules: [ClientSideRowModelModule, RowGroupingModule, PivotModule], - }); - - afterEach(() => { - gridsManager.reset(); - }); - - const rowData = [ - { country: 'Ireland', year: 2000, gold: 1, silver: 2, bronze: 3 }, - { country: 'Ireland', year: 2004, gold: 4, silver: 5, bronze: 6 }, - { country: 'Italy', year: 2000, gold: 7, silver: 8, bronze: 9 }, - ]; - - const columnDefs: (ColDef | ColGroupDef)[] = [ - { field: 'country', rowGroup: true }, - { field: 'year', pivot: true }, - { field: 'gold', aggFunc: 'sum' }, - { field: 'silver', aggFunc: 'sum' }, - { field: 'bronze', aggFunc: 'sum' }, - ]; - - const rowTotalIds = (gridApi: ReturnType) => - getColumnOrder(gridApi, 'center').filter((id) => id.startsWith('PivotRowTotal_')); - - // Checks the order of the row-total columns relative to the rest of the - // pivot columns. The row-total groups must all sit together at the start - // of the grid (for pivotRowTotals: 'before'). - const rowTotalsArePositionedBeforePivotCols = (gridApi: ReturnType) => { - const order = getColumnOrder(gridApi, 'center'); - // Find last row-total and first non-row-total pivot column. - const lastRowTotalIdx = order.reduce((acc, id, idx) => (id.startsWith('PivotRowTotal_') ? idx : acc), -1); - const firstPivotIdx = order.findIndex((id) => id.startsWith('pivot_')); - return lastRowTotalIdx < firstPivotIdx; - }; - - test('remove then re-add value columns => all row totals stay grouped at the start', () => { - const gridApi = gridsManager.createGrid('myGrid', { - columnDefs, - rowData, - pivotMode: true, - pivotRowTotals: 'before', - }); - - expect(rowTotalIds(gridApi)).toEqual([ - 'PivotRowTotal_pivot_year__gold', - 'PivotRowTotal_pivot_year__silver', - 'PivotRowTotal_pivot_year__bronze', - ]); - expect(rowTotalsArePositionedBeforePivotCols(gridApi)).toBe(true); - - gridApi.removeValueColumns(['silver', 'bronze']); - expect(rowTotalIds(gridApi)).toEqual(['PivotRowTotal_pivot_year__gold']); - expect(rowTotalsArePositionedBeforePivotCols(gridApi)).toBe(true); - - gridApi.addValueColumns(['silver']); - const rowTotalIdsAfterReAddingSilver = rowTotalIds(gridApi); - expect(rowTotalIdsAfterReAddingSilver).toEqual([ - 'PivotRowTotal_pivot_year__gold', - 'PivotRowTotal_pivot_year__silver', - ]); - expect(rowTotalsArePositionedBeforePivotCols(gridApi)).toBe(true); - - gridApi.addValueColumns(['bronze']); - const rowTotalIdsAfterReAddingBronze = rowTotalIds(gridApi); - expect(rowTotalIdsAfterReAddingBronze).toEqual([ - 'PivotRowTotal_pivot_year__gold', - 'PivotRowTotal_pivot_year__silver', - 'PivotRowTotal_pivot_year__bronze', - ]); - expect(rowTotalsArePositionedBeforePivotCols(gridApi)).toBe(true); - }); - - test('pivotRowTotals=after: re-added row totals stay grouped at the end', () => { - const gridApi = gridsManager.createGrid('myGrid', { - columnDefs, - rowData, - pivotMode: true, - pivotRowTotals: 'after', - }); - - const rowTotalsArePositionedAfterPivotCols = () => { - const order = getColumnOrder(gridApi, 'center'); - const firstRowTotalIdx = order.findIndex((id) => id.startsWith('PivotRowTotal_')); - const lastPivotIdx = order.reduce((acc, id, idx) => (id.startsWith('pivot_') ? idx : acc), -1); - return lastPivotIdx < firstRowTotalIdx; - }; - - expect(rowTotalsArePositionedAfterPivotCols()).toBe(true); - - gridApi.removeValueColumns(['silver', 'bronze']); - expect(rowTotalIds(gridApi)).toEqual(['PivotRowTotal_pivot_year__gold']); - expect(rowTotalsArePositionedAfterPivotCols()).toBe(true); - - gridApi.addValueColumns(['silver']); - const rowTotalIdsAfterReAddingSilver = rowTotalIds(gridApi); - expect(rowTotalIdsAfterReAddingSilver).toEqual([ - 'PivotRowTotal_pivot_year__gold', - 'PivotRowTotal_pivot_year__silver', - ]); - expect(rowTotalsArePositionedAfterPivotCols()).toBe(true); - - gridApi.addValueColumns(['bronze']); - const rowTotalIdsAfterReAddingBronze = rowTotalIds(gridApi); - expect(rowTotalIdsAfterReAddingBronze).toEqual([ - 'PivotRowTotal_pivot_year__gold', - 'PivotRowTotal_pivot_year__silver', - 'PivotRowTotal_pivot_year__bronze', - ]); - expect(rowTotalsArePositionedAfterPivotCols()).toBe(true); - }); - - // Matches how the tool panel Values drop zone toggles: it always calls setValueColumns - // with the full desired list, never add/remove deltas. - test('tool-panel-style setValueColumns toggle: row totals stay grouped at the start', () => { - const gridApi = gridsManager.createGrid('myGrid', { - columnDefs, - rowData, - pivotMode: true, - pivotRowTotals: 'before', - }); - - // Drop silver+bronze from the Values section - gridApi.setValueColumns(['gold']); - expect(rowTotalIds(gridApi)).toEqual(['PivotRowTotal_pivot_year__gold']); - - // Drag silver back in - gridApi.setValueColumns(['gold', 'silver']); - const rowTotalIdsAfterReAddingSilver = rowTotalIds(gridApi); - expect(rowTotalIdsAfterReAddingSilver).toEqual([ - 'PivotRowTotal_pivot_year__gold', - 'PivotRowTotal_pivot_year__silver', - ]); - expect(rowTotalsArePositionedBeforePivotCols(gridApi)).toBe(true); - - // Drag bronze back in - gridApi.setValueColumns(['gold', 'silver', 'bronze']); - const rowTotalIdsAfterReAddingBronze = rowTotalIds(gridApi); - expect(rowTotalIdsAfterReAddingBronze).toEqual([ - 'PivotRowTotal_pivot_year__gold', - 'PivotRowTotal_pivot_year__silver', - 'PivotRowTotal_pivot_year__bronze', - ]); - expect(rowTotalsArePositionedBeforePivotCols(gridApi)).toBe(true); - }); - - test('setValueColumns reorder updates generated pivot column order', () => { - const gridApi = gridsManager.createGrid('myGrid', { - columnDefs, - rowData, - pivotMode: true, - }); - - gridApi.setValueColumns(['bronze', 'gold', 'silver']); - - expect(getColumnOrder(gridApi, 'center').filter((id) => id.startsWith('pivot_year_2000_'))).toEqual([ - 'pivot_year_2000_bronze', - 'pivot_year_2000_gold', - 'pivot_year_2000_silver', - ]); - }); -}); diff --git a/testing/behavioural/src/version.ts b/testing/behavioural/src/version.ts index 2b7104ca9c3..3bf0b58ee2a 100644 --- a/testing/behavioural/src/version.ts +++ b/testing/behavioural/src/version.ts @@ -1,2 +1,2 @@ // DO NOT UPDATE MANUALLY: Generated from script during build time -export const VERSION = '35.2.1-beta.20260419.2046'; +export const VERSION = '35.2.1-beta.20260503.2052'; diff --git a/testing/csp/package.json b/testing/csp/package.json index c9f5601ad4f..7e074191a19 100644 --- a/testing/csp/package.json +++ b/testing/csp/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-csp", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "CSP testing for AG Grid", "main": "index.js", "scripts": {}, diff --git a/testing/module-size-angular/package.json b/testing/module-size-angular/package.json index 0f3b652b0c1..eb6f83daa46 100644 --- a/testing/module-size-angular/package.json +++ b/testing/module-size-angular/package.json @@ -1,6 +1,6 @@ { "name": "ag-grid-module-size-angular", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "scripts": { "ng": "ng", "start": "ng serve", @@ -20,9 +20,9 @@ "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", - "ag-grid-angular": "35.2.1-beta.20260419.2046", - "ag-grid-community": "35.2.1-beta.20260419.2046", - "ag-grid-enterprise": "35.2.1-beta.20260419.2046", + "ag-grid-angular": "35.2.1-beta.20260503.2052", + "ag-grid-community": "35.2.1-beta.20260503.2052", + "ag-grid-enterprise": "35.2.1-beta.20260503.2052", "ag-charts-community": "13.2.1-beta.20260503", "ag-charts-enterprise": "13.2.1-beta.20260503", "rxjs": "~7.8.2", diff --git a/testing/module-size/package.json b/testing/module-size/package.json index d0c55dd8bcb..fd639ee95a4 100644 --- a/testing/module-size/package.json +++ b/testing/module-size/package.json @@ -1,7 +1,7 @@ { "name": "ag-grid-module-size", "private": true, - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "scripts": { "dev": "vite", "cp-app": "cp ./src/App_Src.tsx ./src/App_AUTO.tsx", @@ -14,9 +14,9 @@ "test:e2e": "run-s \"module-combinations -- {1}\" module-validate --" }, "dependencies": { - "ag-grid-react": "35.2.1-beta.20260419.2046", - "ag-grid-community": "35.2.1-beta.20260419.2046", - "ag-grid-enterprise": "35.2.1-beta.20260419.2046", + "ag-grid-react": "35.2.1-beta.20260503.2052", + "ag-grid-community": "35.2.1-beta.20260503.2052", + "ag-grid-enterprise": "35.2.1-beta.20260503.2052", "ag-charts-community": "13.2.1-beta.20260503", "ag-charts-enterprise": "13.2.1-beta.20260503", "ag-shared": "0.0.1", diff --git a/testing/public-recipes/e2e/package.json b/testing/public-recipes/e2e/package.json index 58a0ff5420a..d91e9289a75 100644 --- a/testing/public-recipes/e2e/package.json +++ b/testing/public-recipes/e2e/package.json @@ -1,12 +1,12 @@ { "name": "ag-grid-public-e2e-testing-recipes", - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "description": "Public E2E testing recipes for AG Grid", "main": "index.js", "scripts": {}, "license": "MIT", "devDependencies": { - "ag-grid-community": "35.2.1-beta.20260419.2046", + "ag-grid-community": "35.2.1-beta.20260503.2052", "playwright": "^1.59.1", "@playwright/test": "^1.59.1", "@types/node": "^22.15.3" diff --git a/testing/vue3-tests/package.json b/testing/vue3-tests/package.json index e3311e62f22..1e40594bff5 100644 --- a/testing/vue3-tests/package.json +++ b/testing/vue3-tests/package.json @@ -1,7 +1,7 @@ { "name": "ag-grid-vue3-tests", "private": true, - "version": "35.2.1-beta.20260419.2046", + "version": "35.2.1-beta.20260503.2052", "type": "module", "scripts": { "dev": "vite", @@ -15,9 +15,9 @@ "dependencies": { "vue": "^3.5.32", "vue-router": "^5.0.6", - "ag-grid-community": "35.2.1-beta.20260419.2046", - "ag-grid-enterprise": "35.2.1-beta.20260419.2046", - "ag-grid-vue3": "35.2.1-beta.20260419.2046", + "ag-grid-community": "35.2.1-beta.20260503.2052", + "ag-grid-enterprise": "35.2.1-beta.20260503.2052", + "ag-grid-vue3": "35.2.1-beta.20260503.2052", "decimal.js": "^10.6.0" }, "devDependencies": {